[PATCH [RFC]] push: propagate --new_branch option when pushing subrepos

Angel Ezquerra angel.ezquerra at gmail.com
Thu Sep 29 10:20:58 CDT 2011


# HG changeset patch
# User Angel Ezquerra <angel.ezquerra at gmail.com>
# Date 1317309604 -7200
# Node ID e6eb3657e327c3e60f042f4cdf77cfb90c4735ac
# Parent  8df4166b6f634b305934fdd49c0e0ae64184d4ed
push: propagate --new_branch option when pushing subrepos

Up until now the --new_branch option of the push command was ignored when
pushing subrepos. The result was 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 flag to every subrepo that is pushed.

Limitations: git subrepos get the new_branch flag, but ignore it.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4077,7 +4077,7 @@
         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')):
                 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=False):
         """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=False):
         # 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)
+        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)
@@ -708,7 +708,7 @@
             if _updateprompt(self._ui, self, dirty, self._wcrev(), new):
                 self.get(state, False)
 
-    def push(self, force):
+    def push(self, force, newbranch=False):
         # push is a no-op for SVN
         return True
 
@@ -993,7 +993,7 @@
         else:
             mergefunc()
 
-    def push(self, force):
+    def push(self, force, newbranch=False):
         if not self._state[1]:
             return True
         if self._gitmissing():


More information about the Mercurial-devel mailing list