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