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

Re: [PATCH 5/6] submodule: improve submodule_has_commits

From
Stefan Beller <sbeller@google.com>
Date
Apr 29, 2017, 00:28 UTC
Message-ID
<CAGZ79kZzpyw0ijiM12TwMHAx1Ung-xKPEm2rVY9803hvk=+UMQ@mail.gmail.com>
In-Reply-To
<20170428235402.162251-6-bmwill@google.com>
On Fri, Apr 28, 2017 at 4:54 PM, Brandon Williams <bmwill@google.com> wrote:
> Teach 'submodule_has_commits()' to ensure that if a commit exists in a
> submodule, that it is also reachable from a ref.
>
> This is a prepritory step prior to merging the logic which checkes for

s/prepritory/preparatory/ s/checkes/checks/

This is the first commit in the series that changes user observable behavior, I guess there will be tests in a later patch? Can you elaborate in this commit message more about why it is useful (or at least harmless for performing this check in the case of fetch/push)?

Show 28 quoted lines
> diff --git a/submodule.c b/submodule.c
> index 3bcf44521..100d31d39 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -648,6 +648,30 @@ static int submodule_has_commits(const char *path, struct oid_array *commits)
>                 return 0;
>
>         oid_array_for_each_unique(commits, check_has_commit, &has_commit);
> +
> +       if (has_commit) {
> +               /*
> +                * Even if the submodule is checked out and the commit is
> +                * present, make sure it is reachable from a ref.
> +                */
> +               struct child_process cp = CHILD_PROCESS_INIT;
> +               struct strbuf out = STRBUF_INIT;
> +
> +               argv_array_pushl(&cp.args, "rev-list", "-n", "1", NULL);
> +               oid_array_for_each_unique(commits, append_oid_to_argv, &cp.args);
> +               argv_array_pushl(&cp.args, "--not", "--all", NULL);
> +
> +               prepare_submodule_repo_env(&cp.env_array);
> +               cp.git_cmd = 1;
> +               cp.no_stdin = 1;
> +               cp.dir = path;
> +
> +               if (capture_command(&cp, &out, 1024) || out.len)
> +                       has_commit = 0;

So if we fail to launch capture_command, we assume we do not have the commits?

capture_command can fail for reasons that are hard to track down or even spurious (OOM due to excessive output, disk failure, corrupt repo, error in executing the process, getting a signal and so on), some of them are ok to ignore, others should never be ignored.

So I'd rather die on capture_command, and inspect out.len only in case of successful capturing.

In addition to that we're only interested if there is any output, such that we can optimize further: c.f. http://public-inbox.org/git/20170324223848.GH31294@aiede.mtv.corp.google.com/

    if (start_command(&cp))
        die("cannot start git-rev-list in submodule'%s', sub->path);
    /* read only one character, if any */
    if (xread(cp.out, &tmp, 1);
        has_commit = 0;
    /*
     * close cp.out, such that the child may get SIGPIPE, upon which
     * it dies (silently, maybe we need to suppress cp.err ?)
     */
    close(cp.out);
    /*
     * Though we need to be nitpicky about finish_command IIUC by now:
     * TODO(sbeller): if this turns out to be true, fixup is_submodule_modified
    */
    int code = finish_command(&cp);
    if (!code && code != 128 + SIGPIPE)
        die("git rev-list failed in submodule'%s'", sub->path);

Upon rereading the patch, I notice the '-n 1', which would make the optimized code above useless, so just consider it food for thought.

Thanks, Stefan

Previous: Brandon WilliamsNext: Brandon Williams
Message 10 of 33 in “changed submodules”
  1. 0/6 changed submodulesBrandon Williams, Apr 28, 2017
  2. 1/6 submodule: rename add_sha1_to_arrayBrandon Williams, Apr 28, 2017
  3. Junio C HamanoMay 1, 2017
  4. 4/6 submodule: change string_list changed_submodule_pathsBrandon Williams, Apr 28, 2017
  5. Junio C HamanoMay 1, 2017
  6. Brandon WilliamsMay 1, 2017
  7. 3/6 submodule: remove add_oid_to_argvBrandon Williams, Apr 28, 2017
  8. 2/6 submodule: rename free_submodules_sha1sBrandon Williams, Apr 28, 2017
  9. 5/6 submodule: improve submodule_has_commitsBrandon Williams, Apr 28, 2017
  10. Stefan BellerApr 29, 2017
  11. Brandon WilliamsApr 30, 2017
  12. Stefan BellerMay 1, 2017
  13. Brandon WilliamsMay 1, 2017
  14. Junio C HamanoMay 1, 2017
  15. Brandon WilliamsMay 1, 2017
  16. 6/6 submodule: refactor logic to determine changed submodulesBrandon Williams, Apr 28, 2017
  17. Stefan BellerApr 29, 2017
  18. Brandon WilliamsMay 1, 2017
  19. Junio C HamanoMay 1, 2017
  20. 0/6 changed submodulesBrandon Williams, May 2, 2017
  21. 1/6 submodule: rename add_sha1_to_arrayBrandon Williams, May 2, 2017
  22. Stefan BellerMay 2, 2017
  23. Brandon WilliamsMay 2, 2017
  24. 2/6 submodule: rename free_submodules_sha1sBrandon Williams, May 2, 2017
  25. 3/6 submodule: remove add_oid_to_argvBrandon Williams, May 2, 2017
  26. 5/6 submodule: improve submodule_has_commitsBrandon Williams, May 2, 2017
  27. Stefan BellerMay 2, 2017
  28. Brandon WilliamsMay 2, 2017
  29. Stefan BellerMay 2, 2017
  30. Brandon WilliamsMay 2, 2017
  31. Brandon WilliamsMay 2, 2017
  32. 6/6 submodule: refactor logic to determine changed submodulesBrandon Williams, May 2, 2017
  33. 4/6 submodule: change string_list changed_submodule_pathsBrandon Williams, May 2, 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.