#!/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(('^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
                              '}"\) = "(.*)", "(.*)", "(.*)"$'))
  # The last line of a project definition.
  end_project = re.compile('^EndProject$')
  # The first line of a dependency list.
  begin_dep = re.compile('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())
