pack-objects: fix thinko in revalidate code
[gitweb.git] / builtin-push.c
index 06d06ff310da61d71cc11bf0ac9245228a6cc10b..c43f2566d519ddb238ca70065ba901881dce372b 100644 (file)
@@ -8,16 +8,16 @@
 
 #define MAX_URI (16)
 
-static const char push_usage[] = "git push [--all] [--tags] [--force] <repository> [<refspec>...]";
+static const char push_usage[] = "git-push [--all] [--tags] [-f | --force] <repository> [<refspec>...]";
 
-static int all = 0, tags = 0, force = 0, thin = 1;
-static const char *execute = NULL;
+static int all, tags, force, thin = 1;
+static const char *execute;
 
 #define BUF_SIZE (2084)
 static char buffer[BUF_SIZE];
 
-static const char **refspec = NULL;
-static int refspec_nr = 0;
+static const char **refspec;
+static int refspec_nr;
 
 static void add_refspec(const char *ref)
 {
@@ -32,10 +32,8 @@ static int expand_one_ref(const char *ref, const unsigned char *sha1)
        /* Ignore the "refs/" at the beginning of the refname */
        ref += 5;
 
-       if (strncmp(ref, "tags/", 5))
-               return 0;
-
-       add_refspec(strdup(ref));
+       if (!strncmp(ref, "tags/", 5))
+               add_refspec(xstrdup(ref));
        return 0;
 }
 
@@ -72,7 +70,7 @@ static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
 {
        int n = 0;
        FILE *f = fopen(git_path("remotes/%s", repo), "r");
-       int has_explicit_refspec = refspec_nr;
+       int has_explicit_refspec = refspec_nr || all || tags;
 
        if (!f)
                return -1;
@@ -102,12 +100,12 @@ static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
 
                if (!is_refspec) {
                        if (n < MAX_URI)
-                               uri[n++] = strdup(s);
+                               uri[n++] = xstrdup(s);
                        else
-                               error("more than %d URL's specified, ignoreing the rest", MAX_URI);
+                               error("more than %d URL's specified, ignoring the rest", MAX_URI);
                }
                else if (is_refspec && !has_explicit_refspec)
-                       add_refspec(strdup(s));
+                       add_refspec(xstrdup(s));
        }
        fclose(f);
        if (!n)
@@ -127,13 +125,13 @@ static int get_remote_config(const char* key, const char* value)
            !strncmp(key + 7, config_repo, config_repo_len)) {
                if (!strcmp(key + 7 + config_repo_len, ".url")) {
                        if (config_current_uri < MAX_URI)
-                               config_uri[config_current_uri++] = strdup(value);
+                               config_uri[config_current_uri++] = xstrdup(value);
                        else
                                error("more than %d URL's specified, ignoring the rest", MAX_URI);
                }
                else if (config_get_refspecs &&
                         !strcmp(key + 7 + config_repo_len, ".push"))
-                       add_refspec(strdup(value));
+                       add_refspec(xstrdup(value));
        }
        return 0;
 }
@@ -144,7 +142,7 @@ static int get_config_remotes_uri(const char *repo, const char *uri[MAX_URI])
        config_repo = repo;
        config_current_uri = 0;
        config_uri = uri;
-       config_get_refspecs = !refspec_nr;
+       config_get_refspecs = !(refspec_nr || all || tags);
 
        git_config(get_remote_config);
        return config_current_uri;
@@ -214,7 +212,7 @@ static int do_push(const char *repo)
 {
        const char *uri[MAX_URI];
        int i, n;
-       int remote;
+       int common_argc;
        const char **argv;
        int argc;
 
@@ -231,27 +229,29 @@ static int do_push(const char *repo)
                argv[argc++] = "--force";
        if (execute)
                argv[argc++] = execute;
-       if (thin)
-               argv[argc++] = "--thin";
-       remote = argc;
-       argv[argc++] = "dummy-remote";
-       while (refspec_nr--)
-               argv[argc++] = *refspec++;
-       argv[argc] = NULL;
+       common_argc = argc;
 
        for (i = 0; i < n; i++) {
-               int error;
+               int err;
+               int dest_argc = common_argc;
+               int dest_refspec_nr = refspec_nr;
+               const char **dest_refspec = refspec;
                const char *dest = uri[i];
                const char *sender = "git-send-pack";
                if (!strncmp(dest, "http://", 7) ||
                    !strncmp(dest, "https://", 8))
                        sender = "git-http-push";
+               else if (thin)
+                       argv[dest_argc++] = "--thin";
                argv[0] = sender;
-               argv[remote] = dest;
-               error = run_command_v(argc, argv);
-               if (!error)
+               argv[dest_argc++] = dest;
+               while (dest_refspec_nr--)
+                       argv[dest_argc++] = *dest_refspec++;
+               argv[dest_argc] = NULL;
+               err = run_command_v(argc, argv);
+               if (!err)
                        continue;
-               switch (error) {
+               switch (err) {
                case -ERR_RUN_COMMAND_FORK:
                        die("unable to fork for %s", sender);
                case -ERR_RUN_COMMAND_EXEC:
@@ -262,16 +262,16 @@ static int do_push(const char *repo)
                case -ERR_RUN_COMMAND_WAITPID_NOEXIT:
                        die("%s died with strange error", sender);
                default:
-                       return -error;
+                       return -err;
                }
        }
        return 0;
 }
 
-int cmd_push(int argc, const char **argv, char **envp)
+int cmd_push(int argc, const char **argv, const char *prefix)
 {
        int i;
-       const char *repo = "origin";    // default repository
+       const char *repo = "origin";    /* default repository */
 
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
@@ -289,7 +289,7 @@ int cmd_push(int argc, const char **argv, char **envp)
                        tags = 1;
                        continue;
                }
-               if (!strcmp(arg, "--force")) {
+               if (!strcmp(arg, "--force") || !strcmp(arg, "-f")) {
                        force = 1;
                        continue;
                }