remote.c: drop "remote" pointer from "struct branch"
authorJeff King <peff@peff.net>
Thu, 21 May 2015 04:45:13 +0000 (00:45 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 21 May 2015 17:48:10 +0000 (10:48 -0700)
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).

So which one do we keep and which one do we get rid of?

If we had a lot of callers accessing the struct, it would be
more efficient to keep it (since you have to do a lookup to
go from the name to the struct, but not vice versa). But we
don't have a lot of callers; we have exactly one, so
efficiency doesn't matter. We can decide this based on
simplicity and readability.

And the meaning of the struct value is somewhat unclear. Is
it always the remote matching remote_name? If remote_name is
NULL (i.e., no per-branch config), does the struct fall back
to the "origin" remote, or is it also NULL? These questions
will get even more tricky with pushremotes, whose fallback
behavior is more complicated. So let's just store the name,
which pretty clearly represents the branch.*.remote config.
Any lookup or fallback behavior can then be implemented in
helper functions.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-remote.txt
builtin/merge.c
remote.c
remote.h
index 5d245aa9d1b1654749ee51495e9eebda261c3681..2cfdd224a83710f32e344b76c131181527caf98c 100644 (file)
@@ -97,10 +97,6 @@ It contains:
 
        The name of the remote listed in the configuration.
 
-`remote`::
-
-       The struct remote for that remote.
-
 `merge_name`::
 
        An array of the "merge" lines in the configuration.
index 3b0f8f96d4168463139d15f1cde655facc73426c..1840317118ab444a56cc0c66a0905a1c1b3650b4 100644 (file)
@@ -955,7 +955,7 @@ static int setup_with_upstream(const char ***argv)
 
        if (!branch)
                die(_("No current branch."));
-       if (!branch->remote)
+       if (!branch->remote_name)
                die(_("No remote for the current branch."));
        if (!branch->merge_nr)
                die(_("No default upstream defined for the current branch."));
index ac17e66c09595a5b85ac3f40bec7168d17d8bfa6..c298a43a1cb4e54858b99b4ee7d768935fabfa28 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1632,6 +1632,7 @@ 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;
@@ -1649,11 +1650,13 @@ static void set_merge(struct branch *ret)
                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]),
@@ -1673,8 +1676,6 @@ 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);
        set_merge(ret);
        return ret;
 }
index 02d66ceff5c962995de37f351a09fe91055d6364..4bb667273575c038b4238dc14b1181cd07582b68 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -203,7 +203,6 @@ struct branch {
        const char *refname;
 
        const char *remote_name;
-       struct remote *remote;
 
        const char **merge_name;
        struct refspec **merge;