Merge branch 'cc/reset-keep'
[gitweb.git] / transport-helper.c
index ca8fa92e638e2589e2b6b8ffbe21ac824b5274a5..2638781c5b89024294f3c4c32861b275e339ad1d 100644 (file)
@@ -102,6 +102,7 @@ static struct child_process *get_helper(struct transport *transport)
        int refspec_nr = 0;
        int refspec_alloc = 0;
        int duped;
+       int code;
 
        if (data->helper)
                return data->helper;
@@ -111,13 +112,18 @@ static struct child_process *get_helper(struct transport *transport)
        helper->out = -1;
        helper->err = 0;
        helper->argv = xcalloc(4, sizeof(*helper->argv));
-       strbuf_addf(&buf, "remote-%s", data->name);
+       strbuf_addf(&buf, "git-remote-%s", data->name);
        helper->argv[0] = strbuf_detach(&buf, NULL);
        helper->argv[1] = transport->remote->name;
        helper->argv[2] = remove_ext_force(transport->url);
-       helper->git_cmd = 1;
-       if (start_command(helper))
-               die("Unable to run helper: git %s", helper->argv[0]);
+       helper->git_cmd = 0;
+       helper->silent_exec_failure = 1;
+       code = start_command(helper);
+       if (code < 0 && errno == ENOENT)
+               die("Unable to find remote helper for '%s'", data->name);
+       else if (code != 0)
+               exit(code);
+
        data->helper = helper;
        data->no_disconnect_req = 0;
 
@@ -165,7 +171,7 @@ static struct child_process *get_helper(struct transport *transport)
                } else if (!strcmp(capname, "connect")) {
                        data->connect = 1;
                } else if (mandatory) {
-                       die("Unknown madatory capability %s. This remote "
+                       die("Unknown mandatory capability %s. This remote "
                            "helper probably needs newer version of Git.\n",
                            capname);
                }
@@ -273,9 +279,8 @@ static void standard_options(struct transport *t)
        char buf[16];
        int n;
        int v = t->verbose;
-       int no_progress = v < 0 || (!t->progress && !isatty(2));
 
-       set_helper_option(t, "progress", !no_progress ? "true" : "false");
+       set_helper_option(t, "progress", t->progress ? "true" : "false");
 
        n = snprintf(buf, sizeof(buf), "%d", v + 1);
        if (n >= sizeof(buf))
@@ -528,24 +533,27 @@ static int push_refs(struct transport *transport,
                return transport->push_refs(transport, remote_refs, flags);
        }
 
-       if (!remote_refs)
+       if (!remote_refs) {
+               fprintf(stderr, "No refs in common and none specified; doing nothing.\n"
+                       "Perhaps you should specify a branch such as 'master'.\n");
                return 0;
+       }
 
        helper = get_helper(transport);
        if (!data->push)
                return 1;
 
        for (ref = remote_refs; ref; ref = ref->next) {
-               if (ref->peer_ref)
-                       hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
-               else if (!mirror)
+               if (!ref->peer_ref && !mirror)
                        continue;
 
-               ref->deletion = is_null_sha1(ref->new_sha1);
-               if (!ref->deletion &&
-                       !hashcmp(ref->old_sha1, ref->new_sha1)) {
-                       ref->status = REF_STATUS_UPTODATE;
+               /* Check for statuses set by set_ref_status_for_push() */
+               switch (ref->status) {
+               case REF_STATUS_REJECT_NONFASTFORWARD:
+               case REF_STATUS_UPTODATE:
                        continue;
+               default:
+                       ; /* do nothing */
                }
 
                if (force_all)
@@ -567,7 +575,6 @@ static int push_refs(struct transport *transport,
        if (buf.len == 0)
                return 0;
 
-       transport->verbose = flags & TRANSPORT_PUSH_VERBOSE ? 1 : 0;
        standard_options(transport);
 
        if (flags & TRANSPORT_PUSH_DRY_RUN) {
@@ -634,6 +641,15 @@ static int push_refs(struct transport *transport,
                        continue;
                }
 
+               if (ref->status != REF_STATUS_NONE) {
+                       /*
+                        * Earlier, the ref was marked not to be pushed, so ignore the ref
+                        * status reported by the remote helper if the latter is 'no match'.
+                        */
+                       if (status == REF_STATUS_NONE)
+                               continue;
+               }
+
                ref->status = status;
                ref->remote_status = msg;
        }