Patchwork D11789: dirstate: make it mandatory to provide parentfiledata in `set_clean`

login
register
mail settings
Submitter phabricator
Date Nov. 24, 2021, 11:14 a.m.
Message ID <differential-rev-PHID-DREV-4es3gbzf33tbreudwj7f-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/50115/
State New
Headers show

Comments

phabricator - Nov. 24, 2021, 11:14 a.m.
marmoute created this revision.
Herald added a reviewer: durin42.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Gathering the mode, size and mtime, independently from determining that the file
  is clean is a race-machine. So we just make it a required argument.
  
  (note that the data is still gathered in a racy way in practice, but at least
  the API is no longer encouraging it.)

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D11789

AFFECTED FILES
  hgext/git/dirstate.py
  mercurial/dirstate.py

CHANGE DETAILS




To: marmoute, durin42, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -486,15 +486,12 @@ 
         return ret
 
     @requires_no_parents_change
-    def set_clean(self, filename, parentfiledata=None):
+    def set_clean(self, filename, parentfiledata):
         """record that the current state of the file on disk is known to be clean"""
         self._dirty = True
-        if parentfiledata:
-            (mode, size, mtime) = parentfiledata
-        else:
-            (mode, size, mtime) = self._get_filedata(filename)
         if not self._map[filename].tracked:
             self._check_new_tracked_filename(filename)
+        (mode, size, mtime) = parentfiledata
         self._map.set_clean(filename, mode, size, mtime)
         if mtime > self._lastnormaltime:
             # Remember the most recent modification timeslot for status(),
diff --git a/hgext/git/dirstate.py b/hgext/git/dirstate.py
--- a/hgext/git/dirstate.py
+++ b/hgext/git/dirstate.py
@@ -257,7 +257,7 @@ 
             if match(p):
                 yield p
 
-    def set_clean(self, f, parentfiledata=None):
+    def set_clean(self, f, parentfiledata):
         """Mark a file normal and clean."""
         # TODO: for now we just let libgit2 re-stat the file. We can
         # clearly do better.