D6237: absorb: aborting if another operation is in progress
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
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