Re: [GSoC][PATCH] submodule: port submodule subcommand 'add' from shell to C
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 24, 2020, 18:35 UTC
- Message-ID
- <xmqq8se36gev.fsf@gitster.c.googlers.com>
- In-Reply-To
- <20200824090359.403944-1-shouryashukla.oo@gmail.com>
Shourya Shukla <shouryashukla.oo@gmail.com> writes:
Show 8 quoted lines
> if test -z "$force" > then > git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 && > die "$(eval_gettext "'\$sm_path' already exists in the index")" > else > git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 && > die "$(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")" > fi
Hmph. So,
- if we are not being 'force'd, we see if there is anything in the index for the path and error out, whether it is a gitlink or not.
- if there is 'force' option, we see what the given path is in the index, and if it is already a gitlink, then die. That sort of makes sense, as long as the remainder of the code deals with the path that is not a submodule in a sensible way.
Show 5 quoted lines
> This is what I have done in C:
>
> if (!force) {
> if (is_directory(path) && submodule_from_path(the_repository, &null_oid, path))
> die(_("'%s' already exists in the index"), path);The shell version would error out with anything in the index, so I'd expect that a faithful conversion would not call is_directory() nor submodule_from_path() at all---it would just look path up in the_index and complains if anything is found. For example, the quoted part in the original above is what gives the error message when I do
$ git submodule add ./Makefile 'Makefile' already exists in the index.
I think. And the above code won't trigger the "already exists" at all because 'path' is not a directory.
Show 6 quoted lines
> } else {
> int err;
> if (index_name_pos(&the_index, path, strlen(path)) >= 0 &&
> !is_submodule_populated_gently(path, &err))
> die(_("'%s' already exists in the index and is not a "
> "submodule"), path);Likewise. The above does much more than the original.
The original was checking if the found cache entry has 160000 mode bit, so the second test would not be is_submodule_populated_gently() but more like !S_ISGITLINK(ce->ce_mode)
Now it is a different question if the original is correct to begin with ;-).
Show 6 quoted lines
> } > > Is this part correct? I am not very sure about this. This particular > part is not covered in any test or test script, so, I do not have a > solid method of knowing the correctness of this segment. > Feedback and reviews are appreciated.