Re: [PATCH v15 15/27] bisect--helper: `bisect_next` and `bisect_auto_next` shell function in C
- From
Pranit Bauva <pranit.bauva@gmail.com>
- Date
- Dec 31, 2016, 10:23 UTC
- Message-ID
- <CAFZEwPMbT+BZ=eDxW1xkgH-Nrd=AMm1vGejLKmQ5wdM84TVnmQ@mail.gmail.com>
- In-Reply-To
- <8bd0682f-e35e-a50e-24a9-fd3a53454ed4@gmx.net>
Hey Stephan,
Extremely sorry I just forgot to reply to this email before. I was preparing from the next iteration when I saw this.
On Mon, Nov 21, 2016 at 1:31 AM, Stephan Beyer <s-beyer@gmx.net> wrote:
Show 7 quoted lines
> Hi Pranit, > > this one is hard to review because you do two or three commits in one here. > I think the first commit should be the exit()->return conversion, the > second commit is next and autonext, and the third commit is the pretty > trivial bisect_start commit ;) However, you did it this way and it's > always a hassle to split commit, so I don't really care...
I had confusion about how to split the commits, but then I then decided to dump it all together so that it compiles (I was finding it difficult to split into meaningful parts which also compiled).
Show 33 quoted lines
> However, I was reviewing this superficially, to be honest. This mail
> skips the next and autonext part.
>
> On 10/14/2016 04:14 PM, Pranit Bauva wrote:
>> diff --git a/bisect.c b/bisect.c
>> index 45d598d..7c97e85 100644
>> --- a/bisect.c
>> +++ b/bisect.c
>> @@ -843,16 +878,21 @@ static int check_ancestors(const char *prefix)
>> *
>> * If that's not the case, we need to check the merge bases.
>> * If a merge base must be tested by the user, its source code will be
>> - * checked out to be tested by the user and we will exit.
>> + * checked out to be tested by the user and we will return.
>> */
>> -static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
>> +static int check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
>> {
>> char *filename = git_pathdup("BISECT_ANCESTORS_OK");
>> struct stat st;
>> - int fd;
>> + int fd, res = 0;
>>
>> + /*
>> + * We don't want to clean the bisection state
>> + * as we need to get back to where we started
>> + * by using `git bisect reset`.
>> + */
>> if (!current_bad_oid)
>> - die(_("a %s revision is needed"), term_bad);
>> + error(_("a %s revision is needed"), term_bad);
>
> Only error() or return error()?It should be return error(). Thanks for pointing it out! :)
Show 11 quoted lines
>> @@ -873,8 +916,11 @@ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout) >> filename); >> else >> close(fd); >> + >> + goto done; >> done: > > I never understand why you do this. In case of adding a "fail" label > (and fail code like "res = -1;") between "goto done" and "done:", it's > fine... but without one this is just a nop.
I will just remove that line.
Show 18 quoted lines
>> diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
>> index 1d3e17f..fcd7574 100644
>> --- a/builtin/bisect--helper.c
>> +++ b/builtin/bisect--helper.c
>> @@ -427,15 +560,24 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
>> no_checkout = 1;
>>
>> for (i = 0; i < argc; i++) {
>> - if (!strcmp(argv[i], "--")) {
>> + const char *arg;
>> + if (starts_with(argv[i], "'"))
>> + arg = sq_dequote(xstrdup(argv[i]));
>> + else
>> + arg = argv[i];
>
> One is xstrdup'ed, one is not, so there'll be a leak somewhere, and it's
> an inconsistent leak... I guess it's a bad idea to do it this way ;)
> (Also below.)Yes. I will use xstrdup() and it does leak.
Show 16 quoted lines
>> @@ -443,24 +585,31 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
>> no_checkout = 1;
>> } else if (!strcmp(arg, "--term-good") ||
>> !strcmp(arg, "--term-old")) {
>> + if (starts_with(argv[++i], "'"))
>> + terms->term_good = sq_dequote(xstrdup(argv[i]));
>> + else
>> + terms->term_good = xstrdup(argv[i]);
>> must_write_terms = 1;
>> - terms->term_good = xstrdup(argv[++i]);
>> } else if (skip_prefix(arg, "--term-good=", &arg)) {
>> must_write_terms = 1;
>> - terms->term_good = xstrdup(arg);
>> + terms->term_good = arg;
>
> No ;) (See my other comments (to other patches) for the "terms" leaks.)Yes I have addressed this issue.
Show 17 quoted lines
> [This repeats several times below.]
>
>> diff --git a/git-bisect.sh b/git-bisect.sh
>> index f0896b3..d574c44 100755
>> --- a/git-bisect.sh
>> +++ b/git-bisect.sh
>> @@ -109,6 +88,7 @@ bisect_skip() {
>> bisect_state() {
>> bisect_autostart
>> state=$1
>> + get_terms
>> git bisect--helper --check-and-set-terms $state $TERM_GOOD $TERM_BAD || exit
>> get_terms
>> case "$#,$state" in
>
> I can't say if this change is right or wrong. It looks right, but: How
> does this relate to the other changes? Is this the right patch for it?This line is because of the following:
* TERM_BAD and TERM_GOOD are global but in the coming patch they would be removed as global variables.
* To compensate for that, I will write out the state of TERM_BAD and TERM_GOOD every time it is updated in the file BISECT_TERMS.
* So we will be reading it from there.
* It is quite possible that this is completely redundant as for now but I really don't care to check for each case because I have removed the shell function bisect_state() afterwards and then this line won't create a problem there because we are using `struct bisect_terms` there.