[PATCH V2] push: propagate --new-branch and --ssh options when pushing subrepos

Angel Ezquerra angel.ezquerra at gmail.com
Thu Oct 6 16:24:02 CDT 2011


# HG changeset patch
# User Angel Ezquerra <angel.ezquerra at gmail.com>
# Date 1317309604 -7200
# Node ID f63ea5a24685e78d1cf432f9ebe1c46b1387f967
# Parent  6dc67dced8c122f6139ae20ccdc03a6b11e8b765
push: propagate --new-branch and --ssh options when pushing subrepos

Up until now the all the push command options were ignored when pushing
subrepos. In particular, the fact that the --new-branch command was not passed
down to subrepos that it was not possible to push a repo when any of its
subrepos had a new branch, even if you used the --new-branch option of the push
command.

In addition the error message was confusing since it showed the following hint:
"--new-branch hint: use 'hg push --new-branch' to create new remote branches".
However using the --new_branch flag did not fix the problem, as it was ignored
when pushing subrepos.

This patch passes the --new-branch and --ssh flags to every subrepo that is
pushed.

Issues/Limitations:

- git subrepos get these flags, but ignore them.
- It is no longer possible to _not_ pass down these flags to subrepos when
pushing.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4105,7 +4105,9 @@
         c = repo['']
         subs = c.substate # only repos that are committed
         for s in sorted(subs):
-            if not c.sub(s).push(opts.get('force')):
+            if not c.sub(s).push(opts.get('force'),
+                    opts.get('new_branch'),
+                    opts.get('ssh')):
                 return False
     finally:
         del repo._subtoppath
diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -302,7 +302,7 @@
         """merge currently-saved state with the new state."""
         raise NotImplementedError
 
-    def push(self, force):
+    def push(self, force, newbranch, ssh):
         """perform whatever action is analogous to 'hg push'
 
         This may be a no-op on some systems.
@@ -507,19 +507,19 @@
         else:
             mergefunc()
 
-    def push(self, force):
+    def push(self, force, newbranch, ssh):
         # push subrepos depth-first for coherent ordering
         c = self._repo['']
         subs = c.substate # only repos that are committed
         for s in sorted(subs):
-            if not c.sub(s).push(force):
+            if not c.sub(s).push(force, newbranch):
                 return False
 
         dsturl = _abssource(self._repo, True)
         self._repo.ui.status(_('pushing subrepo %s to %s\n') %
             (subrelpath(self), dsturl))
-        other = hg.peer(self._repo.ui, {}, dsturl)
-        return self._repo.push(other, force)
+        other = hg.peer(self._repo.ui, {'ssh': ssh}, dsturl)
+        return self._repo.push(other, force, newbranch=newbranch)
 
     def outgoing(self, ui, dest, opts):
         return hg.outgoing(ui, self._repo, _abssource(self._repo, True), opts)
@@ -712,7 +712,7 @@
             if _updateprompt(self._ui, self, dirty, self._wcrev(), new):
                 self.get(state, False)
 
-    def push(self, force):
+    def push(self, force, newbranch, ssh):
         # push is a no-op for SVN
         return True
 
@@ -997,7 +997,7 @@
         else:
             mergefunc()
 
-    def push(self, force):
+    def push(self, force, newbranch, ssh):
         if not self._state[1]:
             return True
         if self._gitmissing():


More information about the Mercurial-devel mailing list