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

Re: [PATCH v3 05/12] refs: move submodule slash stripping code to get_submodule_ref_store

From
Stefan Beller <sbeller@google.com>
Date
Apr 24, 2017, 18:12 UTC
Message-ID
<CAGZ79kb-8zUibxCMNxkg2jbGLuXPGm0ZjqZ_KtLKV4YTrn0TsQ@mail.gmail.com>
In-Reply-To
<378b8e50-562a-a311-2e0f-505de036aaf1@alum.mit.edu>
On Fri, Apr 21, 2017 at 10:27 PM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
Show 62 quoted lines
> On 04/19/2017 01:01 PM, Nguyễn Thái Ngọc Duy wrote:
>> This is a better place that will benefit all submodule callers instead
>> of just resolve_gitlink_ref()
>>
>> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
>> ---
>>  refs.c | 33 +++++++++++++++++----------------
>>  1 file changed, 17 insertions(+), 16 deletions(-)
>>
>> diff --git a/refs.c b/refs.c
>> index 5902a3d9e5..26474cb62a 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -1422,25 +1422,10 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
>>  int resolve_gitlink_ref(const char *submodule, const char *refname,
>>                       unsigned char *sha1)
>>  {
>> -     size_t len = strlen(submodule);
>>       struct ref_store *refs;
>>       int flags;
>>
>> -     while (len && submodule[len - 1] == '/')
>> -             len--;
>> -
>> -     if (!len)
>> -             return -1;
>> -
>> -     if (submodule[len]) {
>> -             /* We need to strip off one or more trailing slashes */
>> -             char *stripped = xmemdupz(submodule, len);
>> -
>> -             refs = get_submodule_ref_store(stripped);
>> -             free(stripped);
>> -     } else {
>> -             refs = get_submodule_ref_store(submodule);
>> -     }
>> +     refs = get_submodule_ref_store(submodule);
>>
>>       if (!refs)
>>               return -1;
>> @@ -1558,7 +1543,17 @@ struct ref_store *get_submodule_ref_store(const char *submodule)
>>  {
>>       struct strbuf submodule_sb = STRBUF_INIT;
>>       struct ref_store *refs;
>> +     char *to_free = NULL;
>>       int ret;
>> +     size_t len;
>> +
>> +     if (submodule) {
>> +             len = strlen(submodule);
>> +             while (len && submodule[len - 1] == '/')
>> +                     len--;
>> +             if (!len)
>> +                     submodule = NULL;
>> +     }
>
> Ugh. Should a submodule named "///" *really* be considered to refer to
> the main ref_store? I understand that's what the code did before this
> patch, but it seems to me more like an accident of the old design rather
> than something worth supporting. In other words, if a caller would
> really pass us such a string, it seems like we could declare the caller
> buggy, no?

In a nearby thread we discussed whether we want to tighten the submodule names and paths as some of the code path do funny things on funny input. As 'submodule' here refers to a path (and not a name), I would think '///' is not possible/buggy, rather we'd want to discuss if we want to extend the check to is_dir_sep, which would include '\' on Windows.

Thanks, Stefan

Previous: Michael HaggertyNext: Nguyễn Thái Ngọc Duy
Message 13 of 30 in “Fix git-gc losing objects in multi worktree”
  1. 00/12 Fix git-gc losing objects in multi worktreeNguyễn Thái Ngọc Duy, Apr 19, 2017
  2. 01/12 revision.h: new flag in struct rev_info wrt. worktree-related refsNguyễn Thái Ngọc Duy, Apr 19, 2017
  3. 02/12 revision.c: refactor add_index_objects_to_pending()Nguyễn Thái Ngọc Duy, Apr 19, 2017
  4. 03/12 revision.c: --indexed-objects add objects from all worktreesNguyễn Thái Ngọc Duy, Apr 19, 2017
  5. 04/12 refs.c: refactor get_submodule_ref_store(), share common free blockNguyễn Thái Ngọc Duy, Apr 19, 2017
  6. Michael HaggertyApr 22, 2017
  7. 05/12 refs: move submodule slash stripping code to get_submodule_ref_storeNguyễn Thái Ngọc Duy, Apr 19, 2017
  8. Johannes SixtApr 19, 2017
  9. Duy NguyenApr 20, 2017
  10. Duy NguyenApr 20, 2017
  11. Johannes SixtApr 20, 2017
  12. Michael HaggertyApr 22, 2017
  13. Stefan BellerApr 24, 2017
  14. 06/12 refs: add refs_head_ref()Nguyễn Thái Ngọc Duy, Apr 19, 2017
  15. Michael HaggertyApr 22, 2017
  16. Duy NguyenApr 22, 2017
  17. 07/12 revision.c: use refs_for_each*() instead of for_each_*_submodule()Nguyễn Thái Ngọc Duy, Apr 19, 2017
  18. 08/12 refs: remove dead for_each_*_submodule()Nguyễn Thái Ngọc Duy, Apr 19, 2017
  19. Ramsay JonesApr 19, 2017
  20. Junio C HamanoApr 20, 2017
  21. Michael HaggertyApr 22, 2017
  22. 09/12 revision.c: --all adds HEAD from all worktreesNguyễn Thái Ngọc Duy, Apr 19, 2017
  23. Michael HaggertyApr 22, 2017
  24. 10/12 files-backend: make reflog iterator go through per-worktree reflogNguyễn Thái Ngọc Duy, Apr 19, 2017
  25. Michael HaggertyApr 22, 2017
  26. Duy NguyenApr 23, 2017
  27. Michael HaggertyMay 17, 2017
  28. 11/12 revision.c: --reflog add HEAD reflog from all worktreesNguyễn Thái Ngọc Duy, Apr 19, 2017
  29. 12/12 rev-list: expose and document --single-worktreeNguyễn Thái Ngọc Duy, Apr 19, 2017
  30. Michael HaggertyApr 22, 2017

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.