---
 transport.c | 41 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/transport.c b/transport.c
index ca7bb44..ac933ee 100644
--- a/transport.c
+++ b/transport.c
@@ -143,6 +143,25 @@ static void insert_packed_refs(const char *packed_refs, 
struct ref **list)
        }
 }
 
+/* That of course should not be hardcoded. */
+static const char* list_of_local_refs[] = {"refs/heads/", "refs/wip/", NULL};
+static const char** get_local_refs(void)
+{
+       return list_of_local_refs;
+}
+
+static int is_local_ref(const char *ref)
+{
+       const char **local_refs = get_local_refs();
+       const char **iter;
+
+       for (iter = local_refs; iter != NULL; ++iter)
+               if (starts_with(ref, *iter))
+                       return strlen(*iter);
+
+       return 0;
+}
+
 static void set_upstreams(struct transport *transport, struct ref *refs,
        int pretend)
 {
@@ -153,6 +172,8 @@ static void set_upstreams(struct transport *transport, 
struct ref *refs,
                const char *remotename;
                unsigned char sha[20];
                int flag = 0;
+               int localadd = 0;
+               int remoteadd = 0;
                /*
                 * Check suitability for tracking. Must be successful /
                 * already up-to-date ref create/modify (not delete).
@@ -169,23 +190,29 @@ static void set_upstreams(struct transport *transport, 
struct ref *refs,
                localname = ref->peer_ref->name;
                remotename = ref->name;
                tmp = resolve_ref_unsafe(localname, sha, 1, &flag);
-               if (tmp && flag & REF_ISSYMREF &&
-                       starts_with(tmp, "refs/heads/"))
-                       localname = tmp;
+
+               if (tmp && flag & REF_ISSYMREF) {
+                       localadd = is_local_ref (tmp);
+                       if (localadd > 0)
+                               localname = tmp;
+               }
+               if (localadd == 0)
+                       localadd = is_local_ref(localname);
+               remoteadd = is_local_ref(remotename);
 
                /* Both source and destination must be local branches. */
-               if (!localname || !starts_with(localname, "refs/heads/"))
+               if (!localname || localadd == 0)
                        continue;
-               if (!remotename || !starts_with(remotename, "refs/heads/"))
+               if (!remotename || remoteadd == 0)
                        continue;
 
                if (!pretend)
                        install_branch_config(BRANCH_CONFIG_VERBOSE,
-                               localname + 11, transport->remote->name,
+                               localname + localadd, transport->remote->name,
                                remotename);
                else
                        printf("Would set upstream of '%s' to '%s' of '%s'\n",
-                               localname + 11, remotename + 11,
+                               localname + localadd, remotename + remoteadd,
                                transport->remote->name);
        }
 }
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to