Do the same as in the previous patch, but for push refspecs, i.e. with
remote->push_refspec, remote->push and add_push_refspec().

Signed-off-by: SZEDER Gábor <szeder....@gmail.com>
---
 builtin/push.c   | 12 +++++++-----
 builtin/remote.c | 19 ++++++++++++-------
 remote.c         | 29 +++++++++++------------------
 remote.h         | 10 ++++------
 4 files changed, 34 insertions(+), 36 deletions(-)

diff --git a/builtin/push.c b/builtin/push.c
index 258648d5f..9a721fe8a 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -47,11 +47,11 @@ static const char *map_refspec(const char *ref,
        if (count_refspec_match(ref, local_refs, &matched) != 1)
                return ref;
 
-       if (remote->push) {
+       if (remote->push.rs) {
                struct refspec query;
                memset(&query, 0, sizeof(struct refspec));
                query.src = matched->name;
-               if (!query_refspecs(remote->push, remote->push_refspec_nr, 
&query) &&
+               if (!query_refspecs(remote->push.rs, remote->push.nr, &query) &&
                    query.dst) {
                        struct strbuf buf = STRBUF_INIT;
                        strbuf_addf(&buf, "%s%s:%s",
@@ -401,9 +401,11 @@ static int do_push(const char *repo, int flags,
        }
 
        if (!refspec && !(flags & TRANSPORT_PUSH_ALL)) {
-               if (remote->push_refspec_nr) {
-                       refspec = remote->push_refspec;
-                       refspec_nr = remote->push_refspec_nr;
+               if (remote->push.nr) {
+                       ALLOC_ARRAY(refspec, remote->push.nr);
+                       for (i = 0; i < remote->push.nr; i++)
+                               refspec[i] = 
refspec_to_string(&remote->push.rs[i]);
+                       refspec_nr = remote->push.nr;
                } else if (!(flags & TRANSPORT_PUSH_MIRROR))
                        setup_default_push_refspecs(remote);
        }
diff --git a/builtin/remote.c b/builtin/remote.c
index d61daa5e8..c04dec0e1 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -380,14 +380,19 @@ static int get_push_ref_states(const struct ref 
*remote_refs,
 {
        struct remote *remote = states->remote;
        struct ref *ref, *local_refs, *push_map;
+       const char **refspec;
+       int i;
        if (remote->mirror)
                return 0;
 
        local_refs = get_local_heads();
        push_map = copy_ref_list(remote_refs);
 
-       match_push_refs(local_refs, &push_map, remote->push_refspec_nr,
-                       remote->push_refspec, MATCH_REFS_NONE);
+       ALLOC_ARRAY(refspec, remote->push.nr);
+       for (i = 0; i < remote->push.nr; i++)
+               refspec[i] = refspec_to_string(&remote->push.rs[i]);
+       match_push_refs(local_refs, &push_map, remote->push.nr,
+                       refspec, MATCH_REFS_NONE);
 
        states->push.strdup_strings = 1;
        for (ref = push_map; ref; ref = ref->next) {
@@ -433,14 +438,14 @@ static int get_push_ref_states_noquery(struct ref_states 
*states)
                return 0;
 
        states->push.strdup_strings = 1;
-       if (!remote->push_refspec_nr) {
+       if (!remote->push.nr) {
                item = string_list_append(&states->push, _("(matching)"));
                info = item->util = xcalloc(1, sizeof(struct push_info));
                info->status = PUSH_STATUS_NOTQUERIED;
                info->dest = xstrdup(item->string);
        }
-       for (i = 0; i < remote->push_refspec_nr; i++) {
-               struct refspec *spec = remote->push + i;
+       for (i = 0; i < remote->push.nr; i++) {
+               struct refspec *spec = remote->push.rs + i;
                if (spec->matching)
                        item = string_list_append(&states->push, 
_("(matching)"));
                else if (strlen(spec->src))
@@ -584,8 +589,8 @@ static int migrate_file(struct remote *remote)
                git_config_set_multivar(buf.buf, remote->url[i], "^$", 0);
        strbuf_reset(&buf);
        strbuf_addf(&buf, "remote.%s.push", remote->name);
-       for (i = 0; i < remote->push_refspec_nr; i++) {
-               strbuf_add_refspec(&refspec, &remote->push[i]);
+       for (i = 0; i < remote->push.nr; i++) {
+               strbuf_add_refspec(&refspec, &remote->push.rs[i]);
                git_config_set_multivar(buf.buf, refspec.buf, "^$", 0);
                strbuf_reset(&refspec);
        }
diff --git a/remote.c b/remote.c
index 952000b61..9dfe3e9a6 100644
--- a/remote.c
+++ b/remote.c
@@ -86,14 +86,6 @@ static const char *alias_url(const char *url, struct 
rewrites *r)
        return xstrfmt("%s%s", r->rewrite[longest_i]->base, url + longest->len);
 }
 
-static void add_push_refspec(struct remote *remote, const char *ref)
-{
-       ALLOC_GROW(remote->push_refspec,
-                  remote->push_refspec_nr + 1,
-                  remote->push_refspec_alloc);
-       remote->push_refspec[remote->push_refspec_nr++] = strdup(ref);
-}
-
 static void add_url(struct remote *remote, const char *url)
 {
        ALLOC_GROW(remote->url, remote->url_nr + 1, remote->url_alloc);
@@ -257,7 +249,7 @@ static void read_remotes_file(struct remote *remote)
                if (skip_prefix(buf.buf, "URL:", &v))
                        add_url_alias(remote, xstrdup(skip_spaces(v)));
                else if (skip_prefix(buf.buf, "Push:", &v))
-                       add_push_refspec(remote, skip_spaces(v));
+                       add_push_refspec(remote, skip_spaces(v), 1);
                else if (skip_prefix(buf.buf, "Pull:", &v))
                        add_fetch_refspec(remote, skip_spaces(v), 1);
        }
@@ -308,7 +300,7 @@ static void read_branches_file(struct remote *remote)
         * (master if missing)
         */
        strbuf_addf(&buf, "HEAD:refs/heads/%s", frag);
-       add_push_refspec(remote, buf.buf);
+       add_push_refspec(remote, buf.buf, 1);
        remote->fetch_tags = 1; /* always auto-follow */
 
        strbuf_release(&buf);
@@ -394,7 +386,7 @@ static int handle_config(const char *key, const char 
*value, void *cb)
                const char *v;
                if (git_config_string(&v, key, value))
                        return -1;
-               add_push_refspec(remote, v);
+               add_push_refspec(remote, v, 1);
                free((char*)v);
        } else if (!strcmp(subkey, "fetch")) {
                const char *v;
@@ -625,7 +617,7 @@ struct refspec *parse_fetch_refspec(int nr_refspec, const 
char **refspec)
 static int add_refspec(struct remote *remote, const char *refspec,
                       int fetch, int gently)
 {
-       struct refspec_array *rsa = fetch ? &remote->fetch : NULL;
+       struct refspec_array *rsa = fetch ? &remote->fetch : &remote->push;
 
        ALLOC_GROW(rsa->rs, rsa->nr + 1, rsa->alloc);
 
@@ -651,6 +643,11 @@ struct refspec *parse_push_refspec(int nr_refspec, const 
char **refspec)
        return parse_refspec_internal(nr_refspec, refspec, 0, 0);
 }
 
+int add_push_refspec(struct remote *remote, const char *refspec, int gently)
+{
+       return add_refspec(remote, refspec, 0, gently);
+}
+
 void free_refspec(int nr_refspec, struct refspec *refspec)
 {
        int i;
@@ -730,7 +727,6 @@ static struct remote *remote_get_1(const char *name,
                return NULL;
        if (ret->bogus_refspec)
                die("Invalid refspec '%s'", ret->bogus_refspec);
-       ret->push = parse_push_refspec(ret->push_refspec_nr, ret->push_refspec);
        return ret;
 }
 
@@ -763,9 +759,6 @@ int for_each_remote(each_remote_fn fn, void *priv)
                        continue;
                if (r->bogus_refspec)
                        die("Invalid refspec '%s'", r->bogus_refspec);
-               if (!r->push)
-                       r->push = parse_push_refspec(r->push_refspec_nr,
-                                                    r->push_refspec);
                result = fn(r, priv);
        }
        return result;
@@ -1777,11 +1770,11 @@ static const char *branch_get_push_1(struct branch 
*branch, struct strbuf *err)
                                 _("branch '%s' has no remote for pushing"),
                                 branch->name);
 
-       if (remote->push_refspec_nr) {
+       if (remote->push.nr) {
                char *dst;
                const char *ret;
 
-               dst = apply_refspecs(remote->push, remote->push_refspec_nr,
+               dst = apply_refspecs(remote->push.rs, remote->push.nr,
                                     branch->refname);
                if (!dst)
                        return error_buf(err,
diff --git a/remote.h b/remote.h
index 416a08501..eba06bacb 100644
--- a/remote.h
+++ b/remote.h
@@ -32,14 +32,10 @@ struct remote {
        int pushurl_nr;
        int pushurl_alloc;
 
-       const char **push_refspec;
-       struct refspec *push;
-       int push_refspec_nr;
-       int push_refspec_alloc;
-
+       struct refspec_array push;
        struct refspec_array fetch;
 
-       /* Copy of the first bogus fetch refspec we couldn't parse */
+       /* Copy of the first bogus refspec we couldn't parse */
        const char *bogus_refspec;
 
        /*
@@ -184,6 +180,8 @@ struct refspec *parse_fetch_refspec(int nr_refspec, const 
char **refspec);
  */
 int add_fetch_refspec(struct remote *remote, const char *refspec, int gently);
 extern struct refspec *parse_push_refspec(int nr_refspec, const char 
**refspec);
+/* The same as add_fetch_refspec() above, but for push refspecs. */
+int add_push_refspec(struct remote *remote, const char *refspec, int gently);
 
 void free_refspec(int nr_refspec, struct refspec *refspec);
 
-- 
2.13.1.505.g7cc9fcafb

Reply via email to