Jpp 21.0.0-rc.1-88-g0130508c4
the software that should make you happy
Loading...
Searching...
No Matches
km3net-cmake-setup-makefile-version Namespace Reference

Functions

 run_git (source_dir, *args)
 
 parse_version (value)
 
 fallback_version (source_dir)
 
 collect_metadata (source_dir, package_name)
 
 sanitize_identifier (value)
 
 namespace_block (namespace)
 
 cpp_bool (value)
 
 cpp_string (value)
 
 write_header (path, metadata, namespace)
 
 write_source (path, metadata, namespace, include)
 
 write_main (path, namespace, include)
 
 project_name_to_namespace (package_name)
 
 main ()
 

Function Documentation

◆ run_git()

km3net-cmake-setup-makefile-version.run_git ( source_dir,
* args )

Definition at line 12 of file km3net-cmake-setup-makefile-version.py.

12def run_git(source_dir, *args):
13 try:
14 completed = subprocess.run(
15 ["git", *args],
16 cwd=source_dir,
17 check=True,
18 stdout=subprocess.PIPE,
19 stderr=subprocess.PIPE,
20 text=True,
21 )
22 except (FileNotFoundError, subprocess.CalledProcessError):
23 return None
24 return completed.stdout.strip()
25
26

◆ parse_version()

km3net-cmake-setup-makefile-version.parse_version ( value)

Definition at line 27 of file km3net-cmake-setup-makefile-version.py.

27def parse_version(value):
28 match = re.match(r"^v?([0-9]+)(?:\.([0-9]+))?(?:\.([0-9]+))?", value.strip())
29 if not match:
30 return 0, 0, 0
31
32 major = int(match.group(1))
33 minor = int(match.group(2) or 0)
34 patch = int(match.group(3) or 0)
35 return major, minor, patch
36
37

◆ fallback_version()

km3net-cmake-setup-makefile-version.fallback_version ( source_dir)

Definition at line 38 of file km3net-cmake-setup-makefile-version.py.

38def fallback_version(source_dir):
39 codemeta = source_dir / "codemeta.json"
40 if codemeta.exists():
41 with codemeta.open(encoding="utf-8") as stream:
42 metadata = json.load(stream)
43 return parse_version(str(metadata.get("version", "0.0.0"))), True
44
45 version_file = source_dir / "VERSION"
46 if version_file.exists():
47 return parse_version(version_file.read_text(encoding="utf-8")), True
48
49 return (0, 0, 0), False
50
51

◆ collect_metadata()

km3net-cmake-setup-makefile-version.collect_metadata ( source_dir,
package_name )

Definition at line 52 of file km3net-cmake-setup-makefile-version.py.

52def collect_metadata(source_dir, package_name):
53 is_git_repo = run_git(source_dir, "status") is not None
54 git_tag = ""
55 git_describe = ""
56 git_commit = ""
57 git_short_hash = ""
58 git_dirty = False
59 commits_since_tag = 0
60
61 if is_git_repo:
62 source_available = True
63 git_describe = run_git(source_dir, "--no-pager", "describe", "--tags", "--always", "--dirty") or ""
64 git_commit = run_git(source_dir, "rev-parse", "HEAD") or ""
65 git_short_hash = run_git(source_dir, "rev-parse", "--short", "HEAD") or ""
66 git_status = run_git(source_dir, "status", "--porcelain") or ""
67 git_dirty = bool(git_status)
68 git_tag = run_git(source_dir, "--no-pager", "describe", "--tags", "--abbrev=0") or ""
69
70 if git_tag:
71 major, minor, patch = parse_version(git_tag)
72 commits_since_tag_text = run_git(source_dir, "rev-list", "--count", f"{git_tag}..HEAD")
73 commits_since_tag = int(commits_since_tag_text or 0)
74 else:
75 major, minor, patch = 0, 0, 0
76 else:
77 (major, minor, patch), source_available = fallback_version(source_dir)
78
79 return {
80 "package_name": package_name,
81 "version": f"{major}.{minor}.{patch}",
82 "version_major": major,
83 "version_minor": minor,
84 "version_patch": patch,
85 "git_tag": git_tag,
86 "git_describe": git_describe,
87 "git_commit": git_commit,
88 "git_short_hash": git_short_hash,
89 "git_dirty": git_dirty,
90 "commits_since_tag": commits_since_tag,
91 "source_available": source_available,
92 }
93
94

◆ sanitize_identifier()

km3net-cmake-setup-makefile-version.sanitize_identifier ( value)

Definition at line 95 of file km3net-cmake-setup-makefile-version.py.

95def sanitize_identifier(value):
96 result = re.sub(r"[^a-zA-Z0-9_]", "_", value)
97 result = re.sub(r"^([0-9])", r"_\1", result)
98 return result.upper()
99
100

◆ namespace_block()

km3net-cmake-setup-makefile-version.namespace_block ( namespace)

