D4096: narrow: call narrowspec.{save,restore,clear}backup directly

2018-08-05 Thread martinvonz (Martin von Zweigbergk)
This revision was automatically updated to reflect the committed changes.
Closed by commit rHGad24b581e4d9: narrow: call 
narrowspec.{save,restore,clear}backup directly (authored by martinvonz, 
committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D4096?vs=9871=9931

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

AFFECTED FILES
  hgext/narrow/narrowdirstate.py
  hgext/shelve.py
  mercurial/dirstateguard.py
  mercurial/localrepo.py
  mercurial/narrowspec.py

CHANGE DETAILS

diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py
--- a/mercurial/narrowspec.py
+++ b/mercurial/narrowspec.py
@@ -13,6 +13,7 @@
 from . import (
 error,
 match as matchmod,
+repository,
 sparse,
 util,
 )
@@ -129,15 +130,22 @@
 spec = format(includepats, excludepats)
 repo.vfs.write(FILENAME, spec)
 
-def savebackup(vfs, backupname):
+def savebackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+vfs = repo.vfs
 vfs.tryunlink(backupname)
 util.copyfile(vfs.join(FILENAME), vfs.join(backupname), hardlink=True)
 
-def restorebackup(vfs, backupname):
-vfs.rename(backupname, FILENAME, checkambig=True)
+def restorebackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+repo.vfs.rename(backupname, FILENAME, checkambig=True)
 
-def clearbackup(vfs, backupname):
-vfs.unlink(backupname)
+def clearbackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+repo.vfs.unlink(backupname)
 
 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes):
 r""" Restricts the patterns according to repo settings,
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1373,6 +1373,7 @@
 else:
 # discard all changes (including ones already written
 # out) in this transaction
+narrowspec.restorebackup(self, 'journal.narrowspec')
 repo.dirstate.restorebackup(None, 'journal.dirstate')
 
 repo.invalidate(clearfilecache=True)
@@ -1461,6 +1462,7 @@
 @unfilteredmethod
 def _writejournal(self, desc):
 self.dirstate.savebackup(None, 'journal.dirstate')
+narrowspec.savebackup(self, 'journal.narrowspec')
 self.vfs.write("journal.branch",
   encoding.fromlocal(self.dirstate.branch()))
 self.vfs.write("journal.desc",
@@ -1548,6 +1550,7 @@
 # prevent dirstateguard from overwriting already restored one
 dsguard.close()
 
+narrowspec.restorebackup(self, 'undo.narrowspec')
 self.dirstate.restorebackup(None, 'undo.dirstate')
 try:
 branch = self.vfs.read('undo.branch')
diff --git a/mercurial/dirstateguard.py b/mercurial/dirstateguard.py
--- a/mercurial/dirstateguard.py
+++ b/mercurial/dirstateguard.py
@@ -11,6 +11,7 @@
 
 from . import (
 error,
+narrowspec,
 util,
 )
 
@@ -33,7 +34,10 @@
 self._active = False
 self._closed = False
 self._backupname = 'dirstate.backup.%s.%d' % (name, id(self))
+self._narrowspecbackupname = ('narrowspec.backup.%s.%d' %
+  (name, id(self)))
 repo.dirstate.savebackup(repo.currenttransaction(), self._backupname)
+narrowspec.savebackup(repo, self._narrowspecbackupname)
 self._active = True
 
 def __del__(self):
@@ -52,10 +56,12 @@
 
 self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
  self._backupname)
+narrowspec.clearbackup(self._repo, self._narrowspecbackupname)
 self._active = False
 self._closed = True
 
 def _abort(self):
+narrowspec.restorebackup(self._repo, self._narrowspecbackupname)
 self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
self._backupname)
 self._active = False
diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -41,6 +41,7 @@
 lock as lockmod,
 mdiff,
 merge,
+narrowspec,
 node as nodemod,
 patch,
 phases,
@@ -314,10 +315,13 @@
 '''Abort current transaction for shelve/unshelve, but keep dirstate
 '''
 tr = repo.currenttransaction()
-backupname = 'dirstate.shelve'
-repo.dirstate.savebackup(tr, backupname)
+dirstatebackupname = 'dirstate.shelve'
+narrowspecbackupname = 'narrowspec.shelve'
+repo.dirstate.savebackup(tr, dirstatebackupname)
+narrowspec.savebackup(repo, narrowspecbackupname)
 tr.abort()
-repo.dirstate.restorebackup(None, backupname)
+narrowspec.restorebackup(repo, narrowspecbackupname)
+repo.dirstate.restorebackup(None, 

D4096: narrow: call narrowspec.{save,restore,clear}backup directly

2018-08-03 Thread martinvonz (Martin von Zweigbergk)
martinvonz updated this revision to Diff 9871.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D4096?vs=9858=9871

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

AFFECTED FILES
  hgext/narrow/narrowdirstate.py
  hgext/shelve.py
  mercurial/dirstateguard.py
  mercurial/localrepo.py
  mercurial/narrowspec.py

CHANGE DETAILS

diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py
--- a/mercurial/narrowspec.py
+++ b/mercurial/narrowspec.py
@@ -13,6 +13,7 @@
 from . import (
 error,
 match as matchmod,
+repository,
 sparse,
 util,
 )
@@ -129,15 +130,22 @@
 spec = format(includepats, excludepats)
 repo.vfs.write(FILENAME, spec)
 
-def savebackup(vfs, backupname):
+def savebackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+vfs = repo.vfs
 vfs.tryunlink(backupname)
 util.copyfile(vfs.join(FILENAME), vfs.join(backupname), hardlink=True)
 
-def restorebackup(vfs, backupname):
-vfs.rename(backupname, FILENAME, checkambig=True)
+def restorebackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+repo.vfs.rename(backupname, FILENAME, checkambig=True)
 
-def clearbackup(vfs, backupname):
-vfs.unlink(backupname)
+def clearbackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+repo.vfs.unlink(backupname)
 
 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes):
 r""" Restricts the patterns according to repo settings,
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1372,6 +1372,7 @@
 else:
 # discard all changes (including ones already written
 # out) in this transaction
