Show More
@@ -29,6 +29,8 b'' | |||||
29 |
|
29 | |||
30 | static const char *const versionerrortext = "Python minor version mismatch"; |
|
30 | static const char *const versionerrortext = "Python minor version mismatch"; | |
31 |
|
31 | |||
|
32 | static const int dirstate_v1_from_p2 = -2; | |||
|
33 | ||||
32 | static PyObject *dict_new_presized(PyObject *self, PyObject *args) |
|
34 | static PyObject *dict_new_presized(PyObject *self, PyObject *args) | |
33 | { |
|
35 | { | |
34 | Py_ssize_t expected_size; |
|
36 | Py_ssize_t expected_size; | |
@@ -164,9 +166,19 b' static PyObject *dirstatetuple_get_merge' | |||||
164 | } |
|
166 | } | |
165 | }; |
|
167 | }; | |
166 |
|
168 | |||
|
169 | static PyObject *dirstatetuple_get_from_p2(dirstateTupleObject *self) | |||
|
170 | { | |||
|
171 | if (self->size == dirstate_v1_from_p2) { | |||
|
172 | Py_RETURN_TRUE; | |||
|
173 | } else { | |||
|
174 | Py_RETURN_FALSE; | |||
|
175 | } | |||
|
176 | }; | |||
|
177 | ||||
167 | static PyGetSetDef dirstatetuple_getset[] = { |
|
178 | static PyGetSetDef dirstatetuple_getset[] = { | |
168 | {"state", (getter)dirstatetuple_get_state, NULL, "state", NULL}, |
|
179 | {"state", (getter)dirstatetuple_get_state, NULL, "state", NULL}, | |
169 | {"merged", (getter)dirstatetuple_get_merged, NULL, "merged", NULL}, |
|
180 | {"merged", (getter)dirstatetuple_get_merged, NULL, "merged", NULL}, | |
|
181 | {"from_p2", (getter)dirstatetuple_get_from_p2, NULL, "from_p2", NULL}, | |||
170 | {NULL} /* Sentinel */ |
|
182 | {NULL} /* Sentinel */ | |
171 | }; |
|
183 | }; | |
172 |
|
184 |
@@ -393,7 +393,7 b' class dirstate(object):' | |||||
393 | copies[f] = source |
|
393 | copies[f] = source | |
394 | self.normallookup(f) |
|
394 | self.normallookup(f) | |
395 | # Also fix up otherparent markers |
|
395 | # Also fix up otherparent markers | |
396 |
elif s.state == b'n' and s |
|
396 | elif s.state == b'n' and s.from_p2: | |
397 | source = self._map.copymap.get(f) |
|
397 | source = self._map.copymap.get(f) | |
398 | if source: |
|
398 | if source: | |
399 | copies[f] = source |
|
399 | copies[f] = source | |
@@ -531,16 +531,18 b' class dirstate(object):' | |||||
531 | # being removed, restore that state. |
|
531 | # being removed, restore that state. | |
532 | entry = self._map.get(f) |
|
532 | entry = self._map.get(f) | |
533 | if entry is not None: |
|
533 | if entry is not None: | |
534 |
if entry.state == b'r' and |
|
534 | if entry.state == b'r' and ( | |
|
535 | entry[2] == NONNORMAL or entry.from_p2 | |||
|
536 | ): | |||
535 | source = self._map.copymap.get(f) |
|
537 | source = self._map.copymap.get(f) | |
536 | if entry[2] == NONNORMAL: |
|
538 | if entry[2] == NONNORMAL: | |
537 | self.merge(f) |
|
539 | self.merge(f) | |
538 |
elif entry |
|
540 | elif entry.from_p2: | |
539 | self.otherparent(f) |
|
541 | self.otherparent(f) | |
540 | if source: |
|
542 | if source: | |
541 | self.copy(source, f) |
|
543 | self.copy(source, f) | |
542 | return |
|
544 | return | |
543 |
if entry.merged or entry.state == b'n' and entry |
|
545 | if entry.merged or entry.state == b'n' and entry.from_p2: | |
544 | return |
|
546 | return | |
545 | self._addpath(f, b'n', 0, possibly_dirty=True) |
|
547 | self._addpath(f, b'n', 0, possibly_dirty=True) | |
546 | self._map.copymap.pop(f, None) |
|
548 | self._map.copymap.pop(f, None) | |
@@ -1336,7 +1338,7 b' class dirstate(object):' | |||||
1336 | (size != st.st_size and size != st.st_size & _rangemask) |
|
1338 | (size != st.st_size and size != st.st_size & _rangemask) | |
1337 | or ((mode ^ st.st_mode) & 0o100 and checkexec) |
|
1339 | or ((mode ^ st.st_mode) & 0o100 and checkexec) | |
1338 | ) |
|
1340 | ) | |
1339 | or size == FROM_P2 # other parent |
|
1341 | or t.from_p2 | |
1340 | or fn in copymap |
|
1342 | or fn in copymap | |
1341 | ): |
|
1343 | ): | |
1342 | if stat.S_ISLNK(st.st_mode) and size != st.st_size: |
|
1344 | if stat.S_ISLNK(st.st_mode) and size != st.st_size: |
@@ -173,7 +173,7 b' class dirstatemap(object):' | |||||
173 | # backup the previous state |
|
173 | # backup the previous state | |
174 | if entry.merged: # merge |
|
174 | if entry.merged: # merge | |
175 | size = NONNORMAL |
|
175 | size = NONNORMAL | |
176 |
elif entry[0] == b'n' and entry |
|
176 | elif entry[0] == b'n' and entry.from_p2: | |
177 | size = FROM_P2 |
|
177 | size = FROM_P2 | |
178 | self.otherparentset.add(f) |
|
178 | self.otherparentset.add(f) | |
179 | if size == 0: |
|
179 | if size == 0: |
@@ -33,6 +33,10 b' stringio = pycompat.bytesio' | |||||
33 | _decompress = zlib.decompress |
|
33 | _decompress = zlib.decompress | |
34 |
|
34 | |||
35 |
|
35 | |||
|
36 | # a special value used internally for `size` if the file come from the other parent | |||
|
37 | FROM_P2 = -2 | |||
|
38 | ||||
|
39 | ||||
36 | class dirstatetuple(object): |
|
40 | class dirstatetuple(object): | |
37 | """represent a dirstate entry |
|
41 | """represent a dirstate entry | |
38 |
|
42 | |||
@@ -87,6 +91,14 b' class dirstatetuple(object):' | |||||
87 | """ |
|
91 | """ | |
88 | return self._state == b'm' |
|
92 | return self._state == b'm' | |
89 |
|
93 | |||
|
94 | @property | |||
|
95 | def from_p2(self): | |||
|
96 | """True if the file have been fetched from p2 during the current merge | |||
|
97 | ||||
|
98 | Should only be set if a merge is in progress in the dirstate | |||
|
99 | """ | |||
|
100 | return self._size == FROM_P2 | |||
|
101 | ||||
90 | def v1_state(self): |
|
102 | def v1_state(self): | |
91 | """return a "state" suitable for v1 serialization""" |
|
103 | """return a "state" suitable for v1 serialization""" | |
92 | return self._state |
|
104 | return self._state |
General Comments 0
You need to be logged in to leave comments.
Login now