Patchwork [2,of,2,RFC,RESEND] bookmarks: suggest 'push -B FOO' when a potentially new remote head has a local bookmark

login
register
mail settings
Submitter Stephen Lee
Date Sept. 8, 2013, 10:45 a.m.
Message ID <67f4f79481793fd635d2.1378637109@slee-desktop>
Download mbox | patch
Permalink /patch/2413/
State Superseded, archived
Headers show

Comments

Stephen Lee - Sept. 8, 2013, 10:45 a.m.
# HG changeset patch
# User Stephen Lee <sphen.lee@gmail.com>
# Date 1378636809 -36000
# Node ID 67f4f79481793fd635d28c9e584f024070b87277
# Parent  4f3b94d13ecd9d35b1c7bd65e57f8700322d2816
bookmarks: suggest 'push -B FOO' when a potentially new remote head has a local bookmark

If a new head is prevented from being pushed and has a local bookmark this change suggests
using 'push -B FOO' since this is somewhat safer than using force.

This does not consider if there are unsynced changes, or if the localbook exists
remotely but cannot be updated (ie. if it is divergent).  In these cases pull and/or merge
might be a better suggestion.
Augie Fackler - Sept. 20, 2013, 2:46 p.m.
On Sun, Sep 08, 2013 at 08:45:09PM +1000, Stephen Lee wrote:
> # HG changeset patch
> # User Stephen Lee <sphen.lee@gmail.com>
> # Date 1378636809 -36000
> # Node ID 67f4f79481793fd635d28c9e584f024070b87277
> # Parent  4f3b94d13ecd9d35b1c7bd65e57f8700322d2816
> bookmarks: suggest 'push -B FOO' when a potentially new remote head has a local bookmark

I think I'm +1 on this series. Kevin?

>
> If a new head is prevented from being pushed and has a local bookmark this change suggests
> using 'push -B FOO' since this is somewhat safer than using force.
>
> This does not consider if there are unsynced changes, or if the localbook exists
> remotely but cannot be updated (ie. if it is divergent).  In these cases pull and/or merge
> might be a better suggestion.
>
> diff --git a/mercurial/discovery.py b/mercurial/discovery.py
> --- a/mercurial/discovery.py
> +++ b/mercurial/discovery.py
> @@ -319,18 +319,24 @@
>              dhs = sorted(newhs - bookmarkedheads - oldhs)
>          if dhs:
>              if error is None:
> -                if branch not in ('default', None):
> +                if repo[dhs[0]].bookmarks():
> +                    bm = repo[dhs[0]].bookmarks()[0]
>                      error = _("push creates new remote head %s "
> -                              "on branch '%s'!") % (short(dhs[0]), branch)
> +                              "with bookmark '%s'") % (short(dhs[0]), bm)
> +                    hint = _("use push -B %s to push this bookmark") % bm
>                  else:
> -                    error = _("push creates new remote head %s!"
> -                              ) % short(dhs[0])
> -                if heads[2]: # unsynced
> -                    hint = _("you should pull and merge or "
> -                             "use push -f to force")
> -                else:
> -                    hint = _("did you forget to merge? "
> -                             "use push -f to force")
> +                    if branch not in ('default', None):
> +                        error = _("push creates new remote head %s "
> +                                "on branch '%s'!") % (short(dhs[0]), branch)
> +                    else:
> +                        error = _("push creates new remote head %s!"
> +                                ) % short(dhs[0])
> +                    if heads[2]: # unsynced
> +                        hint = _("you should pull and merge or "
> +                                "use push -f to force")
> +                    else:
> +                        hint = _("did you forget to merge? "
> +                                "use push -f to force")
>              if branch is not None:
>                  repo.ui.note(_("new remote heads on branch '%s'\n") % branch)
>              for h in dhs:
> diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
> --- a/tests/test-bookmarks-pushpull.t
> +++ b/tests/test-bookmarks-pushpull.t
> @@ -274,8 +274,8 @@
>    $ hg push http://localhost:$HGPORT2/
>    pushing to http://localhost:$HGPORT2/
>    searching for changes
> -  abort: push creates new remote head c922c0139ca0!
> -  (did you forget to merge? use push -f to force)
> +  abort: push creates new remote head c922c0139ca0 with bookmark 'Y'
> +  (use push -B Y to push this bookmark)
>    [255]
>    $ hg -R ../a book
>       @                         1:0d2164f0ce0d
> @@ -290,8 +290,8 @@
>    $ hg push http://localhost:$HGPORT2/
>    pushing to http://localhost:$HGPORT2/
>    searching for changes
> -  abort: push creates new remote head c922c0139ca0!
> -  (did you forget to merge? use push -f to force)
> +  abort: push creates new remote head c922c0139ca0 with bookmark 'Y'
> +  (use push -B Y to push this bookmark)
>    [255]
>    $ hg -R ../a book
>       @                         1:0d2164f0ce0d
> @@ -431,6 +431,12 @@
>    $ echo c5 > f2
>    $ hg ci -Am5
>    created new head
> +  $ hg push
> +  pushing to http://localhost:$HGPORT/
> +  searching for changes
> +  abort: push creates new remote head cc978a373a53 with bookmark 'W'
> +  (use push -B W to push this bookmark)
> +  [255]
>    $ hg push -B W
>    pushing to http://localhost:$HGPORT/
>    searching for changes
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -319,18 +319,24 @@ 
             dhs = sorted(newhs - bookmarkedheads - oldhs)
         if dhs:
             if error is None:
-                if branch not in ('default', None):
+                if repo[dhs[0]].bookmarks():
+                    bm = repo[dhs[0]].bookmarks()[0]
                     error = _("push creates new remote head %s "
-                              "on branch '%s'!") % (short(dhs[0]), branch)
+                              "with bookmark '%s'") % (short(dhs[0]), bm)
+                    hint = _("use push -B %s to push this bookmark") % bm
                 else:
-                    error = _("push creates new remote head %s!"
-                              ) % short(dhs[0])
-                if heads[2]: # unsynced
-                    hint = _("you should pull and merge or "
-                             "use push -f to force")
-                else:
-                    hint = _("did you forget to merge? "
-                             "use push -f to force")
+                    if branch not in ('default', None):
+                        error = _("push creates new remote head %s "
+                                "on branch '%s'!") % (short(dhs[0]), branch)
+                    else:
+                        error = _("push creates new remote head %s!"
+                                ) % short(dhs[0])
+                    if heads[2]: # unsynced
+                        hint = _("you should pull and merge or "
+                                "use push -f to force")
+                    else:
+                        hint = _("did you forget to merge? "
+                                "use push -f to force")
             if branch is not None:
                 repo.ui.note(_("new remote heads on branch '%s'\n") % branch)
             for h in dhs:
diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
--- a/tests/test-bookmarks-pushpull.t
+++ b/tests/test-bookmarks-pushpull.t
@@ -274,8 +274,8 @@ 
   $ hg push http://localhost:$HGPORT2/
   pushing to http://localhost:$HGPORT2/
   searching for changes
-  abort: push creates new remote head c922c0139ca0!
-  (did you forget to merge? use push -f to force)
+  abort: push creates new remote head c922c0139ca0 with bookmark 'Y'
+  (use push -B Y to push this bookmark)
   [255]
   $ hg -R ../a book
      @                         1:0d2164f0ce0d
@@ -290,8 +290,8 @@ 
   $ hg push http://localhost:$HGPORT2/
   pushing to http://localhost:$HGPORT2/
   searching for changes
-  abort: push creates new remote head c922c0139ca0!
-  (did you forget to merge? use push -f to force)
+  abort: push creates new remote head c922c0139ca0 with bookmark 'Y'
+  (use push -B Y to push this bookmark)
   [255]
   $ hg -R ../a book
      @                         1:0d2164f0ce0d
@@ -431,6 +431,12 @@ 
   $ echo c5 > f2
   $ hg ci -Am5
   created new head
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  abort: push creates new remote head cc978a373a53 with bookmark 'W'
+  (use push -B W to push this bookmark)
+  [255]
   $ hg push -B W
   pushing to http://localhost:$HGPORT/
   searching for changes