Mercurial > hg
comparison mercurial/manifest.c @ 24295:2b7ab29627fd
lazymanifest: add iterkeys() method
So we don't have to iteratate over (path, node, flags) tuples only to
throw away the node and flags.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Wed, 11 Mar 2015 13:46:15 -0700 |
parents | 3d485727e45e |
children | 49cd847fd69a |
comparison
equal
deleted
inserted
replaced
24294:3d485727e45e | 24295:2b7ab29627fd |
---|---|
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_iternext, /* tp_iternext: next() method */ |
295 }; | 295 }; |
296 | 296 |
297 static PyObject *lmiter_iterkeysnext(PyObject *o) | |
298 { | |
299 size_t pl; | |
300 line *l = lmiter_nextline((lmIter *)o); | |
301 if (!l) { | |
302 return NULL; | |
303 } | |
304 pl = pathlen(l); | |
305 return PyString_FromStringAndSize(l->start, pl); | |
306 } | |
307 | |
308 static PyTypeObject lazymanifestKeysIterator = { | |
309 PyObject_HEAD_INIT(NULL) | |
310 0, /*ob_size */ | |
311 "parsers.lazymanifest.keysiterator", /*tp_name */ | |
312 sizeof(lmIter), /*tp_basicsize */ | |
313 0, /*tp_itemsize */ | |
314 lmiter_dealloc, /*tp_dealloc */ | |
315 0, /*tp_print */ | |
316 0, /*tp_getattr */ | |
317 0, /*tp_setattr */ | |
318 0, /*tp_compare */ | |
319 0, /*tp_repr */ | |
320 0, /*tp_as_number */ | |
321 0, /*tp_as_sequence */ | |
322 0, /*tp_as_mapping */ | |
323 0, /*tp_hash */ | |
324 0, /*tp_call */ | |
325 0, /*tp_str */ | |
326 0, /*tp_getattro */ | |
327 0, /*tp_setattro */ | |
328 0, /*tp_as_buffer */ | |
329 /* tp_flags: Py_TPFLAGS_HAVE_ITER tells python to | |
330 use tp_iter and tp_iternext fields. */ | |
331 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, | |
332 "Keys iterator for a lazymanifest.", /* tp_doc */ | |
333 0, /* tp_traverse */ | |
334 0, /* tp_clear */ | |
335 0, /* tp_richcompare */ | |
336 0, /* tp_weaklistoffset */ | |
337 PyObject_SelfIter, /* tp_iter: __iter__() method */ | |
338 lmiter_iterkeysnext, /* tp_iternext: next() method */ | |
339 }; | |
340 | |
297 static lazymanifest *lazymanifest_copy(lazymanifest *self); | 341 static lazymanifest *lazymanifest_copy(lazymanifest *self); |
298 | 342 |
299 static PyObject *lazymanifest_getiter(lazymanifest *self) | 343 static PyObject *lazymanifest_getiter(lazymanifest *self) |
300 { | 344 { |
301 lmIter *i = NULL; | 345 lmIter *i = NULL; |
303 if (!t) { | 347 if (!t) { |
304 PyErr_NoMemory(); | 348 PyErr_NoMemory(); |
305 return NULL; | 349 return NULL; |
306 } | 350 } |
307 i = PyObject_New(lmIter, &lazymanifestIterator); | 351 i = PyObject_New(lmIter, &lazymanifestIterator); |
352 if (i) { | |
353 i->m = t; | |
354 i->pos = -1; | |
355 } else { | |
356 Py_DECREF(t); | |
357 PyErr_NoMemory(); | |
358 } | |
359 return (PyObject *)i; | |
360 } | |
361 | |
362 static PyObject *lazymanifest_getkeysiter(lazymanifest *self) | |
363 { | |
364 lmIter *i = NULL; | |
365 lazymanifest *t = lazymanifest_copy(self); | |
366 if (!t) { | |
367 PyErr_NoMemory(); | |
368 return NULL; | |
369 } | |
370 i = PyObject_New(lmIter, &lazymanifestKeysIterator); | |
308 if (i) { | 371 if (i) { |
309 i->m = t; | 372 i->m = t; |
310 i->pos = -1; | 373 i->pos = -1; |
311 } else { | 374 } else { |
312 Py_DECREF(t); | 375 Py_DECREF(t); |
793 Py_XDECREF(emptyTup); | 856 Py_XDECREF(emptyTup); |
794 return NULL; | 857 return NULL; |
795 } | 858 } |
796 | 859 |
797 static PyMethodDef lazymanifest_methods[] = { | 860 static PyMethodDef lazymanifest_methods[] = { |
861 {"iterkeys", (PyCFunction)lazymanifest_getkeysiter, METH_NOARGS, | |
862 "Iterate over file names in this lazymanifest."}, | |
798 {"copy", (PyCFunction)lazymanifest_copy, METH_NOARGS, | 863 {"copy", (PyCFunction)lazymanifest_copy, METH_NOARGS, |
799 "Make a copy of this lazymanifest."}, | 864 "Make a copy of this lazymanifest."}, |
800 {"filtercopy", (PyCFunction)lazymanifest_filtercopy, METH_O, | 865 {"filtercopy", (PyCFunction)lazymanifest_filtercopy, METH_O, |
801 "Make a copy of this manifest filtered by matchfn."}, | 866 "Make a copy of this manifest filtered by matchfn."}, |
802 {"diff", (PyCFunction)lazymanifest_diff, METH_VARARGS, | 867 {"diff", (PyCFunction)lazymanifest_diff, METH_VARARGS, |