Changeset View
Changeset View
Standalone View
Standalone View
mercurial/dirstatemap.py
Show First 20 Lines • Show All 297 Lines • ▼ Show 20 Line(s) | ): | ||||
msg %= filename | msg %= filename | ||||
raise error.ProgrammingError(msg) | raise error.ProgrammingError(msg) | ||||
mode, size, mtime = parentfiledata | mode, size, mtime = parentfiledata | ||||
self.addfile(filename, mode=mode, size=size, mtime=mtime) | self.addfile(filename, mode=mode, size=size, mtime=mtime) | ||||
self.nonnormalset.discard(filename) | self.nonnormalset.discard(filename) | ||||
else: | else: | ||||
assert False, 'unreachable' | assert False, 'unreachable' | ||||
def removefile(self, f, in_merge=False): | def set_untracked(self, f): | ||||
""" | """Mark a file as no longer tracked in the dirstate map""" | ||||
Mark a file as removed in the dirstate. | entry = self[f] | ||||
self._dirs_decr(f, old_entry=entry, remove_variant=True) | |||||
The `size` parameter is used to store sentinel values that indicate | if entry.from_p2: | ||||
the file's previous state. In the future, we should refactor this | |||||
to be more explicit about what that state is. | |||||
""" | |||||
entry = self.get(f) | |||||
size = 0 | |||||
if in_merge: | |||||
# XXX we should not be able to have 'm' state and 'FROM_P2' if not | |||||
# during a merge. So I (marmoute) am not sure we need the | |||||
# conditionnal at all. Adding double checking this with assert | |||||
# would be nice. | |||||
if entry is not None: | |||||
# backup the previous state | |||||
if entry.merged: # merge | |||||
size = NONNORMAL | |||||
elif entry.from_p2: | |||||
size = FROM_P2 | |||||
self.otherparentset.add(f) | self.otherparentset.add(f) | ||||
if entry is not None and not (entry.merged or entry.from_p2): | elif not entry.merged: | ||||
self.copymap.pop(f, None) | self.copymap.pop(f, None) | ||||
self._dirs_decr(f, old_entry=entry, remove_variant=True) | entry.set_untracked() | ||||
self._map[f] = DirstateItem(b'r', 0, size, 0) | |||||
self.nonnormalset.add(f) | self.nonnormalset.add(f) | ||||
def dropfile(self, f): | def dropfile(self, f): | ||||
""" | """ | ||||
Remove a file from the dirstate. Returns True if the file was | Remove a file from the dirstate. Returns True if the file was | ||||
previously recorded. | previously recorded. | ||||
""" | """ | ||||
old_entry = self._map.pop(f, None) | old_entry = self._map.pop(f, None) | ||||
▲ Show 20 Lines • Show All 319 Lines • ▼ Show 20 Line(s) | class dirstatemap(object): | ||||
msg %= filename | msg %= filename | ||||
raise error.ProgrammingError(msg) | raise error.ProgrammingError(msg) | ||||
mode, size, mtime = parentfiledata | mode, size, mtime = parentfiledata | ||||
self.addfile(filename, mode=mode, size=size, mtime=mtime) | self.addfile(filename, mode=mode, size=size, mtime=mtime) | ||||
self.nonnormalset.discard(filename) | self.nonnormalset.discard(filename) | ||||
else: | else: | ||||
assert False, 'unreachable' | assert False, 'unreachable' | ||||
def set_untracked(self, f): | |||||
"""Mark a file as no longer tracked in the dirstate map""" | |||||
# in merge is only trigger more logic, so it "fine" to pass it. | |||||
# | |||||
# the inner rust dirstate map code need to be adjusted once the API | |||||
# for dirstate/dirstatemap/DirstateItem is a bit more settled | |||||
self._rustmap.removefile(f, in_merge=True) | |||||
def removefile(self, *args, **kwargs): | def removefile(self, *args, **kwargs): | ||||
return self._rustmap.removefile(*args, **kwargs) | return self._rustmap.removefile(*args, **kwargs) | ||||
def dropfile(self, *args, **kwargs): | def dropfile(self, *args, **kwargs): | ||||
return self._rustmap.dropfile(*args, **kwargs) | return self._rustmap.dropfile(*args, **kwargs) | ||||
def clearambiguoustimes(self, *args, **kwargs): | def clearambiguoustimes(self, *args, **kwargs): | ||||
return self._rustmap.clearambiguoustimes(*args, **kwargs) | return self._rustmap.clearambiguoustimes(*args, **kwargs) | ||||
▲ Show 20 Lines • Show All 251 Lines • Show Last 20 Lines |