Merge lp:~jelmer/brz-debian/upstream-subpath into lp:brz-debian

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
Reviewer Review Type Date Requested Status
Breezy developers Pending
Review via email: mp+436171@code.launchpad.net

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)

Subscribers

People subscribed via source and target branches

to all changes: