Patchwork D6847: dont-accept-this: this is for reference in D6776

login
register
mail settings
Submitter phabricator
Date Sept. 13, 2019, 4:25 a.m.
Message ID <differential-rev-PHID-DREV-armfo3uf76shfefjejha-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/41654/
State New
Headers show

Comments

phabricator - Sept. 13, 2019, 4:25 a.m.
valentin.gatienbaron created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6847

AFFECTED FILES
  mercurial/exchange.py
  tests/test-bookflow.t
  tests/test-bookmarks-conflict.t
  tests/test-bookmarks-pushpull.t

CHANGE DETAILS




To: valentin.gatienbaron, #hg-reviewers
Cc: mercurial-devel

Patch

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
@@ -816,7 +816,7 @@ 
      Z                         0d2164f0ce0d
      foo                                   
      foobar                                
-  $ hg push -B Z http://localhost:$HGPORT/
+  $ hg push -f -B Z http://localhost:$HGPORT/
   pushing to http://localhost:$HGPORT/
   searching for changes
   no changes found
@@ -1041,9 +1041,8 @@ 
   $ hg push -B X
   pushing to $TESTTMP/addmarks
   searching for changes
-  remote has heads on branch 'default' that are not known locally: a2a606d9ff1b
-  abort: push creates new remote head 54694f811df9 with bookmark 'X'!
-  (pull and merge or see 'hg help push' for details about pushing new heads)
+  abort: push rejected: bookmark "X" has changed
+  (run 'hg pull', resolve conflicts, and push again)
   [255]
   $ cd ../addmarks
 
diff --git a/tests/test-bookmarks-conflict.t b/tests/test-bookmarks-conflict.t
new file mode 100644
--- /dev/null
+++ b/tests/test-bookmarks-conflict.t
@@ -0,0 +1,90 @@ 
+initialize
+  $ make_changes() {
+  >     d=`pwd`
+  >     [ ! -z $1 ] && cd $1
+  >     echo "test `basename \`pwd\``" >> test
+  >     hg commit -Am"${2:-test}"
+  >     r=$?
+  >     cd $d
+  >     return $r
+  > }
+  $ ls -1a
+  .
+  ..
+  $ hg init a
+  $ cd a
+  $ echo 'test' > test; hg commit -Am'test'
+  adding test
+  $ hg book @
+
+clone to b
+
+  $ mkdir ../b
+  $ cd ../b
+  $ hg clone ../a .
+  updating to bookmark @
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ make_changes
+  $ hg book bk_b
+
+clone to c
+  $ mkdir ../c
+  $ cd ../c
+  $ hg clone ../a .
+  updating to bookmark @
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ make_changes
+  $ hg book bk_c
+
+push from b
+  $ cd ../b
+  $ hg push -B .
+  pushing to $TESTTMP/a
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  updating bookmark @
+  exporting bookmark bk_b
+  $ hg -R ../a id -r @
+  e11a942451be tip @/bk_b
+
+push from c
+  $ cd ../c
+  $ hg push -B .
+  pushing to $TESTTMP/a
+  searching for changes
+  remote has heads on branch 'default' that are not known locally: e11a942451be
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  exporting bookmark bk_c
+  $ hg push -B @
+  pushing to $TESTTMP/a
+  searching for changes
+  abort: push rejected: bookmark "@" has changed
+  (run 'hg pull', resolve conflicts, and push again)
+  [255]
+  $ hg -R ../a log -G -T '{rev} {bookmarks}'
+  o  2 bk_c
+  |
+  | o  1 @ bk_b
+  |/
+  @  0
+  
+
+  $ hg push -B @ --force
+  pushing to $TESTTMP/a
+  searching for changes
+  no changes found
+  updating bookmark @
+  [1]
+  $ hg -R ../a log -G -T '{rev} {bookmarks}'
+  o  2 @ bk_c
+  |
+  | o  1 bk_b
+  |/
+  @  0
+  
diff --git a/tests/test-bookflow.t b/tests/test-bookflow.t
--- a/tests/test-bookflow.t
+++ b/tests/test-bookflow.t
@@ -140,8 +140,8 @@ 
   $ cd ../b
   $ # make sure we cannot push after bookmarks diverged
   $ hg push -B X | grep abort
-  abort: push creates new remote head * with bookmark 'X'! (glob)
-  (pull and merge or see 'hg help push' for details about pushing new heads)
+  abort: push rejected: bookmark "X" has changed
+  (run 'hg pull', resolve conflicts, and push again)
   [1]
   $ hg pull -u | grep divergent
   divergent bookmark X stored as X@default
diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -739,7 +739,12 @@ 
     for b, scid, dcid in list(advdst) + list(diverge) + list(differ):
         if b in explicit:
             explicit.remove(b)
-            pushop.outbookmarks.append((b, dcid, scid))
+            if pushop.force:
+                pushop.outbookmarks.append((b, dcid, scid))
+            else:
+                msg = _('push rejected: bookmark "%s" has changed') % b
+                hint = _("run 'hg pull', resolve conflicts, and push again")
+                raise error.Abort(msg, hint=hint)
     # search for bookmark to delete
     for b, scid, dcid in adddst:
         if b in explicit: