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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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