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

Re: [PATCH 02/12] remote.c: drop "remote" pointer from "struct branch"

From
Eric Sunshine <sunshine@sunshineco.com>
Date
May 3, 2015, 03:34 UTC
Message-ID
<CAPig+cQny16Jei9AtDWVY3ADbPGshFw7CYofD_TnyA+GL58AOg@mail.gmail.com>
In-Reply-To
<20150501224515.GB1534@peff.net>
On Fri, May 1, 2015 at 6:45 PM, Jeff King <peff@peff.net> wrote:
Show 23 quoted lines
> When we create each branch struct, we fill in the
> "remote_name" field from the config, and then fill in the
> actual "remote" field (with a "struct remote") based on that
> name. However, it turns out that nobody really cares about
> the latter field. The only two sites that access it at all
> are:
>
>   1. git-merge, which uses it to notice when the branch does
>      not have a remote defined. But we can easily replace this
>      with looking at remote_name instead.
>
>   2. remote.c itself, when setting up the @{upstream} merge
>      config. But we don't need to save the "remote" in the
>      "struct branch" for that; we can just look it up for
>      the duration of the operation.
>
> So there is no need to have both fields; they are redundant
> with each other (the struct remote contains the name, or you
> can look up the struct from the name). It would be nice to
> simplify this, especially as we are going to add matching
> pushremote config in a future patch (and it would be nice to
> keep them consistent).
> [...]
Nice clear explanation, but...
Show 39 quoted lines
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> diff --git a/remote.c b/remote.c
> index bec8b31..c85ecef 100644
> --- a/remote.c
> +++ b/remote.c
> @@ -1632,15 +1632,20 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
>
>  static void set_merge(struct branch *ret)
>  {
> +       struct remote *remote;
>         char *ref;
>         unsigned char sha1[20];
>         int i;
>
> +       if (!ret->remote_name || !ret->merge_nr)
> +               return;
> +       remote = remote_get(ret->remote_name);
> +
>         ret->merge = xcalloc(ret->merge_nr, sizeof(*ret->merge));
>         for (i = 0; i < ret->merge_nr; i++) {
>                 ret->merge[i] = xcalloc(1, sizeof(**ret->merge));
>                 ret->merge[i]->src = xstrdup(ret->merge_name[i]);
> -               if (!remote_find_tracking(ret->remote, ret->merge[i]) ||
> +               if (!remote_find_tracking(remote, ret->merge[i]) ||
>                     strcmp(ret->remote_name, "."))
>                         continue;
>                 if (dwim_ref(ret->merge_name[i], strlen(ret->merge_name[i]),
> @@ -1660,11 +1665,8 @@ struct branch *branch_get(const char *name)
>                 ret = current_branch;
>         else
>                 ret = make_branch(name, 0);
> -       if (ret && ret->remote_name) {
> -               ret->remote = remote_get(ret->remote_name);
> -               if (ret->merge_nr)
> -                       set_merge(ret);
> -       }
> +       if (ret)
> +              set_merge(ret);

When reading the actual patch, I was surprised to see unmentioned changes to the reg->merge_nr check. Although the merge_nr simplification seems sensible, it appears to be unrelated to the stated purpose of the patch, and made the review more difficult since it required keeping track of two distinct (yet textually intertwined) changes. I wonder if it would make more sense to apply the merge_nr simplification as a separate preparatory patch?

>         return ret;
>  }
Previous: Jeff KingNext: Jeff King
Message 4 of 21 in “implement @{push} shorthand”
  1. 0/12 implement @{push} shorthandJeff King, May 1, 2015
  2. 01/12 remote.c: drop default_remote_name variableJeff King, May 1, 2015
  3. 02/12 remote.c: drop "remote" pointer from "struct branch"Jeff King, May 1, 2015
  4. Eric SunshineMay 3, 2015
  5. Jeff KingMay 5, 2015
  6. Jeff KingMay 7, 2015
  7. 03/12 remote.c: hoist branch.*.remote lookup out of remote_get_1Jeff King, May 1, 2015
  8. 04/12 remote.c: provide per-branch pushremote nameJeff King, May 1, 2015
  9. Eric SunshineMay 3, 2015
  10. Jeff KingMay 5, 2015
  11. Eric SunshineMay 5, 2015
  12. Jeff KingMay 7, 2015
  13. Eric SunshineMay 8, 2015
  14. 05/12 remote.c: introduce branch_get_upstream helperJeff King, May 1, 2015
  15. 06/12 remote.c: report specific errors from branch_get_upstreamJeff King, May 1, 2015
  16. 07/12 remote.c: add branch_get_pushJeff King, May 1, 2015
  17. 08/12 sha1_name: refactor upstream_markJeff King, May 1, 2015
  18. 09/12 sha1_name: refactor interpret_upstream_markJeff King, May 1, 2015
  19. 10/12 sha1_name: implement @{push} shorthandJeff King, May 1, 2015
  20. 11/12 for-each-ref: use skip_prefix instead of starts_withJeff King, May 1, 2015
  21. 12/12 for-each-ref: accept "%(push)" formatJeff King, May 1, 2015

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.