+narrowspec.restorebackup(self, 'journal.narrowspec')
 repo.dirstate.restorebackup(None, 'journal.dirstate')
 
 repo.invalidate(clearfilecache=True)
@@ -1460,6 +1461,7 @@
 @unfilteredmethod
 def _writejournal(self, desc):
 self.dirstate.savebackup(None, 'journal.dirstate')
+narrowspec.savebackup(self, 'journal.narrowspec')
 self.vfs.write("journal.branch",
   encoding.fromlocal(self.dirstate.branch()))
 self.vfs.write("journal.desc",
@@ -1547,6 +1549,7 @@
 # prevent dirstateguard from overwriting already restored one
 dsguard.close()
 
+narrowspec.restorebackup(self, 'undo.narrowspec')
 self.dirstate.restorebackup(None, 'undo.dirstate')
 try:
 branch = self.vfs.read('undo.branch')
diff --git a/mercurial/dirstateguard.py b/mercurial/dirstateguard.py
--- a/mercurial/dirstateguard.py
+++ b/mercurial/dirstateguard.py
@@ -11,6 +11,7 @@
 
 from . import (
 error,
+narrowspec,
 util,
 )
 
@@ -33,7 +34,10 @@
 self._active = False
 self._closed = False
 self._backupname = 'dirstate.backup.%s.%d' % (name, id(self))
+self._narrowspecbackupname = ('narrowspec.backup.%s.%d' %
+  (name, id(self)))
 repo.dirstate.savebackup(repo.currenttransaction(), self._backupname)
+narrowspec.savebackup(repo, self._narrowspecbackupname)
 self._active = True
 
 def __del__(self):
@@ -52,10 +56,12 @@
 
 self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
  self._backupname)
+narrowspec.clearbackup(self._repo, self._narrowspecbackupname)
 self._active = False
 self._closed = True
 
 def _abort(self):
+narrowspec.restorebackup(self._repo, self._narrowspecbackupname)
 self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
self._backupname)
 self._active = False
diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -41,6 +41,7 @@
 lock as lockmod,
 mdiff,
 merge,
+narrowspec,
 node as nodemod,
 patch,
 phases,
@@ -314,10 +315,13 @@
 '''Abort current transaction for shelve/unshelve, but keep dirstate
 '''
 tr = repo.currenttransaction()
-backupname = 'dirstate.shelve'
-repo.dirstate.savebackup(tr, backupname)
+dirstatebackupname = 'dirstate.shelve'
+narrowspecbackupname = 'narrowspec.shelve'
+repo.dirstate.savebackup(tr, dirstatebackupname)
+narrowspec.savebackup(repo, narrowspecbackupname)
 tr.abort()
-repo.dirstate.restorebackup(None, backupname)
+narrowspec.restorebackup(repo, narrowspecbackupname)
+repo.dirstate.restorebackup(None, dirstatebackupname)
 
 def createcmd(ui, repo, pats, opts):
 """subcommand that creates a new shelve"""
diff --git a/hgext/narrow/narrowdirstate.py 

D4096: narrow: call narrowspec.{save,restore,clear}backup directly

