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

Angel Ezquerra angel.ezquerra at gmail.com
Thu Oct 6 16:44:08 CDT 2011


On Thu, Oct 6, 2011 at 11:24 PM, Angel Ezquerra
<angel.ezquerra at gmail.com> wrote:
> # 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():
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>

In this second version I added the --ssh flag to the list of flags
that get passed down to subrepos (i.e. now we pass down --new-branch
and --ssh). I also removed the default parameter values for the
subrepo.push() methods.

I am still not entirely happy with the way this works. I think it is
better than what we have today, because in most cases you do want to
allow pushing new subrepo branches. However, it is now not possible to
push new branches only on the parent repo... Also we have no way to
pass down some of the other parameters.

A solution may be to add a flag to control whether these flags are
passed down to subrepos or not. However this introduces some
inconsistency, since the --force flag is would be passed down anyway,
unless we decide that is is ok to change the current mercurial
behavior, which is to always pass the --force flag down.

Comments?

Angel


More information about the Mercurial-devel mailing list