mercurial/dirstate.py
changeset 50002 e358f6e0e50e
parent 50001 9313d8666a0f
child 50003 f4eef08575ce
--- 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):
         """