[PATCH 2 of 2 V3] changelog: fix bug in heads computation

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue May 26 13:18:48 CDT 2015



On 05/21/2015 03:59 PM, Laurent Charignon wrote:
> # HG changeset patch
> # User Laurent Charignon <lcharignon at fb.com>
> # Date 1432248471 25200
> #      Thu May 21 15:47:51 2015 -0700
> # Node ID 13c35e19e9b943fabee197431f87d098d8c5fdfd
> # Parent  facf49ded5ab213fbbd4599c6e50af742de2fe13
> changelog: fix bug in heads computation
>
> This patch refactors the native computation of heads. It fixes a bug where
> filtered heads in the pending index could be returned by the native code
> despite their filtering.
>
> diff --git a/mercurial/parsers.c b/mercurial/parsers.c
> --- a/mercurial/parsers.c
> +++ b/mercurial/parsers.c
> @@ -1193,7 +1193,7 @@
>
>   static PyObject *index_headrevs(indexObject *self, PyObject *args)
>   {
> -	Py_ssize_t i, len, addlen;
> +	int i, j, len;

mysterioux variable type change ?

>   	char *nothead = NULL;
>   	PyObject *heads = NULL;
>   	PyObject *filter = NULL;
> @@ -1236,9 +1236,9 @@
>   	if (nothead == NULL)
>   		goto bail;
>
> -	for (i = 0; i < self->raw_length; i++) {
> -		const char *data;
> -		int parent_1, parent_2, isfiltered;
> +	for (i = 0; i < len; i++) {
> +		int isfiltered;
> +		int parents[2];
>
>   		isfiltered = check_filter(filter, i);
>   		if (isfiltered == -1) {
> @@ -1252,49 +1252,11 @@
>   			continue;
>   		}
>
> -		data = index_deref(self, i);
> -		parent_1 = getbe32(data + 24);
> -		parent_2 = getbe32(data + 28);
> -
> -		if (parent_1 >= 0)
> -			nothead[parent_1] = 1;
> -		if (parent_2 >= 0)
> -			nothead[parent_2] = 1;
> -	}
> -
> -	addlen = self->added ? PyList_GET_SIZE(self->added) : 0;
> -
> -	for (i = 0; i < addlen; i++) {
> -		PyObject *rev = PyList_GET_ITEM(self->added, i);
> -		PyObject *p1 = PyTuple_GET_ITEM(rev, 5);
> -		PyObject *p2 = PyTuple_GET_ITEM(rev, 6);
> -		long parent_1, parent_2;
> -		int isfiltered;
> -
> -		if (!PyInt_Check(p1) || !PyInt_Check(p2)) {
> -			PyErr_SetString(PyExc_TypeError,
> -					"revlog parents are invalid");
> -			goto bail;
> +		index_get_parents(self, i, parents);
> +		for (j = 0; j < 2 ; j++){
> +			if (parents[j] >= 0)
> +				nothead[parents[j]] = 1;
>   		}
> -
> -		isfiltered = check_filter(filter, i);
> -		if (isfiltered == -1) {
> -			PyErr_SetString(PyExc_TypeError,
> -				"unable to check filter");
> -			goto bail;
> -		}
> -
> -		if (isfiltered) {
> -			nothead[i] = 1;
> -			continue;
> -		}
> -
> -		parent_1 = PyInt_AS_LONG(p1);
> -		parent_2 = PyInt_AS_LONG(p2);
> -		if (parent_1 >= 0)
> -			nothead[parent_1] = 1;
> -		if (parent_2 >= 0)
> -			nothead[parent_2] = 1;
>   	}
>
>   	for (i = 0; i < len; i++) {

Given what I've read from matt feedback, the change seems fine to me 
(but I've not idea what I'm talking about) and the new code it much simpler.

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list