Merge ~apw/ubuntu-archive-tools:new-review--switch-form-and-minor-fixes into ubuntu-archive-tools:main

Proposed by Andy Whitcroft
Status: Needs review
Proposed branch: ~apw/ubuntu-archive-tools:new-review--switch-form-and-minor-fixes
Merge into: ubuntu-archive-tools:main
Diff against target: 315 lines (+138/-148)
3 files modified
dev/null (+0/-147)
new-review (+1/-0)
new_review.py (+137/-1)
Reviewer Review Type Date Requested Status
Ubuntu Package Archive Administrators Pending
Review via email: mp+456346@code.launchpad.net

Commit message

new-review: switch up application layout to match u-a-t standard and minor fixes

1) rebuild application to include new-review in new_review.py and symlink for use,
2) fix version fallback for non-kernel promotions, and
3) emit output on stdout to facilitate pager use.

To post a comment you must log in.

Unmerged commits

0b08781... by Andy Whitcroft

new-review: merge new-review and library

Switch new-review to better match the normal form in
ubuntu-archive-tools.

Signed-off-by: Andy Whitcroft <email address hidden>

afabb53... by Andy Whitcroft

new-review: use stdout so you can simply use a pager

Signed-off-by: Andy Whitcroft <email address hidden>

1a26421... by Andy Whitcroft

new-review: fix non-kernel version fallback

