diff options
Diffstat (limited to 'meta-oe/recipes-graphics/vk-gl-cts/files/generate-srcuri.py')
-rwxr-xr-x | meta-oe/recipes-graphics/vk-gl-cts/files/generate-srcuri.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/meta-oe/recipes-graphics/vk-gl-cts/files/generate-srcuri.py b/meta-oe/recipes-graphics/vk-gl-cts/files/generate-srcuri.py new file mode 100755 index 0000000000..c2756b592c --- /dev/null +++ b/meta-oe/recipes-graphics/vk-gl-cts/files/generate-srcuri.py | |||
@@ -0,0 +1,131 @@ | |||
1 | #! /usr/bin/env python3 | ||
2 | |||
3 | import json | ||
4 | import re | ||
5 | import os | ||
6 | import subprocess | ||
7 | import sys | ||
8 | import types | ||
9 | import urllib.parse | ||
10 | |||
11 | |||
12 | def resolve_commit(repo, ref): | ||
13 | # If it looks like a SHA, just return that | ||
14 | if re.match(r"[a-z0-9]{40}", ref): | ||
15 | return ref | ||
16 | |||
17 | # Otherwise it's probably a tag name so resolve it | ||
18 | cmd = ("git", "ls-remote", "--tags", "--exit-code", repo, ref) | ||
19 | ret = subprocess.run(cmd, check=True, text=True, capture_output=True) | ||
20 | sha = ret.stdout.split(maxsplit=1)[0] | ||
21 | assert len(sha) == 40 | ||
22 | return sha | ||
23 | |||
24 | |||
25 | def transform_git(repo_url, repo_ref, destination): | ||
26 | parts = urllib.parse.urlparse(repo_url) | ||
27 | protocol = parts.scheme | ||
28 | parts = parts._replace(scheme="git") | ||
29 | url = urllib.parse.urlunparse(parts) | ||
30 | # Resolve the commit reference to a SHA | ||
31 | sha = resolve_commit(repo_url, repo_ref) | ||
32 | |||
33 | return url + f";protocol={protocol};nobranch=1;destsuffix={destination};rev={sha}" | ||
34 | |||
35 | |||
36 | def load_module(filename): | ||
37 | import importlib.util | ||
38 | |||
39 | spec = importlib.util.spec_from_file_location("fetchmodule", filename) | ||
40 | module = importlib.util.module_from_spec(spec) | ||
41 | spec.loader.exec_module(module) | ||
42 | return module | ||
43 | |||
44 | |||
45 | def convert_fetch(basedir): | ||
46 | """ | ||
47 | Convert the external/fetch_sources.py data | ||
48 | """ | ||
49 | fetch = load_module(os.path.join(basedir, "fetch_sources.py")) | ||
50 | lines = [] | ||
51 | for p in fetch.PACKAGES: | ||
52 | if isinstance(p, fetch.SourcePackage): | ||
53 | # Ignore these as so far we can use the system copies | ||
54 | pass | ||
55 | elif isinstance(p, fetch.SourceFile): | ||
56 | dest = "/".join(["git/external", p.baseDir, p.extractDir]) | ||
57 | url = f"{p.url};subdir={dest};sha256sum={p.checksum}" | ||
58 | lines.append(f" {url} \\") | ||
59 | elif isinstance(p, fetch.GitRepo): | ||
60 | dest = "/".join(["git/external", p.baseDir, p.extractDir]) | ||
61 | url = transform_git(p.httpsUrl, p.revision, dest) | ||
62 | lines.append(f" {url} \\") | ||
63 | else: | ||
64 | assert f"Unexpected {p=}" | ||
65 | return lines | ||
66 | |||
67 | |||
68 | def convert_knowngood(basedir, destination): | ||
69 | """ | ||
70 | Convert the """ | ||
71 | filename = os.path.join(basedir, "vulkan-validationlayers/src/scripts/known_good.json") | ||
72 | try: | ||
73 | with open(filename) as fp: | ||
74 | data = json.load(fp, object_hook=lambda x: types.SimpleNamespace(**x)) | ||
75 | except FileNotFoundError: | ||
76 | return [] | ||
77 | |||
78 | lines = [] | ||
79 | for repo in data.repos: | ||
80 | # Skip repositories that are not needed on Linux (TODO: assumes linux target) | ||
81 | if hasattr(repo, "build_platforms") and repo.build_platforms != "linux": | ||
82 | continue | ||
83 | |||
84 | # Switch the URL to use git: and save the original protocol | ||
85 | parts = urllib.parse.urlparse(repo.url) | ||
86 | protocol = parts.scheme | ||
87 | parts = parts._replace(scheme="git") | ||
88 | url = urllib.parse.urlunparse(parts) | ||
89 | # Resolve the commit reference to a SHA | ||
90 | sha = resolve_commit(repo.url, repo.commit) | ||
91 | |||
92 | destsuffix = destination + "/" + repo.sub_dir | ||
93 | |||
94 | url += f";protocol={protocol};nobranch=1;destsuffix={destsuffix};rev={sha}" | ||
95 | lines.append(f" {url} \\") | ||
96 | return lines | ||
97 | |||
98 | |||
99 | def main(): | ||
100 | pv = sys.argv[1] | ||
101 | basedir = sys.argv[2] | ||
102 | |||
103 | print(""" | ||
104 | # | ||
105 | # Generated by generate-srcuri.py, don't update manually") | ||
106 | # | ||
107 | |||
108 | RECIPE_UPGRADE_EXTRA_TASKS += "do_refresh_srcuri" | ||
109 | |||
110 | python __anonymous() { | ||
111 | if d.getVar("PV") != "%s": | ||
112 | bb.warn("-sources.inc out of date, run refresh_srcuri task") | ||
113 | } | ||
114 | """ % (pv)) | ||
115 | |||
116 | print('SRC_URI += " \\') | ||
117 | lines = convert_fetch(basedir) | ||
118 | print("\n".join(lines)) | ||
119 | print('"') | ||
120 | |||
121 | #lines = convert_knowngood(sys.argv[1], "git/external/validation") | ||
122 | #if lines: | ||
123 | # print('SRC_URI += " \\') | ||
124 | # print("\n".join(lines)) | ||
125 | # print('"') | ||
126 | #else: | ||
127 | # print("# Re-run") | ||
128 | |||
129 | |||
130 | if __name__ == "__main__": | ||
131 | main() | ||