Mercurial > hg
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): |