# HG changeset patch # User Pierre-Yves David # Date 1676412318 -3600 # Node ID e358f6e0e50e05be71b92b0f735bcf86c017fc10 # Parent 9313d8666a0fc0adef5d6d08136e6622bbc38480 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. diff -r 9313d8666a0f -r e358f6e0e50e mercurial/dirstate.py --- 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): """ diff -r 9313d8666a0f -r e358f6e0e50e tests/test-empty.t --- 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 diff -r 9313d8666a0f -r e358f6e0e50e tests/test-inherit-mode.t --- 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/