| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | 
							- #!/usr/bin/env python
 
- # 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())
 
 
  |