Mercurial > vim-crosoft
annotate scripts/vshelpers.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 | f444739dd8af |
children |
rev | line source |
---|---|
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import os.path |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import logging |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 from vsutil import SolutionCache |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 logger = logging.getLogger(__name__) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 config_format = 2 # Keep in sync with vimcrosoft.vim |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 def load_vimcrosoft_auto_env(sln_file, build_env): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 cache_file = os.path.join(os.path.dirname(sln_file), '.vimcrosoft', 'config.txt') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 if not os.path.isfile(cache_file): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 logger.warn("No Vimcrosoft cache file found, you will probably have to specify " |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 "all configuration values in the command line!") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 return |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 with open(cache_file, 'r', encoding='utf8') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 lines = fp.readlines() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 tokens = [ |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 '_VimcrosoftConfigFormat', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 '_VimcrosoftCurrentSolution', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 'Configuration', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 'Platform', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 '_VimcrosoftActiveProject'] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 for i, line in enumerate(lines): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 token = tokens[i] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 build_env[token] = line.strip() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 try: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 found_conffmt = int(build_env['_VimcrosoftConfigFormat'].split('=')[-1]) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 except: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 raise Exception("Invalid Vimcrosoft cache file found.") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 if found_conffmt != config_format: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 raise Exception("Incompatible Vimcrosoft cache file found. " |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 "Expected format %d but got %d" % (config_format, found_conffmt)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 logger.info("Loaded cached configuration|platform: %s|%s" % |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 (build_env['Configuration'], build_env['Platform'])) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 def find_vimcrosoft_slncache(sln_file): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 return os.path.join(os.path.dirname(sln_file), '.vimcrosoft', 'slncache.bin') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 def get_solution_cache(solution, slncache=None): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 if not solution: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 raise Exception( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 "No solution path was provided!") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 cache, loaded = SolutionCache.load_or_rebuild(solution, slncache) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 if not loaded: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 cache.build_cache() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 if slncache: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 logger.debug(f"Saving solution cache: {slncache}") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 cache.save(slncache) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 return cache |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 def find_item_project(item_path, solution, slncache=None): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 # Load the solution |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 cache = get_solution_cache(solution, slncache) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 # Find the primary file in the solution. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 item_path_lower = item_path.lower() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 projpath = None |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 for pp, pi in cache.index.items(): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 if item_path_lower in pi: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 projpath = pp |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 break |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 raise Exception("File doesn't belong to the solution: %s" % item_path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 # Find the project that our file belongs to. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 proj = cache.slnobj.find_project_by_path(projpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 if not proj: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 raise Exception("Can't find project in solution: %s" % projpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 return cache, proj |