comparison mercurial/commands.py @ 46778:066b8d8f75b8

push: allow to specify multiple destinations I end up needing that on a regular basis and it turn out to be very simple to implement. See documentation and test for details. Differential Revision: https://phab.mercurial-scm.org/D10161
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 10 Mar 2021 05:50:20 +0100
parents 25850879a215
children e2f7b2695ba1
comparison
equal deleted inserted replaced
46777:25850879a215 46778:066b8d8f75b8
5621 False, 5621 False,
5622 _(b'push the changeset as public (EXPERIMENTAL)'), 5622 _(b'push the changeset as public (EXPERIMENTAL)'),
5623 ), 5623 ),
5624 ] 5624 ]
5625 + remoteopts, 5625 + remoteopts,
5626 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'), 5626 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]...'),
5627 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 5627 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5628 helpbasic=True, 5628 helpbasic=True,
5629 ) 5629 )
5630 def push(ui, repo, dest=None, **opts): 5630 def push(ui, repo, *dests, **opts):
5631 """push changes to the specified destination 5631 """push changes to the specified destination
5632 5632
5633 Push changesets from the local repository to the specified 5633 Push changesets from the local repository to the specified
5634 destination. 5634 destination.
5635 5635
5660 bookmark's name. Use the --all-bookmarks option for pushing all 5660 bookmark's name. Use the --all-bookmarks option for pushing all
5661 current bookmarks. 5661 current bookmarks.
5662 5662
5663 Please see :hg:`help urls` for important details about ``ssh://`` 5663 Please see :hg:`help urls` for important details about ``ssh://``
5664 URLs. If DESTINATION is omitted, a default path will be used. 5664 URLs. If DESTINATION is omitted, a default path will be used.
5665
5666 When passed multiple destinations, push will process them one after the
5667 other, but stop should an error occur.
5665 5668
5666 .. container:: verbose 5669 .. container:: verbose
5667 5670
5668 The --pushvars option sends strings to the server that become 5671 The --pushvars option sends strings to the server that become
5669 environment variables prepended with ``HG_USERVAR_``. For example, 5672 environment variables prepended with ``HG_USERVAR_``. For example,
5704 opts.setdefault(b'rev', []).append(b) 5707 opts.setdefault(b'rev', []).append(b)
5705 else: 5708 else:
5706 # if we try to push a deleted bookmark, translate it to null 5709 # if we try to push a deleted bookmark, translate it to null
5707 # this lets simultaneous -r, -b options continue working 5710 # this lets simultaneous -r, -b options continue working
5708 opts.setdefault(b'rev', []).append(b"null") 5711 opts.setdefault(b'rev', []).append(b"null")
5709 if True: 5712
5713 if not dests:
5714 dests = [None]
5715 some_pushed = False
5716 result = 0
5717 for dest in dests:
5710 path = ui.getpath(dest, default=(b'default-push', b'default')) 5718 path = ui.getpath(dest, default=(b'default-push', b'default'))
5711 if not path: 5719 if not path:
5712 raise error.ConfigError( 5720 raise error.ConfigError(
5713 _(b'default repository not configured!'), 5721 _(b'default repository not configured!'),
5714 hint=_(b"see 'hg help config.paths'"), 5722 hint=_(b"see 'hg help config.paths'"),
5751 try: 5759 try:
5752 # push subrepos depth-first for coherent ordering 5760 # push subrepos depth-first for coherent ordering
5753 c = repo[b'.'] 5761 c = repo[b'.']
5754 subs = c.substate # only repos that are committed 5762 subs = c.substate # only repos that are committed
5755 for s in sorted(subs): 5763 for s in sorted(subs):
5756 result = c.sub(s).push(opts) 5764 sub_result = c.sub(s).push(opts)
5757 if result == 0: 5765 if sub_result == 0:
5758 return not result 5766 return 1
5759 finally: 5767 finally:
5760 del repo._subtoppath 5768 del repo._subtoppath
5761 5769
5762 opargs = dict( 5770 opargs = dict(
5763 opts.get(b'opargs', {}) 5771 opts.get(b'opargs', {})
5773 bookmarks=opts.get(b'bookmark', ()), 5781 bookmarks=opts.get(b'bookmark', ()),
5774 publish=opts.get(b'publish'), 5782 publish=opts.get(b'publish'),
5775 opargs=opargs, 5783 opargs=opargs,
5776 ) 5784 )
5777 5785
5778 result = not pushop.cgresult 5786 if pushop.cgresult == 0:
5787 result = 1
5788 elif pushop.cgresult is not None:
5789 some_pushed = True
5779 5790
5780 if pushop.bkresult is not None: 5791 if pushop.bkresult is not None:
5781 if pushop.bkresult == 2: 5792 if pushop.bkresult == 2:
5782 result = 2 5793 result = 2
5783 elif not result and pushop.bkresult: 5794 elif not result and pushop.bkresult:
5784 result = 2 5795 result = 2
5796
5797 if result:
5798 break
5799
5785 finally: 5800 finally:
5786 other.close() 5801 other.close()
5802 if result == 0 and not some_pushed:
5803 result = 1
5787 return result 5804 return result
5788 5805
5789 5806
5790 @command( 5807 @command(
5791 b'recover', 5808 b'recover',