Merge lp:~jelmer/brz-debian/upstream-subpath into lp:brz-debian
- upstream-subpath
- Merge into trunk
Proposed by
Jelmer Vernooij
Status: | Needs review |
---|---|
Proposed branch: | lp:~jelmer/brz-debian/upstream-subpath |
Merge into: | lp:brz-debian |
Diff against target: |
1392 lines (+232/-169) 16 files modified
__init__.py (+7/-7) cmds.py (+15/-9) import_dsc.py (+60/-38) import_uncommitted.py (+3/-2) merge_package.py (+10/-5) merge_upstream.py (+6/-6) move_orphaned.py (+3/-1) new_upstream.py (+15/-10) revspec.py (+1/-1) tests/blackbox/test_merge_upstream.py (+1/-1) tests/test_config.py (+0/-1) tests/test_import_dsc.py (+47/-45) tests/test_upstream.py (+14/-12) upstream/__init__.py (+1/-1) upstream/branch.py (+26/-18) upstream/pristinetar.py (+23/-12) |
To merge this branch: | bzr merge lp:~jelmer/brz-debian/upstream-subpath |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Breezy developers | Pending | ||
Review via email: mp+436171@code.launchpad.net |
Commit message
Description of the change
Support merging of upstreams on subpaths
To post a comment you must log in.
- 1591. By Jelmer Vernooij
-
Report formatting-
unpreservable diff when possible.
Unmerged revisions
- 1591. By Jelmer Vernooij
-
Report formatting-
unpreservable diff when possible. - 1590. By Jelmer Vernooij
-
Support merging upstream with subpath (for build_type==merge)
- 1589. By Jelmer Vernooij
-
Add specific exception for merging of upstream subpaths not working.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file '__init__.py' |
2 | --- __init__.py 2023-01-12 17:15:19 +0000 |
3 | +++ __init__.py 2023-01-27 18:04:28 +0000 |
4 | @@ -34,8 +34,15 @@ |
5 | brz_plugin_version as version_info, |
6 | ) |
7 | |
8 | +from ...directory_service import ( |
9 | + AliasDirectory, |
10 | + directories, |
11 | + ) |
12 | |
13 | from ...i18n import load_plugin_translations |
14 | +from ...tag import tag_sort_methods |
15 | +from ...revisionspec import revspec_registry |
16 | + |
17 | translation = load_plugin_translations("brz-debian") |
18 | gettext = translation.gettext |
19 | |
20 | @@ -66,11 +73,6 @@ |
21 | default_result_dir = '..' |
22 | |
23 | |
24 | -from ...directory_service import ( |
25 | - AliasDirectory, |
26 | - directories, |
27 | - ) |
28 | - |
29 | directories.register_lazy( |
30 | "apt:", __name__ + '.directory', |
31 | 'AptDirectory', |
32 | @@ -89,12 +91,10 @@ |
33 | "upstream", __name__ + ".directory", "upstream_branch_alias", |
34 | help="upstream branch (for packaging branches)") |
35 | |
36 | -from ...tag import tag_sort_methods |
37 | tag_sort_methods.register_lazy( |
38 | "debversion", __name__ + ".tagging", "sort_debversion", |
39 | "Sort like Debian versions.") |
40 | |
41 | -from ...revisionspec import revspec_registry |
42 | revspec_registry.register_lazy( |
43 | "package:", __name__ + ".revspec", "RevisionSpec_package") |
44 | revspec_registry.register_lazy( |
45 | |
46 | === modified file 'cmds.py' |
47 | --- cmds.py 2023-01-12 11:16:09 +0000 |
48 | +++ cmds.py 2023-01-27 18:04:28 +0000 |
49 | @@ -953,7 +953,8 @@ |
50 | "merge-upstream takes only a single --revision")) |
51 | upstream_revspec = revision[0] |
52 | upstream_revisions = { |
53 | - None: upstream_revspec.as_revision_id(upstream_branch)} |
54 | + None: (upstream_revspec.as_revision_id(upstream_branch), |
55 | + subpath)} |
56 | else: |
57 | upstream_revisions = None |
58 | |
59 | @@ -961,7 +962,7 @@ |
60 | # Look up the version from the upstream revision |
61 | unmangled_version, version = ( |
62 | upstream_branch_source.get_version( |
63 | - package, current_version, upstream_revisions[None])) |
64 | + package, current_version, upstream_revisions[None][0])) |
65 | elif version is None and primary_upstream_source is not None: |
66 | unmangled_version, version = ( |
67 | primary_upstream_source.get_latest_version( |
68 | @@ -1016,7 +1017,7 @@ |
69 | % e.path) from e |
70 | try: |
71 | conflicts, imported_revids = do_merge( |
72 | - tree, subpath, tarball_filenames, package, version, |
73 | + tree, tarball_filenames, package, version, |
74 | current_version, upstream_branch, upstream_revisions, |
75 | merge_type, force=force, |
76 | force_pristine_tar=force_pristine_tar, |
77 | @@ -1228,11 +1229,13 @@ |
78 | md5sum_filename, |
79 | ) |
80 | # TODO: search for similarity etc. |
81 | - branch, _ = Branch.open_containing('.') |
82 | + branch, subpath = Branch.open_containing('.') |
83 | if upstream_branch is None: |
84 | upstream = None |
85 | + upstream_subpath = "" |
86 | else: |
87 | - upstream = Branch.open(upstream_branch) |
88 | + upstream, upstream_subpath = Branch.open_containing( |
89 | + upstream_branch) |
90 | self.add_cleanup(branch.lock_write().unlock) |
91 | tempdir = self.enter_context(tempfile.TemporaryDirectory( |
92 | dir=branch.controldir.root_transport.clone('..') |
93 | @@ -1255,10 +1258,13 @@ |
94 | # See bug lp:309682 |
95 | for parent in base_revisions.values(): |
96 | upstream.repository.fetch(branch.repository, parent) |
97 | - db.extract_upstream_tree(base_revisions, tempdir) |
98 | + db.extract_upstream_tree( |
99 | + {comp: (revid, subpath) |
100 | + for comp, revid in base_revisions.items()}, |
101 | + tempdir) |
102 | parents = {} |
103 | for name, base_revid in base_revisions.items(): |
104 | - parents[name] = [base_revid] |
105 | + parents[name] = [(base_revid, subpath)] |
106 | else: |
107 | parents = {} |
108 | db.create_empty_upstream_tree(tempdir) |
109 | @@ -1276,9 +1282,9 @@ |
110 | ' one revision specifier.')) |
111 | tarballs = [(location, None, md5sum_filename(location))] |
112 | for (component, tag_name, revid, |
113 | - pristine_tar_imported) in db.import_upstream_tarballs( |
114 | + pristine_tar_imported, subpath) in db.import_upstream_tarballs( |
115 | tarballs, None, version, parents, upstream_branch=upstream, |
116 | - upstream_revisions={None: upstream_revid}, |
117 | + upstream_revisions={None: (upstream_revid, upstream_subpath)}, |
118 | force_pristine_tar=force_pristine_tar): |
119 | if component is None: |
120 | self.outf.write(gettext( |
121 | |
122 | === modified file 'import_dsc.py' |
123 | --- import_dsc.py 2023-01-12 11:16:09 +0000 |
124 | +++ import_dsc.py 2023-01-27 18:04:28 +0000 |
125 | @@ -209,15 +209,18 @@ |
126 | """Checkout an upstream version from the pristine tar source. |
127 | |
128 | """ |
129 | - tree.update(revision=revisions[None]) |
130 | + main_revid, main_subpath = revisions[None] |
131 | + if main_subpath: |
132 | + raise Exception("subpaths not yet supported") |
133 | + tree.update(revision=main_revid) |
134 | parent_ids = [] |
135 | for component in sorted(revisions.keys()): |
136 | - revid = revisions[component] |
137 | + revid, subpath = revisions[component] |
138 | if component is not None: |
139 | component_tree = tree.branch.repository.revision_tree(revid) |
140 | export_with_nested( |
141 | component_tree, os.path.join(tree.basedir, component), |
142 | - format='dir') |
143 | + format='dir', subdir=subpath) |
144 | parent_ids.append(revid) |
145 | tree.set_parent_ids(parent_ids) |
146 | |
147 | @@ -542,8 +545,8 @@ |
148 | pristine_upstream_revids = branch.pristine_upstream_source\ |
149 | .version_as_revisions( |
150 | package, version, tarballs=upstream_tarballs) |
151 | - for (component, pristine_upstream_revid) in ( |
152 | - pristine_upstream_revids.items()): |
153 | + for (pristine_upstream_revid, pristine_upstream_subpath) in ( |
154 | + pristine_upstream_revids.values()): |
155 | if not graph.is_ancestor( |
156 | up_branch.last_revision(), pristine_upstream_revid): |
157 | return False |
158 | @@ -614,7 +617,8 @@ |
159 | str(last_contained_version)) |
160 | parents = [ |
161 | (self, last_contained_version, |
162 | - self.revid_of_version(last_contained_version))] |
163 | + self.revid_of_version(last_contained_version), |
164 | + "")] |
165 | else: |
166 | mutter("We don't have any of those versions") |
167 | for branch in (list(reversed(self.get_lesser_branches())) |
168 | @@ -623,7 +627,7 @@ |
169 | branch.contained_versions(missing_versions) |
170 | if merged: |
171 | revid = branch.revid_of_version(merged[0]) |
172 | - parents.append((branch, merged[0], revid)) |
173 | + parents.append((branch, merged[0], revid, "")) |
174 | mutter("Adding merge from related branch of %s for version %s", |
175 | revid, str(merged[0])) |
176 | # FIXME: should this really be here? |
177 | @@ -649,7 +653,8 @@ |
178 | pull_revisions = ( |
179 | pull_branch.pristine_upstream_source.version_as_revisions( |
180 | package, version)) |
181 | - for (component, pull_revision) in pull_revisions.items(): |
182 | + for (component, |
183 | + (pull_revision, _pull_subpath)) in pull_revisions.items(): |
184 | mutter("Fetching upstream part %s of %s from revision %s", |
185 | component, version, pull_revision) |
186 | assert self.pristine_upstream_tree is not None, \ |
187 | @@ -753,7 +758,7 @@ |
188 | if parent_pair[1].upstream_version == version.upstream_version: |
189 | need_upstream_parent = False |
190 | break |
191 | - real_parents = [p[2] for p in parents] |
192 | + real_parents = [(p[2], p[3]) for p in parents] |
193 | if need_upstream_parent: |
194 | upstream_revids = self.pristine_upstream_source\ |
195 | .version_as_revisions( |
196 | @@ -776,7 +781,8 @@ |
197 | # Make sure we see any revisions added by the upstream branch |
198 | # since self.tree was locked. |
199 | self.branch.repository.refresh_data() |
200 | - for (component, tag, revid, pristine_tar_imported) in imported_revids: |
201 | + for (component, tag, revid, pristine_tar_imported, |
202 | + subpath) in imported_revids: |
203 | self.branch.fetch(self.pristine_upstream_branch, revid) |
204 | self.pristine_upstream_branch.tags.merge_to(self.branch.tags) |
205 | |
206 | @@ -797,8 +803,8 @@ |
207 | :param upstream_parents: the parents to give the upstream revision |
208 | :param timestamp: a tuple of (timestamp, timezone) to use for |
209 | the commit, or None to use the current time. |
210 | - :return: |
211 | - list with (component, tag, revid, pristine_tar_imported) tuples |
212 | + :return: list with |
213 | + (component, tag, revid, pristine_tar_imported, subpath) tuples |
214 | """ |
215 | # Should we just dump the upstream part on whatever is currently |
216 | # there, or try and pull all of the other upstream versions |
217 | @@ -814,9 +820,12 @@ |
218 | for (tarball, component, md5) in upstream_tarballs: |
219 | parents = upstream_parents.get(component, []) |
220 | if upstream_revisions is not None: |
221 | - revid = upstream_revisions[component] |
222 | + revid, subpath = upstream_revisions[component] |
223 | else: |
224 | revid = None |
225 | + subpath = "" |
226 | + if subpath: |
227 | + raise Exception('subpaths are not yet supported') |
228 | upstream_trees = [ |
229 | o.pristine_upstream_branch.basis_tree() |
230 | for o in other_branches] |
231 | @@ -834,7 +843,7 @@ |
232 | revid = fetch_result.revidmap[revid] |
233 | upstream_branch.tags.merge_to( |
234 | self.pristine_upstream_branch.tags) |
235 | - parents.append(revid) |
236 | + parents.append((revid, "")) |
237 | target_tree = ( |
238 | self.pristine_upstream_branch.repository.revision_tree( |
239 | revid)) |
240 | @@ -847,9 +856,12 @@ |
241 | self_tree = self.branch.basis_tree() |
242 | self_tree.lock_read() |
243 | if len(parents) > 0: |
244 | - parent_revid = parents[0] |
245 | + parent_revid, parent_subpath = parents[0] |
246 | else: |
247 | parent_revid = NULL_REVISION |
248 | + parent_subpath = None |
249 | + if parent_subpath: |
250 | + raise Exception('subpaths are not supported yet') |
251 | self.pristine_upstream_tree.pull( |
252 | self.pristine_upstream_tree.branch, |
253 | overwrite=True, stop_revision=parent_revid) |
254 | @@ -878,7 +890,7 @@ |
255 | committer=committer, files_excluded=files_excluded, |
256 | reuse_existing=True)) |
257 | self.pristine_upstream_branch.generate_revision_history(revid) |
258 | - ret.append((component, tag, revid, pristine_tar_imported)) |
259 | + ret.append((component, tag, revid, pristine_tar_imported, subpath)) |
260 | self.branch.fetch(self.pristine_upstream_branch) |
261 | self.branch.tags.set_tag(tag, revid) |
262 | return ret |
263 | @@ -900,7 +912,7 @@ |
264 | upstream_revisions: Upstream revision ids dictionary |
265 | md5sum: hex digest of the md5sum of the tarball, if known. |
266 | Returns: |
267 | - list with (component, tag, revid, pristine_tar_imported) |
268 | + list with (component, tag, revid, pristine_tar_imported, subpath) |
269 | tuples |
270 | """ |
271 | with _extract_tarballs_to_tempdir(tarballs) as tarball_dir: |
272 | @@ -933,29 +945,31 @@ |
273 | # First we move the branch to the first parent |
274 | if parents: |
275 | if self.branch.last_revision() == NULL_REVISION: |
276 | - parent_revid = parents[0] |
277 | + parent_revid, parent_subpath = parents[0] |
278 | + if parent_subpath: |
279 | + raise Exception('subpaths are not yet supported') |
280 | self.tree.pull( |
281 | self.tree.branch, overwrite=True, |
282 | stop_revision=parent_revid) |
283 | - elif parents[0] != self.branch.last_revision(): |
284 | + elif parents[0][0] != self.branch.last_revision(): |
285 | mutter("Adding current tip as parent: %s", |
286 | self.branch.last_revision()) |
287 | - parents.insert(0, self.branch.last_revision()) |
288 | + parents.insert(0, (self.branch.last_revision(), "")) |
289 | elif self.branch.last_revision() != NULL_REVISION: |
290 | # We were told to import with no parents. That's not |
291 | # right, so import with the current parent. Should |
292 | # perhaps be fixed in the methods to determine the parents. |
293 | mutter("Told to import with no parents. Adding current tip " |
294 | "as the single parent") |
295 | - parents = [self.branch.last_revision()] |
296 | + parents = [(self.branch.last_revision(), "")] |
297 | other_branches = self.get_other_branches() |
298 | debian_trees = [o.branch.basis_tree() for o in other_branches] |
299 | parent_trees = [] |
300 | if file_ids_from is not None: |
301 | parent_trees = file_ids_from[:] |
302 | - for parent in parents: |
303 | - parent_trees.append(self.branch.repository.revision_tree( |
304 | - parent)) |
305 | + for parent_revid, parent_subpath in parents: |
306 | + parent_trees.append( |
307 | + self.branch.repository.revision_tree(parent_revid)) |
308 | import_dir( |
309 | self.tree, debian_part, |
310 | file_ids_from=parent_trees + debian_trees) |
311 | @@ -964,7 +978,8 @@ |
312 | os.chmod(rules_path, |
313 | (stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | |
314 | stat.S_IROTH | stat.S_IXOTH)) |
315 | - self.tree.set_parent_ids(parents) |
316 | + self.tree.set_parent_ids( |
317 | + [parent_revid for (parent_revid, parent_subpath) in parents]) |
318 | changelog_path = os.path.join( |
319 | self.tree.basedir, 'debian', 'changelog') |
320 | if os.path.exists(changelog_path): |
321 | @@ -1009,7 +1024,7 @@ |
322 | parents = [] |
323 | first_parent = self.pristine_upstream_branch.last_revision() |
324 | if first_parent != NULL_REVISION: |
325 | - parents = [first_parent] |
326 | + parents = [(first_parent, "")] |
327 | last_contained_version = self.last_contained_version(versions) |
328 | if last_contained_version is not None: |
329 | # If the last version was native, and was not from the same |
330 | @@ -1019,7 +1034,7 @@ |
331 | and not self.pristine_upstream_source.has_version( |
332 | package, last_contained_version.upstream_version)): |
333 | revid = self.revid_of_version(last_contained_version) |
334 | - parents.append(revid) |
335 | + parents.append((revid, "")) |
336 | self.pristine_upstream_branch.fetch(self.branch, revid) |
337 | pull_parents = self.get_parents(versions) |
338 | if ((first_parent == NULL_REVISION and len(pull_parents) > 0) |
339 | @@ -1036,13 +1051,12 @@ |
340 | package, pull_version.upstream_version)) |
341 | if list(pull_revids.keys()) != [None]: |
342 | raise MultipleUpstreamTarballsNotSupported() |
343 | - pull_revid = pull_revids[None] |
344 | mutter("Initialising upstream from %s, version %s", |
345 | str(pull_branch), str(pull_version)) |
346 | - parents.append(pull_revid) |
347 | + parents.append(pull_revids[None]) |
348 | self.pristine_upstream_branch.fetch( |
349 | pull_branch.pristine_upstream_branch, |
350 | - pull_revid) |
351 | + pull_revids[None][0]) |
352 | pull_branch.pristine_upstream_branch.tags.merge_to( |
353 | self.pristine_upstream_branch.tags) |
354 | # FIXME: What about other versions ? |
355 | @@ -1129,7 +1143,7 @@ |
356 | if last_contained_version is None: |
357 | parents = [] |
358 | else: |
359 | - parents = [self.revid_of_version(last_contained_version)] |
360 | + parents = [(self.revid_of_version(last_contained_version), "")] |
361 | missing_versions = self.missing_versions(versions) |
362 | for branch in (list(reversed(self.get_lesser_branches())) |
363 | + self.get_greater_branches()): |
364 | @@ -1137,12 +1151,12 @@ |
365 | branch.contained_versions(missing_versions) |
366 | if merged: |
367 | revid = branch.revid_of_version(merged[0]) |
368 | - parents.append(revid) |
369 | + parents.append((revid, "")) |
370 | # FIXME: should this really be here? |
371 | self._fetch_from_branch(branch, revid) |
372 | if (self.branch.last_revision() != NULL_REVISION |
373 | and not self.branch.last_revision() in parents): |
374 | - parents.insert(0, self.branch.last_revision()) |
375 | + parents.insert(0, (self.branch.last_revision(), "")) |
376 | return parents |
377 | |
378 | def _import_native_package(self, package, version, versions, debian_part, |
379 | @@ -1225,8 +1239,10 @@ |
380 | assert list(upstream_tips.keys()) == [None], \ |
381 | "Upstream tips: %r" % list(upstream_tips.keys()) |
382 | # TODO(jelmer): Use colocated branches rather than creating a copy. |
383 | + if upstream_tips[None][1]: |
384 | + raise Exception("subpaths are not yet supported") |
385 | dir_to = source_branch.controldir.sprout( |
386 | - to_location, revision_id=upstream_tips[None], |
387 | + to_location, revision_id=upstream_tips[None][0], |
388 | accelerator_tree=self.tree) |
389 | try: |
390 | self.pristine_upstream_tree = dir_to.open_workingtree() |
391 | @@ -1287,7 +1303,8 @@ |
392 | graph = self.branch.repository.get_graph( |
393 | other_repository=upstream_repository) |
394 | return all(graph.is_ancestor(upstream_revision, this_revision) |
395 | - for upstream_revision in upstream_revisions.values()) |
396 | + for upstream_revision, upstream_subpath |
397 | + in upstream_revisions.values()) |
398 | |
399 | def merge_upstream(self, tarball_filenames, package, version, |
400 | previous_version, upstream_branch=None, |
401 | @@ -1310,7 +1327,7 @@ |
402 | if upstream_branch is not None: |
403 | if upstream_revisions is None: |
404 | upstream_revisions = { |
405 | - None: upstream_branch.last_revision()} |
406 | + None: (upstream_branch.last_revision(), "")} |
407 | if (not force and |
408 | self.has_merged_upstream_revisions( |
409 | self.branch.last_revision(), |
410 | @@ -1327,7 +1344,9 @@ |
411 | if (self.pristine_upstream_branch.last_revision() |
412 | != NULL_REVISION): |
413 | parents = { |
414 | - None: [self.pristine_upstream_branch.last_revision()]} |
415 | + None: [ |
416 | + (self.pristine_upstream_branch.last_revision(), "") |
417 | + ]} |
418 | imported_revids = self.import_upstream( |
419 | tarball_dir, package, version, parents, |
420 | upstream_tarballs=upstream_tarballs, |
421 | @@ -1348,8 +1367,11 @@ |
422 | # Use the previous upstream import as the from revision |
423 | if len(parents[None]) == 0: |
424 | from_revision = NULL_REVISION |
425 | + from_subpath = "" |
426 | else: |
427 | - from_revision = parents[None][0] |
428 | + from_revision, from_subpath = parents[None][0] |
429 | + if from_subpath: |
430 | + raise Exception('subpath not yet supported') |
431 | conflicts = self.tree.merge_from_branch( |
432 | self.pristine_upstream_branch, |
433 | merge_type=merge_type, from_revision=from_revision) |
434 | |
435 | === modified file 'import_uncommitted.py' |
436 | --- import_uncommitted.py 2023-01-19 10:51:00 +0000 |
437 | +++ import_uncommitted.py 2023-01-27 18:04:28 +0000 |
438 | @@ -575,9 +575,10 @@ |
439 | except MalformedTransform as e: |
440 | report_fatal('malformed-transform', str(e)) |
441 | return 1 |
442 | - except ConflictsInTree as e: |
443 | + except ConflictsInTree: |
444 | report_fatal( |
445 | - 'merge-conflicts', "Merging uncommitted changes resulted in conflicts.", |
446 | + 'merge-conflicts', |
447 | + "Merging uncommitted changes resulted in conflicts.", |
448 | transient=False) |
449 | return 1 |
450 | |
451 | |
452 | === modified file 'merge_package.py' |
453 | --- merge_package.py 2023-01-12 11:16:09 +0000 |
454 | +++ merge_package.py 2023-01-27 18:04:28 +0000 |
455 | @@ -80,8 +80,8 @@ |
456 | None, uver) |
457 | if list(upstream_revids.keys()) != [None]: |
458 | raise MultipleUpstreamTarballsNotSupported() |
459 | - upstream_revid = upstream_revids[None] |
460 | - return (Version(uver), upstream_revid) |
461 | + upstream_revid, upstream_subpath = upstream_revids[None] |
462 | + return (Version(uver), upstream_revid, upstream_subpath) |
463 | |
464 | |
465 | def fix_ancestry_as_needed(tree, source, source_revid=None): |
466 | @@ -137,10 +137,14 @@ |
467 | with tree.lock_write(): |
468 | # "Unpack" the upstream versions and revision ids for the merge |
469 | # source and target branch respectively. |
470 | - (us_ver, us_revid) = _upstream_version_data(source, source_revid) |
471 | - (ut_ver, ut_revid) = _upstream_version_data( |
472 | + (us_ver, us_revid, us_subpath) = _upstream_version_data( |
473 | + source, source_revid) |
474 | + (ut_ver, ut_revid, ut_subpath) = _upstream_version_data( |
475 | target, target.last_revision()) |
476 | |
477 | + if us_subpath or ut_subpath: |
478 | + raise Exception("subpaths not yet supported") |
479 | + |
480 | # Did the upstream branches of the merge source/target diverge? |
481 | graph = source.repository.get_graph(target.repository) |
482 | upstreams_diverged = (len(graph.heads([us_revid, ut_revid])) > 1) |
483 | @@ -156,7 +160,8 @@ |
484 | dir=os.path.join(tree.basedir, '..')) as tempdir: |
485 | # Extract the merge target's upstream tree into a temporary |
486 | # directory. |
487 | - db.extract_upstream_tree({None: ut_revid}, tempdir) |
488 | + db.extract_upstream_tree( |
489 | + {None: (ut_revid, ut_subpath)}, tempdir) |
490 | tmp_target_utree = db.pristine_upstream_tree |
491 | |
492 | # Merge upstream branch tips to obtain a shared upstream |
493 | |
494 | === modified file 'merge_upstream.py' |
495 | --- merge_upstream.py 2022-10-16 17:18:34 +0000 |
496 | +++ merge_upstream.py 2023-01-27 18:04:28 +0000 |
497 | @@ -108,7 +108,7 @@ |
498 | committer: Committer string to use |
499 | files_excluded: Files to exclude |
500 | Returns: |
501 | - list with (component, tag, revid, pristine_tar_imported) |
502 | + list with (component, tag, revid, pristine_tar_imported, subpath) |
503 | tuples |
504 | """ |
505 | db = DistributionBranch(tree.branch, tree.branch, tree=tree) |
506 | @@ -142,7 +142,7 @@ |
507 | |
508 | |
509 | def do_merge( |
510 | - tree, subpath, tarball_filenames, package, version, |
511 | + tree, tarball_filenames, package, version, |
512 | current_version, upstream_branch, upstream_revisions, merge_type=None, |
513 | force=False, force_pristine_tar=False, committer=None, |
514 | files_excluded=None): |
515 | @@ -242,12 +242,12 @@ |
516 | def get_existing_imported_upstream_revids( |
517 | upstream_source, package, new_upstream_version): |
518 | imported_revids = [] |
519 | - for component, revid in upstream_source.version_as_revisions( |
520 | - package, new_upstream_version |
521 | - ).items(): |
522 | + for (component, |
523 | + (revid, subpath)) in upstream_source.version_as_revisions( |
524 | + package, new_upstream_version).items(): |
525 | upstream_tag = upstream_source.tag_name( |
526 | new_upstream_version, component |
527 | ) |
528 | imported_revids.append( |
529 | - (component, upstream_tag, revid, None)) |
530 | + (component, upstream_tag, revid, None, subpath)) |
531 | return imported_revids |
532 | |
533 | === modified file 'move_orphaned.py' |
534 | --- move_orphaned.py 2023-01-12 11:16:09 +0000 |
535 | +++ move_orphaned.py 2023-01-27 18:04:28 +0000 |
536 | @@ -19,6 +19,7 @@ |
537 | import json |
538 | import logging |
539 | import os |
540 | +import sys |
541 | from urllib.parse import urlparse |
542 | |
543 | import breezy.bzr # noqa: F401 |
544 | @@ -372,6 +373,8 @@ |
545 | report_fatal( |
546 | "formatting-unpreservable", |
547 | "unable to preserve formatting while editing %s" % e.path) |
548 | + if hasattr(e, 'diff'): |
549 | + sys.stderr.writelines(e.diff()) |
550 | return 1 |
551 | except (ChangeConflict, GeneratedFile) as e: |
552 | report_fatal( |
553 | @@ -409,5 +412,4 @@ |
554 | |
555 | |
556 | if __name__ == '__main__': |
557 | - import sys |
558 | sys.exit(main(sys.argv[1:])) |
559 | |
560 | === modified file 'new_upstream.py' |
561 | --- new_upstream.py 2023-01-12 11:16:09 +0000 |
562 | +++ new_upstream.py 2023-01-27 18:04:28 +0000 |
563 | @@ -259,6 +259,10 @@ |
564 | self.new_upstream_version = new_upstream_version |
565 | |
566 | |
567 | +class MergingUpstreamSubpathUnsupported(Exception): |
568 | + """Merging an upstream branch with subpath is not yet supported.""" |
569 | + |
570 | + |
571 | RELEASE_BRANCH_NAME = "new-upstream-release" |
572 | SNAPSHOT_BRANCH_NAME = "new-upstream-snapshot" |
573 | DEFAULT_DISTRIBUTION = "unstable" |
574 | @@ -417,16 +421,16 @@ |
575 | |
576 | def find_new_upstream( # noqa: C901 |
577 | tree, |
578 | - subpath, |
579 | + subpath: str, |
580 | config, |
581 | package, |
582 | - location=None, |
583 | + location: Optional[str] = None, |
584 | old_upstream_version=None, |
585 | new_upstream_version=None, |
586 | - trust_package=False, |
587 | + trust_package: bool = False, |
588 | version_kind: str = "release", |
589 | - allow_ignore_upstream_branch=False, |
590 | - top_level=False, |
591 | + allow_ignore_upstream_branch: bool = False, |
592 | + top_level: bool = False, |
593 | create_dist=None, |
594 | include_upstream_history: Optional[bool] = None, |
595 | force_big_version_jump: bool = False, |
596 | @@ -474,16 +478,14 @@ |
597 | upstream_subpath = None # noqa: F841 |
598 | |
599 | if upstream_branch is not None: |
600 | - if upstream_subpath: |
601 | - raise Exception( |
602 | - 'merging from upstream with subpath not yet supported') |
603 | try: |
604 | upstream_branch_source = UpstreamBranchSource.from_branch( |
605 | upstream_branch, |
606 | config=config, |
607 | local_dir=tree.controldir, |
608 | create_dist=create_dist, |
609 | - version_kind=version_kind |
610 | + version_kind=version_kind, |
611 | + subpath=upstream_subpath, |
612 | ) |
613 | except InvalidHttpResponse as e: |
614 | raise UpstreamBranchUnavailable(upstream_branch_location, str(e)) |
615 | @@ -961,7 +963,6 @@ |
616 | try: |
617 | conflicts, imported_revids = do_merge( |
618 | tree, |
619 | - subpath, |
620 | tarball_filenames, |
621 | package, |
622 | str(new_upstream_version), |
623 | @@ -1506,6 +1507,10 @@ |
624 | upstream_version=e.new_upstream_version, transient=False |
625 | ) |
626 | return 1 |
627 | + except MergingUpstreamSubpathUnsupported as e: |
628 | + report_fatal( |
629 | + "unsupported-merging-upstream-with-subpath", |
630 | + str(e), transient=False) |
631 | except WatchSyntaxError as e: |
632 | report_fatal('watch-syntax-error', str(e), transient=False) |
633 | return 1 |
634 | |
635 | === modified file 'revspec.py' |
636 | --- revspec.py 2022-10-15 11:52:18 +0000 |
637 | +++ revspec.py 2023-01-27 18:04:28 +0000 |
638 | @@ -109,7 +109,7 @@ |
639 | get_pristine_tar_source(tree, branch), |
640 | ]) |
641 | try: |
642 | - revision_id = upstream_source.version_as_revisions( |
643 | + revision_id, subpath = upstream_source.version_as_revisions( |
644 | cl.package, version_spec)[None] |
645 | return RevisionInfo.from_revision_id( |
646 | branch, revision_id) |
647 | |
648 | === modified file 'tests/blackbox/test_merge_upstream.py' |
649 | --- tests/blackbox/test_merge_upstream.py 2023-01-12 11:16:09 +0000 |
650 | +++ tests/blackbox/test_merge_upstream.py 2023-01-27 18:04:28 +0000 |
651 | @@ -99,7 +99,7 @@ |
652 | [(self.tar.tarball, None, md5sum_filename(self.tar.tarball))], |
653 | "foo", |
654 | str(self.tar.version), |
655 | - {None: [tree.branch.last_revision()]}) |
656 | + {None: [(tree.branch.last_revision(), "")]}) |
657 | package_builder = SourcePackageBuilder( |
658 | "foo", str(self.tar.version)+"-1") |
659 | package_builder.add_default_control() |
660 | |
661 | === modified file 'tests/test_config.py' |
662 | --- tests/test_config.py 2023-01-12 14:05:53 +0000 |
663 | +++ tests/test_config.py 2023-01-27 18:04:28 +0000 |
664 | @@ -23,7 +23,6 @@ |
665 | from ..config import ( |
666 | BUILD_TYPE_MERGE, |
667 | DebBuildConfig, |
668 | - UpstreamMetadataSyntaxError, |
669 | ) |
670 | from . import TestCaseWithTransport |
671 | |
672 | |
673 | === modified file 'tests/test_import_dsc.py' |
674 | --- tests/test_import_dsc.py 2023-01-12 11:16:09 +0000 |
675 | +++ tests/test_import_dsc.py 2023-01-27 18:04:28 +0000 |
676 | @@ -264,7 +264,7 @@ |
677 | self.assertEqual( |
678 | db.pristine_upstream_source.version_as_revisions( |
679 | "package", version), |
680 | - {None: revid}) |
681 | + {None: (revid, "")}) |
682 | |
683 | def test_contained_versions(self): |
684 | db = self.db1 |
685 | @@ -337,7 +337,7 @@ |
686 | db.tag_version(version1) |
687 | self.assertEqual( |
688 | db.get_parents([version2, version1]), |
689 | - [(db, version1, revid1)]) |
690 | + [(db, version1, revid1, "")]) |
691 | |
692 | def test_get_parents_merge_from_lesser(self): |
693 | """Merge with same upstream version gives merged as second parent.""" |
694 | @@ -352,8 +352,8 @@ |
695 | # test is that revid1 is second parent |
696 | self.assertEqual( |
697 | self.db2.get_parents(versions), |
698 | - [(self.db2, version2, revid2), |
699 | - (self.db1, version1, revid1)]) |
700 | + [(self.db2, version2, revid2, ""), |
701 | + (self.db1, version1, revid1, "")]) |
702 | |
703 | def test_get_parents_merge_from_greater(self): |
704 | """Merge from greater is same as merge from lesser.""" |
705 | @@ -368,8 +368,8 @@ |
706 | # test is that revid2 is second parent |
707 | self.assertEqual( |
708 | self.db1.get_parents(versions), [ |
709 | - (self.db1, version1, revid1), |
710 | - (self.db2, version2, revid2)]) |
711 | + (self.db1, version1, revid1, ""), |
712 | + (self.db2, version2, revid2, "")]) |
713 | |
714 | def test_get_parents_merge_from_two_lesser(self): |
715 | """Should use greatest lesser when two candidates.""" |
716 | @@ -386,8 +386,8 @@ |
717 | # test is that revid2 and not revid1 is second parent |
718 | self.assertEqual( |
719 | self.db3.get_parents(versions), |
720 | - [(self.db3, version2, revid3), |
721 | - (self.db2, version1, revid2)]) |
722 | + [(self.db3, version2, revid3, ""), |
723 | + (self.db2, version1, revid2, "")]) |
724 | |
725 | def test_get_parents_merge_from_two_greater(self): |
726 | """Should use least greater when two candidates.""" |
727 | @@ -404,8 +404,8 @@ |
728 | # test is that revid2 and not revid3 is second parent |
729 | self.assertEqual( |
730 | self.db1.get_parents(versions), |
731 | - [(self.db1, version1, revid1), |
732 | - (self.db2, version2, revid2)]) |
733 | + [(self.db1, version1, revid1, ""), |
734 | + (self.db2, version2, revid2, "")]) |
735 | |
736 | def test_get_parents_merge_multiple_from_greater(self): |
737 | """More than two parents correctly ordered.""" |
738 | @@ -423,8 +423,9 @@ |
739 | # test is that revid2 is second, revid3 is third |
740 | self.assertEqual( |
741 | self.db1.get_parents(versions), |
742 | - [(self.db1, version1, revid1), (self.db2, version2, revid2), |
743 | - (self.db3, version3, revid3)]) |
744 | + [(self.db1, version1, revid1, ""), |
745 | + (self.db2, version2, revid2, ""), |
746 | + (self.db3, version3, revid3, "")]) |
747 | |
748 | def test_get_parents_sync_when_diverged(self): |
749 | version1 = Version("0.1-1") |
750 | @@ -442,8 +443,8 @@ |
751 | # and the Debian upload as the second parent. |
752 | self.assertEqual( |
753 | self.db2.get_parents(versions), |
754 | - [(self.db2, version2, revid2), |
755 | - (self.db1, version3, revid3)]) |
756 | + [(self.db2, version2, revid2, ""), |
757 | + (self.db1, version3, revid3, "")]) |
758 | |
759 | def test_get_parents_skipped_version(self): |
760 | version1 = Version("0.1-1") |
761 | @@ -456,7 +457,7 @@ |
762 | versions = [version3, version2, version1] |
763 | self.assertEqual( |
764 | self.db2.get_parents(versions), |
765 | - [(self.db2, version2, revid2)]) |
766 | + [(self.db2, version2, revid2, "")]) |
767 | |
768 | def test_get_parents_with_upstream_first_version(self): |
769 | db = self.db1 |
770 | @@ -466,14 +467,14 @@ |
771 | self.assertEqual( |
772 | db.get_parents_with_upstream( |
773 | "package", version1, [version1], None), |
774 | - [up_revid]) |
775 | + [(up_revid, "")]) |
776 | db = self.db2 |
777 | self.up_tree2.pull(self.up_tree1.branch) |
778 | self.tag_upstream_version(db, version1.upstream_version) |
779 | self.assertEqual( |
780 | db.get_parents_with_upstream( |
781 | "package", version1, [version1], None), |
782 | - [up_revid]) |
783 | + [(up_revid, "")]) |
784 | |
785 | def test_get_parents_with_upstream_second_version(self): |
786 | db = self.db1 |
787 | @@ -485,7 +486,7 @@ |
788 | self.tag_upstream_version(db, version1.upstream_version) |
789 | # No upstream parent |
790 | self.assertEqual(db.get_parents_with_upstream( |
791 | - "package", version2, [version2, version1], None), [revid1]) |
792 | + "package", version2, [version2, version1], None), [(revid1, "")]) |
793 | |
794 | def test_get_parents_with_upstream_merge_from_lesser(self): |
795 | version1 = Version("0.1-1") |
796 | @@ -502,7 +503,7 @@ |
797 | versions = [version3, version1, version2] |
798 | # No upstream parent |
799 | self.assertEqual(self.db2.get_parents_with_upstream( |
800 | - "package", version3, versions, None), [revid2, revid1]) |
801 | + "package", version3, versions, None), [(revid2, ""), (revid1, "")]) |
802 | |
803 | def test_get_parents_with_upstream_merge_from_greater(self): |
804 | version1 = Version("0.1-1") |
805 | @@ -519,7 +520,7 @@ |
806 | versions = [version3, version2, version1] |
807 | # No upstream parent |
808 | self.assertEqual(self.db1.get_parents_with_upstream( |
809 | - "package", version3, versions, None), [revid1, revid2]) |
810 | + "package", version3, versions, None), [(revid1, ""), (revid2, "")]) |
811 | |
812 | def test_get_parents_with_upstream_new_upstream_import(self): |
813 | version1 = Version("0.1-1") |
814 | @@ -535,7 +536,8 @@ |
815 | versions = [version2, version1] |
816 | # Upstream parent as it is new upstream version |
817 | self.assertEqual(self.db2.get_parents_with_upstream( |
818 | - "package", version2, versions, None), [revid1, up_revid2]) |
819 | + "package", version2, versions, None), |
820 | + [(revid1, ""), (up_revid2, "")]) |
821 | |
822 | def test_get_parents_merge_new_upstream_from_lesser(self): |
823 | version1 = Version("0.1-1") |
824 | @@ -559,7 +561,7 @@ |
825 | versions = [version4, version3, version2, version1] |
826 | # no upstream parent as the lesser branch has already merged it |
827 | self.assertEqual(self.db2.get_parents_with_upstream( |
828 | - "package", version4, versions, None), [revid2, revid3]) |
829 | + "package", version4, versions, None), [(revid2, ""), (revid3, "")]) |
830 | |
831 | def test_get_parents_with_upstream_force_upstream(self): |
832 | version1 = Version("0.1-1") |
833 | @@ -575,7 +577,7 @@ |
834 | # upstream parent, but we are requiring one. |
835 | self.assertEqual(self.db2.get_parents_with_upstream( |
836 | "package", version2, versions, None, force_upstream_parent=True), |
837 | - [revid1, up_revid2]) |
838 | + [(revid1, ""), (up_revid2, "")]) |
839 | |
840 | def test_get_parents_with_upstream_sync_when_diverged(self): |
841 | version1 = Version("0.1-1") |
842 | @@ -595,7 +597,7 @@ |
843 | # This is a sync but we are diverged so we should get two |
844 | # parents |
845 | self.assertEqual(self.db2.get_parents_with_upstream( |
846 | - "package", version3, versions, None), [revid2, revid3]) |
847 | + "package", version3, versions, None), [(revid2, ""), (revid3, "")]) |
848 | |
849 | def test_get_parents_with_upstream_sync_new_upstream(self): |
850 | version1 = Version("0.1-1") |
851 | @@ -618,7 +620,7 @@ |
852 | # parents. There should be no upstream as the synced |
853 | # version will already have it. |
854 | self.assertEqual(self.db2.get_parents_with_upstream( |
855 | - "package", version3, versions, None), [revid2, revid3]) |
856 | + "package", version3, versions, None), [(revid2, ""), (revid3, "")]) |
857 | |
858 | def test_get_parents_with_upstream_sync_new_upstream_force(self): |
859 | version1 = Version("0.1-1") |
860 | @@ -646,7 +648,7 @@ |
861 | # TODO: should the upstream parent be second or third? |
862 | self.assertEqual(self.db2.get_parents_with_upstream( |
863 | "package", version3, versions, None, force_upstream_parent=True), |
864 | - [revid2, up_revid3, revid3]) |
865 | + [(revid2, ""), (up_revid3, ""), (revid3, "")]) |
866 | |
867 | def test_branch_to_pull_version_from(self): |
868 | """Test the check for pulling from a branch. |
869 | @@ -774,7 +776,7 @@ |
870 | self.assertEqual(self.db2.revid_of_version(version), revid) |
871 | self.assertEqual( |
872 | self.db2.pristine_upstream_source.version_as_revisions( |
873 | - "package", version.upstream_version), {None: up_revid}) |
874 | + "package", version.upstream_version), {None: (up_revid, "")}) |
875 | |
876 | def test_pull_from_lesser_branch_with_upstream(self): |
877 | version = Version("0.1-1") |
878 | @@ -791,7 +793,7 @@ |
879 | self.assertEqual(self.db2.revid_of_version(version), revid) |
880 | self.assertEqual( |
881 | self.db2.pristine_upstream_source.version_as_revisions( |
882 | - "package", version.upstream_version), {None: up_revid}) |
883 | + "package", version.upstream_version), {None: (up_revid, "")}) |
884 | |
885 | def test_pull_upstream_from_branch(self): |
886 | version = "0.1" |
887 | @@ -804,7 +806,7 @@ |
888 | self.assertEqual( |
889 | self.db2.pristine_upstream_source.version_as_revisions( |
890 | "package", version), |
891 | - {None: up_revid}) |
892 | + {None: (up_revid, "")}) |
893 | |
894 | def check_changes(self, changes, added=[], removed=[], modified=[], |
895 | renamed=[]): |
896 | @@ -874,7 +876,7 @@ |
897 | self.assertEqual(revno, 1) |
898 | self.assertEqual( |
899 | self.db1.pristine_upstream_source.version_as_revisions( |
900 | - "package", version.upstream_version), {None: rev_id}) |
901 | + "package", version.upstream_version), {None: (rev_id, "")}) |
902 | rev = branch.repository.get_revision(rev_id) |
903 | self.assertEqual( |
904 | rev.message, |
905 | @@ -909,7 +911,7 @@ |
906 | write_to_file(os.path.join(basedir, "NEWS"), b"") |
907 | self.db1.import_upstream( |
908 | basedir, "package", version2.upstream_version, |
909 | - {None: [self.up_tree1.branch.last_revision()]}, |
910 | + {None: [(self.up_tree1.branch.last_revision(), "")]}, |
911 | [(None, None, None)]) |
912 | tree = self.up_tree1 |
913 | branch = tree.branch |
914 | @@ -918,7 +920,7 @@ |
915 | self.assertEqual( |
916 | self.db1.pristine_upstream_source.version_as_revisions( |
917 | "package", version2.upstream_version), |
918 | - {None: rev_id}) |
919 | + {None: (rev_id, "")}) |
920 | rev = branch.repository.get_revision(rev_id) |
921 | self.assertEqual( |
922 | rev.message, |
923 | @@ -955,7 +957,7 @@ |
924 | self.assertEqual(revno, 1) |
925 | self.assertEqual( |
926 | self.db1.pristine_upstream_source.version_as_revisions( |
927 | - "package", version.upstream_version), {None: rev_id}) |
928 | + "package", version.upstream_version), {None: (rev_id, "")}) |
929 | rev = branch.repository.get_revision(rev_id) |
930 | self.assertEqual( |
931 | rev.message, |
932 | @@ -987,7 +989,7 @@ |
933 | self.assertEqual(revno, 1) |
934 | self.assertEqual( |
935 | self.db1.pristine_upstream_source.version_as_revisions( |
936 | - "package", version.upstream_version), {None: rev_id}) |
937 | + "package", version.upstream_version), {None: (rev_id, "")}) |
938 | rev = branch.repository.get_revision(rev_id) |
939 | self.assertEqual( |
940 | rev.message, |
941 | @@ -1037,7 +1039,7 @@ |
942 | self.assertEqual(revno, 1) |
943 | self.assertEqual( |
944 | self.db1.pristine_upstream_source.version_as_revisions( |
945 | - "package", version.upstream_version), {None: rev_id}) |
946 | + "package", version.upstream_version), {None: (rev_id, "")}) |
947 | rev = branch.repository.get_revision(rev_id) |
948 | self.assertEqual( |
949 | rev.message, |
950 | @@ -1491,7 +1493,7 @@ |
951 | self.assertEqual( |
952 | self.db1.pristine_upstream_source.version_as_revisions( |
953 | "package", version1.upstream_version), |
954 | - {None: up_rh1[0]}) |
955 | + {None: (up_rh1[0], "")}) |
956 | self.tree1.lock_read() |
957 | self.addCleanup(self.tree1.unlock) |
958 | self.assertFalse(self.db1.is_version_native(version1)) |
959 | @@ -1542,11 +1544,11 @@ |
960 | self.assertEqual( |
961 | self.db1.pristine_upstream_source.version_as_revisions( |
962 | "package", version1.upstream_version), |
963 | - {None: up_rh1[0]}) |
964 | + {None: (up_rh1[0], "")}) |
965 | self.assertEqual( |
966 | self.db1.pristine_upstream_source.version_as_revisions( |
967 | "package", version3.upstream_version), |
968 | - {None: up_rh1[1]}) |
969 | + {None: (up_rh1[1], "")}) |
970 | self.tree1.lock_read() |
971 | self.addCleanup(self.tree1.unlock) |
972 | self.assertFalse(self.db1.is_version_native(version1)) |
973 | @@ -1596,11 +1598,11 @@ |
974 | self.assertEqual( |
975 | self.db1.pristine_upstream_source.version_as_revisions( |
976 | "package", version1.upstream_version), |
977 | - {None: up_rh1[0]}) |
978 | + {None: (up_rh1[0], "")}) |
979 | self.assertEqual( |
980 | self.db1.pristine_upstream_source.version_as_revisions( |
981 | "package", version3.upstream_version), |
982 | - {None: up_rh1[1]}) |
983 | + {None: (up_rh1[1], "")}) |
984 | self.tree1.lock_read() |
985 | self.addCleanup(self.tree1.unlock) |
986 | self.assertFalse(self.db1.is_version_native(version1)) |
987 | @@ -1707,7 +1709,7 @@ |
988 | conflicts, imported_revids = db.merge_upstream( |
989 | [(tarball_filename, None)], "foo", "0.2", "0.1", |
990 | upstream_branch=upstream_tree.branch, |
991 | - upstream_revisions={None: upstream_rev}) |
992 | + upstream_revisions={None: (upstream_rev, "")}) |
993 | self.assertFalse(conflicts) |
994 | |
995 | def test_merge_upstream_initial_with_removed_debian(self): |
996 | @@ -1745,7 +1747,7 @@ |
997 | conflicts, imported_revids = db.merge_upstream( |
998 | [(tarball_filename, None)], "foo", "0.2", "0.1", |
999 | upstream_branch=upstream_tree.branch, |
1000 | - upstream_revisions={None: upstream_rev}) |
1001 | + upstream_revisions={None: (upstream_rev, "")}) |
1002 | # ./debian conflicts. |
1003 | self.assertEqual(3, len(conflicts)) |
1004 | |
1005 | @@ -1789,7 +1791,7 @@ |
1006 | [(builder.tar_name(), None)], "package", str(version2), |
1007 | version1.upstream_version, |
1008 | upstream_branch=upstream_tree.branch, |
1009 | - upstream_revisions={None: upstream_rev}) |
1010 | + upstream_revisions={None: (upstream_rev, "")}) |
1011 | revno1, rev_id1 = tree.branch.last_revision_info() |
1012 | self.assertEqual(2, revno1) |
1013 | packaging_upstream_tip = tree.get_parent_ids()[1] |
1014 | @@ -1866,7 +1868,7 @@ |
1015 | version2.upstream_version, |
1016 | version1.upstream_version, |
1017 | upstream_branch=upstream_tree.branch, |
1018 | - upstream_revisions={None: upstream_rev2}) |
1019 | + upstream_revisions={None: (upstream_rev2, "")}) |
1020 | self.assertEqual(b"a-id", tree.path2id("b")) |
1021 | |
1022 | def test_merge_upstream_rename_on_top(self): |
1023 | @@ -1904,7 +1906,7 @@ |
1024 | version2.upstream_version, |
1025 | version1.upstream_version, |
1026 | upstream_branch=upstream_tree.branch, |
1027 | - upstream_revisions={None: upstream_rev2}) |
1028 | + upstream_revisions={None: (upstream_rev2, "")}) |
1029 | self.assertEqual(b"a-id", tree.path2id("b")) |
1030 | |
1031 | def test_merge_upstream_rename_in_packaging_branch(self): |
1032 | |
1033 | === modified file 'tests/test_upstream.py' |
1034 | --- tests/test_upstream.py 2023-01-12 11:16:09 +0000 |
1035 | +++ tests/test_upstream.py 2023-01-27 18:04:28 +0000 |
1036 | @@ -489,10 +489,10 @@ |
1037 | config=config) |
1038 | revid2 = self.tree.commit("msg") |
1039 | self.assertEqual( |
1040 | - revid2, |
1041 | + (revid2, ""), |
1042 | source.version_as_revision("foo", "2.1+bzr2")) |
1043 | self.assertEqual( |
1044 | - {None: revid1}, source.version_as_revisions("foo", "2.1")) |
1045 | + {None: (revid1, "")}, source.version_as_revisions("foo", "2.1")) |
1046 | |
1047 | def test_version_as_revision(self): |
1048 | revid1 = self.tree.commit("msg") |
1049 | @@ -506,8 +506,9 @@ |
1050 | config=config) |
1051 | revid2 = self.tree.commit("msg") |
1052 | self.assertEqual( |
1053 | - revid2, source.version_as_revision("foo", "2.1+bzr2")) |
1054 | - self.assertEqual(revid1, source.version_as_revision("foo", "2.1")) |
1055 | + (revid2, ""), source.version_as_revision("foo", "2.1+bzr2")) |
1056 | + self.assertEqual( |
1057 | + (revid1, ""), source.version_as_revision("foo", "2.1")) |
1058 | |
1059 | def test_version_as_revision_no_revspec(self): |
1060 | # There is no relevant revspec known |
1061 | @@ -635,8 +636,9 @@ |
1062 | self.assertIs(None, source._upstream_branch) |
1063 | revid2 = self.tree.commit("msg") |
1064 | self.assertEqual( |
1065 | - revid2, source.version_as_revision("foo", "2.1+bzr2")) |
1066 | - self.assertEqual(revid1, source.version_as_revision("foo", "2.1")) |
1067 | + (revid2, ""), source.version_as_revision("foo", "2.1+bzr2")) |
1068 | + self.assertEqual( |
1069 | + (revid1, ""), source.version_as_revision("foo", "2.1")) |
1070 | self.assertIsNot(None, source._upstream_branch) |
1071 | |
1072 | |
1073 | @@ -1073,14 +1075,14 @@ |
1074 | revid1 = self.tree.commit("msg") |
1075 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) |
1076 | self.assertEqual( |
1077 | - {None: revid1}, |
1078 | + {None: (revid1, "")}, |
1079 | self.source.version_as_revisions(None, "2.1")) |
1080 | |
1081 | def test_version_component_as_revision(self): |
1082 | revid1 = self.tree.commit("msg") |
1083 | self.tree.branch.tags.set_tag("upstream-2.1/lib", revid1) |
1084 | self.assertEqual( |
1085 | - revid1, |
1086 | + (revid1, ""), |
1087 | self.source.version_component_as_revision(None, "2.1", "lib")) |
1088 | |
1089 | # git doesn't support subtags |
1090 | @@ -1091,7 +1093,7 @@ |
1091 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) |
1092 | self.tree.branch.tags.set_tag("upstream-2.1/lib", revid2) |
1093 | self.assertEqual( |
1094 | - {None: revid1, "lib": revid2}, |
1095 | + {None: (revid1, ""), "lib": (revid2, "")}, |
1096 | self.source.version_as_revisions(None, "2.1", [ |
1097 | ("upstream_2.1.orig.tar.gz", None, "somemd5sum"), |
1098 | ("upstream_2.1.orig-lib.tar.gz", "lib", "othermd5sum")])) |
1099 | @@ -1177,14 +1179,14 @@ |
1100 | revid1 = self.tree.commit("msg") |
1101 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) |
1102 | self.assertEqual( |
1103 | - {None: revid1}, |
1104 | + {None: (revid1, "")}, |
1105 | self.source.version_as_revisions(None, "2.1")) |
1106 | |
1107 | def test_version_component_as_revision(self): |
1108 | revid1 = self.tree.commit("msg") |
1109 | self.tree.branch.tags.set_tag("upstream-2.1/lib", revid1) |
1110 | self.assertEqual( |
1111 | - revid1, |
1112 | + (revid1, ""), |
1113 | self.source.version_component_as_revision(None, "2.1", "lib")) |
1114 | |
1115 | def test_version_as_revisions(self): |
1116 | @@ -1193,7 +1195,7 @@ |
1117 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) |
1118 | self.tree.branch.tags.set_tag("upstream-2.1/lib", revid2) |
1119 | self.assertEqual( |
1120 | - {None: revid1, "lib": revid2}, |
1121 | + {None: (revid1, ""), "lib": (revid2, "")}, |
1122 | self.source.version_as_revisions(None, "2.1", [ |
1123 | ("upstream_2.1.orig.tar.gz", None, "somemd5sum"), |
1124 | ("upstream_2.1.orig-lib.tar.gz", "lib", "othermd5sum")])) |
1125 | |
1126 | === modified file 'upstream/__init__.py' |
1127 | --- upstream/__init__.py 2023-01-12 11:16:09 +0000 |
1128 | +++ upstream/__init__.py 2023-01-27 18:04:28 +0000 |
1129 | @@ -105,7 +105,7 @@ |
1130 | |
1131 | def version_as_revisions( |
1132 | self, package: str, version: str, |
1133 | - tarballs=None) -> dict[Optional[str], RevisionID]: |
1134 | + tarballs=None) -> dict[Optional[str], tuple[RevisionID, str]]: |
1135 | """Lookup the revision ids for a particular version. |
1136 | |
1137 | :param package: Package name |
1138 | |
1139 | === modified file 'upstream/branch.py' |
1140 | --- upstream/branch.py 2023-01-12 11:16:09 +0000 |
1141 | +++ upstream/branch.py 2023-01-27 18:04:28 +0000 |
1142 | @@ -51,7 +51,7 @@ |
1143 | ) |
1144 | from ....memorybranch import MemoryBranch |
1145 | from ..repack_tarball import get_filetype, repack_tarball |
1146 | -from ....revision import NULL_REVISION |
1147 | +from ....revision import NULL_REVISION, RevisionID |
1148 | from ....revisionspec import RevisionSpec |
1149 | from ....trace import note, mutter, warning |
1150 | from ....tree import Tree |
1151 | @@ -409,7 +409,7 @@ |
1152 | |
1153 | def __init__(self, upstream_branch, upstream_revision_map=None, |
1154 | config=None, actual_branch=None, create_dist=None, |
1155 | - other_repository=None, version_kind="auto"): |
1156 | + other_repository=None, version_kind="auto", subpath=None): |
1157 | self.upstream_branch = upstream_branch |
1158 | self._actual_branch = actual_branch or upstream_branch |
1159 | self.create_dist = create_dist |
1160 | @@ -417,13 +417,16 @@ |
1161 | self.version_kind = version_kind |
1162 | self.other_repository = other_repository |
1163 | self.upstream_revision_map = {} |
1164 | + if subpath is None: |
1165 | + subpath = "" |
1166 | + self.subpath = subpath |
1167 | if upstream_revision_map is not None: |
1168 | self.upstream_revision_map.update(upstream_revision_map.items()) |
1169 | |
1170 | @classmethod |
1171 | def from_branch(cls, upstream_branch, upstream_revision_map=None, |
1172 | config=None, local_dir=None, create_dist=None, |
1173 | - version_kind="auto"): |
1174 | + version_kind="auto", subpath: Optional[str] = None): |
1175 | """Create a new upstream branch source from a branch. |
1176 | |
1177 | This will optionally fetch into a local directory. |
1178 | @@ -449,7 +452,8 @@ |
1179 | actual_branch=actual_branch, create_dist=create_dist, |
1180 | version_kind=version_kind) |
1181 | |
1182 | - def version_as_revision(self, package, version, tarballs=None): |
1183 | + def version_as_revision( |
1184 | + self, package, version, tarballs=None) -> tuple[RevisionID, str]: |
1185 | if version in self.upstream_revision_map: |
1186 | revspec = self.upstream_revision_map[version] |
1187 | else: |
1188 | @@ -458,7 +462,7 @@ |
1189 | if revspec is not None: |
1190 | try: |
1191 | return RevisionSpec.from_string( |
1192 | - revspec).as_revision_id(self.upstream_branch) |
1193 | + revspec).as_revision_id(self.upstream_branch), self.subpath |
1194 | except (InvalidRevisionSpec, NoSuchTag) as e: |
1195 | raise PackageVersionNotPresent(package, version, self) from e |
1196 | else: |
1197 | @@ -466,17 +470,16 @@ |
1198 | note(gettext('No upstream upstream-revision format ' |
1199 | 'specified, trying %s') % revspec) |
1200 | try: |
1201 | - return RevisionSpec.from_string( |
1202 | - revspec).as_revision_id(self.upstream_branch) |
1203 | + return RevisionSpec.from_string(revspec)\ |
1204 | + .as_revision_id(self.upstream_branch), self.subpath |
1205 | except (InvalidRevisionSpec, NoSuchTag): |
1206 | pass |
1207 | - else: |
1208 | - raise PackageVersionNotPresent(package, version, self) |
1209 | + raise PackageVersionNotPresent(package, version, self) |
1210 | raise PackageVersionNotPresent(package, version, self) |
1211 | |
1212 | def revision_tree(self, package, version): |
1213 | - revid = self.version_as_revision(package, version) |
1214 | - return self.upstream_branch.repository.revision_tree(revid) |
1215 | + revid, subpath = self.version_as_revision(package, version) |
1216 | + return self.upstream_branch.repository.revision_tree(revid), subpath |
1217 | |
1218 | def version_as_revisions(self, package, version, tarballs=None): |
1219 | # FIXME: Support multiple upstream locations if there are multiple |
1220 | @@ -536,7 +539,7 @@ |
1221 | graph = self.upstream_branch.repository.get_graph() |
1222 | if since_version is not None: |
1223 | try: |
1224 | - since_revision = self.version_as_revision( |
1225 | + since_revision, _subpath = self.version_as_revision( |
1226 | package, since_version) |
1227 | except PackageVersionNotPresent as e: |
1228 | raise PreviousVersionTagMissing( |
1229 | @@ -574,9 +577,9 @@ |
1230 | getattr(self, '_actual_branch', self.upstream_branch).user_url) |
1231 | with self.upstream_branch.lock_read(): |
1232 | if revisions is not None: |
1233 | - revid = revisions[None] |
1234 | + revid, subpath = revisions[None] |
1235 | else: |
1236 | - revid = self.version_as_revision(package, version) |
1237 | + revid, subpath = self.version_as_revision(package, version) |
1238 | if revid is None: |
1239 | raise PackageVersionNotPresent(package, version, self) |
1240 | if self.other_repository is not None: |
1241 | @@ -590,17 +593,19 @@ |
1242 | rev_tree = self.upstream_branch.repository.revision_tree(revid) |
1243 | if self.create_dist is not None: |
1244 | with tempfile.TemporaryDirectory() as td: |
1245 | - fn = self.create_dist(rev_tree, package, version, td) |
1246 | + fn = self.create_dist( |
1247 | + rev_tree, package, version, td, subpath=subpath) |
1248 | if fn: |
1249 | nfn = new_tarball_name(package, version, fn) |
1250 | repack_tarball(os.path.join(td, fn), nfn, target_dir) |
1251 | return [os.path.join(target_dir, nfn)] |
1252 | - tarball_base = "{}-{}".format(package, version) |
1253 | + tarball_base = f"{package}-{version}" |
1254 | target_filename = self._tarball_path( |
1255 | package, version, None, target_dir) |
1256 | try: |
1257 | export_with_nested( |
1258 | - rev_tree, target_filename, format='tgz', root=tarball_base) |
1259 | + rev_tree, target_filename, format='tgz', root=tarball_base, |
1260 | + subdir=subpath) |
1261 | except UnsupportedOperation as e: |
1262 | note('Not exporting revision from upstream branch: %s', e) |
1263 | raise PackageVersionNotPresent(package, version, self) from e |
1264 | @@ -621,13 +626,16 @@ |
1265 | |
1266 | def __init__(self, upstream_branch_url, upstream_revision_map=None, |
1267 | config=None, create_dist=None, other_repository=None, |
1268 | - version_kind="snapshot"): |
1269 | + version_kind="snapshot", subpath=None): |
1270 | self.upstream_branch_url = upstream_branch_url |
1271 | self.version_kind = version_kind |
1272 | self._upstream_branch = None |
1273 | self.config = config |
1274 | self.create_dist = create_dist |
1275 | self.other_repository = other_repository |
1276 | + if subpath is None: |
1277 | + subpath = "" |
1278 | + self.subpath = subpath |
1279 | if upstream_revision_map is None: |
1280 | self.upstream_revision_map = {} |
1281 | else: |
1282 | |
1283 | === modified file 'upstream/pristinetar.py' |
1284 | --- upstream/pristinetar.py 2023-01-12 11:16:09 +0000 |
1285 | +++ upstream/pristinetar.py 2023-01-27 18:04:28 +0000 |
1286 | @@ -58,7 +58,7 @@ |
1287 | NoSuchTag, |
1288 | NotBranchError, |
1289 | ) |
1290 | -from ....revision import NULL_REVISION |
1291 | +from ....revision import NULL_REVISION, RevisionID |
1292 | from ....trace import ( |
1293 | mutter, |
1294 | note, |
1295 | @@ -360,7 +360,8 @@ |
1296 | |
1297 | def version_component_as_revision( |
1298 | self, package: Optional[str], version: str, |
1299 | - component: Optional[str], md5: Optional[str] = None): |
1300 | + component: Optional[str], |
1301 | + md5: Optional[str] = None) -> tuple[RevisionID, str]: |
1302 | with self.branch.lock_read(): |
1303 | for tag_name in self.possible_tag_names( |
1304 | package, version, component=component): |
1305 | @@ -370,14 +371,14 @@ |
1306 | continue |
1307 | else: |
1308 | if self._has_revision(revid, md5=md5): |
1309 | - return revid |
1310 | + return revid, "" |
1311 | # Note that we don't check *all* possible revids here, |
1312 | # since some of them are branch-local (such as revno:) |
1313 | (git_id, git_date) = git_snapshot_data_from_version(version) |
1314 | if git_id: |
1315 | try: |
1316 | revspec = RevisionSpec.from_string('git:%s' % git_id) |
1317 | - return revspec.as_revision_id(self.branch) |
1318 | + return revspec.as_revision_id(self.branch), "" |
1319 | except (InvalidRevisionSpec, NoSuchTag): |
1320 | pass |
1321 | revid = self._search_for_upstream_version( |
1322 | @@ -388,9 +389,9 @@ |
1323 | "Upstream import of %s lacks a tag. Set one by running: " |
1324 | "brz tag -rrevid:%s %s", version, revid.decode('utf-8'), |
1325 | tag_name) |
1326 | - return revid |
1327 | + return revid, "" |
1328 | try: |
1329 | - return self.branch.tags.lookup_tag(tag_name) |
1330 | + return self.branch.tags.lookup_tag(tag_name), "" |
1331 | except NoSuchTag as e: |
1332 | raise PackageVersionNotPresent(package, version, self) from e |
1333 | |
1334 | @@ -509,12 +510,16 @@ |
1335 | timestamp = timestamp[0] |
1336 | if len(parent_ids) == 0: |
1337 | base_revid = _mod_revision.NULL_REVISION |
1338 | + base_subpath = "" |
1339 | else: |
1340 | - base_revid = parent_ids[0] |
1341 | + base_revid, base_subpath = parent_ids[0] |
1342 | + if base_subpath: |
1343 | + raise Exception('subpaths are not yet supported') |
1344 | basis_tree = tree.branch.repository.revision_tree(base_revid) |
1345 | with tree.lock_write(): |
1346 | builder = tree.branch.get_commit_builder( |
1347 | - parents=parent_ids, revprops=revprops, timestamp=timestamp, |
1348 | + parents=[revid for revid, subpath in parent_ids], |
1349 | + revprops=revprops, timestamp=timestamp, |
1350 | timezone=timezone, committer=committer) |
1351 | try: |
1352 | changes = [c for c in tree.iter_changes(basis_tree) if |
1353 | @@ -534,7 +539,9 @@ |
1354 | return tag_name, revid, delta is not None |
1355 | |
1356 | def fetch_component_tarball(self, package, version, component, target_dir): |
1357 | - revid = self.version_component_as_revision(package, version, component) |
1358 | + revid, subpath = self.version_component_as_revision( |
1359 | + package, version, component) |
1360 | + assert subpath == "" |
1361 | try: |
1362 | rev = self.branch.repository.get_revision(revid) |
1363 | except NoSuchRevision as e: |
1364 | @@ -798,8 +805,11 @@ |
1365 | timestamp = timestamp[0] |
1366 | if len(parent_ids) == 0: |
1367 | base_revid = _mod_revision.NULL_REVISION |
1368 | + base_subpath = "" |
1369 | else: |
1370 | - base_revid = parent_ids[0] |
1371 | + base_revid, base_subpath = parent_ids[0] |
1372 | + if base_subpath: |
1373 | + raise Exception('subpaths not yet supported') |
1374 | basis_tree = tree.branch.repository.revision_tree(base_revid) |
1375 | with tree.lock_write(): |
1376 | builder = tree.branch.get_commit_builder( |
1377 | @@ -937,12 +947,13 @@ |
1378 | (dest_filename, delta_bytes, delta_id, |
1379 | delta_sig) = self.get_pristine_tar_delta(package, version) |
1380 | except PristineTarDeltaAbsent: |
1381 | - revid = self.version_component_as_revision( |
1382 | + revid, subpath = self.version_component_as_revision( |
1383 | package, version, component) |
1384 | tree = self.branch.repository.revision_tree(revid) |
1385 | dest_filename = self._tarball_path( |
1386 | package, version, component, target_dir, format='gz') |
1387 | - export_with_nested(tree, dest_filename, per_file_timestamps=True) |
1388 | + export_with_nested( |
1389 | + tree, dest_filename, per_file_timestamps=True, subdir=subpath) |
1390 | return dest_filename |
1391 | else: |
1392 | dest_filename = os.path.join(target_dir, dest_filename) |