D6237: absorb: aborting if another operation is in progress

2019-04-16 Thread rdamazio (Rodrigo Damazio Bovendorp)
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG537a8aeb9977: absorb: aborting if another operation is in 
progress (authored by rdamazio, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6237?vs=14755=14760

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

AFFECTED FILES
  hgext/absorb.py
  tests/test-absorb-unfinished.t

CHANGE DETAILS

diff --git a/tests/test-absorb-unfinished.t b/tests/test-absorb-unfinished.t
new file mode 100644
--- /dev/null
+++ b/tests/test-absorb-unfinished.t
@@ -0,0 +1,30 @@
+  $ cat >> $HGRCPATH << EOF
+  > [extensions]
+  > absorb=
+  > EOF
+
+Abort absorb if there is an unfinished operation.
+
+  $ hg init abortunresolved
+  $ cd abortunresolved
+
+  $ echo "foo1" > foo.whole
+  $ hg commit -Aqm "foo 1"
+
+  $ hg update null
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo "foo2" > foo.whole
+  $ hg commit -Aqm "foo 2"
+
+  $ hg --config extensions.rebase= rebase -r 1 -d 0
+  rebasing 1:c3b6dc0e177a "foo 2" (tip)
+  merging foo.whole
+  warning: conflicts while merging foo.whole! (edit, then use 'hg resolve 
--mark')
+  unresolved conflicts (see hg resolve, then hg rebase --continue)
+  [1]
+
+  $ hg --config extensions.rebase= absorb
+  abort: rebase in progress
+  (use 'hg rebase --continue' or 'hg rebase --abort')
+  [255]
+
diff --git a/hgext/absorb.py b/hgext/absorb.py
--- a/hgext/absorb.py
+++ b/hgext/absorb.py
@@ -682,13 +682,12 @@
 
 def commit(self):
 """commit changes. update self.finalnode, self.replacemap"""
-with self.repo.wlock(), self.repo.lock():
-with self.repo.transaction('absorb') as tr:
-self._commitstack()
-self._movebookmarks(tr)
-if self.repo['.'].node() in self.replacemap:
-self._moveworkingdirectoryparent()
-self._cleanupoldcommits()
+with self.repo.transaction('absorb') as tr:
+self._commitstack()
+self._movebookmarks(tr)
+if self.repo['.'].node() in self.replacemap:
+self._moveworkingdirectoryparent()
+self._cleanupoldcommits()
 return self.finalnode
 
 def printchunkstats(self):
@@ -1006,6 +1005,11 @@
 Returns 0 on success, 1 if all chunks were ignored and nothing amended.
 """
 opts = pycompat.byteskwargs(opts)
-state = absorb(ui, repo, pats=pats, opts=opts)
-if sum(s[0] for s in state.chunkstats.values()) == 0:
-return 1
+
+with repo.wlock(), repo.lock():
+if not opts['dry_run']:
+cmdutil.checkunfinished(repo)
+
+state = absorb(ui, repo, pats=pats, opts=opts)
+if sum(s[0] for s in state.chunkstats.values()) == 0:
+return 1



To: rdamazio, #hg-reviewers, pulkit
Cc: mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6237: absorb: aborting if another operation is in progress

2019-04-15 Thread rdamazio (Rodrigo Damazio Bovendorp)
rdamazio created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This increases safety of using absorb by both aborting when another operation
  is in progress (since the absorption could confuse any other command a lot)
  and holding the locks throughout the reading of the working directory (for
  which changes to absorb) and the reading of the repo (for which changes to
  absorb into).

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  hgext/absorb.py
  tests/test-absorb-unfinished.t

CHANGE DETAILS

diff --git a/tests/test-absorb-unfinished.t b/tests/test-absorb-unfinished.t
new file mode 100644
--- /dev/null
+++ b/tests/test-absorb-unfinished.t
@@ -0,0 +1,30 @@
+  $ cat >> $HGRCPATH << EOF
+  > [extensions]
+  > absorb=
+  > EOF
+
+Abort absorb if there is an unfinished operation.
+
+  $ hg init abortunresolved
+  $ cd abortunresolved
+
+  $ echo "foo1" > foo.whole
+  $ hg commit -Aqm "foo 1"
+
+  $ hg update null
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo "foo2" > foo.whole
+  $ hg commit -Aqm "foo 2"
+
+  $ hg --config extensions.rebase= rebase -r 1 -d 0
+  rebasing 1:c3b6dc0e177a "foo 2" (tip)
+  merging foo.whole
+  warning: conflicts while merging foo.whole! (edit, then use 'hg resolve 
--mark')
+  unresolved conflicts (see hg resolve, then hg rebase --continue)
+  [1]
+
+  $ hg --config extensions.rebase= absorb
+  abort: rebase in progress
+  (use 'hg rebase --continue' or 'hg rebase --abort')
+  [255]
+
diff --git a/hgext/absorb.py b/hgext/absorb.py
--- a/hgext/absorb.py
+++ b/hgext/absorb.py
@@ -682,13 +682,12 @@
 
 def commit(self):
 """commit changes. update self.finalnode, self.replacemap"""
-with self.repo.wlock(), self.repo.lock():
-with self.repo.transaction('absorb') as tr:
-self._commitstack()
-self._movebookmarks(tr)
-if self.repo['.'].node() in self.replacemap:
-self._moveworkingdirectoryparent()
-self._cleanupoldcommits()
+with self.repo.transaction('absorb') as tr:
+self._commitstack()
+self._movebookmarks(tr)
+if self.repo['.'].node() in self.replacemap:
+self._moveworkingdirectoryparent()
+self._cleanupoldcommits()
 return self.finalnode
 
 def printchunkstats(self):
@@ -1006,6 +1005,11 @@
 Returns 0 on success, 1 if all chunks were ignored and nothing amended.
 """
 opts = pycompat.byteskwargs(opts)
-state = absorb(ui, repo, pats=pats, opts=opts)
-if sum(s[0] for s in state.chunkstats.values()) == 0:
-return 1
+
+with repo.wlock(), repo.lock():
+if not opts['dry_run']:
+cmdutil.checkunfinished(repo)
+
+state = absorb(ui, repo, pats=pats, opts=opts)
+if sum(s[0] for s in state.chunkstats.values()) == 0:
+return 1



To: rdamazio, #hg-reviewers
Cc: mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel