mercurial/manifest.c
changeset 24298 49cd847fd69a
parent 24295 2b7ab29627fd
child 24312 f208ce59a6e5
equal deleted inserted replaced
24297:0178f500d61e 24298:49cd847fd69a
   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 */