Patchwork D2912: rebase: register status file generator only once when using single transaction

login
register
mail settings
Submitter phabricator
Date March 21, 2018, 6:11 p.m.
Message ID <differential-rev-PHID-DREV-zqhiogzwylnwma3zlokq-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/29700/
State Superseded
Headers show

Comments

phabricator - March 21, 2018, 6:11 p.m.
martinvonz created this revision.
martinvonz added a reviewer: phillco.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  rebase.storestatus() behaved differently depending on whether a
  transaction is passed to it. If a transaction is passed, it registers
  a "file generator" that runs when the transaction commits. If no
  transaction was passed, it writes the rebase state immediately. This
  imprecise timing of the writing makes it hard to reason about, so
  let's make it more explicit which behavior we're getting by checking
  if we have a transaction before calling it. For the single-transaction
  case, move the call to storestatus(tr) early and do it only once since
  it's only going to write the file (at most) once anyway.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  hgext/rebase.py

CHANGE DETAILS




To: martinvonz, phillco, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -420,6 +420,10 @@ 
         # Store the state before we begin so users can run 'hg rebase --abort'
         # if we fail before the transaction closes.
         self.storestatus()
+        if tr:
+            # When using single transaction, store state when transaction
+            # commits.
+            self.storestatus(tr)
 
         cands = [k for k, v in self.state.iteritems() if v == revtodo]
         total = len(cands)
@@ -480,7 +484,8 @@ 
             p1, p2, base = defineparents(repo, rev, self.destmap,
                                          self.state, self.skipped,
                                          self.obsoletenotrebased)
-            self.storestatus(tr=tr)
+            if not tr:
+                self.storestatus()
             if len(repo[None].parents()) == 2:
                 repo.ui.debug('resuming interrupted rebase\n')
             else: