server-info: skip empty lines.
[gitweb.git] / send-pack.c
index 3eeb18f7c7d32412003ea665a47081dc06d84c95..5bc2f017bca8e9c92352b19469b3c1021844ddec 100644 (file)
@@ -8,6 +8,7 @@ static const char send_pack_usage[] =
 "git-send-pack [--all] [--exec=git-receive-pack] <remote> [<head>...]\n"
 "  --all and explicit <head> specification are mutually exclusive.";
 static const char *exec = "git-receive-pack";
+static int verbose = 0;
 static int send_all = 0;
 static int force_update = 0;
 
@@ -179,6 +180,7 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
 {
        struct ref *ref;
        int new_refs;
+       int ret = 0;
 
        /* No funny business with the matcher */
        remote_tail = get_remote_heads(in, &remote_refs, 0, NULL, 1);
@@ -190,6 +192,12 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
        if (match_refs(local_refs, remote_refs, &remote_tail,
                       nr_refspec, refspec, send_all))
                return -1;
+
+       if (!remote_refs) {
+               fprintf(stderr, "No refs in common and none specified; doing nothing.\n");
+               return 0;
+       }
+
        /*
         * Finally, tell the other end!
         */
@@ -199,7 +207,8 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
                if (!ref->peer_ref)
                        continue;
                if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
-                       fprintf(stderr, "'%s': up-to-date\n", ref->name);
+                       if (verbose)
+                               fprintf(stderr, "'%s': up-to-date\n", ref->name);
                        continue;
                }
 
@@ -226,6 +235,7 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
                                error("remote '%s' object %s does not "
                                      "exist on local",
                                      ref->name, sha1_to_hex(ref->old_sha1));
+                               ret = -2;
                                continue;
                        }
 
@@ -239,12 +249,14 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
                                error("remote ref '%s' is not a strict "
                                      "subset of local ref '%s'.", ref->name,
                                      ref->peer_ref->name);
+                               ret = -2;
                                continue;
                        }
                }
                memcpy(ref->new_sha1, ref->peer_ref->new_sha1, 20);
                if (is_zero_sha1(ref->new_sha1)) {
                        error("cannot happen anymore");
+                       ret = -3;
                        continue;
                }
                new_refs++;
@@ -260,8 +272,10 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
        packet_flush(out);
        if (new_refs)
                pack_objects(out, remote_refs);
+       else if (ret == 0)
+               fprintf(stderr, "Everything up-to-date\n");
        close(out);
-       return 0;
+       return ret;
 }
 
 
@@ -273,6 +287,7 @@ int main(int argc, char **argv)
        int fd[2], ret;
        pid_t pid;
 
+       setup_git_directory();
        argv++;
        for (i = 1; i < argc; i++, argv++) {
                char *arg = *argv;
@@ -290,6 +305,10 @@ int main(int argc, char **argv)
                                force_update = 1;
                                continue;
                        }
+                       if (!strcmp(arg, "--verbose")) {
+                               verbose = 1;
+                               continue;
+                       }
                        usage(send_pack_usage);
                }
                if (!dest) {