Definition at line 101 of file km3net-cmake-setup-makefile-version.py.

101def namespace_block(namespace):
102 parts = [part for part in namespace.split("::") if part]
103 open_block = "".join(f"namespace {part} {{\n" for part in parts)
104 close_block = "".join(f"}} // namespace {part}\n" for part in reversed(parts))
105 return open_block, close_block
106
107

◆ cpp_bool()

km3net-cmake-setup-makefile-version.cpp_bool ( value)

Definition at line 108 of file km3net-cmake-setup-makefile-version.py.

108def cpp_bool(value):
109 return "true" if value else "false"
110
111

◆ cpp_string()

km3net-cmake-setup-makefile-version.cpp_string ( value)

Definition at line 112 of file km3net-cmake-setup-makefile-version.py.

112def cpp_string(value):
113 return json.dumps(value)
114
115

◆ write_header()

km3net-cmake-setup-makefile-version.write_header ( path,
metadata,
namespace )

Definition at line 116 of file km3net-cmake-setup-makefile-version.py.

116def write_header(path, metadata, namespace):
117 guard = f"{sanitize_identifier(str(path))}_H"
118 open_block, close_block = namespace_block(namespace)
119 path.parent.mkdir(parents=True, exist_ok=True)
120 path.write_text(
121 f"""#ifndef {guard}
122#define {guard}
123
124#include <string>
125
126{open_block}
127std::string getPackageName();
128std::string getVersion();
129
130unsigned int getVersionMajor();
131unsigned int getVersionMinor();
132unsigned int getVersionPatch();
133
134std::string getGitTag();
135std::string getGitDescribe();
136std::string getGitCommit();
137bool getGitDirty();
138bool hasVersionMetadata();
139
140std::string getShortHash();
141unsigned int getCommitsSinceTag();
142
143{close_block}
144#endif
145""",
146 encoding="utf-8",
147 )
148
149

◆ write_source()

km3net-cmake-setup-makefile-version.write_source ( path,
metadata,
namespace,
include )

Definition at line 150 of file km3net-cmake-setup-makefile-version.py.

150def write_source(path, metadata, namespace, include):
151 open_block, close_block = namespace_block(namespace)
152 path.parent.mkdir(parents=True, exist_ok=True)
153 path.write_text(
154 f"""#include "{include}"
155
156{open_block}
157std::string getPackageName() {{
158return {cpp_string(metadata["package_name"])};
159}}
160
161std::string getVersion() {{
162return {cpp_string(metadata["version"])};
163}}
164
165unsigned int getVersionMajor() {{ return {metadata["version_major"]}; }}
166unsigned int getVersionMinor() {{ return {metadata["version_minor"]}; }}
167unsigned int getVersionPatch() {{ return {metadata["version_patch"]}; }}
168
169std::string getGitTag() {{ return {cpp_string(metadata["git_tag"])}; }}
170std::string getGitDescribe() {{ return {cpp_string(metadata["git_describe"])}; }}
171std::string getGitCommit() {{ return {cpp_string(metadata["git_commit"])}; }}
172bool getGitDirty() {{ return {cpp_bool(metadata["git_dirty"])}; }}
173bool hasVersionMetadata() {{ return {cpp_bool(metadata["source_available"])}; }}
174
175std::string getShortHash() {{ return {cpp_string(metadata["git_short_hash"])}; }}
176unsigned int getCommitsSinceTag() {{ return {metadata["commits_since_tag"]}; }}
177
178{close_block}
179""",
180 encoding="utf-8",
181 )
182
183

◆ write_main()

km3net-cmake-setup-makefile-version.write_main ( path,
namespace,
include )

Definition at line 184 of file km3net-cmake-setup-makefile-version.py.

