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
diff --git a/new-review b/new-review
0deleted file mode 1007550deleted file mode 100755
index 521df2f..0000000
--- a/new-review
+++ /dev/null
@@ -1,147 +0,0 @@
1#!/usr/bin/python3
2
3import logging
4import sys
5import yaml
6from argparse import ArgumentParser
7
8from new_review import ReviewServices, ReviewRequest, ReviewError, SigningBotSubmit
9
10
11class CustomFilter(logging.Filter):
12
13 def filter(self, record):
14 # Use nice clear explicit prefixes for warn and error.
15 if record.levelno == logging.WARN:
16 record.msg = "WARNING: " + record.msg
17 elif record.levelno == logging.ERROR:
18 record.msg = "ERROR: " + record.msg
19
20 return True
21
22
23class NewReview:
24
25 def __init__(self, services=None):
26 if services is None:
27 services = ReviewServices()
28
29 self.svcs = services
30
31 def identify_kernel(self, task):
32 for tag in task.bug.tags:
33 if tag.startswith("kernel-sru-cycle-"):
34 return tag[17:]
35 return "kernel"
36
37 def identify_other(self, task):
38 return "-"
39
40 def cmd_ready(self, args):
41 new_review_stati = ["In Progress", "Triaged"]
42 if args.early:
43 new_review_stati.append("Confirmed")
44 tasks = []
45 for project, task, stati, identify in [
46 ("kernel-sru-workflow", "new-review", new_review_stati, self.identify_kernel),
47 ("canonical-signing-jobs", None, ["In Progress", "Confirmed", "Triaged"], self.identify_other),
48 ]:
49 lp_pool = self.svcs.launchpad.projects[project]
50 if task:
51 lp_pool = lp_pool.getSeries(name=task)
52 #print(lp_pool)
53 #tasks += lp_pool.searchTasks(status=stati)
54 for task in lp_pool.searchTasks(status=stati):
55 tasks.append((task, identify(task)))
56 #print(len(tasks))
57 for task, area in tasks:
58 if task.status == "In Progress":
59 assigned = " (in-progress {})".format(task.assignee.name)
60 else:
61 assigned = ""
62 area_pad = " " + area if area[0].isdigit() else area
63 print("{bug:<7} {area:<12} {title}{assigned}".format(bug=task.bug.id, title=task.bug.title, area=area_pad, assigned=assigned))
64
65 def cmd_review(self, args):
66 signing_request = ReviewRequest.select(args, services=self.svcs)
67 if signing_request.task_assign(args):
68 signing_request.analyse(args)
69 if not args.approve:
70 signing_request.binary_new(args)
71
72 signing_bot = SigningBotSubmit()
73 signing_bot.submit(args, signing_request)
74
75 signing_request.task_finalise(args)
76
77 def _main(self):
78 parser = ArgumentParser(description='new-review command line tool')
79
80 commands = parser.add_subparsers(metavar='COMMAND',
81 title='sub-commands', help='add -h for command help')
82 # Work around http://bugs.python.org/issue9253
83 commands.required = True
84
85 subcmd = commands.add_parser('ready',
86 help='list trackers which are ready for review',
87 description='''
88 List all trackers which are currently ready for review
89 and promotion.
90 ''')
91 subcmd.set_defaults(func=self.cmd_ready)
92 subcmd.add_argument("--early", action="store_true")
93
94 subcmd = commands.add_parser('review',
95 help='perform new-review on the selected tracker',
96 description='''
97 Perform a new-review against the selected tracker
98 and reject or promote.
99 ''')
100 subcmd.set_defaults(func=self.cmd_review)
101 group = subcmd.add_argument_group(title='routing options')
102 group.add_argument("--from", dest="from_route")
103 group.add_argument("--from-suite", dest="from_suite")
104 group.add_argument("--to", dest="to_route")
105 group.add_argument("--to-suite", dest="to_suite")
106 group.add_argument("--existing-suite", dest="existing_suite")
107 group.add_argument("--embargo", action="store_true")
108 group = subcmd.add_argument_group(title='type/package options')
109 group.add_argument("--force-type")
110 group.add_argument("--key")
111 group.add_argument("--package", action="append")
112 group = subcmd.add_argument_group(title='disposition options')
113 group.add_argument("--view", action="store_true")
114 group.add_argument("--approve", action="store_true")
115 group.add_argument('--reject', metavar='REASON', help='mark the sru-review as rejected')
116 group.add_argument('--put-back', action="store_true")
117 group.add_argument("--complete", action="store_true")
118 group.add_argument("--ignore-depwait", action="store_true")
119 group.add_argument("--ignore-archs", action="store_true")
120 group = subcmd.add_argument_group(title='verbosity options')
121 group.add_argument("--show-job", action="store_true")
122 group = subcmd.add_argument_group(title='signing task options')
123 group.add_argument("--direct-file")
124 group.add_argument("--delay-ready", action="store_true", default=None)
125 group.add_argument("--no-delay-ready", action="store_false", dest="delay_ready")
126 group.add_argument("--task", default=0, type=int)
127 subcmd.add_argument("tracker", help="tracker (or kernel handle) to promote")
128
129 args = parser.parse_args()
130 args.func(args)
131
132 def main(self):
133 try:
134 self._main()
135 except ReviewError as e:
136 logger.error(str(e.args[0]))
137 sys.exit(1)
138
139
140logger = logging.getLogger(__name__)
141
142if __name__ == '__main__':
143 logging.basicConfig(level=logging.INFO, format="%(message)s")
144 root = logging.getLogger()
145 root.handlers[0].addFilter(CustomFilter())
146
147 NewReview().main()
diff --git a/new-review b/new-review
148new file mode 1200000new file mode 120000
index 0000000..55214c8
--- /dev/null
+++ b/new-review
@@ -0,0 +1 @@
1new_review.py
0\ No newline at end of file2\ No newline at end of file
diff --git a/new_review.py b/new_review.py
index 23c82ad..de9be95 100755
--- a/new_review.py
+++ b/new_review.py
@@ -716,7 +716,7 @@ class ReviewRequestKernel(ReviewRequest):
716 if match:716 if match:
717 main_version = match.group(1)717 main_version = match.group(1)
718 else:718 else:
719 main_version = package_version719 main_version = package.version
720720
721 for ucs_ref, ucs_pocket in self.proposed_routes:721 for ucs_ref, ucs_pocket in self.proposed_routes:
722 lp_archive = lp.archives.getByReference(reference=ucs_ref)722 lp_archive = lp.archives.getByReference(reference=ucs_ref)
@@ -1588,4 +1588,140 @@ class SigningBotSubmit:
1588 signing_task.lp_save()1588 signing_task.lp_save()
15891589
15901590
1591class CustomFilter(logging.Filter):
1592
1593 def filter(self, record):
1594 # Use nice clear explicit prefixes for warn and error.
1595 if record.levelno == logging.WARN:
1596 record.msg = "WARNING: " + record.msg
1597 elif record.levelno == logging.ERROR:
1598 record.msg = "ERROR: " + record.msg
1599
1600 return True
1601
1602
1603class NewReview:
1604
1605 def __init__(self, services=None):
1606 if services is None:
1607 services = ReviewServices()
1608
1609 self.svcs = services
1610
1611 def identify_kernel(self, task):
1612 for tag in task.bug.tags:
1613 if tag.startswith("kernel-sru-cycle-"):
1614 return tag[17:]
1615 return "kernel"
1616
1617 def identify_other(self, task):
1618 return "-"
1619
1620 def cmd_ready(self, args):
1621 new_review_stati = ["In Progress", "Triaged"]
1622 if args.early:
1623 new_review_stati.append("Confirmed")
1624 tasks = []
1625 for project, task, stati, identify in [
1626 ("kernel-sru-workflow", "new-review", new_review_stati, self.identify_kernel),
1627 ("canonical-signing-jobs", None, ["In Progress", "Confirmed", "Triaged"], self.identify_other),
1628 ]:
1629 lp_pool = self.svcs.launchpad.projects[project]
1630 if task:
1631 lp_pool = lp_pool.getSeries(name=task)
1632 #print(lp_pool)
1633 #tasks += lp_pool.searchTasks(status=stati)
1634 for task in lp_pool.searchTasks(status=stati):
1635 tasks.append((task, identify(task)))
1636 #print(len(tasks))
1637 for task, area in tasks:
1638 if task.status == "In Progress":
1639 assigned = " (in-progress {})".format(task.assignee.name)
1640 else:
1641 assigned = ""
1642 area_pad = " " + area if area[0].isdigit() else area
1643 print("{bug:<7} {area:<12} {title}{assigned}".format(bug=task.bug.id, title=task.bug.title, area=area_pad, assigned=assigned))
1644
1645 def cmd_review(self, args):
1646 signing_request = ReviewRequest.select(args, services=self.svcs)
1647 if signing_request.task_assign(args):
1648 signing_request.analyse(args)
1649 if not args.approve:
1650 signing_request.binary_new(args)
1651
1652 signing_bot = SigningBotSubmit()
1653 signing_bot.submit(args, signing_request)
1654
1655 signing_request.task_finalise(args)
1656
1657 def _main(self):
1658 parser = ArgumentParser(description='new-review command line tool')
1659
1660 commands = parser.add_subparsers(metavar='COMMAND',
1661 title='sub-commands', help='add -h for command help')
1662 # Work around http://bugs.python.org/issue9253
1663 commands.required = True
1664
1665 subcmd = commands.add_parser('ready',
1666 help='list trackers which are ready for review',
1667 description='''
1668 List all trackers which are currently ready for review
1669 and promotion.
1670 ''')
1671 subcmd.set_defaults(func=self.cmd_ready)
1672 subcmd.add_argument("--early", action="store_true")
1673
1674 subcmd = commands.add_parser('review',
1675 help='perform new-review on the selected tracker',
1676 description='''
1677 Perform a new-review against the selected tracker
1678 and reject or promote.
1679 ''')
1680 subcmd.set_defaults(func=self.cmd_review)
1681 group = subcmd.add_argument_group(title='routing options')
1682 group.add_argument("--from", dest="from_route")
1683 group.add_argument("--from-suite", dest="from_suite")
1684 group.add_argument("--to", dest="to_route")
1685 group.add_argument("--to-suite", dest="to_suite")
1686 group.add_argument("--existing-suite", dest="existing_suite")
1687 group.add_argument("--embargo", action="store_true")
1688 group = subcmd.add_argument_group(title='type/package options')
1689 group.add_argument("--force-type")
1690 group.add_argument("--key")
1691 group.add_argument("--package", action="append")
1692 group = subcmd.add_argument_group(title='disposition options')
1693 group.add_argument("--view", action="store_true")
1694 group.add_argument("--approve", action="store_true")
1695 group.add_argument('--reject', metavar='REASON', help='mark the sru-review as rejected')
1696 group.add_argument('--put-back', action="store_true")
1697 group.add_argument("--complete", action="store_true")
1698 group.add_argument("--ignore-depwait", action="store_true")
1699 group.add_argument("--ignore-archs", action="store_true")
1700 group = subcmd.add_argument_group(title='verbosity options')
1701 group.add_argument("--show-job", action="store_true")
1702 group = subcmd.add_argument_group(title='signing task options')
1703 group.add_argument("--direct-file")
1704 group.add_argument("--delay-ready", action="store_true", default=None)
1705 group.add_argument("--no-delay-ready", action="store_false", dest="delay_ready")
1706 group.add_argument("--task", default=0, type=int)
1707 subcmd.add_argument("tracker", help="tracker (or kernel handle) to promote")
1708
1709 args = parser.parse_args()
1710 args.func(args)
1711
1712 def main(self):
1713 try:
1714 self._main()
1715 except ReviewError as e:
1716 logger.error(str(e.args[0]))
1717 sys.exit(1)
1718
1719
1591logger = logging.getLogger(__name__)1720logger = logging.getLogger(__name__)
1721
1722if __name__ == '__main__':
1723 logging.basicConfig(level=logging.INFO, format="%(message)s", stream=sys.stdout)
1724 root = logging.getLogger()
1725 root.handlers[0].addFilter(CustomFilter())
1726
1727 NewReview().main()

Subscribers

People subscribed via source and target branches