]> asedeno.scripts.mit.edu Git - git.git/blobdiff - transport.c
git-push: make git push --porcelain print "Done"
[git.git] / transport.c
index 7714fdb6c6578c711dc0b98a2086669a6a797257..260350b5a6f1eb38e3755a6be5befef66c04fa29 100644 (file)
@@ -675,7 +675,7 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
 static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
 {
        if (!count)
-               fprintf(stderr, "To %s\n", dest);
+               fprintf(porcelain ? stdout : stderr, "To %s\n", dest);
 
        switch(ref->status) {
        case REF_STATUS_NONE:
@@ -791,6 +791,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
        args.verbose = !!(flags & TRANSPORT_PUSH_VERBOSE);
        args.quiet = !!(flags & TRANSPORT_PUSH_QUIET);
        args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
+       args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
 
        ret = send_pack(&args, data->fd, data->conn, remote_refs,
                        &data->extra_have);
@@ -912,20 +913,19 @@ static int external_specification_len(const char *url)
 
 struct transport *transport_get(struct remote *remote, const char *url)
 {
+       const char *helper;
        struct transport *ret = xcalloc(1, sizeof(*ret));
 
        if (!remote)
                die("No remote provided to transport_get()");
 
        ret->remote = remote;
+       helper = remote->foreign_vcs;
 
-       if (!url && remote && remote->url)
+       if (!url && remote->url)
                url = remote->url[0];
        ret->url = url;
 
-       /* In case previous URL had helper forced, reset it. */
-       remote->foreign_vcs = NULL;
-
        /* maybe it is a foreign URL? */
        if (url) {
                const char *p = url;
@@ -933,11 +933,11 @@ struct transport *transport_get(struct remote *remote, const char *url)
                while (isalnum(*p))
                        p++;
                if (!prefixcmp(p, "::"))
-                       remote->foreign_vcs = xstrndup(url, p - url);
+                       helper = xstrndup(url, p - url);
        }
 
-       if (remote && remote->foreign_vcs) {
-               transport_helper_init(ret, remote->foreign_vcs);
+       if (helper) {
+               transport_helper_init(ret, helper);
        } else if (!prefixcmp(url, "rsync:")) {
                ret->get_refs_list = get_refs_via_rsync;
                ret->fetch = fetch_objs_via_rsync;
@@ -1036,7 +1036,7 @@ int transport_push(struct transport *transport,
                int quiet = flags & TRANSPORT_PUSH_QUIET;
                int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
                int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
-               int ret, err;
+               int push_ret, ret, err;
 
                if (flags & TRANSPORT_PUSH_ALL)
                        match_flags |= MATCH_REFS_ALL;
@@ -1052,10 +1052,9 @@ int transport_push(struct transport *transport,
                        flags & TRANSPORT_PUSH_MIRROR,
                        flags & TRANSPORT_PUSH_FORCE);
 
-               ret = transport->push_refs(transport, remote_refs, flags);
+               push_ret = transport->push_refs(transport, remote_refs, flags);
                err = push_had_errors(remote_refs);
-
-               ret |= err;
+               ret = push_ret | err;
 
                if (!quiet || err)
                        print_push_status(transport->url, remote_refs,
@@ -1071,8 +1070,11 @@ int transport_push(struct transport *transport,
                                update_tracking_ref(transport->remote, ref, verbose);
                }
 
-               if (!quiet && !ret && !refs_pushed(remote_refs))
+               if (porcelain && !push_ret)
+                       puts("Done");
+               else if (!quiet && !ret && !refs_pushed(remote_refs))
                        fprintf(stderr, "Everything up-to-date\n");
+
                return ret;
        }
        return 1;