]> git.ipfire.org Git - thirdparty/git.git/commitdiff
http: allow custom index-pack args
authorJonathan Tan <jonathantanmy@google.com>
Mon, 22 Feb 2021 19:20:06 +0000 (11:20 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 22 Feb 2021 20:07:40 +0000 (12:07 -0800)
Currently, when fetching, packfiles referenced by URIs are run through
index-pack without any arguments other than --stdin and --keep, no
matter what arguments are used for the packfile that is inline in the
fetch response. As a preparation for ensuring that all packs (whether
inline or not) use the same index-pack arguments, teach the http
subsystem to allow custom index-pack arguments.

http-fetch has been updated to use the new API. For now, it passes
--keep alone instead of --keep with a process ID, but this is only
temporary because http-fetch itself will be taught to accept index-pack
parameters (instead of using a hardcoded constant) in a subsequent
commit.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http-fetch.c
http.c
http.h

index c4ccc5fea93cff445785bb101c8438b9374d1b74..2d1d9d054f7f95ce8d0cb7ec708c3fb58286ba3e 100644 (file)
@@ -43,6 +43,9 @@ static int fetch_using_walker(const char *raw_url, int get_verbosely,
        return rc;
 }
 
+static const char *index_pack_args[] =
+       {"index-pack", "--stdin", "--keep", NULL};
+
 static void fetch_single_packfile(struct object_id *packfile_hash,
                                  const char *url) {
        struct http_pack_request *preq;
@@ -55,7 +58,8 @@ static void fetch_single_packfile(struct object_id *packfile_hash,
        if (preq == NULL)
                die("couldn't create http pack request");
        preq->slot->results = &results;
-       preq->generate_keep = 1;
+       preq->index_pack_args = index_pack_args;
+       preq->preserve_index_pack_stdout = 1;
 
        if (start_active_slot(preq->slot)) {
                run_active_slot(preq->slot);
diff --git a/http.c b/http.c
index 8b23a546afdf40dc9f15756f637a62286fe1bdd0..f8ea28bb2ed2bd7189378c2a39c9f222964081cd 100644 (file)
--- a/http.c
+++ b/http.c
@@ -2259,6 +2259,9 @@ void release_http_pack_request(struct http_pack_request *preq)
        free(preq);
 }
 
+static const char *default_index_pack_args[] =
+       {"index-pack", "--stdin", NULL};
+
 int finish_http_pack_request(struct http_pack_request *preq)
 {
        struct child_process ip = CHILD_PROCESS_INIT;
@@ -2270,17 +2273,15 @@ int finish_http_pack_request(struct http_pack_request *preq)
 
        tmpfile_fd = xopen(preq->tmpfile.buf, O_RDONLY);
 
-       strvec_push(&ip.args, "index-pack");
-       strvec_push(&ip.args, "--stdin");
        ip.git_cmd = 1;
        ip.in = tmpfile_fd;
-       if (preq->generate_keep) {
-               strvec_pushf(&ip.args, "--keep=git %"PRIuMAX,
-                            (uintmax_t)getpid());
+       ip.argv = preq->index_pack_args ? preq->index_pack_args
+                                       : default_index_pack_args;
+
+       if (preq->preserve_index_pack_stdout)
                ip.out = 0;
-       } else {
+       else
                ip.no_stdout = 1;
-       }
 
        if (run_command(&ip)) {
                ret = -1;
diff --git a/http.h b/http.h
index 5de792ef3fe1dd8597c9b890a120eeacd2eb4994..bf3d1270ad8e2f0bd11b76baa183987f7b44d6f7 100644 (file)
--- a/http.h
+++ b/http.h
@@ -218,12 +218,12 @@ struct http_pack_request {
        char *url;
 
        /*
-        * If this is true, finish_http_pack_request() will pass "--keep" to
-        * index-pack, resulting in the creation of a keep file, and will not
-        * suppress its stdout (that is, the "keep\t<hash>\n" line will be
-        * printed to stdout).
+        * index-pack command to run. Must be terminated by NULL.
+        *
+        * If NULL, defaults to {"index-pack", "--stdin", NULL}.
         */
-       unsigned generate_keep : 1;
+       const char **index_pack_args;
+       unsigned preserve_index_pack_stdout : 1;
 
        FILE *packfile;
        struct strbuf tmpfile;