Show More
@@ -155,6 +155,48 b' static PyObject *dirstate_item_need_dela' | |||||
155 | } |
|
155 | } | |
156 | }; |
|
156 | }; | |
157 |
|
157 | |||
|
158 | /* This will never change since it's bound to V1, unlike `make_dirstate_item` | |||
|
159 | */ | |||
|
160 | static inline dirstateItemObject * | |||
|
161 | dirstate_item_from_v1_data(char state, int mode, int size, int mtime) | |||
|
162 | { | |||
|
163 | dirstateItemObject *t = | |||
|
164 | PyObject_New(dirstateItemObject, &dirstateItemType); | |||
|
165 | if (!t) { | |||
|
166 | return NULL; | |||
|
167 | } | |||
|
168 | t->state = state; | |||
|
169 | t->mode = mode; | |||
|
170 | t->size = size; | |||
|
171 | t->mtime = mtime; | |||
|
172 | return t; | |||
|
173 | } | |||
|
174 | ||||
|
175 | /* This will never change since it's bound to V1, unlike `dirstate_item_new` */ | |||
|
176 | static PyObject *dirstate_item_from_v1_meth(PyTypeObject *subtype, | |||
|
177 | PyObject *args) | |||
|
178 | { | |||
|
179 | /* We do all the initialization here and not a tp_init function because | |||
|
180 | * dirstate_item is immutable. */ | |||
|
181 | dirstateItemObject *t; | |||
|
182 | char state; | |||
|
183 | int size, mode, mtime; | |||
|
184 | if (!PyArg_ParseTuple(args, "ciii", &state, &mode, &size, &mtime)) { | |||
|
185 | return NULL; | |||
|
186 | } | |||
|
187 | ||||
|
188 | t = (dirstateItemObject *)subtype->tp_alloc(subtype, 1); | |||
|
189 | if (!t) { | |||
|
190 | return NULL; | |||
|
191 | } | |||
|
192 | t->state = state; | |||
|
193 | t->mode = mode; | |||
|
194 | t->size = size; | |||
|
195 | t->mtime = mtime; | |||
|
196 | ||||
|
197 | return (PyObject *)t; | |||
|
198 | }; | |||
|
199 | ||||
158 | static PyMethodDef dirstate_item_methods[] = { |
|
200 | static PyMethodDef dirstate_item_methods[] = { | |
159 | {"v1_state", (PyCFunction)dirstate_item_v1_state, METH_NOARGS, |
|
201 | {"v1_state", (PyCFunction)dirstate_item_v1_state, METH_NOARGS, | |
160 | "return a \"state\" suitable for v1 serialization"}, |
|
202 | "return a \"state\" suitable for v1 serialization"}, | |
@@ -166,6 +208,8 b' static PyMethodDef dirstate_item_methods' | |||||
166 | "return a \"mtime\" suitable for v1 serialization"}, |
|
208 | "return a \"mtime\" suitable for v1 serialization"}, | |
167 | {"need_delay", (PyCFunction)dirstate_item_need_delay, METH_O, |
|
209 | {"need_delay", (PyCFunction)dirstate_item_need_delay, METH_O, | |
168 | "True if the stored mtime would be ambiguous with the current time"}, |
|
210 | "True if the stored mtime would be ambiguous with the current time"}, | |
|
211 | {"from_v1_data", (PyCFunction)dirstate_item_from_v1_meth, METH_O, | |||
|
212 | "build a new DirstateItem object from V1 data"}, | |||
169 | {NULL} /* Sentinel */ |
|
213 | {NULL} /* Sentinel */ | |
170 | }; |
|
214 | }; | |
171 |
|
215 | |||
@@ -363,8 +407,8 b' static PyObject *parse_dirstate(PyObject' | |||||
363 | goto quit; |
|
407 | goto quit; | |
364 | } |
|
408 | } | |
365 |
|
409 | |||
366 | entry = |
|
410 | entry = (PyObject *)dirstate_item_from_v1_data(state, mode, | |
367 | (PyObject *)make_dirstate_item(state, mode, size, mtime); |
|
411 | size, mtime); | |
368 | cpos = memchr(cur, 0, flen); |
|
412 | cpos = memchr(cur, 0, flen); | |
369 | if (cpos) { |
|
413 | if (cpos) { | |
370 | fname = PyBytes_FromStringAndSize(cur, cpos - cur); |
|
414 | fname = PyBytes_FromStringAndSize(cur, cpos - cur); |
@@ -67,6 +67,20 b' class DirstateItem(object):' | |||||
67 | self._size = size |
|
67 | self._size = size | |
68 | self._mtime = mtime |
|
68 | self._mtime = mtime | |
69 |
|
69 | |||
|
70 | @classmethod | |||
|
71 | def from_v1_data(cls, state, mode, size, mtime): | |||
|
72 | """Build a new DirstateItem object from V1 data | |||
|
73 | ||||
|
74 | Since the dirstate-v1 format is frozen, the signature of this function | |||
|
75 | is not expected to change, unlike the __init__ one. | |||
|
76 | """ | |||
|
77 | return cls( | |||
|
78 | state=state, | |||
|
79 | mode=mode, | |||
|
80 | size=size, | |||
|
81 | mtime=mtime, | |||
|
82 | ) | |||
|
83 | ||||
70 | def __getitem__(self, idx): |
|
84 | def __getitem__(self, idx): | |
71 | if idx == 0 or idx == -4: |
|
85 | if idx == 0 or idx == -4: | |
72 | msg = b"do not use item[x], use item.state" |
|
86 | msg = b"do not use item[x], use item.state" | |
@@ -546,7 +560,7 b' def parse_dirstate(dmap, copymap, st):' | |||||
546 | if b'\0' in f: |
|
560 | if b'\0' in f: | |
547 | f, c = f.split(b'\0') |
|
561 | f, c = f.split(b'\0') | |
548 | copymap[f] = c |
|
562 | copymap[f] = c | |
549 | dmap[f] = DirstateItem(*e[:4]) |
|
563 | dmap[f] = DirstateItem.from_v1_data(*e[:4]) | |
550 | return parents |
|
564 | return parents | |
551 |
|
565 | |||
552 |
|
566 |
General Comments 0
You need to be logged in to leave comments.
Login now