Merge branch 'nd/transport-positive-depth-only' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 5 Feb 2014 21:58:51 +0000 (13:58 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Feb 2014 21:58:52 +0000 (13:58 -0800)
"git fetch --depth=0" was a no-op, and was silently ignored.
Diagnose it as an error.

* nd/transport-positive-depth-only:
clone,fetch: catch non positive --depth option value

1  2 
builtin/clone.c
builtin/fetch.c
diff --combined builtin/clone.c
index 874e0fd0b6e3ea4882783c0b2377016d93bd989d,535b52f315ff4e2f0106974538b03c0739137c03..cc11104d4267f61aa5a2aa5472a5c69c1ccd8994
@@@ -62,22 -62,23 +62,22 @@@ static struct option builtin_clone_opti
        OPT__VERBOSITY(&option_verbosity),
        OPT_BOOL(0, "progress", &option_progress,
                 N_("force progress reporting")),
 -      OPT_BOOLEAN('n', "no-checkout", &option_no_checkout,
 -                  N_("don't create a checkout")),
 -      OPT_BOOLEAN(0, "bare", &option_bare, N_("create a bare repository")),
 -      { OPTION_BOOLEAN, 0, "naked", &option_bare, NULL,
 -              N_("create a bare repository"),
 -              PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
 -      OPT_BOOLEAN(0, "mirror", &option_mirror,
 -                  N_("create a mirror repository (implies bare)")),
 +      OPT_BOOL('n', "no-checkout", &option_no_checkout,
 +               N_("don't create a checkout")),
 +      OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
 +      OPT_HIDDEN_BOOL(0, "naked", &option_bare,
 +                      N_("create a bare repository")),
 +      OPT_BOOL(0, "mirror", &option_mirror,
 +               N_("create a mirror repository (implies bare)")),
        OPT_BOOL('l', "local", &option_local,
                N_("to clone from a local repository")),
 -      OPT_BOOLEAN(0, "no-hardlinks", &option_no_hardlinks,
 +      OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
                    N_("don't use local hardlinks, always copy")),
 -      OPT_BOOLEAN('s', "shared", &option_shared,
 +      OPT_BOOL('s', "shared", &option_shared,
                    N_("setup as shared repository")),
 -      OPT_BOOLEAN(0, "recursive", &option_recursive,
 +      OPT_BOOL(0, "recursive", &option_recursive,
                    N_("initialize submodules in the clone")),
 -      OPT_BOOLEAN(0, "recurse-submodules", &option_recursive,
 +      OPT_BOOL(0, "recurse-submodules", &option_recursive,
                    N_("initialize submodules in the clone")),
        OPT_STRING(0, "template", &option_template, N_("template-directory"),
                   N_("directory from which templates will be used")),
@@@ -556,7 -557,7 +556,7 @@@ static void update_remote_refs(const st
                                                              0, &rm, transport))
                        die(_("remote did not send all necessary objects"));
                if (transport->progress)
 -                      fprintf(stderr, _("done\n"));
 +                      fprintf(stderr, _("done.\n"));
        }
  
        if (refs) {
@@@ -796,6 -797,10 +796,10 @@@ int cmd_clone(int argc, const char **ar
        if (option_local > 0 && !is_local)
                warning(_("--local is ignored"));
  
+       /* no need to be strict, transport_set_option() will validate it again */
+       if (option_depth && atoi(option_depth) < 1)
+               die(_("depth %s is not a positive number"), option_depth);
        if (argc == 2)
                dir = xstrdup(argv[1]);
        else
diff --combined builtin/fetch.c
index bd7a10164f4fed8aeb6e8148e2ae8c0a793e7ee0,72930fcfdf65e4f2257ad77fdfb28c4b1741b428..5bd00d064a7fbfb828f7a7c5e79f8ed0a5a1e959
@@@ -30,11 -30,7 +30,11 @@@ enum 
        TAGS_SET = 2
  };
  
 -static int all, append, dry_run, force, keep, multiple, prune, update_head_ok, verbosity;
 +static int fetch_prune_config = -1; /* unspecified */
 +static int prune = -1; /* unspecified */
 +#define PRUNE_BY_DEFAULT 0 /* do we prune by default? */
 +
 +static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity;
  static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
  static int tags = TAGS_DEFAULT, unshallow;
  static const char *depth;
@@@ -59,39 -55,30 +59,39 @@@ static int option_parse_recurse_submodu
        return 0;
  }
  
 +static int git_fetch_config(const char *k, const char *v, void *cb)
 +{
 +      if (!strcmp(k, "fetch.prune")) {
 +              fetch_prune_config = git_config_bool(k, v);
 +              return 0;
 +      }
 +      return 0;
 +}
 +
  static struct option builtin_fetch_options[] = {
        OPT__VERBOSITY(&verbosity),
 -      OPT_BOOLEAN(0, "all", &all,
 -                  N_("fetch from all remotes")),
 -      OPT_BOOLEAN('a', "append", &append,
 -                  N_("append to .git/FETCH_HEAD instead of overwriting")),
 +      OPT_BOOL(0, "all", &all,
 +               N_("fetch from all remotes")),
 +      OPT_BOOL('a', "append", &append,
 +               N_("append to .git/FETCH_HEAD instead of overwriting")),
        OPT_STRING(0, "upload-pack", &upload_pack, N_("path"),
                   N_("path to upload pack on remote end")),
        OPT__FORCE(&force, N_("force overwrite of local branch")),
 -      OPT_BOOLEAN('m', "multiple", &multiple,
 -                  N_("fetch from multiple remotes")),
 +      OPT_BOOL('m', "multiple", &multiple,
 +               N_("fetch from multiple remotes")),
        OPT_SET_INT('t', "tags", &tags,
                    N_("fetch all tags and associated objects"), TAGS_SET),
        OPT_SET_INT('n', NULL, &tags,
                    N_("do not fetch all tags (--no-tags)"), TAGS_UNSET),
 -      OPT_BOOLEAN('p', "prune", &prune,
 -                  N_("prune remote-tracking branches no longer on remote")),
 +      OPT_BOOL('p', "prune", &prune,
 +               N_("prune remote-tracking branches no longer on remote")),
        { OPTION_CALLBACK, 0, "recurse-submodules", NULL, N_("on-demand"),
                    N_("control recursive fetching of submodules"),
                    PARSE_OPT_OPTARG, option_parse_recurse_submodules },
 -      OPT_BOOLEAN(0, "dry-run", &dry_run,
 -                  N_("dry run")),
 -      OPT_BOOLEAN('k', "keep", &keep, N_("keep downloaded pack")),
 -      OPT_BOOLEAN('u', "update-head-ok", &update_head_ok,
 +      OPT_BOOL(0, "dry-run", &dry_run,
 +               N_("dry run")),
 +      OPT_BOOL('k', "keep", &keep, N_("keep downloaded pack")),
 +      OPT_BOOL('u', "update-head-ok", &update_head_ok,
                    N_("allow updating of HEAD ref")),
        OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
        OPT_STRING(0, "depth", &depth, N_("depth"),
@@@ -262,8 -249,7 +262,8 @@@ static int s_update_ref(const char *act
                rla = default_rla.buf;
        snprintf(msg, sizeof(msg), "%s: %s", rla, action);
        lock = lock_any_ref_for_update(ref->name,
 -                                     check_old ? ref->old_sha1 : NULL, 0);
 +                                     check_old ? ref->old_sha1 : NULL,
 +                                     0, NULL);
        if (!lock)
                return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
                                          STORE_REF_ERROR_OTHER;
@@@ -830,10 -816,7 +830,10 @@@ static int do_fetch(struct transport *t
                goto cleanup;
        }
        if (prune) {
 -              /* If --tags was specified, pretend the user gave us the canonical tags refspec */
 +              /*
 +               * If --tags was specified, pretend that the user gave us
 +               * the canonical tags refspec
 +               */
                if (tags == TAGS_SET) {
                        const char *tags_str = "refs/tags/*:refs/tags/*";
                        struct refspec *tags_refspec, *refspec;
@@@ -930,7 -913,7 +930,7 @@@ static void add_options_to_argv(struct 
  {
        if (dry_run)
                argv_array_push(argv, "--dry-run");
 -      if (prune)
 +      if (prune > 0)
                argv_array_push(argv, "--prune");
        if (update_head_ok)
                argv_array_push(argv, "--update-head-ok");
@@@ -998,17 -981,6 +998,17 @@@ static int fetch_one(struct remote *rem
                    "remote name from which new revisions should be fetched."));
  
        gtransport = prepare_transport(remote);
 +
 +      if (prune < 0) {
 +              /* no command line request */
 +              if (0 <= gtransport->remote->prune)
 +                      prune = gtransport->remote->prune;
 +              else if (0 <= fetch_prune_config)
 +                      prune = fetch_prune_config;
 +              else
 +                      prune = PRUNE_BY_DEFAULT;
 +      }
 +
        if (argc > 0) {
                int j = 0;
                refs = xcalloc(argc + 1, sizeof(const char *));
@@@ -1058,8 -1030,6 +1058,8 @@@ int cmd_fetch(int argc, const char **ar
        for (i = 1; i < argc; i++)
                strbuf_addf(&default_rla, " %s", argv[i]);
  
 +      git_config(git_fetch_config, NULL);
 +
        argc = parse_options(argc, argv, prefix,
                             builtin_fetch_options, builtin_fetch_usage, 0);
  
                }
        }
  
+       /* no need to be strict, transport_set_option() will validate it again */
+       if (depth && atoi(depth) < 1)
+               die(_("depth %s is not a positive number"), depth);
        if (recurse_submodules != RECURSE_SUBMODULES_OFF) {
                if (recurse_submodules_default) {
                        int arg = parse_fetch_recurse_submodules_arg("--recurse-submodules-default", recurse_submodules_default);