view scripts/list_sln_projects.py @ 15:cfcac4ed7d21 default tip

Improve loading of solution files - New argument to force a rebuild of the cache - Gracefully handle missing projects in a solution - Handle more different xml namespaces - Support more edge cases
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 29 Aug 2023 12:59:54 -0700
parents 5d2c0db51914
children
line wrap: on
line source

import argparse
import logging
from logutil import setup_logging
from vsutil import SolutionCache


logger = logging.getLogger(__name__)


def main(args=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('solution',
                        help="The path to the Visual Studio solution file.")
    parser.add_argument('-c', '--cache',
                        help="The path to the solution cache.")
    parser.add_argument('-f', '--full-names',
                        action='store_true',
                        help="Print full names for nested projects.")
    parser.add_argument('-v', '--verbose',
                        action='store_true',
                        help="Show verbose information.")
    args = parser.parse_args(args)
    setup_logging(args.verbose)

    cache, _ = SolutionCache.load_or_rebuild(args.solution, args.cache)
    slnobj = cache.slnobj
    logger.debug("Found {0} projects:".format(len(slnobj.projects)))

    non_folder_projs = list(filter(lambda p: not p.is_folder,
                                   slnobj.projects))
    if args.full_names:
        parenting = {}
        nesting_sec = slnobj.globalsection("NestedProjects")
        if nesting_sec:
            for entry in nesting_sec.entries:
                child_guid, parent_guid = (entry.name.strip('{}'),
                                           entry.value.strip('{}'))
                child = slnobj.find_project_by_guid(child_guid, False)
                parent = slnobj.find_project_by_guid(parent_guid, False)
                parenting[child] = parent

        for p in non_folder_projs:
            full_name = p.name
            cur_p = p
            while True:
                cur_p = parenting.get(cur_p)
                if not cur_p:
                    break
                full_name = cur_p.name + "\\" + full_name
            print(full_name)
    else:
        for p in non_folder_projs:
            print(p.name)


if __name__ == '__main__':
    main()