D6237: absorb: aborting if another operation is in progress
rdamazio (Rodrigo Damazio Bovendorp)
phabricator at mercurial-scm.org
Tue Apr 16 05:17:03 UTC 2019
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
More information about the Mercurial-devel
mailing list