##// END OF EJS Templates
dirstate-entry: add a `from_p2` property...
marmoute -
r48303:559aee84 default
parent child Browse files
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[2] == FROM_P2:
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 entry[2] in (NONNORMAL, FROM_P2):
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[2] == FROM_P2:
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[2] == FROM_P2:
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[2] == FROM_P2: # other parent
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