Show More
@@ -223,6 +223,21 b' static PyObject *dirstate_item_set_possi' | |||
|
223 | 223 | Py_RETURN_NONE; |
|
224 | 224 | } |
|
225 | 225 | |
|
226 | static PyObject *dirstate_item_set_untracked(dirstateItemObject *self) | |
|
227 | { | |
|
228 | if (self->state == 'm') { | |
|
229 | self->size = dirstate_v1_nonnormal; | |
|
230 | } else if (self->state == 'n' && self->size == dirstate_v1_from_p2) { | |
|
231 | self->size = dirstate_v1_from_p2; | |
|
232 | } else { | |
|
233 | self->size = 0; | |
|
234 | } | |
|
235 | self->state = 'r'; | |
|
236 | self->mode = 0; | |
|
237 | self->mtime = 0; | |
|
238 | Py_RETURN_NONE; | |
|
239 | } | |
|
240 | ||
|
226 | 241 | static PyMethodDef dirstate_item_methods[] = { |
|
227 | 242 | {"v1_state", (PyCFunction)dirstate_item_v1_state, METH_NOARGS, |
|
228 | 243 | "return a \"state\" suitable for v1 serialization"}, |
@@ -238,6 +253,8 b' static PyMethodDef dirstate_item_methods' | |||
|
238 | 253 | "build a new DirstateItem object from V1 data"}, |
|
239 | 254 | {"set_possibly_dirty", (PyCFunction)dirstate_item_set_possibly_dirty, |
|
240 | 255 | METH_NOARGS, "mark a file as \"possibly dirty\""}, |
|
256 | {"set_untracked", (PyCFunction)dirstate_item_set_untracked, METH_NOARGS, | |
|
257 | "mark a file as \"untracked\""}, | |
|
241 | 258 | {"dm_nonnormal", (PyCFunction)dm_nonnormal, METH_NOARGS, |
|
242 | 259 | "True is the entry is non-normal in the dirstatemap sense"}, |
|
243 | 260 | {"dm_otherparent", (PyCFunction)dm_otherparent, METH_NOARGS, |
@@ -502,7 +502,7 b' class dirstate(object):' | |||
|
502 | 502 | else: |
|
503 | 503 | self._dirty = True |
|
504 | 504 | self._updatedfiles.add(filename) |
|
505 |
self._map. |
|
|
505 | self._map.set_untracked(filename) | |
|
506 | 506 | return True |
|
507 | 507 | |
|
508 | 508 | @requires_no_parents_change |
@@ -303,32 +303,15 b' class dirstatemap(object):' | |||
|
303 | 303 | else: |
|
304 | 304 | assert False, 'unreachable' |
|
305 | 305 | |
|
306 | def removefile(self, f, in_merge=False): | |
|
307 | """ | |
|
308 | Mark a file as removed in the dirstate. | |
|
309 | ||
|
310 | The `size` parameter is used to store sentinel values that indicate | |
|
311 | the file's previous state. In the future, we should refactor this | |
|
312 | to be more explicit about what that state is. | |
|
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 | |
|
306 | def set_untracked(self, f): | |
|
307 | """Mark a file as no longer tracked in the dirstate map""" | |
|
308 | entry = self[f] | |
|
309 | self._dirs_decr(f, old_entry=entry, remove_variant=True) | |
|
310 | if entry.from_p2: | |
|
327 | 311 |
|
|
328 | if entry is not None and not (entry.merged or entry.from_p2): | |
|
312 | elif not entry.merged: | |
|
329 | 313 | self.copymap.pop(f, None) |
|
330 | self._dirs_decr(f, old_entry=entry, remove_variant=True) | |
|
331 | self._map[f] = DirstateItem(b'r', 0, size, 0) | |
|
314 | entry.set_untracked() | |
|
332 | 315 | self.nonnormalset.add(f) |
|
333 | 316 | |
|
334 | 317 | def dropfile(self, f): |
@@ -664,6 +647,14 b' if rustmod is not None:' | |||
|
664 | 647 | else: |
|
665 | 648 | assert False, 'unreachable' |
|
666 | 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) | |
|
657 | ||
|
667 | 658 | def removefile(self, *args, **kwargs): |
|
668 | 659 | return self._rustmap.removefile(*args, **kwargs) |
|
669 | 660 |
@@ -89,6 +89,22 b' class DirstateItem(object):' | |||
|
89 | 89 | """ |
|
90 | 90 | self._mtime = AMBIGUOUS_TIME |
|
91 | 91 | |
|
92 | def set_untracked(self): | |
|
93 | """mark a file as untracked in the working copy | |
|
94 | ||
|
95 | This will ultimately be called by command like `hg remove`. | |
|
96 | """ | |
|
97 | # backup the previous state (useful for merge) | |
|
98 | size = 0 | |
|
99 | if self.merged: # merge | |
|
100 | size = NONNORMAL | |
|
101 | elif self.from_p2: | |
|
102 | size = FROM_P2 | |
|
103 | self._state = b'r' | |
|
104 | self._mode = 0 | |
|
105 | self._size = size | |
|
106 | self._mtime = 0 | |
|
107 | ||
|
92 | 108 | def __getitem__(self, idx): |
|
93 | 109 | if idx == 0 or idx == -4: |
|
94 | 110 | msg = b"do not use item[x], use item.state" |
General Comments 0
You need to be logged in to leave comments.
Login now