dirstate: do not write an empty dirstate just for backup
authorPierre-Yves David <pierre-yves.david@octobus.net>
Tue, 14 Feb 2023 23:05:18 +0100
changeset 50002 e358f6e0e50e
parent 50001 9313d8666a0f
child 50003 f4eef08575ce
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.
mercurial/dirstate.py
tests/test-empty.t
tests/test-inherit-mode.t
--- 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/