Skip to content

Commit b09ca17

Browse files
authored
Add script to generate artefacts shasum. (#98)
1 parent db21e5a commit b09ca17

2 files changed

Lines changed: 109 additions & 0 deletions

File tree

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#!/usr/bin/env/python3
2+
"""Create SHASUM from GitHub release artifacts for a given version
3+
4+
Example:
5+
$ python3 get_artifacts_hash.py 1.7.0
6+
7+
"""
8+
import argparse
9+
import hashlib
10+
import json
11+
import sys
12+
from dataclasses import dataclass
13+
14+
import requests
15+
16+
17+
@dataclass
18+
class Asset:
19+
name: str
20+
download_url: str
21+
22+
def shasum256(self) -> str:
23+
resp = requests.get(self.download_url, allow_redirects=True)
24+
_hash = hashlib.sha256(resp.content).hexdigest()
25+
return _hash
26+
27+
28+
def github_graphql(
29+
token: str,
30+
query: str,
31+
) -> str:
32+
"""Execute a GraphQL query using GitHub API."""
33+
url = "https://api.github.com/graphql"
34+
query_json = {"query": query}
35+
body = json.dumps(query_json)
36+
sys.stderr.write("* POST %s\n" % url)
37+
headers = {}
38+
if token:
39+
headers["Authorization"] = f"Bearer {token}"
40+
r = requests.post(url, data=body, headers=headers)
41+
if r.status_code != 200:
42+
raise Exception("HTTP Error %s - %s" % (r.status_code, r.text))
43+
return r.text
44+
45+
46+
def get_release_assets(version: str, token: str) -> list[Asset]:
47+
"""return assets release for the given tag"""
48+
query = """\
49+
query {
50+
repository(owner:"Orange-OpenSource", name:"hurl") {
51+
release(tagName:"VERSION") {
52+
releaseAssets(first:20) {
53+
edges {
54+
node {
55+
name
56+
contentType
57+
downloadUrl
58+
url
59+
}
60+
}
61+
}
62+
}
63+
}
64+
}
65+
"""
66+
query = query.replace("VERSION", version)
67+
payload = github_graphql(token=token, query=query)
68+
response = json.loads(payload)
69+
assets_list = response["data"]["repository"]["release"]["releaseAssets"]["edges"]
70+
assets = []
71+
for node in assets_list:
72+
name = node["node"]["name"]
73+
download_url = node["node"]["downloadUrl"]
74+
asset = Asset(name=name, download_url=download_url)
75+
assets.append(asset)
76+
77+
# We add source artifacts (not returned by the APIs)
78+
name = f"{version}.zip"
79+
download_url = f"https://github.com/Orange-OpenSource/hurl/archive/refs/tags/{name}"
80+
asset = Asset(name=name, download_url=download_url)
81+
assets.append(asset)
82+
83+
name = f"{version}.tar.gz"
84+
download_url = f"https://github.com/Orange-OpenSource/hurl/archive/refs/tags/{name}"
85+
asset = Asset(name=name, download_url=download_url)
86+
assets.append(asset)
87+
88+
return assets
89+
90+
91+
def main():
92+
parser = argparse.ArgumentParser(description="Get Hurl release artifacts shasum")
93+
parser.add_argument("version", help="Hurl release version ex 4.2.0")
94+
parser.add_argument("--token", help="GitHub authentication token")
95+
args = parser.parse_args()
96+
if args.version == "":
97+
raise Exception("version can not be empty")
98+
99+
assets = get_release_assets(version=args.version, token=args.token)
100+
# We keep only the binary files
101+
assets = [a for a in assets if not a.name.endswith(".sha256")]
102+
assets.sort(key=lambda x: x.name)
103+
for a in assets:
104+
print(f"{a.download_url},{a.shasum256()}")
105+
106+
107+
if __name__ == "__main__":
108+
main()

sites/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ black
44
Markdown
55
lxml
66
pytz
7+
requests

0 commit comments

Comments
 (0)