Re: [PATCHv5 3/3] submodule: Reimplement `module_clone` shell function in C

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 3, 2015 at 3:07 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote:
>> +
>> +     cp.no_stdin = 1;
>> +     cp.no_stdout = 1;
>> +     cp.no_stderr = 1;
>
> Output from "git clone" is not shown, regardless of --quiet option?

Removed that.

>> +     argc = parse_options(argc, argv, prefix, module_clone_options,
>> +                          git_submodule_helper_usage, 0);
>> +
>> +     strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
>
> The original says
>
>         base_name=$(dirname "$name")
>
> before doing this %s/modules/%s concatenation.  I do not think we
> intended to allow a slash in submodule name, so this difference may
> be showing that the original was doing an unnecessary thing.

The way I understood the code, this was a workaround of now having
safe_create_leading_directories, which takes the base directory of
a given path and creates that directory. (base_name is only used as an
argument for mkdir -p).

Slashes are already in use for submodule names as the name defaults
to the path if no explicit name is given. And the path may contain slashes
as it may be nested. In Gerrit we have a .gitmodules:
[submodule "plugins/commit-message-length-validator"]
    path = plugins/commit-message-length-validator
    url = ../plugins/commit-message-length-validator
[...

>
>> +     sm_gitdir = strbuf_detach(&sb, NULL);
>> +
>> +     if (!file_exists(sm_gitdir)) {
>> +             if (safe_create_leading_directories_const(sm_gitdir) < 0)
>> +                     die(_("could not create directory '%s'"), sm_gitdir);
>> +             if (clone_submodule(path, sm_gitdir, url, depth, reference, quiet))
>> +                     die(_("clone of '%s' into submodule path '%s' failed"),
>> +                         url, path);
>> +     } else {
>> +             if (safe_create_leading_directories_const(path) < 0)
>> +                     die(_("could not create directory '%s'"), path);
>> +             strbuf_addf(&sb, "%s/index", sm_gitdir);
>> +             if (unlink(sb.buf) < 0)
>> +                     die_errno(_("failed to delete '%s'"), sm_gitdir);
>
> The original says "we do not care if it failed" with
>
>         rm -f "$gitdir/index"
>
> I think the intention of the original is "we do not care if it
> failed because it did not exist." in which case unconditional
> die_errno() here may be something we do not want?

Right, this was a short-circuit reaction from me on Erics comment
to check for the return value of unlink. I think we can use
unlink_or_warn here as that only warns if we cannot remove
an existing file. non existent files are not warned about.

>
>> +             strbuf_reset(&sb);
>> +     }
>> +
>> +     /* Write a .git file in the submodule to redirect to the superproject. */
>> +     if (safe_create_leading_directories_const(path) < 0)
>> +             die(_("could not create directory '%s'"), path);
>> +
>> +     if (path && *path)
>> +             strbuf_addf(&sb, "%s/.git", path);
>> +     else
>> +             strbuf_addf(&sb, ".git");
>> +
>> +     if (safe_create_leading_directories_const(sb.buf) < 0)
>> +             die(_("could not create leading directories of '%s'"), sb.buf);
>> +     submodule_dot_git = fopen(sb.buf, "w");
>> +     if (!submodule_dot_git)
>> +             die_errno(_("cannot open file '%s'"), sb.buf);
>> +
>> +     fprintf(submodule_dot_git, "gitdir: %s\n",
>> +             relative_path(sm_gitdir, path, &rel_path));
>> +     if (fclose(submodule_dot_git))
>> +             die(_("could not close file %s"), sb.buf);
>> +     strbuf_reset(&sb);
>> +     strbuf_reset(&rel_path);
>
> The original seems to go quite a length to make sure symbolic links
> do not fool the comparison between $gitdir and $sm_path, and also it
> makes sure one is not a subpath of the other.  Do we need the same
> level of carefulness, or is textual relative_path() enough?

I think the original was doing an "optimized" version of relative_path()
as we know that they have an anchor at the superproject root directory.

relative_path() seems to deal with the symbolic links just fine, as all
tests pass. (6eafa6d096ce, "submodules: don't stumble over symbolic
links when cloning recursively" did add code as well as testing for symbolic
link problems, Thanks Jens!)

>>               --depth=*)
>> -                     depth=$1
>> +                     depth="$1"
>
> This seems to be an unrelated change.

A leftover from earlier, when I mucked around with --depth and
--reference in the shell scipt.


On Thu, Sep 3, 2015 at 4:17 PM, Eric Sunshine <sunshine@xxxxxxxxxxxxxx> wrote:
>> +       if (path && *path)
>> +               strbuf_addf(&sb, "%s/.git", path);
>> +       else
>> +               strbuf_addf(&sb, ".git");
>
> Minor: strbuf_addstr(...);

done
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]