Merge branch 'js/maint-fetch-update-head' into maint
authorJunio C Hamano <gitster@pobox.com>
Sun, 2 Nov 2008 21:37:16 +0000 (13:37 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 2 Nov 2008 21:37:16 +0000 (13:37 -0800)
* js/maint-fetch-update-head:
pull: allow "git pull origin $something:$current_branch" into an unborn branch
Fix fetch/pull when run without --update-head-ok

builtin-fetch.c
git-pull.sh
t/t5405-send-pack-rewind.sh
t/t5505-remote.sh
t/t5510-fetch.sh
t/t5520-pull.sh
t/t9300-fast-import.sh
index ee93d3a93da0267caa485fa552c29d779aecfdf7..57c161d35b2e317f1fe32f39067c86508b89152e 100644 (file)
@@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
        string_list_clear(&new_refs, 0);
 }
 
+static void check_not_current_branch(struct ref *ref_map)
+{
+       struct branch *current_branch = branch_get(NULL);
+
+       if (is_bare_repository() || !current_branch)
+               return;
+
+       for (; ref_map; ref_map = ref_map->next)
+               if (ref_map->peer_ref && !strcmp(current_branch->refname,
+                                       ref_map->peer_ref->name))
+                       die("Refusing to fetch into current branch");
+}
+
 static int do_fetch(struct transport *transport,
                    struct refspec *refs, int ref_count)
 {
@@ -558,6 +571,8 @@ static int do_fetch(struct transport *transport,
        }
 
        ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
+       if (!update_head_ok)
+               check_not_current_branch(ref_map);
 
        for (rm = ref_map; rm; rm = rm->next) {
                if (rm->peer_ref)
index 75c36100a2f858bcf2663d2b4560654787963175..664fe34419e9aeef1af8fac820cc423a641f5525 100755 (executable)
@@ -124,7 +124,7 @@ orig_head=$(git rev-parse --verify HEAD 2>/dev/null)
 git fetch --update-head-ok "$@" || exit 1
 
 curr_head=$(git rev-parse --verify HEAD 2>/dev/null)
-if test "$curr_head" != "$orig_head"
+if test -n "$orig_head" && test "$curr_head" != "$orig_head"
 then
        # The fetch involved updating the current branch.
 
@@ -172,7 +172,7 @@ esac
 
 if test -z "$orig_head"
 then
-       git update-ref -m "initial pull" HEAD $merge_head "" &&
+       git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
        git read-tree --reset -u HEAD || exit 1
        exit
 fi
index 86abc6227105e27fdb9ad99e34193efb90a6242f..cb9aacc7bc62e2ecfdca0dc7f6071e5330fe09d0 100755 (executable)
@@ -12,7 +12,7 @@ test_expect_success setup '
        mkdir another && (
                cd another &&
                git init &&
-               git fetch .. master:master
+               git fetch --update-head-ok .. master:master
        ) &&
 
        >file2 && git add file2 && test_tick &&
index c4496635dfba85b0e9fc105c4516096d433881a4..0103e1a18046b6a156721da0036155b2f707b9f6 100755 (executable)
@@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
 test_expect_success 'add --mirror && prune' '
        (mkdir mirror &&
         cd mirror &&
-        git init &&
+        git init --bare &&
         git remote add --mirror -f origin ../one) &&
        (cd one &&
         git branch -m side2 side) &&
index de26c203270522983f9ffae4e0bde64a61898567..52094e78dcd63cd7dc1ce166450c403fc32efbac 100755 (executable)
@@ -303,4 +303,16 @@ test_expect_success 'pushing nonexistent branch by mistake should not segv' '
 
 '
 
+test_expect_success 'refuse to fetch into the current branch' '
+
+       test_must_fail git fetch . side:master
+
+'
+
+test_expect_success 'fetch into the current branch with --update-head-ok' '
+
+       git fetch --update-head-ok . side:master
+
+'
+
 test_done
index 997b2db827c4f37512c6b5d2f861e12105e2a32d..725771fac167ea5aac8cf65b916c96918b0f5e0d 100755 (executable)
@@ -29,6 +29,18 @@ test_expect_success 'checking the results' '
        diff file cloned/file
 '
 
+test_expect_success 'pulling into void using master:master' '
+       mkdir cloned-uho &&
+       (
+               cd cloned-uho &&
+               git init &&
+               git pull .. master:master
+       ) &&
+       test -f file &&
+       test -f cloned-uho/file &&
+       test_cmp file cloned-uho/file
+'
+
 test_expect_success 'test . as a remote' '
 
        git branch copy master &&
index c6bc0a607f200fcc8888b66ff1a8f0e324332db8..dba3a1b48f70c47b405d85f140684b181e62002a 100755 (executable)
@@ -983,7 +983,7 @@ test_expect_success \
         git checkout subuse1 &&
         rm -rf sub && mkdir sub && cd sub &&
         git init &&
-        git fetch .. refs/heads/sub:refs/heads/master &&
+        git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
         git checkout master &&
         cd .. &&
         git submodule init &&