Merge branch 'jk/allow-fetch-onelevel-refname' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 13 Feb 2014 21:38:34 +0000 (13:38 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 Feb 2014 21:38:34 +0000 (13:38 -0800)
"git clone" would fail to clone from a repository that has a ref
directly under "refs/", e.g. "refs/stash", because different
validation paths do different things on such a refname. Loosen the
client side's validation to allow such a ref.

* jk/allow-fetch-onelevel-refname:
fetch-pack: do not filter out one-level refs

1  2 
fetch-pack.c
t/t5510-fetch.sh
diff --combined fetch-pack.c
index 1042448fa0b321e8826f0fdb69c89810c731cf5d,4637eb13287ca253ef008b9df2848cacbf6f9dc6..fab5e801755a9152aa19baf72b609052e1b32035
@@@ -9,7 -9,6 +9,7 @@@
  #include "fetch-pack.h"
  #include "remote.h"
  #include "run-command.h"
 +#include "connect.h"
  #include "transport.h"
  #include "version.h"
  #include "prio-queue.h"
@@@ -507,7 -506,7 +507,7 @@@ static void filter_refs(struct fetch_pa
                next = ref->next;
  
                if (!memcmp(ref->name, "refs/", 5) &&
-                   check_refname_format(ref->name + 5, 0))
+                   check_refname_format(ref->name, 0))
                        ; /* trash */
                else {
                        while (i < nr_sought) {
@@@ -659,7 -658,7 +659,7 @@@ static int get_pack(struct fetch_pack_a
        const char *argv[22];
        char keep_arg[256];
        char hdr_arg[256];
 -      const char **av;
 +      const char **av, *cmd_name;
        int do_keep = args->keep_pack;
        struct child_process cmd;
        int ret;
        if (do_keep) {
                if (pack_lockfile)
                        cmd.out = -1;
 -              *av++ = "index-pack";
 +              *av++ = cmd_name = "index-pack";
                *av++ = "--stdin";
                if (!args->quiet && !args->no_progress)
                        *av++ = "-v";
                        *av++ = "--check-self-contained-and-connected";
        }
        else {
 -              *av++ = "unpack-objects";
 +              *av++ = cmd_name = "unpack-objects";
                if (args->quiet || args->no_progress)
                        *av++ = "-q";
                args->check_self_contained_and_connected = 0;
        cmd.in = demux.out;
        cmd.git_cmd = 1;
        if (start_command(&cmd))
 -              die("fetch-pack: unable to fork off %s", argv[0]);
 +              die("fetch-pack: unable to fork off %s", cmd_name);
        if (do_keep && pack_lockfile) {
                *pack_lockfile = index_pack_lockfile(cmd.out);
                close(cmd.out);
        }
  
 +      if (!use_sideband)
 +              /* Closed by start_command() */
 +              xd[0] = -1;
 +
        ret = finish_command(&cmd);
        if (!ret || (args->check_self_contained_and_connected && ret == 1))
                args->self_contained_and_connected =
                        args->check_self_contained_and_connected &&
                        ret == 0;
        else
 -              die("%s failed", argv[0]);
 +              die("%s failed", cmd_name);
        if (use_sideband && finish_async(&demux))
                die("error in sideband demultiplexer");
        return 0;
diff --combined t/t5510-fetch.sh
index 1f0f8e6827773b1bb9a419a822de2d1ebde8e37a,d52ef7fe80683c455e9024c565938a5bda88b827..07986d94bdf2cebfc39ee25c990485f43cbf2999
@@@ -497,88 -497,6 +497,88 @@@ test_expect_success "should be able to 
        )
  '
  
 +# configured prune tests
 +
 +set_config_tristate () {
 +      # var=$1 val=$2
 +      case "$2" in
 +      unset)  test_unconfig "$1" ;;
 +      *)      git config "$1" "$2" ;;
 +      esac
 +}
 +
 +test_configured_prune () {
 +      fetch_prune=$1 remote_origin_prune=$2 cmdline=$3 expected=$4
 +
 +      test_expect_success "prune fetch.prune=$1 remote.origin.prune=$2${3:+ $3}; $4" '
 +              # make sure a newbranch is there in . and also in one
 +              git branch -f newbranch &&
 +              (
 +                      cd one &&
 +                      test_unconfig fetch.prune &&
 +                      test_unconfig remote.origin.prune &&
 +                      git fetch &&
 +                      git rev-parse --verify refs/remotes/origin/newbranch
 +              )
 +
 +              # now remove it
 +              git branch -d newbranch &&
 +
 +              # then test
 +              (
 +                      cd one &&
 +                      set_config_tristate fetch.prune $fetch_prune &&
 +                      set_config_tristate remote.origin.prune $remote_origin_prune &&
 +
 +                      git fetch $cmdline &&
 +                      case "$expected" in
 +                      pruned)
 +                              test_must_fail git rev-parse --verify refs/remotes/origin/newbranch
 +                              ;;
 +                      kept)
 +                              git rev-parse --verify refs/remotes/origin/newbranch
 +                              ;;
 +                      esac
 +              )
 +      '
 +}
 +
 +test_configured_prune unset unset ""          kept
 +test_configured_prune unset unset "--no-prune"        kept
 +test_configured_prune unset unset "--prune"   pruned
 +
 +test_configured_prune false unset ""          kept
 +test_configured_prune false unset "--no-prune"        kept
 +test_configured_prune false unset "--prune"   pruned
 +
 +test_configured_prune true  unset ""          pruned
 +test_configured_prune true  unset "--prune"   pruned
 +test_configured_prune true  unset "--no-prune"        kept
 +
 +test_configured_prune unset false ""          kept
 +test_configured_prune unset false "--no-prune"        kept
 +test_configured_prune unset false "--prune"   pruned
 +
 +test_configured_prune false false ""          kept
 +test_configured_prune false false "--no-prune"        kept
 +test_configured_prune false false "--prune"   pruned
 +
 +test_configured_prune true  false ""          kept
 +test_configured_prune true  false "--prune"   pruned
 +test_configured_prune true  false "--no-prune"        kept
 +
 +test_configured_prune unset true  ""          pruned
 +test_configured_prune unset true  "--no-prune"        kept
 +test_configured_prune unset true  "--prune"   pruned
 +
 +test_configured_prune false true  ""          pruned
 +test_configured_prune false true  "--no-prune"        kept
 +test_configured_prune false true  "--prune"   pruned
 +
 +test_configured_prune true  true  ""          pruned
 +test_configured_prune true  true  "--prune"   pruned
 +test_configured_prune true  true  "--no-prune"        kept
 +
  test_expect_success 'all boundary commits are excluded' '
        test_commit base &&
        test_commit oneside &&
        test_bundle_object_count .git/objects/pack/pack-${pack##pack    }.pack 3
  '
  
+ test_expect_success 'fetching a one-level ref works' '
+       test_commit extra &&
+       git reset --hard HEAD^ &&
+       git update-ref refs/foo extra &&
+       git init one-level &&
+       (
+               cd one-level &&
+               git fetch .. HEAD refs/foo
+       )
+ '
  test_done