# HG changeset patch # User Matt Mackall # Date 1402699324 18000 # Node ID c5699c2d690b9543fbeaf0ea1c2bdead2d762bc8 # Parent fecead61d222ae0bd4b866034272e3e8f0ca00b3# Parent 4ab287c2d3378289f0a8125cfba955d1183e472d merge with stable diff -r fecead61d222 -r c5699c2d690b mercurial/parsers.c --- a/mercurial/parsers.c Tue Jun 10 17:00:31 2014 -0700 +++ b/mercurial/parsers.c Fri Jun 13 17:42:04 2014 -0500 @@ -1299,7 +1299,7 @@ static const Py_ssize_t capacity = 24; int *depth, *interesting = NULL; int i, j, v, ninteresting; - PyObject *dict = NULL, *keys; + PyObject *dict = NULL, *keys = NULL; long *seen = NULL; int maxrev = -1; long final; @@ -1403,8 +1403,10 @@ final |= i; j -= 1; } - if (final == 0) - return PyList_New(0); + if (final == 0) { + keys = PyList_New(0); + goto bail; + } dict = PyDict_New(); if (dict == NULL) @@ -1428,19 +1430,13 @@ keys = PyDict_Keys(dict); - free(depth); - free(seen); - free(interesting); - Py_DECREF(dict); - - return keys; bail: free(depth); free(seen); free(interesting); Py_XDECREF(dict); - return NULL; + return keys; } /* diff -r fecead61d222 -r c5699c2d690b mercurial/revlog.py --- a/mercurial/revlog.py Tue Jun 10 17:00:31 2014 -0700 +++ b/mercurial/revlog.py Fri Jun 13 17:42:04 2014 -0500 @@ -919,8 +919,13 @@ # preload the cache try: - self._chunkraw(revs[0], revs[-1]) - offset, data = self._chunkcache + while 1: + # ensure that the cache doesn't change out from under us + _cache = self._chunkcache + self._chunkraw(revs[0], revs[-1]) + if _cache == self._chunkcache: + break + offset, data = _cache except OverflowError: # issue4215 - we can't cache a run of chunks greater than # 2G on Windows @@ -967,13 +972,14 @@ node = nodeorrev rev = None + _cache = self._cache # grab local copy of cache to avoid thread race cachedrev = None if node == nullid: return "" - if self._cache: - if self._cache[0] == node: - return self._cache[2] - cachedrev = self._cache[1] + if _cache: + if _cache[0] == node: + return _cache[2] + cachedrev = _cache[1] # look up what we need to read text = None @@ -1001,7 +1007,7 @@ if iterrev == cachedrev: # cache hit - text = self._cache[2] + text = _cache[2] else: chain.append(iterrev) chain.reverse() diff -r fecead61d222 -r c5699c2d690b tests/test-subrepo-git.t --- a/tests/test-subrepo-git.t Tue Jun 10 17:00:31 2014 -0700 +++ b/tests/test-subrepo-git.t Fri Jun 13 17:42:04 2014 -0500 @@ -601,11 +601,9 @@ 8:3473d20bddcf $ grep ' s$' .hgsubstate c4069473b459cf27fd4d7c2f50c4346b4e936599 s - $ cat s/.hg/hgrc - cat: s/.hg/hgrc: No such file or directory + $ test -f s/.hg/hgrc [1] - $ cat s/sub/.hg/hgrc - cat: s/sub/.hg/hgrc: No such file or directory + $ test -f s/sub/.hg/hgrc [1] $ cd .. @@ -636,11 +634,9 @@ $ cd tc $ hg update -q -C af6d2edbb0d3 - $ cat s/.hg/hgrc - cat: s/.hg/hgrc: No such file or directory + $ test -f s/.hg/hgrc [1] - $ cat s/sub/.hg/hgrc - cat: s/sub/.hg/hgrc: No such file or directory + $ test -f s/sub/.hg/hgrc [1] $ cd .. $ hg -R tc pull -q @@ -652,11 +648,9 @@ 9:ed23f7fe024e $ grep ' s$' .hgsubstate f262643c1077219fbd3858d54e78ef050ef84fbf s - $ cat s/.hg/hgrc - cat: s/.hg/hgrc: No such file or directory + $ test -f s/.hg/hgrc [1] - $ cat s/sub/.hg/hgrc - cat: s/sub/.hg/hgrc: No such file or directory + $ test -f s/sub/.hg/hgrc [1] Test that sanitizing is omitted in meta data area: