git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCHv4 5/8] clone: factor out checking for an alternate path

From
Stefan Beller <sbeller@google.com>
Date
Aug 15, 2016, 19:03 UTC
Message-ID
<CAGZ79kYVh7N-H7iO4E7HydeOzdUfxGTc3sUo8RhCzR33u9gRHw@mail.gmail.com>
In-Reply-To
<xmqqa8ghvd3j.fsf@gitster.mtv.corp.google.com>
On Fri, Aug 12, 2016 at 3:25 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 6 quoted lines
> Stefan Beller <sbeller@google.com> writes:
>
>> +     struct strbuf sb = STRBUF_INIT;
>> +     char *ref_git = compute_alternate_path(item->string, &sb);
>
> Who owns the memory for ref_git?

The caller of compute_alternate_path(..), which makes add_one_reference faulty as of this patch.

Show 12 quoted lines
>
>> -     if (!access(mkpath("%s/shallow", ref_git), F_OK))
>> -             die(_("reference repository '%s' is shallow"), item->string);
>> +     if (!ref_git)
>> +             die("%s", sb.buf);
>
> Presumably the second argument to compute_alternate_path() is a
> strbuf to receive the error message?  It is unfortunate that the
> variable used for this purpose is a bland "sb", but perhaps that
> cannot be helped as you would reuse that strbuf for a different
> purpose (i.e. not to store the error message, but to formulate a
> pathname).

Ok. I had an intermediate version with 2 strbufs but for some reason I decided one is better. We'll have 2 again. (err and sb; sb will have a smaller scope only in the else part.)

Show 13 quoted lines
>
>> -     if (!access(mkpath("%s/info/grafts", ref_git), F_OK))
>> -             die(_("reference repository '%s' is grafted"), item->string);
>> +     strbuf_addf(&sb, "%s/objects", ref_git);
>> +     add_to_alternates_file(sb.buf);
>>
>> -     strbuf_addf(&alternate, "%s/objects", ref_git);
>> -     add_to_alternates_file(alternate.buf);
>> -     strbuf_release(&alternate);
>> -     free(ref_git);
>> +     strbuf_release(&sb);
>
> I am wondering about the loss of free() here in the first comment.
fixed in a reroll.
Show 19 quoted lines
>
>> +/*
>> + * Compute the exact path an alternate is at and returns it. In case of
>> + * error NULL is returned and the human readable error is added to `err`
>> + * `path` may be relative and should point to $GITDIR.
>> + * `err` must not be null.
>> + */
>> +char *compute_alternate_path(const char *path, struct strbuf *err)
>> +{
>> +     char *ref_git = NULL;
>> +     const char *repo, *ref_git_s;
>> +     struct strbuf err_buf = STRBUF_INIT;
>
> Why do you need "err_buf", instead of directly writing the error to
> "err", especially if "err" is not optional?
>
>> + ...
>> +out:
>> +     if (err_buf.len) {

If we were directly writing to err, we would have checked err.len here. Then you open up a subtle way of saying "dry run" by giving a non empty error buffer.

I contemplated doing that actually instead of splitting up into 2 functions, but I considered that bad taste as it would require documentation.

Show 11 quoted lines
>> +             strbuf_addbuf(err, &err_buf);
>> +             free(ref_git);
>> +             ref_git = NULL;
>> +     }
>> +
>> +     strbuf_release(&err_buf);
>> +     return ref_git;
>> +}
>
> So ref_git is a piece of memory on heap, and the caller is
> responsible for not leaking it.
Correct.
Previous: Junio C HamanoNext: Junio C Hamano
Message 8 of 18 in “[PATCHv4 0/6] git clone: Marry --recursive and --reference”
  1. Stefan BellerAug 11, 2016
  2. 1/8 t7408: modernize styleStefan Beller, Aug 11, 2016
  3. 2/8 t7408: merge short tests, factor out testing methodStefan Beller, Aug 11, 2016
  4. 3/8 submodule--helper module-clone: allow multiple referencesStefan Beller, Aug 11, 2016
  5. 4/8 submodule--helper update-clone: allow multiple referencesStefan Beller, Aug 11, 2016
  6. 5/8 clone: factor out checking for an alternate pathStefan Beller, Aug 11, 2016
  7. Junio C HamanoAug 12, 2016
  8. Stefan BellerAug 15, 2016
  9. Junio C HamanoAug 15, 2016
  10. Stefan BellerAug 15, 2016
  11. 7/8 clone: implement optional referencesStefan Beller, Aug 11, 2016
  12. 6/8 clone: clarify option_reference as requiredStefan Beller, Aug 11, 2016
  13. 8/8 clone: recursive and reference option triggers submodule alternatesStefan Beller, Aug 11, 2016
  14. Junio C HamanoAug 12, 2016
  15. Junio C HamanoAug 17, 2016
  16. Stefan BellerAug 17, 2016
  17. Junio C HamanoAug 17, 2016
  18. Stefan BellerAug 17, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.