bundle: do not detect --base argument that match nothing as lack of argument stable
authorPierre-Yves David <pierre-yves.david@octobus.net>
Wed, 27 Dec 2023 18:02:26 +0100
branchstable
changeset 51280 c17cf2d51ff4
parent 51279 51021612aea7
child 51308 bf7c24e12fad
bundle: do not detect --base argument that match nothing as lack of argument With the previous version of the code, if --base did not match anything, it will be handled as if no --base was provided and will fallback to using discovery with the default path. This has two issues : - The resulting bundle won't match what the user requested, - if not default path is configured, it will crash. We now properly distinct between the two cases and if the --base query does not find any changeset, we will assume that everything under --rev needs to be sent.
mercurial/commands.py
tests/test-bundle-r.t
--- a/mercurial/commands.py	Wed Dec 27 18:42:13 2023 +0100
+++ b/mercurial/commands.py	Wed Dec 27 18:02:26 2023 +0100
@@ -1592,13 +1592,13 @@
             _(b'packed bundles cannot be produced by "hg bundle"'),
             hint=_(b"use 'hg debugcreatestreamclonebundle'"),
         )
-
+    base_opt = opts.get('base')
     if opts.get('all'):
         if dests:
             raise error.InputError(
                 _(b"--all is incompatible with specifying destinations")
             )
-        if opts.get('base'):
+        if base_opt:
             ui.warn(_(b"ignoring --base because --all was specified\n"))
         if opts.get('exact'):
             ui.warn(_(b"ignoring --exact because --all was specified\n"))
@@ -1608,19 +1608,24 @@
             raise error.InputError(
                 _(b"--exact is incompatible with specifying destinations")
             )
-        if opts.get('base'):
+        if base_opt:
             ui.warn(_(b"ignoring --base because --exact was specified\n"))
         base = repo.revs(b'parents(%ld) - %ld', revs, revs)
         if not base:
             base = [nullrev]
+    elif base_opt:
+        base = logcmdutil.revrange(repo, base_opt)
+        if not base:
+            # base specified, but nothing was selected
+            base = [nullrev]
     else:
-        base = logcmdutil.revrange(repo, opts.get('base'))
+        base = None
     if cgversion not in changegroup.supportedoutgoingversions(repo):
         raise error.Abort(
             _(b"repository does not support bundle version %s") % cgversion
         )
 
-    if base:
+    if base is not None:
         if dests:
             raise error.InputError(
                 _(b"--base is incompatible with specifying destinations")
--- a/tests/test-bundle-r.t	Wed Dec 27 18:42:13 2023 +0100
+++ b/tests/test-bundle-r.t	Wed Dec 27 18:02:26 2023 +0100
@@ -141,14 +141,9 @@
   ignoring --base because --all was specified
   9 changesets found
   $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-with-dest.hg --config paths.default=$TESTTMP/test-3
-  searching for changes (known-bad-output !)
-  1 changesets found (known-bad-output !)
-  5 changesets found (missing-correct-output !)
+  5 changesets found
   $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-no-dest.hg
-  config error: default repository not configured! (known-bad-output !)
-  (see 'hg help config.paths') (known-bad-output !)
-  5 changesets found (missing-correct-output !)
-  [30]
+  5 changesets found
   $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
   1 changesets found