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

Re: [PATCH v7 2/3] submodule--helper: introduce for_each_listed_submodule()

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Oct 6, 2017, 21:56 UTC
Message-ID
<CAPig+cT31XM9nW7sytukbQQ_O_15np6oepazKJaoNuHey+kiBA@mail.gmail.com>
In-Reply-To
<20171006132415.2876-3-pc44800@gmail.com>

Same disclaimer as in my review of patch 1/3: I didn't see a URL in the cover letter pointing at discussions of earlier iterations, so below comments may be at odds with what went on previously...

On Fri, Oct 6, 2017 at 9:24 AM, Prathamesh Chavan <pc44800@gmail.com> wrote:
Show 17 quoted lines
> Introduce function for_each_listed_submodule() and replace a loop
> in module_init() with a call to it.
>
> The new function will also be used in other parts of the
> system in later patches.
>
> Signed-off-by: Prathamesh Chavan <pc44800@gmail.com>
> ---
> diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
> @@ -14,6 +14,11 @@
>  #include "refs.h"
>  #include "connect.h"
>
> +#define OPT_QUIET (1 << 0)
> +
> +typedef void (*each_submodule_fn)(const struct cache_entry *list_item,
> +                                 void *cb_data);

What is the reason for having the definition of 'each_submodule_fn' so far removed textually from its first reference by for_each_listed_submodule() below?

Show 15 quoted lines
>  static char *get_default_remote(void)
>  {
>         char *dest = NULL, *ret;
> @@ -348,7 +353,23 @@ static int module_list(int argc, const char **argv, const char *prefix)
>         return 0;
>  }
>
> -static void init_submodule(const char *path, const char *prefix, int quiet)
> +static void for_each_listed_submodule(const struct module_list *list,
> +                                     each_submodule_fn fn, void *cb_data)
> +{
> +       int i;
> +       for (i = 0; i < list->nr; i++)
> +               fn(list->entries[i], cb_data);
> +}

I'm very curious about the justification for introducing a for-each function for what amounts to the simplest sort of loop possible: a canonical for-loop with a one-line body. I could easily understand the desire for such a function if either the loop conditions or the body of the loop, or both, were complex, but this does not seem to be the case. Even the callers of this new function, in this patch and in 3/3, are as simple as possible: one-liners (simple function calls).

Although this sort of for-each function can, at times, be helpful, there are costs: extra boilerplate and increased complexity for clients since it requires callback functions and (optionally) callback data. The separation of logic into a callback function can make code more difficult to reason about than when it is simply the body of a for-loop.

So, unless the plan for the future is that this for-each function will have considerable additional functionality baked into it, I'm having a difficult time understanding why this change is desirable.

