33 params = {
"o": [
"CURRENT_REVISION",
"LABELS",
"DETAILED_ACCOUNTS"]}
34 r = requests.get(f
"{args.url}/changes/{args.changeid}", params=params)
36 json_txt = r.text.removeprefix(
")]}'\n")
37 json_data = json.loads(json_txt)
38 assert len(json_data[
"revisions"]) == 1
39 revision = json_data[
"revisions"].popitem()[1][
"_number"]
40 assert "Code-Review" in json_data[
"labels"]
42 for reviewer
in json_data[
"labels"][
"Code-Review"][
"all"]:
43 if "value" in reviewer:
44 assert reviewer[
"value"] >= 0
45 if reviewer[
"value"] == 2:
47 reviewer_name = reviewer.get(
"display_name", reviewer[
"name"])
48 reviewer_mail = reviewer.get(
"email", reviewer[
"name"])
49 ack = f
"{reviewer_name} <{reviewer_mail}>"
50 print(f
"Acked-by: {ack}")
53 owner = json_data[
"owner"]
54 owner_name = owner.get(
"display_name", owner[
"name"])
55 owner_mail = owner.get(
"email", owner[
"name"])
56 sign_off = f
"{owner_name} <{owner_mail}>"
57 print(f
"Signed-off-by: {sign_off}")
58 change_id = json_data[
"change_id"]
61 dateutil.parser.parse(json_data[
"created"])
62 .replace(tzinfo=timezone.utc)
66 created_stamp = int(utc_stamp * 1000)
67 hostname = urlparse(args.url).hostname
68 msg_id = f
"gerrit.{created_stamp}.{change_id}@{hostname}"
71 "project": json_data[
"project"],
72 "target": json_data[
"branch"],
89 comment_start = patch_text.index(
"\n---\n") + len(
"\n---\n")
91 signed_off_comment =
""
93 signed_off_start = patch_text.rindex(
"\nSigned-off-by: ")
94 signed_off_end = patch_text.index(
"\n", signed_off_start + 1) + 1
96 signed_off_text = f
"Signed-off-by: {details['sign_off']}\n"
97 signed_off_comment =
"\nSigned-off-by line for the author was added as per our policy.\n"
98 signed_off_end = patch_text.index(
"\n---\n") + 1
99 assert comment_start > signed_off_end
102 gerrit_url = f
"{args.url}/c/{details['project']}/+/{args.changeid}"
103 for ack
in details[
"acked_by"]:
104 acked_by_text += f
"Acked-by: {ack}\n"
105 acked_by_names += f
"{ack}\n"
107 patch_text[:signed_off_end]
110 + f
"Gerrit URL: {gerrit_url}\n"
111 + patch_text[signed_off_end:comment_start]
113This change was reviewed on Gerrit and approved by at least one
114developer. I request to merge it to {details["target"]}.
116Gerrit URL: {gerrit_url}
117This mail reflects revision {details["revision"]} of this Change.
119Acked-by according to Gerrit (reflected above):
122 + patch_text[comment_start:]
124 filename = f
"gerrit-{args.changeid}-{details['revision']}.patch"
125 patch_text_final = patch_text_mod.replace(
"Subject: [PATCH]", f
"Subject: [PATCH v{details['revision']}]")
126 with open(filename,
"w", encoding=
"utf-8", newline=
"\n")
as patch_file:
127 patch_file.write(patch_text_final)
129 print(f
"git send-email --in-reply-to {details['msg_id']} {filename}")