Re: [PATCH] git tag --contains : avoid stack overflow
From: Johannes Schindelin <hidden>
Date: 2016-06-15 23:00:43
Hi Peff, On Wed, 16 Apr 2014, Jeff King wrote:
On Wed, Apr 16, 2014 at 04:15:19PM +0200, Stepan Kasal wrote:quoted
From: Jean-Jacques Lafay at Sat, 10 Nov 2012 18:36:10 +0100 In large repos, the recursion implementation of contains(commit, commit_list) may result in a stack overflow. Replace the recursion with a loop to fix it. This problem is more apparent on Windows than on Linux, where the stack is more limited by default.I think this is a good thing to be doing, and it looks mostly good to me. A few comments:quoted
-static int contains_recurse(struct commit *candidate, +/* + * Test whether the candidate or one of its parents is contained in the list. + * Do not recurse to find out, though, but return -1 if inconclusive. + */ +static int contains_test(struct commit *candidate, const struct commit_list *want)Can we turn this return value into enum { CONTAINS_UNKNOWN = -1, CONTAINS_NO = 0, CONTAINS_YES = 1, } contains_result; to make the code a little more self-documenting?
Good idea!
[... detailed instructions what changes are implied by the enum ...]quoted
+>expect +# ulimit is a bash builtin; we can rely on that in MinGW, but nowhere else +test_expect_success MINGW '--contains works in a deep repo' ' + ulimit -s 64It would be nice to test this on Linux. Can we do something like: test_lazy_prereq BASH 'bash --version' test_expect_success BASH '--contains works in a deep repo' ' ... setup repo ... bash -c "ulimit -s 64 && git tag --contains HEAD" >actual && test_cmp expect actual ' As a bonus, then our "ulimit" call does not pollute the environment of subsequent tests.
That's a very good idea! We mulled it over a bit and did not come up with this excellent solution. Please see https://github.com/msysgit/git/c63d196 for the fixup, and https://github.com/msysgit/git/compare/tag-contains%5E...tag-contains for the updated patch. Thanks, Dscho