Show 6 quoted lines
> +struct init_cb {
> +       const char *prefix;
> +       unsigned int flags;
> +};
> +
> +#define INIT_CB_INIT { NULL, 0 }
Why are these definitions so far removed from init_submodule_cb() below?
Show 11 quoted lines
> +static void init_submodule(const char *path, const char *prefix,
> +                          unsigned int flags)
>  {
>         const struct submodule *sub;
>         struct strbuf sb = STRBUF_INIT;
> @@ -410,7 +431,7 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
>                 if (git_config_set_gently(sb.buf, url))
>                         die(_("Failed to register url for submodule path '%s'"),
>                             displaypath);
> -               if (!quiet)
> +               if (!(flags & OPT_QUIET))

This change of having init_submodule() accept a 'flags' argument, rather than a single boolean, increases reviewer burden, since the reviewer is forced to puzzle out how this change relates to the stated intention of the patch since it is not mentioned at all by the commit message.

It's also conceptually unrelated to the introduction of a for-each function, thus should be instead be done by a separate preparatory patch.

Show 39 quoted lines
>                         fprintf(stderr,
>                                 _("Submodule '%s' (%s) registered for path '%s'\n"),
>                                 sub->name, url, displaypath);
> @@ -437,12 +458,18 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
>         free(upd);
>  }
>
> +static void init_submodule_cb(const struct cache_entry *list_item, void *cb_data)
> +{
> +       struct init_cb *info = cb_data;
> +       init_submodule(list_item->name, info->prefix, info->flags);
> +}
> +
>  static int module_init(int argc, const char **argv, const char *prefix)
>  {
> +       struct init_cb info = INIT_CB_INIT;
>         struct pathspec pathspec;
>         struct module_list list = MODULE_LIST_INIT;
>         int quiet = 0;
> -       int i;
>
>         struct option module_init_options[] = {
>                 OPT__QUIET(&quiet, N_("Suppress output for initializing a submodule")),
> @@ -467,8 +494,11 @@ static int module_init(int argc, const char **argv, const char *prefix)
>         if (!argc && git_config_get_value_multi("submodule.active"))
>                 module_list_active(&list);
>
> -       for (i = 0; i < list.nr; i++)
> -               init_submodule(list.entries[i]->name, prefix, quiet);
> +       info.prefix = prefix;
> +       if (quiet)
> +               info.flags |= OPT_QUIET;
> +
> +       for_each_listed_submodule(&list, init_submodule_cb, &info);
>
>         return 0;
>  }
> --
> 2.14.2
Previous: Prathamesh ChavanNext: Prathamesh Chavan
Message 53 of 59 in “submodule--helper: introduce get_submodule_displaypath()”
  1. Prathamesh ChavanAug 21, 2017
  2. [GSoC][PATCH 2/4] submodule--helper: introduce for_each_submodule_list()Prathamesh Chavan, Aug 21, 2017
  3. Junio C HamanoAug 22, 2017
  4. [GSoC][PATCH 3/4] submodule: port set_name_rev() from shell to CPrathamesh Chavan, Aug 21, 2017
  5. Heiko VoigtAug 21, 2017
  6. Prathamesh ChavanAug 21, 2017
  7. [GSoC][PATCH 4/4] submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Aug 21, 2017
  8. Junio C HamanoAug 22, 2017
  9. [GSoC][PATCH v2 0/4] submodule: Incremental rewrite of git-submodulesPrathamesh Chavan, Aug 23, 2017
  10. [GSoC][PATCH v2 1/4] submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Aug 23, 2017
  11. [GSoC][PATCH v2 2/4] submodule--helper: introduce for_each_submodule()Prathamesh Chavan, Aug 23, 2017
  12. Junio C HamanoAug 23, 2017
  13. Stefan BellerAug 23, 2017
  14. Junio C HamanoAug 23, 2017
  15. [GSoC][PATCH v3 0/4] Incremental rewrite of git-submodulesPrathamesh Chavan, Aug 24, 2017
  16. [GSoC][PATCH v3 1/4] submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Aug 24, 2017
  17. [GSoC][PATCH v3 2/4] submodule--helper: introduce for_each_listed_submodule()Prathamesh Chavan, Aug 24, 2017
  18. [GSoC][PATCH v3 3/4] submodule: port set_name_rev() from shell to CPrathamesh Chavan, Aug 24, 2017
  19. [GSoC][PATCH v3 4/4] submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Aug 24, 2017
  20. Junio C HamanoAug 25, 2017
  21. Stefan BellerAug 25, 2017
  22. Junio C HamanoAug 25, 2017
  23. Prathamesh ChavanAug 27, 2017
  24. [GSoC][PATCH v4 0/4] Incremental rewrite of git-submodulesPrathamesh Chavan, Aug 28, 2017
  25. [GSoC][PATCH v4 1/4] submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Aug 28, 2017
  26. [GSoC][PATCH v4 1/4] submodule--helper: introduce get_submodule_displaypath()Han-Wen Nienhuys, Sep 21, 2017
  27. [GSoC][PATCH v4 2/4] submodule--helper: introduce for_each_listed_submodule()Prathamesh Chavan, Aug 28, 2017
  28. [GSoC][PATCH v4 3/4] submodule: port set_name_rev() from shell to CPrathamesh Chavan, Aug 28, 2017
  29. [GSoC][PATCH v4 3/4] submodule: port set_name_rev() from shell to CHan-Wen Nienhuys, Sep 21, 2017
  30. [GSoC][PATCH v4 4/4] submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Aug 28, 2017
  31. [GSoC][PATCH v4 4/4] submodule: port submodule subcommand 'status' from shell to CHan-Wen Nienhuys, Sep 21, 2017
  32. 0/4 Incremental rewrite of git-submodulesPrathamesh Chavan, Sep 24, 2017
  33. 1/4 submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Sep 24, 2017
  34. Junio C HamanoSep 25, 2017
  35. 2/4 submodule--helper: introduce for_each_listed_submodule()Prathamesh Chavan, Sep 24, 2017
  36. Junio C HamanoSep 25, 2017
  37. 3/4 submodule: port set_name_rev() from shell to CPrathamesh Chavan, Sep 24, 2017
  38. Junio C HamanoSep 25, 2017
  39. Junio C HamanoSep 25, 2017
  40. 4/4 submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Sep 24, 2017
  41. Junio C HamanoSep 25, 2017
  42. 0/3 Incremental rewrite of git-submodulesPrathamesh Chavan, Sep 29, 2017
  43. 1/3 submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Sep 29, 2017
  44. Junio C HamanoOct 2, 2017
  45. 2/3 submodule--helper: introduce for_each_listed_submodule()Prathamesh Chavan, Sep 29, 2017
  46. Junio C HamanoOct 2, 2017
  47. 3/3 submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Sep 29, 2017
  48. Junio C HamanoOct 2, 2017
  49. 0/3 Incremental rewrite of git-submodulesPrathamesh Chavan, Oct 6, 2017
  50. 1/3 submodule--helper: introduce get_submodule_displaypath()Prathamesh Chavan, Oct 6, 2017
  51. Eric SunshineOct 6, 2017
  52. 2/3 submodule--helper: introduce for_each_listed_submodule()Prathamesh Chavan, Oct 6, 2017
  53. Eric SunshineOct 6, 2017
  54. 3/3 submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Oct 6, 2017
  55. Junio C HamanoOct 7, 2017
  56. Eric SunshineOct 7, 2017
  57. Junio C HamanoOct 2, 2017
  58. [GSoC][PATCH v2 3/4] submodule: port set_name_rev() from shell to CPrathamesh Chavan, Aug 23, 2017
  59. [GSoC][PATCH v2 4/4] submodule: port submodule subcommand 'status' from shell to CPrathamesh Chavan, Aug 23, 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.