]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: allow refspecs specified through stdin
authorJonathan Tan <jonathantanmy@google.com>
Tue, 18 Aug 2020 04:01:32 +0000 (21:01 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Aug 2020 20:25:05 +0000 (13:25 -0700)
In a subsequent patch, partial clones will be taught to fetch missing
objects using a "git fetch" subprocess. Because the number of objects
fetched may be too numerous to fit on the command line, teach "fetch" to
accept refspecs passed through stdin.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-fetch.txt
builtin/fetch.c

index 45b6d8e633ccf20675349b1a23072b90c0a46709..9067c2079e44c140fcb46c34ec708842f7dde5b4 100644 (file)
@@ -48,6 +48,10 @@ include::fetch-options.txt[]
 
 include::pull-fetch-param.txt[]
 
+--stdin::
+       Read refspecs, one per line, from stdin in addition to those provided
+       as arguments. The "tag <name>" format is not supported.
+
 include::urls-remotes.txt[]
 
 
index 2eb8d6a5a5c015ad1530502bfd5db666d5d6b9e0..9fca92b509413c96a49032ccda1553698f4e98ed 100644 (file)
@@ -80,6 +80,7 @@ static struct list_objects_filter_options filter_options;
 static struct string_list server_options = STRING_LIST_INIT_DUP;
 static struct string_list negotiation_tip = STRING_LIST_INIT_NODUP;
 static int fetch_write_commit_graph = -1;
+static int stdin_refspecs = 0;
 
 static int git_fetch_config(const char *k, const char *v, void *cb)
 {
@@ -205,6 +206,8 @@ static struct option builtin_fetch_options[] = {
                 N_("check for forced-updates on all updated branches")),
        OPT_BOOL(0, "write-commit-graph", &fetch_write_commit_graph,
                 N_("write the commit-graph after fetching")),
+       OPT_BOOL(0, "stdin", &stdin_refspecs,
+                N_("accept refspecs from stdin")),
        OPT_END()
 };
 
@@ -1680,7 +1683,8 @@ static inline void fetch_one_setup_partial(struct remote *remote)
        return;
 }
 
-static int fetch_one(struct remote *remote, int argc, const char **argv, int prune_tags_ok)
+static int fetch_one(struct remote *remote, int argc, const char **argv,
+                    int prune_tags_ok, int use_stdin_refspecs)
 {
        struct refspec rs = REFSPEC_INIT_FETCH;
        int i;
@@ -1737,6 +1741,13 @@ static int fetch_one(struct remote *remote, int argc, const char **argv, int pru
                }
        }
 
+       if (use_stdin_refspecs) {
+               struct strbuf line = STRBUF_INIT;
+               while (strbuf_getline_lf(&line, stdin) != EOF)
+                       refspec_append(&rs, line.buf);
+               strbuf_release(&line);
+       }
+
        if (server_options.nr)
                gtransport->server_options = &server_options;
 
@@ -1837,7 +1848,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
        if (remote) {
                if (filter_options.choice || has_promisor_remote())
                        fetch_one_setup_partial(remote);
-               result = fetch_one(remote, argc, argv, prune_tags_ok);
+               result = fetch_one(remote, argc, argv, prune_tags_ok, stdin_refspecs);
        } else {
                int max_children = max_jobs;
 
@@ -1845,6 +1856,10 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
                        die(_("--filter can only be used with the remote "
                              "configured in extensions.partialclone"));
 
+               if (stdin_refspecs)
+                       die(_("--stdin can only be used when fetching "
+                             "from one remote"));
+
                if (max_children < 0)
                        max_children = fetch_parallel_config;