184def write_main(path, namespace, include):
185 path.parent.mkdir(parents=True, exist_ok=True)
186 path.write_text(
187 f"""#include "{include}"
188
189#include <iostream>
190#include <string>
191
192namespace {{
193
194std::string jsonEscape(const std::string& input) {{
195 std::string output;
196 for (const char character : input) {{
197 switch (character) {{
198 case '\\\"':
199 output += "\\\\\\\"";
200 break;
201 case '\\\\':
202 output += "\\\\\\\\";
203 break;
204 case '\\b':
205 output += "\\\\b";
206 break;
207 case '\\f':
208 output += "\\\\f";
209 break;
210 case '\\n':
211 output += "\\\\n";
212 break;
213 case '\\r':
214 output += "\\\\r";
215 break;
216 case '\\t':
217 output += "\\\\t";
218 break;
219 default:
220 output += character;
221 break;
222 }}
223 }}
224 return output;
225}}
226
227void printText() {{
228 std::cout
229 << "package_name=" << {namespace}::getPackageName() << '\\n'
230 << "version=" << {namespace}::getVersion() << '\\n'
231 << "version_major=" << {namespace}::getVersionMajor() << '\\n'
232 << "version_minor=" << {namespace}::getVersionMinor() << '\\n'
233 << "version_patch=" << {namespace}::getVersionPatch() << '\\n'
234 << "git_tag=" << {namespace}::getGitTag() << '\\n'
235 << "git_describe=" << {namespace}::getGitDescribe() << '\\n'
236 << "git_commit=" << {namespace}::getGitCommit() << '\\n'
237 << "git_short_hash=" << {namespace}::getShortHash() << '\\n'
238 << "git_dirty=" << ({namespace}::getGitDirty() ? "true" : "false") << '\\n'
239 << "commits_since_tag=" << {namespace}::getCommitsSinceTag() << '\\n'
240 << "source_available=" << ({namespace}::hasVersionMetadata() ? "true" : "false") << '\\n';
241}}
242
243void printJson() {{
244 std::cout
245 << "{{\\n"
246 << " \\"package_name\\": \\"" << jsonEscape({namespace}::getPackageName()) << "\\",\\n"
247 << " \\"version\\": \\"" << jsonEscape({namespace}::getVersion()) << "\\",\\n"
248 << " \\"version_major\\": " << {namespace}::getVersionMajor() << ",\\n"
249 << " \\"version_minor\\": " << {namespace}::getVersionMinor() << ",\\n"
250 << " \\"version_patch\\": " << {namespace}::getVersionPatch() << ",\\n"
251 << " \\"git_tag\\": \\"" << jsonEscape({namespace}::getGitTag()) << "\\",\\n"
252 << " \\"git_describe\\": \\"" << jsonEscape({namespace}::getGitDescribe()) << "\\",\\n"
253 << " \\"git_commit\\": \\"" << jsonEscape({namespace}::getGitCommit()) << "\\",\\n"
254 << " \\"git_short_hash\\": \\"" << jsonEscape({namespace}::getShortHash()) << "\\",\\n"
255 << " \\"git_dirty\\": " << ({namespace}::getGitDirty() ? "true" : "false") << ",\\n"
256 << " \\"commits_since_tag\\": " << {namespace}::getCommitsSinceTag() << ",\\n"
257 << " \\"source_available\\": " << ({namespace}::hasVersionMetadata() ? "true" : "false") << '\\n'
258 << "}}\\n";
259}}
260
261}} // namespace
262
263int main(int argc, char** argv) {{
264 if (argc == 1) {{
265 printText();
266 return 0;
267 }}
268
269 if (argc == 2 && std::string(argv[1]) == "--json") {{
270 printJson();
271 return 0;
272 }}
273
274 std::cerr << "usage: " << argv[0] << " [--json]\\n";
275 return 1;
276}}
277""",
278 encoding="utf-8",
279 )
280
281

◆ project_name_to_namespace()

km3net-cmake-setup-makefile-version.project_name_to_namespace ( package_name)

Definition at line 282 of file km3net-cmake-setup-makefile-version.py.

282def project_name_to_namespace(package_name):
283 return re.sub(r"[^a-zA-Z0-9]+", "::", package_name).strip(":").lower()
284
285

◆ main()

km3net-cmake-setup-makefile-version.main ( )

Definition at line 286 of file km3net-cmake-setup-makefile-version.py.

286def main():
287 parser = argparse.ArgumentParser()
288 parser.add_argument("--source-dir", default=os.getcwd())
289 parser.add_argument("--package-name")
290 parser.add_argument("--namespace")
291 parser.add_argument("--include", default=None)
292 parser.add_argument("--output-dir")
293 parser.add_argument("--header")
294 parser.add_argument("--source")
295 parser.add_argument("--main")
296 args = parser.parse_args()
297
298 source_dir = Path(args.source_dir).resolve()
299 package_name = args.package_name or source_dir.name
300 namespace = args.namespace or project_name_to_namespace(package_name)
301 include = args.include or f"km3net/{package_name}/version.h"
302 metadata = collect_metadata(source_dir, package_name)
303
304 output_dir = Path(args.output_dir) if args.output_dir else None
305 header_path = Path(args.header) if args.header else None
306 source_path = Path(args.source) if args.source else None
307 main_path = Path(args.main) if args.main else None
308
309 if output_dir:
310 header_path = header_path or output_dir / "include" / include
311 source_path = source_path or output_dir / f"{package_name}-version.cc"
312 main_path = main_path or output_dir / f"{package_name}-version-command.cc"
313
314 if not (header_path or source_path or main_path):
315 print(json.dumps(metadata, indent=2))
316
317 if header_path:
318 write_header(header_path, metadata, namespace)
319 if source_path:
320 write_source(source_path, metadata, namespace, include)
321 if main_path:
322 write_main(main_path, namespace, include)
323
324
void print(const TH1 &h1, std::ostream &out)
Print histogram parameters.
int main()