[PATCH] rebase: 'pull --rebase' rebase on new branching only
Martin von Zweigbergk
martinvonz at google.com
Thu May 5 16:45:00 EDT 2016
On Thu, May 5, 2016 at 9:04 AM, Pierre-Yves David
<pierre-yves.david at ens-lyon.org> wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
> # Date 1462366525 -7200
> # Wed May 04 14:55:25 2016 +0200
> # Node ID 7e72800c070d941f294c4e7ed91db29a08bac073
> # Parent 906a1c8a75fd8a18e43e8545eedcbe5222f84647
> # EXP-Topic pull.rebase
> rebase: 'pull --rebase' rebase on new branching only
Meant for stable?
>
> Previously, if two heads existed on the current branch before the pull and the
> pull add changeset on the one unrelated to the working copy 'hg pull --rebase'
> would trigger a rebase on that branch. This might not what the user wants
> as they could have resolved the head situation before pulling if they wanted to.
>
> Therefore, we restrict the set of destination candidate to 'hg pull --rebase' to
> the set of pulled changesets that create a branching from the current working
> copy branch.
>
> diff -r 906a1c8a75fd -r 7e72800c070d hgext/rebase.py
> --- a/hgext/rebase.py Wed May 04 06:44:44 2016 +0900
> +++ b/hgext/rebase.py Wed May 04 14:55:25 2016 +0200
> @@ -1245,15 +1245,18 @@ def pullrebase(orig, ui, repo, *args, **
> if 'source' in opts:
> del opts['source']
> # revsprepull is the len of the repo, not revnum of tip.
> - destspace = list(repo.changelog.revs(start=revsprepull))
> + destspace = repo.revs("(%ld and children(::.))::",
> + repo.changelog.revs(start=revsprepull))
Is this equivalent to repo.revs("(%d: and children(::.))::", revsprepull)?
> opts['_destspace'] = destspace
> try:
> rebase(ui, repo, **opts)
> except error.NoMergeDestAbort:
> # we can maybe update instead
> rev, _a, _b = destutil.destupdate(repo)
> - if rev == repo['.'].rev():
> - ui.status(_('nothing to rebase\n'))
> + wcp = repo['.']
> + if rev == wcp.rev():
> + ui.status(_('nothing to rebase - no branching from %s '
> + 'pulled\n') % wcp)
> else:
> ui.status(_('nothing to rebase - updating instead\n'))
> # not passing argument to get the bare update behavior
> @@ -1353,7 +1356,8 @@ def uisetup(ui):
> #Replace pull with a decorator to provide --rebase option
> entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
> entry[1].append(('', 'rebase', None,
> - _("rebase working directory to branch head")))
> + _("rebase when pulling new branching from working "
> + "directory parent")))
> entry[1].append(('t', 'tool', '',
> _("specify merge tool for rebase")))
> cmdutil.summaryhooks.add('rebase', summaryhook)
> diff -r 906a1c8a75fd -r 7e72800c070d tests/test-rebase-pull.t
> --- a/tests/test-rebase-pull.t Wed May 04 06:44:44 2016 +0900
> +++ b/tests/test-rebase-pull.t Wed May 04 14:55:25 2016 +0200
> @@ -145,14 +145,20 @@ pull --rebase works when a specific revi
> $ hg ci -Am L1
> adding L1
> created new head
> +
> +(strip extra "remote" changeset to ensure we pull new branching)
> +
> + $ hg strip --rev 'desc(R1)' --config extensions.strip=
> + saved backup bundle to $TESTTMP/c/.hg/strip-backup/77ae9631bcca-d0f9f803-backup.hg (glob)
> +
> $ hg pull --rev tip --rebase
> pulling from $TESTTMP/a (glob)
> searching for changes
> adding changesets
> adding manifests
> adding file changes
> - added 2 changesets with 2 changes to 2 files
> - rebasing 3:ff8d69a621f9 "L1"
> + added 3 changesets with 3 changes to 3 files (+1 heads)
> + rebasing 2:ff8d69a621f9 "L1"
> saved backup bundle to $TESTTMP/c/.hg/strip-backup/ff8d69a621f9-160fa373-backup.hg (glob)
> $ hg tglog
> @ 5: 'L1'
> @@ -335,7 +341,7 @@ pre-existing heads.
> adding manifests
> adding file changes
> added 1 changesets with 1 changes to 1 files
> - nothing to rebase
> + nothing to rebase - no branching from 6dc0ea5dcf55 pulled
>
> There is two local heads and we pull a third one.
> The second local head should not confuse the `hg pull rebase`.
> @@ -354,6 +360,14 @@ The second local head should not confuse
> $ cd ../c
> $ hg up 'desc(L2)'
> 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
> +
> +(rebase on latest "remote" change to remove pre-existing branching)
> +
> + $ hg rebase -d 'desc(R6)'
> + rebasing 7:864e0a2d2614 "L1"
> + rebasing 8:6dc0ea5dcf55 "L2"
> + saved backup bundle to $TESTTMP/c/.hg/strip-backup/864e0a2d2614-2f72c89c-backup.hg (glob)
> +
> $ hg pull --rebase
> pulling from $TESTTMP/a (glob)
> searching for changes
> @@ -361,9 +375,9 @@ The second local head should not confuse
> adding manifests
> adding file changes
> added 1 changesets with 1 changes to 1 files (+1 heads)
> - rebasing 7:864e0a2d2614 "L1"
> - rebasing 8:6dc0ea5dcf55 "L2"
> - saved backup bundle to $TESTTMP/c/.hg/strip-backup/864e0a2d2614-2f72c89c-backup.hg (glob)
> + rebasing 10:40410cfbcfce "L1"
> + rebasing 11:76f58da1b646 "L2"
> + saved backup bundle to $TESTTMP/c/.hg/strip-backup/40410cfbcfce-1aff5e0f-backup.hg (glob)
> $ hg tglog
> @ 12: 'L2'
> |
> @@ -391,3 +405,34 @@ The second local head should not confuse
> |
> o 0: 'C1'
>
> +
> +Pulling change on other pre-existing heads should not trigger a rebase
> +----------------------------------------------------------------------
> +
> +(push the other head in "a" so that we can add changeset on it there)
> +
> + $ hg push -fr 'desc(M1)' ../a
> + pushing to ../a
> + searching for changes
> + adding changesets
> + adding manifests
> + adding file changes
> + added 1 changesets with 1 changes to 1 files (+1 heads)
> + $ cd ../a
> + $ hg up 'desc(M1)'
> + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ echo M2 > M2
> + $ hg commit -Am M2
> + adding M2
> + $ cd ../c
> +
> +Pulling does not create branching, so we do not rebase.
> +
> + $ hg pull --rebase
> + pulling from $TESTTMP/a (glob)
> + searching for changes
> + adding changesets
> + adding manifests
> + adding file changes
> + added 1 changesets with 1 changes to 1 files
> + nothing to rebase - no branching from 590d79f77016 pulled
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list