pull: pass git-fetch's options to git-fetch
authorPaul Tan <pyokagan@gmail.com>
Thu, 18 Jun 2015 10:54:01 +0000 (18:54 +0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Jun 2015 20:16:08 +0000 (13:16 -0700)
Since eb2a8d9 (pull: handle git-fetch's options as well, 2015-06-02),
git-pull knows about and handles git-fetch's options, passing them to
git-fetch. Re-implement this behavior.

Since 29609e6 (pull: do nothing on --dry-run, 2010-05-25) git-pull
supported the --dry-run option, exiting after git-fetch if --dry-run is
set. Re-implement this behavior.

Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Paul Tan <pyokagan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pull.c
index 0442da904f63e51597c443c327e309d1788e2eec..f35649cc3891c841fba4c48f89dfe2172a1a53f9 100644 (file)
@@ -32,6 +32,21 @@ static struct argv_array opt_strategies = ARGV_ARRAY_INIT;
 static struct argv_array opt_strategy_opts = ARGV_ARRAY_INIT;
 static char *opt_gpg_sign;
 
+/* Options passed to git-fetch */
+static char *opt_all;
+static char *opt_append;
+static char *opt_upload_pack;
+static int opt_force;
+static char *opt_tags;
+static char *opt_prune;
+static char *opt_recurse_submodules;
+static int opt_dry_run;
+static char *opt_keep;
+static char *opt_depth;
+static char *opt_unshallow;
+static char *opt_update_shallow;
+static char *opt_refmap;
+
 static struct option pull_options[] = {
        /* Shared options */
        OPT__VERBOSITY(&opt_verbosity),
@@ -82,6 +97,46 @@ static struct option pull_options[] = {
                N_("GPG sign commit"),
                PARSE_OPT_OPTARG),
 
+       /* Options passed to git-fetch */
+       OPT_GROUP(N_("Options related to fetching")),
+       OPT_PASSTHRU(0, "all", &opt_all, NULL,
+               N_("fetch from all remotes"),
+               PARSE_OPT_NOARG),
+       OPT_PASSTHRU('a', "append", &opt_append, NULL,
+               N_("append to .git/FETCH_HEAD instead of overwriting"),
+               PARSE_OPT_NOARG),
+       OPT_PASSTHRU(0, "upload-pack", &opt_upload_pack, N_("path"),
+               N_("path to upload pack on remote end"),
+               0),
+       OPT__FORCE(&opt_force, N_("force overwrite of local branch")),
+       OPT_PASSTHRU('t', "tags", &opt_tags, NULL,
+               N_("fetch all tags and associated objects"),
+               PARSE_OPT_NOARG),
+       OPT_PASSTHRU('p', "prune", &opt_prune, NULL,
+               N_("prune remote-tracking branches no longer on remote"),
+               PARSE_OPT_NOARG),
+       OPT_PASSTHRU(0, "recurse-submodules", &opt_recurse_submodules,
+               N_("on-demand"),
+               N_("control recursive fetching of submodules"),
+               PARSE_OPT_OPTARG),
+       OPT_BOOL(0, "dry-run", &opt_dry_run,
+               N_("dry run")),
+       OPT_PASSTHRU('k', "keep", &opt_keep, NULL,
+               N_("keep downloaded pack"),
+               PARSE_OPT_NOARG),
+       OPT_PASSTHRU(0, "depth", &opt_depth, N_("depth"),
+               N_("deepen history of shallow clone"),
+               0),
+       OPT_PASSTHRU(0, "unshallow", &opt_unshallow, NULL,
+               N_("convert to a complete repository"),
+               PARSE_OPT_NONEG | PARSE_OPT_NOARG),
+       OPT_PASSTHRU(0, "update-shallow", &opt_update_shallow, NULL,
+               N_("accept refs that update .git/shallow"),
+               PARSE_OPT_NOARG),
+       OPT_PASSTHRU(0, "refmap", &opt_refmap, N_("refmap"),
+               N_("specify fetch refmap"),
+               PARSE_OPT_NONEG),
+
        OPT_END()
 };
 
@@ -99,6 +154,16 @@ static void argv_push_verbosity(struct argv_array *arr)
                argv_array_push(arr, "-q");
 }
 
+/**
+ * Pushes "-f" switches into arr to match the opt_force level.
+ */
+static void argv_push_force(struct argv_array *arr)
+{
+       int force = opt_force;
+       while (force-- > 0)
+               argv_array_push(arr, "-f");
+}
+
 /**
  * Parses argv into [<repo> [<refspecs>...]], returning their values in `repo`
  * as a string and `refspecs` as a null-terminated array of strings. If `repo`
@@ -131,6 +196,33 @@ static int run_fetch(const char *repo, const char **refspecs)
        if (opt_progress)
                argv_array_push(&args, opt_progress);
 
+       /* Options passed to git-fetch */
+       if (opt_all)
+               argv_array_push(&args, opt_all);
+       if (opt_append)
+               argv_array_push(&args, opt_append);
+       if (opt_upload_pack)
+               argv_array_push(&args, opt_upload_pack);
+       argv_push_force(&args);
+       if (opt_tags)
+               argv_array_push(&args, opt_tags);
+       if (opt_prune)
+               argv_array_push(&args, opt_prune);
+       if (opt_recurse_submodules)
+               argv_array_push(&args, opt_recurse_submodules);
+       if (opt_dry_run)
+               argv_array_push(&args, "--dry-run");
+       if (opt_keep)
+               argv_array_push(&args, opt_keep);
+       if (opt_depth)
+               argv_array_push(&args, opt_depth);
+       if (opt_unshallow)
+               argv_array_push(&args, opt_unshallow);
+       if (opt_update_shallow)
+               argv_array_push(&args, opt_update_shallow);
+       if (opt_refmap)
+               argv_array_push(&args, opt_refmap);
+
        if (repo) {
                argv_array_push(&args, repo);
                argv_array_pushv(&args, refspecs);
@@ -200,5 +292,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
        if (run_fetch(repo, refspecs))
                return 1;
 
+       if (opt_dry_run)
+               return 0;
+
        return run_merge();
 }