dirstate: do not write an empty dirstate just for backup
This will get in the way when we get more strict about holding the lock when
writing the dirstate.
Instead, we simply don't copy dirstate files around if there are None at backup
time.
A couple of tests are impacted they no longer need to backup such "empty"
dirstate.
--- a/mercurial/dirstate.py Tue Feb 14 22:46:26 2023 +0100
+++ b/mercurial/dirstate.py Tue Feb 14 23:05:18 2023 +0100
@@ -1486,6 +1486,9 @@
"""return a filename to backup a data-file or None"""
if not self._use_dirstate_v2:
return None
+ if self._map.docket.uuid is None:
+ # not created yet, nothing to backup
+ return None
data_filename = self._map.docket.data_filename()
return data_filename, self.data_backup_filename(backupname)
@@ -1506,7 +1509,7 @@
# 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.
- if self._dirty or not self._opener.exists(filename):
+ if self._dirty:
self._writedirstate(
tr,
self._opener(filename, b"w", atomictemp=True, checkambig=True),
@@ -1530,7 +1533,7 @@
tr.registertmp(filename, location=b'plain')
self._opener.tryunlink(backupname)
- if True:
+ if self._opener.exists(filename):
# hardlink backup is okay because _writedirstate is always called
# with an "atomictemp=True" file.
util.copyfile(
@@ -1557,10 +1560,23 @@
# this "invalidate()" prevents "wlock.release()" from writing
# changes of dirstate out after restoring from backup file
self.invalidate()
+ o = self._opener
+ if not o.exists(backupname):
+ # there was no file backup, delete existing files
+ filename = self._actualfilename(tr)
+ data_file = None
+ if self._use_dirstate_v2:
+ data_file = self._map.docket.data_filename()
+ if o.exists(filename):
+ o.unlink(filename)
+ if data_file is not None and o.exists(data_file):
+ o.unlink(data_file)
+ return
filename = self._actualfilename(tr)
- o = self._opener
data_pair = self.backup_data_file(backupname)
- if util.samefile(o.join(backupname), o.join(filename)):
+ if o.exists(filename) and util.samefile(
+ o.join(backupname), o.join(filename)
+ ):
o.unlink(backupname)
else:
o.rename(backupname, filename, checkambig=True)
@@ -1577,11 +1593,11 @@
def clearbackup(self, tr, backupname):
'''Clear backup file'''
o = self._opener
- data_backup = self.backup_data_file(backupname)
- o.unlink(backupname)
-
- if data_backup is not None:
- o.unlink(data_backup[0])
+ if o.exists(backupname):
+ data_backup = self.backup_data_file(backupname)
+ o.unlink(backupname)
+ if data_backup is not None:
+ o.unlink(data_backup[0])
def verify(self, m1, m2, p1, narrow_matcher=None):
"""
--- a/tests/test-empty.t Tue Feb 14 22:46:26 2023 +0100
+++ b/tests/test-empty.t Tue Feb 14 23:05:18 2023 +0100
@@ -36,7 +36,6 @@
$ ls .hg
00changelog.i
cache
- dirstate
hgrc
requires
store
--- a/tests/test-inherit-mode.t Tue Feb 14 22:46:26 2023 +0100
+++ b/tests/test-inherit-mode.t Tue Feb 14 23:05:18 2023 +0100
@@ -137,7 +137,6 @@
00660 ../push/.hg/cache/branch2-base
00660 ../push/.hg/cache/rbc-names-v1
00660 ../push/.hg/cache/rbc-revs-v1
- 00660 ../push/.hg/dirstate
00660 ../push/.hg/requires
00770 ../push/.hg/store/
00660 ../push/.hg/store/00changelog.i
@@ -160,7 +159,6 @@
00660 ../push/.hg/undo.bookmarks
00660 ../push/.hg/undo.branch
00660 ../push/.hg/undo.desc
- 00660 ../push/.hg/undo.dirstate
00770 ../push/.hg/wcache/