comparison mercurial/dirstatemap.py @ 47890:3853e6ee160d

dirstatemap: replace `removefile` by an explicit `entry.set_untracked()` All the other caller goes through `reset_state`, so we can safely have an explicit method on `DirstateItem` object. This means that all the logic to preserve the previous state (from p2, merged, etc) is now properly encapsulated within the DirstateItem. This pave the way to using different storage for these information. Differential Revision: https://phab.mercurial-scm.org/D11315
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 20 Aug 2021 11:27:01 +0200
parents 460e479be66e
children 0b35bc0b8636
comparison
equal deleted inserted replaced
47889:6614ab9f061d 47890:3853e6ee160d
301 self.addfile(filename, mode=mode, size=size, mtime=mtime) 301 self.addfile(filename, mode=mode, size=size, mtime=mtime)
302 self.nonnormalset.discard(filename) 302 self.nonnormalset.discard(filename)
303 else: 303 else:
304 assert False, 'unreachable' 304 assert False, 'unreachable'
305 305
306 def removefile(self, f, in_merge=False): 306 def set_untracked(self, f):
307 """ 307 """Mark a file as no longer tracked in the dirstate map"""
308 Mark a file as removed in the dirstate. 308 entry = self[f]
309 309 self._dirs_decr(f, old_entry=entry, remove_variant=True)
310 The `size` parameter is used to store sentinel values that indicate 310 if entry.from_p2:
311 the file's previous state. In the future, we should refactor this 311 self.otherparentset.add(f)
312 to be more explicit about what that state is. 312 elif not entry.merged:
313 """
314 entry = self.get(f)
315 size = 0
316 if in_merge:
317 # XXX we should not be able to have 'm' state and 'FROM_P2' if not
318 # during a merge. So I (marmoute) am not sure we need the
319 # conditionnal at all. Adding double checking this with assert
320 # would be nice.
321 if entry is not None:
322 # backup the previous state
323 if entry.merged: # merge
324 size = NONNORMAL
325 elif entry.from_p2:
326 size = FROM_P2
327 self.otherparentset.add(f)
328 if entry is not None and not (entry.merged or entry.from_p2):
329 self.copymap.pop(f, None) 313 self.copymap.pop(f, None)
330 self._dirs_decr(f, old_entry=entry, remove_variant=True) 314 entry.set_untracked()
331 self._map[f] = DirstateItem(b'r', 0, size, 0)
332 self.nonnormalset.add(f) 315 self.nonnormalset.add(f)
333 316
334 def dropfile(self, f): 317 def dropfile(self, f):
335 """ 318 """
336 Remove a file from the dirstate. Returns True if the file was 319 Remove a file from the dirstate. Returns True if the file was
661 mode, size, mtime = parentfiledata 644 mode, size, mtime = parentfiledata
662 self.addfile(filename, mode=mode, size=size, mtime=mtime) 645 self.addfile(filename, mode=mode, size=size, mtime=mtime)
663 self.nonnormalset.discard(filename) 646 self.nonnormalset.discard(filename)
664 else: 647 else:
665 assert False, 'unreachable' 648 assert False, 'unreachable'
649
650 def set_untracked(self, f):
651 """Mark a file as no longer tracked in the dirstate map"""
652 # in merge is only trigger more logic, so it "fine" to pass it.
653 #
654 # the inner rust dirstate map code need to be adjusted once the API
655 # for dirstate/dirstatemap/DirstateItem is a bit more settled
656 self._rustmap.removefile(f, in_merge=True)
666 657
667 def removefile(self, *args, **kwargs): 658 def removefile(self, *args, **kwargs):
668 return self._rustmap.removefile(*args, **kwargs) 659 return self._rustmap.removefile(*args, **kwargs)
669 660
670 def dropfile(self, *args, **kwargs): 661 def dropfile(self, *args, **kwargs):