Mercurial > public > mercurial-scm > hg
diff mercurial/commands.py @ 46948:946db89607c8
bundle: support multiple destinations
`hg outgoing` and `hg push` now support multiple destination. We do the same
for `hg bundle`. Various other commands needs this kind of behavior and it
would be create to factor this code out for their usage. However this is an
adventure for another time.
They are some minor change to the tests (in addition to the new test for the
feature):
* one because I updated a message to plurals,
* another one because the error changed, and I actually find it clearer.
Differential Revision: https://phab.mercurial-scm.org/D10414
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 14 Apr 2021 17:02:20 +0200 |
parents | dec31caf5fd6 |
children | 3800a6aafb6f |
line wrap: on
line diff
--- a/mercurial/commands.py Wed Apr 14 14:35:13 2021 +0200 +++ b/mercurial/commands.py Wed Apr 14 17:02:20 2021 +0200 @@ -1531,10 +1531,10 @@ ), ] + remoteopts, - _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]'), + _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]...'), helpcategory=command.CATEGORY_IMPORT_EXPORT, ) -def bundle(ui, repo, fname, dest=None, **opts): +def bundle(ui, repo, fname, *dests, **opts): """create a bundle file Generate a bundle file containing data to be transferred to another @@ -1545,7 +1545,7 @@ all the nodes you specify with --base parameters. Otherwise, hg will assume the repository has all the nodes in destination, or default-push/default if no destination is specified, where destination - is the repository you provide through DEST option. + is the repositories you provide through DEST option. You can change bundle format with the -t/--type option. See :hg:`help bundlespec` for documentation on this format. By default, @@ -1590,9 +1590,9 @@ ) if opts.get(b'all'): - if dest: + if dests: raise error.InputError( - _(b"--all is incompatible with specifying a destination") + _(b"--all is incompatible with specifying destinations") ) if opts.get(b'base'): ui.warn(_(b"ignoring --base because --all was specified\n")) @@ -1605,31 +1605,54 @@ ) if base: - if dest: + if dests: raise error.InputError( - _(b"--base is incompatible with specifying a destination") + _(b"--base is incompatible with specifying destinations") ) common = [repo[rev].node() for rev in base] heads = [repo[r].node() for r in revs] if revs else None outgoing = discovery.outgoing(repo, common, heads) + missing = outgoing.missing + excluded = outgoing.excluded else: - dest = ui.expandpath(dest or b'default-push', dest or b'default') - dest, branches = urlutil.parseurl(dest, opts.get(b'branch')) - other = hg.peer(repo, opts, dest) - revs = [repo[r].hex() for r in revs] - revs, checkout = hg.addbranchrevs(repo, repo, branches, revs) - heads = revs and pycompat.maplist(repo.lookup, revs) or revs - outgoing = discovery.findcommonoutgoing( - repo, - other, - onlyheads=heads, - force=opts.get(b'force'), - portable=True, + missing = set() + excluded = set() + for path in urlutil.get_push_paths(repo, ui, dests): + other = hg.peer(repo, opts, path.rawloc) + if revs is not None: + hex_revs = [repo[r].hex() for r in revs] + else: + hex_revs = None + branches = (path.branch, []) + head_revs, checkout = hg.addbranchrevs( + repo, repo, branches, hex_revs + ) + heads = ( + head_revs + and pycompat.maplist(repo.lookup, head_revs) + or head_revs + ) + outgoing = discovery.findcommonoutgoing( + repo, + other, + onlyheads=heads, + force=opts.get(b'force'), + portable=True, + ) + missing.update(outgoing.missing) + excluded.update(outgoing.excluded) + + if not missing: + scmutil.nochangesfound(ui, repo, not base and excluded) + return 1 + + if heads: + outgoing = discovery.outgoing( + repo, missingroots=missing, ancestorsof=heads ) - - if not outgoing.missing: - scmutil.nochangesfound(ui, repo, not base and outgoing.excluded) - return 1 + else: + outgoing = discovery.outgoing(repo, missingroots=missing) + outgoing.excluded = sorted(excluded) if cgversion == b'01': # bundle1 bversion = b'HG10' + bundlespec.wirecompression