232 /* skip over deleted manifest entries */ |
232 /* skip over deleted manifest entries */ |
233 } while (self->m->lines[self->pos].deleted); |
233 } while (self->m->lines[self->pos].deleted); |
234 return self->m->lines + self->pos; |
234 return self->m->lines + self->pos; |
235 } |
235 } |
236 |
236 |
237 static PyObject *lmiter_iternext(PyObject *o) |
237 static PyObject *lmiter_iterentriesnext(PyObject *o) |
238 { |
238 { |
239 size_t pl; |
239 size_t pl; |
240 line *l; |
240 line *l; |
241 Py_ssize_t consumed; |
241 Py_ssize_t consumed; |
242 PyObject *path = NULL, *hash = NULL, *flags = NULL; |
242 PyObject *path = NULL, *hash = NULL, *flags = NULL; |
259 Py_XDECREF(hash); |
259 Py_XDECREF(hash); |
260 Py_XDECREF(flags); |
260 Py_XDECREF(flags); |
261 return NULL; |
261 return NULL; |
262 } |
262 } |
263 |
263 |
264 static PyTypeObject lazymanifestIterator = { |
264 static PyTypeObject lazymanifestEntriesIterator = { |
265 PyObject_HEAD_INIT(NULL) |
265 PyObject_HEAD_INIT(NULL) |
266 0, /*ob_size */ |
266 0, /*ob_size */ |
267 "parsers.lazymanifest.iterator", /*tp_name */ |
267 "parsers.lazymanifest.entriesiterator", /*tp_name */ |
268 sizeof(lmIter), /*tp_basicsize */ |
268 sizeof(lmIter), /*tp_basicsize */ |
269 0, /*tp_itemsize */ |
269 0, /*tp_itemsize */ |
270 lmiter_dealloc, /*tp_dealloc */ |
270 lmiter_dealloc, /*tp_dealloc */ |
271 0, /*tp_print */ |
271 0, /*tp_print */ |
272 0, /*tp_getattr */ |
272 0, /*tp_getattr */ |
283 0, /*tp_setattro */ |
283 0, /*tp_setattro */ |
284 0, /*tp_as_buffer */ |
284 0, /*tp_as_buffer */ |
285 /* tp_flags: Py_TPFLAGS_HAVE_ITER tells python to |
285 /* tp_flags: Py_TPFLAGS_HAVE_ITER tells python to |
286 use tp_iter and tp_iternext fields. */ |
286 use tp_iter and tp_iternext fields. */ |
287 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, |
287 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, |
288 "Iterator for a lazymanifest.", /* tp_doc */ |
288 "Iterator for 3-tuples in a lazymanifest.", /* tp_doc */ |
289 0, /* tp_traverse */ |
289 0, /* tp_traverse */ |
290 0, /* tp_clear */ |
290 0, /* tp_clear */ |
291 0, /* tp_richcompare */ |
291 0, /* tp_richcompare */ |
292 0, /* tp_weaklistoffset */ |
292 0, /* tp_weaklistoffset */ |
293 PyObject_SelfIter, /* tp_iter: __iter__() method */ |
293 PyObject_SelfIter, /* tp_iter: __iter__() method */ |
294 lmiter_iternext, /* tp_iternext: next() method */ |
294 lmiter_iterentriesnext, /* tp_iternext: next() method */ |
295 }; |
295 }; |
296 |
296 |
297 static PyObject *lmiter_iterkeysnext(PyObject *o) |
297 static PyObject *lmiter_iterkeysnext(PyObject *o) |
298 { |
298 { |
299 size_t pl; |
299 size_t pl; |
338 lmiter_iterkeysnext, /* tp_iternext: next() method */ |
338 lmiter_iterkeysnext, /* tp_iternext: next() method */ |
339 }; |
339 }; |
340 |
340 |
341 static lazymanifest *lazymanifest_copy(lazymanifest *self); |
341 static lazymanifest *lazymanifest_copy(lazymanifest *self); |
342 |
342 |
343 static PyObject *lazymanifest_getiter(lazymanifest *self) |
343 static PyObject *lazymanifest_getentriesiter(lazymanifest *self) |
344 { |
344 { |
345 lmIter *i = NULL; |
345 lmIter *i = NULL; |
346 lazymanifest *t = lazymanifest_copy(self); |
346 lazymanifest *t = lazymanifest_copy(self); |
347 if (!t) { |
347 if (!t) { |
348 PyErr_NoMemory(); |
348 PyErr_NoMemory(); |
349 return NULL; |
349 return NULL; |
350 } |
350 } |
351 i = PyObject_New(lmIter, &lazymanifestIterator); |
351 i = PyObject_New(lmIter, &lazymanifestEntriesIterator); |
352 if (i) { |
352 if (i) { |
353 i->m = t; |
353 i->m = t; |
354 i->pos = -1; |
354 i->pos = -1; |
355 } else { |
355 } else { |
356 Py_DECREF(t); |
356 Py_DECREF(t); |
858 } |
858 } |
859 |
859 |
860 static PyMethodDef lazymanifest_methods[] = { |
860 static PyMethodDef lazymanifest_methods[] = { |
861 {"iterkeys", (PyCFunction)lazymanifest_getkeysiter, METH_NOARGS, |
861 {"iterkeys", (PyCFunction)lazymanifest_getkeysiter, METH_NOARGS, |
862 "Iterate over file names in this lazymanifest."}, |
862 "Iterate over file names in this lazymanifest."}, |
|
863 {"iterentries", (PyCFunction)lazymanifest_getentriesiter, METH_NOARGS, |
|
864 "Iterate over (path, nodeid, flags) typles in this lazymanifest."}, |
863 {"copy", (PyCFunction)lazymanifest_copy, METH_NOARGS, |
865 {"copy", (PyCFunction)lazymanifest_copy, METH_NOARGS, |
864 "Make a copy of this lazymanifest."}, |
866 "Make a copy of this lazymanifest."}, |
865 {"filtercopy", (PyCFunction)lazymanifest_filtercopy, METH_O, |
867 {"filtercopy", (PyCFunction)lazymanifest_filtercopy, METH_O, |
866 "Make a copy of this manifest filtered by matchfn."}, |
868 "Make a copy of this manifest filtered by matchfn."}, |
867 {"diff", (PyCFunction)lazymanifest_diff, METH_VARARGS, |
869 {"diff", (PyCFunction)lazymanifest_diff, METH_VARARGS, |
896 "TODO(augie)", /* tp_doc */ |
898 "TODO(augie)", /* tp_doc */ |
897 0, /* tp_traverse */ |
899 0, /* tp_traverse */ |
898 0, /* tp_clear */ |
900 0, /* tp_clear */ |
899 0, /* tp_richcompare */ |
901 0, /* tp_richcompare */ |
900 0, /* tp_weaklistoffset */ |
902 0, /* tp_weaklistoffset */ |
901 (getiterfunc)lazymanifest_getiter, /* tp_iter */ |
903 (getiterfunc)lazymanifest_getkeysiter, /* tp_iter */ |
902 0, /* tp_iternext */ |
904 0, /* tp_iternext */ |
903 lazymanifest_methods, /* tp_methods */ |
905 lazymanifest_methods, /* tp_methods */ |
904 0, /* tp_members */ |
906 0, /* tp_members */ |
905 0, /* tp_getset */ |
907 0, /* tp_getset */ |
906 0, /* tp_base */ |
908 0, /* tp_base */ |