commit: fix a segfault when displaying a commit with unreachable parents
[gitweb.git] / builtin-archive.c
index dd7ffc043d48c5480f90905e812f615cd4895feb..9177379122ea29152e1213cc533f7cd7c569f8d3 100644 (file)
@@ -10,6 +10,7 @@
 #include "tree-walk.h"
 #include "exec_cmd.h"
 #include "pkt-line.h"
+#include "sideband.h"
 
 static const char archive_usage[] = \
 "git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>] <tree-ish> [path...]";
@@ -29,7 +30,7 @@ struct archiver archivers[] = {
 static int run_remote_archiver(const char *remote, int argc,
                               const char **argv)
 {
-       char *url, buf[1024];
+       char *url, buf[LARGE_PACKET_MAX];
        int fd[2], i, len, rv;
        pid_t pid;
        const char *exec = "git-upload-archive";
@@ -74,8 +75,7 @@ static int run_remote_archiver(const char *remote, int argc,
                die("git-archive: expected a flush");
 
        /* Now, start reading from fd[0] and spit it out to stdout */
-       rv = copy_fd(fd[0], 1);
-
+       rv = recv_sideband("archive", fd[0], 1, 2);
        close(fd[0]);
        rv |= finish_connect(pid);
 
@@ -145,17 +145,6 @@ void parse_treeish_arg(const char **argv, struct archiver_args *ar_args,
        ar_args->time = archive_time;
 }
 
-static const char *default_parse_extra(struct archiver *ar,
-                                      const char **argv)
-{
-       static char msg[64];
-
-       snprintf(msg, sizeof(msg) - 4, "'%s' format does not handle %s",
-                ar->name, *argv);
-
-       return strcat(msg, "...");
-}
-
 int parse_archive_args(int argc, const char **argv, struct archiver *ar)
 {
        const char *extra_argv[MAX_EXTRA_ARGS];
@@ -208,7 +197,8 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
 
        if (extra_argc) {
                if (!ar->parse_extra)
-                       die("%s", default_parse_extra(ar, extra_argv));
+                       die("'%s' format does not handle %s",
+                           ar->name, extra_argv[0]);
                ar->args.extra = ar->parse_extra(extra_argc, extra_argv);
        }
        ar->args.verbose = verbose;
@@ -217,7 +207,7 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
        return i;
 }
 
-static const char *remote_request(int *ac, const char **av)
+static const char *extract_remote_arg(int *ac, const char **av)
 {
        int ix, iy, cnt = *ac;
        int no_more_options = 0;
@@ -254,7 +244,7 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
        int tree_idx;
        const char *remote = NULL;
 
-       remote = remote_request(&argc, argv);
+       remote = extract_remote_arg(&argc, argv);
        if (remote)
                return run_remote_archiver(remote, argc, argv);