Mercurial > public > mercurial-scm > hg-stable
comparison contrib/automation/hgautomation/try_server.py @ 43057:c5c502bd1f70
automation: add a command to submit to a Try server
The CI code for running the Try Server requires more thorough review.
Let's add just the client-side bits for submitting to Try so others
can start using it.
Differential Revision: https://phab.mercurial-scm.org/D6983
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 05 Oct 2019 11:21:39 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
43056:f71b3c561b93 | 43057:c5c502bd1f70 |
---|---|
1 # try_server.py - Interact with Try server | |
2 # | |
3 # Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com> | |
4 # | |
5 # This software may be used and distributed according to the terms of the | |
6 # GNU General Public License version 2 or any later version. | |
7 | |
8 # no-check-code because Python 3 native. | |
9 | |
10 import base64 | |
11 import json | |
12 import os | |
13 import subprocess | |
14 import tempfile | |
15 | |
16 from .aws import AWSConnection | |
17 | |
18 LAMBDA_FUNCTION = "ci-try-server-upload" | |
19 | |
20 | |
21 def trigger_try(c: AWSConnection, rev="."): | |
22 """Trigger a new Try run.""" | |
23 lambda_client = c.session.client("lambda") | |
24 | |
25 cset, bundle = generate_bundle(rev=rev) | |
26 | |
27 payload = { | |
28 "bundle": base64.b64encode(bundle).decode("utf-8"), | |
29 "node": cset["node"], | |
30 "branch": cset["branch"], | |
31 "user": cset["user"], | |
32 "message": cset["desc"], | |
33 } | |
34 | |
35 print("resolved revision:") | |
36 print("node: %s" % cset["node"]) | |
37 print("branch: %s" % cset["branch"]) | |
38 print("user: %s" % cset["user"]) | |
39 print("desc: %s" % cset["desc"].splitlines()[0]) | |
40 print() | |
41 | |
42 print("sending to Try...") | |
43 res = lambda_client.invoke( | |
44 FunctionName=LAMBDA_FUNCTION, | |
45 InvocationType="RequestResponse", | |
46 Payload=json.dumps(payload).encode("utf-8"), | |
47 ) | |
48 | |
49 body = json.load(res["Payload"]) | |
50 for message in body: | |
51 print("remote: %s" % message) | |
52 | |
53 | |
54 def generate_bundle(rev="."): | |
55 """Generate a bundle suitable for use by the Try service. | |
56 | |
57 Returns a tuple of revision metadata and raw Mercurial bundle data. | |
58 """ | |
59 # `hg bundle` doesn't support streaming to stdout. So we use a temporary | |
60 # file. | |
61 path = None | |
62 try: | |
63 fd, path = tempfile.mkstemp(prefix="hg-bundle-", suffix=".hg") | |
64 os.close(fd) | |
65 | |
66 args = [ | |
67 "hg", | |
68 "bundle", | |
69 "--type", | |
70 "gzip-v2", | |
71 "--base", | |
72 "public()", | |
73 "--rev", | |
74 rev, | |
75 path, | |
76 ] | |
77 | |
78 print("generating bundle...") | |
79 subprocess.run(args, check=True) | |
80 | |
81 with open(path, "rb") as fh: | |
82 bundle_data = fh.read() | |
83 | |
84 finally: | |
85 if path: | |
86 os.unlink(path) | |
87 | |
88 args = [ | |
89 "hg", | |
90 "log", | |
91 "-r", | |
92 rev, | |
93 # We have to upload as JSON, so it won't matter if we emit binary | |
94 # since we need to normalize to UTF-8. | |
95 "-T", | |
96 "json", | |
97 ] | |
98 res = subprocess.run(args, check=True, capture_output=True) | |
99 return json.loads(res.stdout)[0], bundle_data |