dirstateguard: remove layering violation around saving/restoring backup

This violation, which passes 'repo' object to dirstate, was introduced
by afd0ae63d624 and c26227275f1e.
This commit is contained in:
FUJIWARA Katsunori 2015-10-17 01:15:33 +09:00
parent 5fbe511f90
commit 811ef7c75f
2 changed files with 13 additions and 12 deletions

View File

@ -3339,7 +3339,7 @@ class dirstateguard(object):
def __init__(self, repo, name):
self._repo = repo
self._suffix = '.backup.%s.%d' % (name, id(self))
repo.dirstate._savebackup(repo, self._suffix)
repo.dirstate._savebackup(repo.currenttransaction(), self._suffix)
self._active = True
self._closed = False
@ -3357,12 +3357,14 @@ class dirstateguard(object):
% self._suffix)
raise error.Abort(msg)
self._repo.dirstate._clearbackup(self._repo, self._suffix)
self._repo.dirstate._clearbackup(self._repo.currenttransaction(),
self._suffix)
self._active = False
self._closed = True
def _abort(self):
self._repo.dirstate._restorebackup(self._repo, self._suffix)
self._repo.dirstate._restorebackup(self._repo.currenttransaction(),
self._suffix)
self._active = False
def release(self):

View File

@ -1123,22 +1123,21 @@ class dirstate(object):
return list(files)
return [f for f in dmap if match(f)]
def _actualfilename(self, repo):
if repo.currenttransaction():
def _actualfilename(self, tr):
if tr:
return self._pendingfilename
else:
return self._filename
def _savebackup(self, repo, suffix):
def _savebackup(self, tr, suffix):
'''Save current dirstate into backup file with suffix'''
filename = self._actualfilename(repo)
filename = self._actualfilename(tr)
# use '_writedirstate' instead of 'write' to write changes certainly,
# because the latter omits writing out if transaction is running.
# output file will be used to create backup of dirstate at this point.
self._writedirstate(self._opener(filename, "w", atomictemp=True))
tr = repo.currenttransaction()
if tr:
# ensure that subsequent tr.writepending returns True for
# changes written out above, even if dirstate is never
@ -1153,15 +1152,15 @@ class dirstate(object):
self._opener.write(filename + suffix, self._opener.tryread(filename))
def _restorebackup(self, repo, suffix):
def _restorebackup(self, tr, suffix):
'''Restore dirstate by backup file with suffix'''
# this "invalidate()" prevents "wlock.release()" from writing
# changes of dirstate out after restoring from backup file
self.invalidate()
filename = self._actualfilename(repo)
filename = self._actualfilename(tr)
self._opener.rename(filename + suffix, filename)
def _clearbackup(self, repo, suffix):
def _clearbackup(self, tr, suffix):
'''Clear backup file with suffix'''
filename = self._actualfilename(repo)
filename = self._actualfilename(tr)
self._opener.unlink(filename + suffix)