Signed-off-by: Andy Whitcroft <email address hidden>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/new-review b/new-review
2deleted file mode 100755
3index 521df2f..0000000
4--- a/new-review
5+++ /dev/null
6@@ -1,147 +0,0 @@
7-#!/usr/bin/python3
8-
9-import logging
10-import sys
11-import yaml
12-from argparse import ArgumentParser
13-
14-from new_review import ReviewServices, ReviewRequest, ReviewError, SigningBotSubmit
15-
16-
17-class CustomFilter(logging.Filter):
18-
19- def filter(self, record):
20- # Use nice clear explicit prefixes for warn and error.
21- if record.levelno == logging.WARN:
22- record.msg = "WARNING: " + record.msg
23- elif record.levelno == logging.ERROR:
24- record.msg = "ERROR: " + record.msg
25-
26- return True
27-
28-
29-class NewReview:
30-
31- def __init__(self, services=None):
32- if services is None:
33- services = ReviewServices()
34-
35- self.svcs = services
36-
37- def identify_kernel(self, task):
38- for tag in task.bug.tags:
39- if tag.startswith("kernel-sru-cycle-"):
40- return tag[17:]
41- return "kernel"
42-
43- def identify_other(self, task):
44- return "-"
45-
46- def cmd_ready(self, args):
47- new_review_stati = ["In Progress", "Triaged"]
48- if args.early:
49- new_review_stati.append("Confirmed")
50- tasks = []
51- for project, task, stati, identify in [
52- ("kernel-sru-workflow", "new-review", new_review_stati, self.identify_kernel),
53- ("canonical-signing-jobs", None, ["In Progress", "Confirmed", "Triaged"], self.identify_other),
54- ]:
55- lp_pool = self.svcs.launchpad.projects[project]
56- if task:
57- lp_pool = lp_pool.getSeries(name=task)
58- #print(lp_pool)
59- #tasks += lp_pool.searchTasks(status=stati)
60- for task in lp_pool.searchTasks(status=stati):
61- tasks.append((task, identify(task)))
62- #print(len(tasks))
63- for task, area in tasks:
64- if task.status == "In Progress":
65- assigned = " (in-progress {})".format(task.assignee.name)
66- else:
67- assigned = ""
68- area_pad = " " + area if area[0].isdigit() else area
69- print("{bug:<7} {area:<12} {title}{assigned}".format(bug=task.bug.id, title=task.bug.title, area=area_pad, assigned=assigned))
70-
71- def cmd_review(self, args):
72- signing_request = ReviewRequest.select(args, services=self.svcs)
73- if signing_request.task_assign(args):
74- signing_request.analyse(args)
75- if not args.approve:
76- signing_request.binary_new(args)
77-
78- signing_bot = SigningBotSubmit()
79- signing_bot.submit(args, signing_request)
80-
81- signing_request.task_finalise(args)
82-
83- def _main(self):
84- parser = ArgumentParser(description='new-review command line tool')
85-
86- commands = parser.add_subparsers(metavar='COMMAND',
87- title='sub-commands', help='add -h for command help')
88- # Work around http://bugs.python.org/issue9253
89- commands.required = True
90-
91- subcmd = commands.add_parser('ready',
92- help='list trackers which are ready for review',
93- description='''
94- List all trackers which are currently ready for review
95- and promotion.
96- ''')
97- subcmd.set_defaults(func=self.cmd_ready)
98- subcmd.add_argument("--early", action="store_true")
99-
100- subcmd = commands.add_parser('review',
101- help='perform new-review on the selected tracker',
102- description='''
103- Perform a new-review against the selected tracker
104- and reject or promote.
105- ''')
106- subcmd.set_defaults(func=self.cmd_review)
107- group = subcmd.add_argument_group(title='routing options')
108- group.add_argument("--from", dest="from_route")
109- group.add_argument("--from-suite", dest="from_suite")
110- group.add_argument("--to", dest="to_route")
111- group.add_argument("--to-suite", dest="to_suite")
112- group.add_argument("--existing-suite", dest="existing_suite")
113- group.add_argument("--embargo", action="store_true")
114- group = subcmd.add_argument_group(title='type/package options')
115- group.add_argument("--force-type")
116- group.add_argument("--key")
117- group.add_argument("--package", action="append")
118- group = subcmd.add_argument_group(title='disposition options')
119- group.add_argument("--view", action="store_true")
120- group.add_argument("--approve", action="store_true")
121- group.add_argument('--reject', metavar='REASON', help='mark the sru-review as rejected')
122- group.add_argument('--put-back', action="store_true")
123- group.add_argument("--complete", action="store_true")
124- group.add_argument("--ignore-depwait", action="store_true")
125- group.add_argument("--ignore-archs", action="store_true")
126- group = subcmd.add_argument_group(title='verbosity options')
127- group.add_argument("--show-job", action="store_true")
128- group = subcmd.add_argument_group(title='signing task options')
129- group.add_argument("--direct-file")
130- group.add_argument("--delay-ready", action="store_true", default=None)
131- group.add_argument("--no-delay-ready", action="store_false", dest="delay_ready")
132- group.add_argument("--task", default=0, type=int)
133- subcmd.add_argument("tracker", help="tracker (or kernel handle) to promote")
134-
135- args = parser.parse_args()
136- args.func(args)
137-
138- def main(self):
139- try:
140- self._main()
141- except ReviewError as e:
142- logger.error(str(e.args[0]))
143- sys.exit(1)
144-
145-
146-logger = logging.getLogger(__name__)
147-
148-if __name__ == '__main__':
149- logging.basicConfig(level=logging.INFO, format="%(message)s")
150- root = logging.getLogger()
151- root.handlers[0].addFilter(CustomFilter())
152-
153- NewReview().main()
154diff --git a/new-review b/new-review
155new file mode 120000
156index 0000000..55214c8
157--- /dev/null
158+++ b/new-review
159@@ -0,0 +1 @@
160+new_review.py
161\ No newline at end of file
162diff --git a/new_review.py b/new_review.py
163index 23c82ad..de9be95 100755
164--- a/new_review.py
165+++ b/new_review.py
166@@ -716,7 +716,7 @@ class ReviewRequestKernel(ReviewRequest):
167 if match:
168 main_version = match.group(1)
169 else:
170- main_version = package_version
171+ main_version = package.version
172
173 for ucs_ref, ucs_pocket in self.proposed_routes:
174 lp_archive = lp.archives.getByReference(reference=ucs_ref)
175@@ -1588,4 +1588,140 @@ class SigningBotSubmit:
176 signing_task.lp_save()
177
178
179+class CustomFilter(logging.Filter):
180+
181+ def filter(self, record):
182+ # Use nice clear explicit prefixes for warn and error.
183+ if record.levelno == logging.WARN:
184+ record.msg = "WARNING: " + record.msg
185+ elif record.levelno == logging.ERROR:
186+ record.msg = "ERROR: " + record.msg
187+
188+ return True
189+
190+
191+class NewReview:
192+
193+ def __init__(self, services=None):
194+ if services is None:
195+ services = ReviewServices()
196+
197+ self.svcs = services
198+
199+ def identify_kernel(self, task):
200+ for tag in task.bug.tags:
201+ if tag.startswith("kernel-sru-cycle-"):
202+ return tag[17:]
203+ return "kernel"
204+
205+ def identify_other(self, task):
206+ return "-"
207+
208+ def cmd_ready(self, args):
209+ new_review_stati = ["In Progress", "Triaged"]
210+ if args.early:
211+ new_review_stati.append("Confirmed")
212+ tasks = []
213+ for project, task, stati, identify in [
214+ ("kernel-sru-workflow", "new-review", new_review_stati, self.identify_kernel),
215+ ("canonical-signing-jobs", None, ["In Progress", "Confirmed", "Triaged"], self.identify_other),
216+ ]:
217+ lp_pool = self.svcs.launchpad.projects[project]
218+ if task:
219+ lp_pool = lp_pool.getSeries(name=task)
220+ #print(lp_pool)
221+ #tasks += lp_pool.searchTasks(status=stati)
222+ for task in lp_pool.searchTasks(status=stati):
223+ tasks.append((task, identify(task)))
224+ #print(len(tasks))
225+ for task, area in tasks:
226+ if task.status == "In Progress":
227+ assigned = " (in-progress {})".format(task.assignee.name)
228+ else:
229+ assigned = ""
230+ area_pad = " " + area if area[0].isdigit() else area
231+ print("{bug:<7} {area:<12} {title}{assigned}".format(bug=task.bug.id, title=task.bug.title, area=area_pad, assigned=assigned))
232+
233+ def cmd_review(self, args):
234+ signing_request = ReviewRequest.select(args, services=self.svcs)
235+ if signing_request.task_assign(args):
236+ signing_request.analyse(args)
237+ if not args.approve:
238+ signing_request.binary_new(args)
239+
240+ signing_bot = SigningBotSubmit()
241+ signing_bot.submit(args, signing_request)
242+
243+ signing_request.task_finalise(args)
244+
245+ def _main(self):
246+ parser = ArgumentParser(description='new-review command line tool')
247+
248+ commands = parser.add_subparsers(metavar='COMMAND',
249+ title='sub-commands', help='add -h for command help')
250+ # Work around http://bugs.python.org/issue9253
251+ commands.required = True
252+
253+ subcmd = commands.add_parser('ready',
254+ help='list trackers which are ready for review',
255+ description='''
256+ List all trackers which are currently ready for review
257+ and promotion.
258+ ''')
259+ subcmd.set_defaults(func=self.cmd_ready)
260+ subcmd.add_argument("--early", action="store_true")
261+
262+ subcmd = commands.add_parser('review',
263+ help='perform new-review on the selected tracker',
264+ description='''
265+ Perform a new-review against the selected tracker
266+ and reject or promote.
267+ ''')
268+ subcmd.set_defaults(func=self.cmd_review)
269+ group = subcmd.add_argument_group(title='routing options')
270+ group.add_argument("--from", dest="from_route")
271+ group.add_argument("--from-suite", dest="from_suite")
272+ group.add_argument("--to", dest="to_route")
273+ group.add_argument("--to-suite", dest="to_suite")
274+ group.add_argument("--existing-suite", dest="existing_suite")
275+ group.add_argument("--embargo", action="store_true")
276+ group = subcmd.add_argument_group(title='type/package options')
277+ group.add_argument("--force-type")
278+ group.add_argument("--key")
279+ group.add_argument("--package", action="append")
280+ group = subcmd.add_argument_group(title='disposition options')
281+ group.add_argument("--view", action="store_true")
282+ group.add_argument("--approve", action="store_true")
283+ group.add_argument('--reject', metavar='REASON', help='mark the sru-review as rejected')
284+ group.add_argument('--put-back', action="store_true")
285+ group.add_argument("--complete", action="store_true")
286+ group.add_argument("--ignore-depwait", action="store_true")
287+ group.add_argument("--ignore-archs", action="store_true")
288+ group = subcmd.add_argument_group(title='verbosity options')
289+ group.add_argument("--show-job", action="store_true")
290+ group = subcmd.add_argument_group(title='signing task options')
291+ group.add_argument("--direct-file")
292+ group.add_argument("--delay-ready", action="store_true", default=None)
293+ group.add_argument("--no-delay-ready", action="store_false", dest="delay_ready")
294+ group.add_argument("--task", default=0, type=int)
295+ subcmd.add_argument("tracker", help="tracker (or kernel handle) to promote")
296+
297+ args = parser.parse_args()
298+ args.func(args)
299+
300+ def main(self):
301+ try:
302+ self._main()
303+ except ReviewError as e:
304+ logger.error(str(e.args[0]))
305+ sys.exit(1)
306+
307+
308 logger = logging.getLogger(__name__)
309+
310+if __name__ == '__main__':
311+ logging.basicConfig(level=logging.INFO, format="%(message)s", stream=sys.stdout)
312+ root = logging.getLogger()
313+ root.handlers[0].addFilter(CustomFilter())
314+
315+ NewReview().main()

Subscribers

People subscribed via source and target branches