Viewing file:      pretty_sln.py (4.98 KB)      -rwxr-xr-x Select action/file-type:    (+) |   (+) |   (+) | Code (+) | Session (+) |   (+) | SDB (+) |   (+) |   (+) |   (+) |   (+) |   (+) |
 
#!/usr/bin/python2
  # Copyright (c) 2012 Google Inc. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
  """Prints the information in a sln file in a diffable way.
     It first outputs each projects in alphabetical order with their    dependencies.
     Then it outputs a possible build order. """
  __author__ = 'nsylvain (Nicolas Sylvain)'
  import os import re import sys import pretty_vcproj
  def BuildProject(project, built, projects, deps):   # if all dependencies are done, we can build it, otherwise we try to build the   # dependency.   # This is not infinite-recursion proof.   for dep in deps[project]:     if dep not in built:       BuildProject(dep, built, projects, deps)   print project   built.append(project)
  def ParseSolution(solution_file):   # All projects, their clsid and paths.   projects = dict()
    # A list of dependencies associated with a project.   dependencies = dict()
    # Regular expressions that matches the SLN format.   # The first line of a project definition.   begin_project = re.compile(r'^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'                              r'}"\) = "(.*)", "(.*)", "(.*)"$')   # The last line of a project definition.   end_project = re.compile('^EndProject$')   # The first line of a dependency list.   begin_dep = re.compile(       r'ProjectSection\(ProjectDependencies\) = postProject$')   # The last line of a dependency list.   end_dep = re.compile('EndProjectSection$')   # A line describing a dependency.   dep_line = re.compile(' *({.*}) = ({.*})$')
    in_deps = False   solution = open(solution_file)   for line in solution:     results = begin_project.search(line)     if results:       # Hack to remove icu because the diff is too different.       if results.group(1).find('icu') != -1:         continue       # We remove "_gyp" from the names because it helps to diff them.       current_project = results.group(1).replace('_gyp', '')       projects[current_project] = [results.group(2).replace('_gyp', ''),                                    results.group(3),                                    results.group(2)]       dependencies[current_project] = []       continue
      results = end_project.search(line)     if results:       current_project = None       continue
      results = begin_dep.search(line)     if results:       in_deps = True       continue
      results = end_dep.search(line)     if results:       in_deps = False       continue
      results = dep_line.search(line)     if results and in_deps and current_project:       dependencies[current_project].append(results.group(1))       continue
    # Change all dependencies clsid to name instead.   for project in dependencies:     # For each dependencies in this project     new_dep_array = []     for dep in dependencies[project]:       # Look for the project name matching this cldis       for project_info in projects:         if projects[project_info][1] == dep:           new_dep_array.append(project_info)     dependencies[project] = sorted(new_dep_array)
    return (projects, dependencies)
  def PrintDependencies(projects, deps):   print "---------------------------------------"   print "Dependencies for all projects"   print "---------------------------------------"   print "--                                   --"
    for (project, dep_list) in sorted(deps.items()):     print "Project : %s" % project     print "Path : %s" % projects[project][0]     if dep_list:       for dep in dep_list:         print "  - %s" % dep     print ""
    print "--                                   --"
  def PrintBuildOrder(projects, deps):   print "---------------------------------------"   print "Build order                            "   print "---------------------------------------"   print "--                                   --"
    built = []   for (project, _) in sorted(deps.items()):     if project not in built:       BuildProject(project, built, projects, deps)
    print "--                                   --"
  def PrintVCProj(projects):
    for project in projects:     print "-------------------------------------"     print "-------------------------------------"     print project     print project     print project     print "-------------------------------------"     print "-------------------------------------"
      project_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[1]),                                                 projects[project][2]))
      pretty = pretty_vcproj     argv = [ '',              project_path,              '$(SolutionDir)=%s\\' % os.path.dirname(sys.argv[1]),            ]     argv.extend(sys.argv[3:])     pretty.main(argv)
  def main():   # check if we have exactly 1 parameter.   if len(sys.argv) < 2:     print 'Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0]     return 1
    (projects, deps) = ParseSolution(sys.argv[1])   PrintDependencies(projects, deps)   PrintBuildOrder(projects, deps)
    if '--recursive' in sys.argv:     PrintVCProj(projects)   return 0
 
  if __name__ == '__main__':   sys.exit(main()) 
  |