2018-08-03 Thread martinvonz (Martin von Zweigbergk)
martinvonz created this revision.
Herald added a reviewer: durin42.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  I want to move .hg/narrowspec to .hg/store/narrowspec and we need to
  decouple the narrowspec update from the dirstate update for that. This
  patch lets the callers call the narrowspec backup functions directly,
  in addition to the dirstate backup functions. The narrowspec methods
  are made to check if narrowing is enabled. For that, a repo instance
  was needed, which all the callers luckily already had available.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  hgext/narrow/narrowdirstate.py
  hgext/shelve.py
  mercurial/dirstateguard.py
  mercurial/localrepo.py
  mercurial/narrowspec.py

CHANGE DETAILS

diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py
--- a/mercurial/narrowspec.py
+++ b/mercurial/narrowspec.py
@@ -13,6 +13,7 @@
 from . import (
 error,
 match as matchmod,
+repository,
 util,
 )
 
@@ -145,15 +146,22 @@
 spec = format(includepats, excludepats)
 repo.vfs.write(FILENAME, spec)
 
-def savebackup(vfs, backupname):
+def savebackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+vfs = repo.vfs
 vfs.tryunlink(backupname)
 util.copyfile(vfs.join(FILENAME), vfs.join(backupname), hardlink=True)
 
-def restorebackup(vfs, backupname):
-vfs.rename(backupname, FILENAME, checkambig=True)
+def restorebackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+repo.vfs.rename(backupname, FILENAME, checkambig=True)
 
-def clearbackup(vfs, backupname):
-vfs.unlink(backupname)
+def clearbackup(repo, backupname):
+if repository.NARROW_REQUIREMENT not in repo.requirements:
+return
+repo.vfs.unlink(backupname)
 
 def restrictpatterns(req_includes, req_excludes, repo_includes, repo_excludes):
 r""" Restricts the patterns according to repo settings,
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1372,6 +1372,7 @@
 else:
 # discard all changes (including ones already written
 # out) in this transaction
+narrowspec.restorebackup(self, 'journal.narrowspec')
 repo.dirstate.restorebackup(None, 'journal.dirstate')
 
 repo.invalidate(clearfilecache=True)
@@ -1460,6 +1461,7 @@
 @unfilteredmethod
 def _writejournal(self, desc):
 self.dirstate.savebackup(None, 'journal.dirstate')
+narrowspec.savebackup(self, 'journal.narrowspec')
 self.vfs.write("journal.branch",
   encoding.fromlocal(self.dirstate.branch()))
 self.vfs.write("journal.desc",
@@ -1547,6 +1549,7 @@
 # prevent dirstateguard from overwriting already restored one
 dsguard.close()
 
+narrowspec.restorebackup(self, 'undo.narrowspec')
 self.dirstate.restorebackup(None, 'undo.dirstate')
 try:
 branch = self.vfs.read('undo.branch')
diff --git a/mercurial/dirstateguard.py b/mercurial/dirstateguard.py
--- a/mercurial/dirstateguard.py
+++ b/mercurial/dirstateguard.py
@@ -11,6 +11,7 @@
 
 from . import (
 error,
+narrowspec,
 util,
 )
 
@@ -33,7 +34,10 @@
 self._active = False
 self._closed = False
 self._backupname = 'dirstate.backup.%s.%d' % (name, id(self))
+self._narrowspecbackupname = ('narrowspec.backup.%s.%d' %
+  (name, id(self)))
 repo.dirstate.savebackup(repo.currenttransaction(), self._backupname)
+narrowspec.savebackup(repo, self._narrowspecbackupname)
 self._active = True
 
 def __del__(self):
@@ -52,10 +56,12 @@
 
 self._repo.dirstate.clearbackup(self._repo.currenttransaction(),
  self._backupname)
+narrowspec.clearbackup(self._repo, self._narrowspecbackupname)
 self._active = False
 self._closed = True
 
 def _abort(self):
+narrowspec.restorebackup(self._repo, self._narrowspecbackupname)
 self._repo.dirstate.restorebackup(self._repo.currenttransaction(),
self._backupname)
 self._active = False
diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -41,6 +41,7 @@
 lock as lockmod,
 mdiff,
 merge,
+narrowspec,
 node as nodemod,
 patch,
 phases,
@@ -314,10 +315,13 @@
 '''Abort current transaction for shelve/unshelve, but keep dirstate
 '''
 tr = repo.currenttransaction()
-backupname = 'dirstate.shelve'
-repo.dirstate.savebackup(tr, backupname)
+dirstatebackupname = 'dirstate.shelve'
+narrowspecbackupname =