Merge lp:~sil2100/ubuntu-archive-tools/diff-master into lp:ubuntu-archive-tools

Proposed by Łukasz Zemczak
Status: Merged
Merged at revision: 1151
Proposed branch: lp:~sil2100/ubuntu-archive-tools/diff-master
Merge into: lp:ubuntu-archive-tools
Diff against target: 251 lines (+121/-37)
2 files modified
kernel-sru-review (+104/-28)
kernel_workflow.py (+17/-9)
To merge this branch: bzr merge lp:~sil2100/ubuntu-archive-tools/diff-master
Reviewer Review Type Date Requested Status
Ubuntu Package Archive Administrators Pending
Review via email: mp+336208@code.launchpad.net

Commit message

Add an option to perform a brief diff between reviewed kernel and its master kernel, if present. This is useful when reviewing derivatives/backports, to get a better sense of if all the master changes are present.

Description of the change

Add an option to perform a brief diff between reviewed kernel and its master kernel, if present. This is useful when reviewing derivatives/backports, to get a better sense of if all the master changes are present.

To post a comment you must log in.
1145. By Łukasz Zemczak

Some fixes for issues noticed during first test runs of the new functionality.

Revision history for this message
Łukasz Zemczak (sil2100) wrote :

Initial test run done. It should be good-ish now for merging.

1146. By Łukasz Zemczak

For kernel reviews, only match per 'Published' status when no version number is given.

1147. By Łukasz Zemczak

Fix working with ESM.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'kernel-sru-review'
2--- kernel-sru-review 2017-12-12 11:37:10 +0000
3+++ kernel-sru-review 2018-02-06 09:55:13 +0000
4@@ -45,6 +45,87 @@
5 from kernel_workflow import *
6
7
8+def get_master_kernel(lp, bugnum):
9+ current = lp.bugs[bugnum]
10+ master = None
11+ backport_re = re.compile(r'^kernel-sru-backport-of-(\d+)$')
12+ derivative_re = re.compile(r'^kernel-sru-derivative-of-(\d+)$')
13+
14+ for tag in current.tags:
15+ num = derivative_re.match(tag)
16+ if not num:
17+ num = backport_re.match(tag)
18+ if num:
19+ master = lp.bugs[num.group(1)]
20+
21+ if not master:
22+ print("No master kernel.")
23+ return (None, None)
24+ return get_name_and_version_from_bug(master)
25+
26+
27+def get_kernel_dsc(me, archive, source, series=None, version=None):
28+ kwargs = {
29+ 'order_by_date': True,
30+ 'exact_match': True,
31+ 'source_name': source
32+ }
33+ if version:
34+ kwargs['version'] = version
35+ if series:
36+ kwargs['status'] = 'Published'
37+ kwargs['distro_series'] = series
38+
39+ # in cases where we have a separate archive for proposed and release,
40+ # we need to check both places in the order proposed -> release
41+ target = archive['proposed']
42+ srcpkgs = target.getPublishedSources(**kwargs)
43+ if len(srcpkgs) == 0:
44+ target = archive['release']
45+ srcpkgs = target.getPublishedSources(**kwargs)
46+ if len(srcpkgs) == 0 and 'non-esm' in archive:
47+ target = archive['non-esm']
48+ srcpkgs = target.getPublishedSources(**kwargs)
49+ srcpkg = srcpkgs[0]
50+ source_ver = srcpkg.source_package_version
51+ source_dsc = list(filter(
52+ lambda x: x.endswith('.dsc'),
53+ srcpkg.sourceFileUrls()))[0]
54+ if target.private:
55+ priv_url = me.getArchiveSubscriptionURL(archive=target)
56+ dsc_file = os.path.basename(source_dsc)
57+ source_dsc = os.path.join(priv_url, 'pool/main/l', source, dsc_file)
58+
59+ return (source_dsc, source_ver)
60+
61+
62+def generate_diff_from_master(me, archive, master_source, master_version,
63+ new_source, new_upstream,
64+ work_dir, tardir, start_dir):
65+ master_upstream = master_version.split('-')[0]
66+
67+ master_dsc, master_version = get_kernel_dsc(
68+ me, archive, master_source, version=master_version)
69+ fetch_tarball_from_cache(
70+ work_dir, tardir, master_source, master_upstream, start_dir)
71+
72+ # grab the old source first
73+ dget_cmd = ['dget', '-u', master_dsc]
74+ try:
75+ subprocess.check_call(dget_cmd)
76+ except subprocess.CalledProcessError as e:
77+ print("Failed to get master source for %s at version %s" %
78+ (master_source, master_version))
79+ raise e
80+
81+ # generate the diff
82+ print("Generating brief diff between new kernel and master (%s) to %s" %
83+ (master_version, os.path.join(work_dir, 'master_diff')))
84+ diff_cmd = ('diff -rq "{}-{}" "{}-{}" >master_diff').format(
85+ master_source, master_upstream, new_source, new_upstream)
86+ subprocess.call(diff_cmd, shell=True)
87+
88+
89 def review_task_callback(lp, bugnum, task, context):
90 if str(task.target) != \
91 ('%skernel-sru-workflow/promote-to-proposed' % str(lp._root_uri)):
92@@ -71,11 +152,16 @@
93 # as per LP: #1290543, we need to evaluate (load) lp.me for
94 # getArchiveSubscritionURL to work
95 me = lp.load(lp.me.self_link)
96+ master_source = None
97+ master_version = None
98+ if context['diff']:
99+ master_source, master_version = get_master_kernel(lp, bugnum)
100 for source in full_packages:
101 process_source_package(
102 source, release, me, context['archive'], context['ppa'],
103 context['ubuntu'], context['startdir'], context['workdir'],
104- context['tardir'], context['esm'], context['tarcache'])
105+ context['tardir'], context['esm'], context['tarcache'],
106+ master_source, master_version)
107 tasks['proposed'].status = 'Fix Committed'
108 tasks['proposed'].assignee = me
109 tasks['proposed'].lp_save()
110@@ -123,7 +209,8 @@
111
112 def process_source_package(source, release, me, archive, ppa, ubuntu,
113 start_dir, work_dir, tardir,
114- esm=False, tar_cache=False):
115+ esm=False, tar_cache=False,
116+ master_source=None, master_version=None):
117 series = ubuntu.getSeries(name_or_version=release)
118
119 ppa_src = ppa.getPublishedSources(order_by_date=True,
120@@ -155,30 +242,7 @@
121 return
122 scanned.add(pocket.self_link)
123
124- # in cases where we have a separate archive for proposed and release,
125- # we need to check both places in the order proposed -> release
126- target = archive['proposed']
127- srcpkgs = target.getPublishedSources(order_by_date=True,
128- status='Published',
129- exact_match=True,
130- distro_series=series,
131- source_name=source)
132- if len(srcpkgs) == 0:
133- target = archive['release']
134- srcpkgs = target.getPublishedSources(order_by_date=True,
135- status='Published',
136- exact_match=True,
137- distro_series=series,
138- source_name=source)
139- srcpkg = srcpkgs[0]
140- source_ver = srcpkg.source_package_version
141- source_dsc = list(filter(
142- lambda x: x.endswith('.dsc'),
143- srcpkg.sourceFileUrls()))[0]
144- if target.private:
145- priv_url = me.getArchiveSubscriptionURL(archive=target)
146- dsc_file = os.path.basename(source_dsc)
147- source_dsc = os.path.join(priv_url, 'pool/main/l', source, dsc_file)
148+ source_dsc, source_ver = get_kernel_dsc(me, archive, source, series=series)
149
150 new_fullabi = ppa_ver.split('~')[0]
151 new_majorabi = re.sub(r"\.[^.]+$", '', new_fullabi)
152@@ -239,6 +303,14 @@
153 if not real_tardir and tar_cache:
154 save_tarball_to_cache(work_dir, tardir, source, new_upstream)
155
156+ if (master_source and master_version and
157+ '-meta' not in source and '-signed' not in source):
158+ # if requested, we also generate a brief diff between the new kernel
159+ # and its 'master' kernel
160+ generate_diff_from_master(
161+ me, archive, master_source, master_version, source, new_upstream,
162+ work_dir, tardir, start_dir)
163+
164 # look at the diff
165 diff_cmd = ('diff -uNr "{}-{}.old" "{}-{}" | filterdiff -x \'**/abi/**\''
166 + ' | sensible-pager').format(
167@@ -273,7 +345,7 @@
168 # only include uefi binaries that have appeared since we started the
169 # copy to avoid accepting something that might have been improperly
170 # copied into the queue by an "attacker" with upload rights.
171- uefis = series.getPackageUploads(archive=target,
172+ uefis = series.getPackageUploads(archive=archive['release'],
173 pocket='Proposed',
174 status='Unapproved',
175 custom_type='uefi',
176@@ -304,6 +376,9 @@
177 "-t", "--tarball-directory", dest="tardir", default=cachedir)
178 parser.add_option(
179 "-e", "--esm", dest="esm", action="store_true")
180+ parser.add_option(
181+ "-d", "--diff-against-master", dest="diff_master",
182+ action="store_true")
183
184 opts, bugs = parser.parse_args()
185
186@@ -334,6 +409,7 @@
187 distribution=ubuntu, name='proposed')
188 archive['release'] = launchpad.people['ubuntu-esm'].getPPAByName(
189 distribution=ubuntu, name='esm')
190+ archive['non-esm'] = ubuntu.main_archive
191 else:
192 team = 'canonical-kernel-team'
193 archive['proposed'] = archive['release'] = ubuntu.main_archive
194@@ -344,7 +420,7 @@
195 context = {
196 'archive': archive, 'ppa': ppa, 'ubuntu': ubuntu,
197 'tardir': tardir, 'tarcache': opts.caching, 'startdir': start_dir,
198- 'esm': opts.esm
199+ 'esm': opts.esm, 'diff': opts.diff_master
200 }
201 for bugnum in bugs:
202 with ExitStack() as resources:
203
204=== modified file 'kernel_workflow.py'
205--- kernel_workflow.py 2016-12-21 15:21:20 +0000
206+++ kernel_workflow.py 2018-02-06 09:55:13 +0000
207@@ -23,13 +23,25 @@
208 class KernelWorkflowError(Exception):
209 """An exception occurred with the state of the workflow bug"""
210
211+
212+def get_name_and_version_from_bug(bug):
213+ title_re = re.compile(
214+ r'^(?P<package>[a-z0-9.-]+): (?P<version>[0-9.-]+[0-9a-z.~-]*)'
215+ + ' -proposed tracker$')
216+ match = title_re.search(bug.title)
217+ if not match:
218+ print("Ignoring bug %s, not a kernel SRU tracking bug" % bugnum)
219+ return (None, None)
220+ package = match.group('package')
221+ version = match.group('version')
222+ # FIXME: check that the package version is correct for the suite
223+ return (package, version)
224+
225+
226 def process_sru_bug(lp, bugnum, task_callback, source_callback, context=None):
227 """Process the indicated bug and call the provided helper functions
228 as needed
229 """
230- title_re = re.compile(
231- r'^(?P<package>[a-z0-9.-]+): (?P<version>[0-9.-]+[0-9a-z.~-]*)'
232- + ' -proposed tracker$')
233 package_re = re.compile(
234 (r'^%subuntu/(?P<release>[0-9a-z.-]+)/'
235 + '\+source/(?P<package>[a-z0-9.-]+)$') % str(lp._root_uri))
236@@ -43,13 +55,9 @@
237 updates_task = None
238 security_task = None
239 bug = lp.bugs[int(bugnum)]
240- match = title_re.search(bug.title)
241- if not match:
242- print("Ignoring bug %s, not a kernel SRU tracking bug" % bugnum)
243+ package, version = get_name_and_version_from_bug(bug)
244+ if not package or not version:
245 return
246- package = match.group('package')
247- version = match.group('version')
248- # FIXME: check that the package version is correct for the suite
249
250 task_results = {}
251 for task in bug.bug_tasks:

Subscribers

People subscribed via source and target branches