Merge branch 'js/maint-fetch-update-head'

* 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

Conflicts:
	t/t5510-fetch.sh
This commit is contained in:
Junio C Hamano 2008-10-21 17:58:21 -07:00
commit ca6c06b2ef
7 changed files with 44 additions and 5 deletions

View File

@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
string_list_clear(&new_refs, 0); 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, static int do_fetch(struct transport *transport,
struct refspec *refs, int ref_count) 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); 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) { for (rm = ref_map; rm; rm = rm->next) {
if (rm->peer_ref) if (rm->peer_ref)

View File

@ -124,7 +124,7 @@ orig_head=$(git rev-parse --verify HEAD 2>/dev/null)
git fetch --update-head-ok "$@" || exit 1 git fetch --update-head-ok "$@" || exit 1
curr_head=$(git rev-parse --verify HEAD 2>/dev/null) 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 then
# The fetch involved updating the current branch. # The fetch involved updating the current branch.
@ -172,7 +172,7 @@ esac
if test -z "$orig_head" if test -z "$orig_head"
then 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 git read-tree --reset -u HEAD || exit 1
exit exit
fi fi

View File

@ -12,7 +12,7 @@ test_expect_success setup '
mkdir another && ( mkdir another && (
cd another && cd another &&
git init && git init &&
git fetch .. master:master git fetch --update-head-ok .. master:master
) && ) &&
>file2 && git add file2 && test_tick && >file2 && git add file2 && test_tick &&

View File

@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
test_expect_success 'add --mirror && prune' ' test_expect_success 'add --mirror && prune' '
(mkdir mirror && (mkdir mirror &&
cd mirror && cd mirror &&
git init && git init --bare &&
git remote add --mirror -f origin ../one) && git remote add --mirror -f origin ../one) &&
(cd one && (cd one &&
git branch -m side2 side) && git branch -m side2 side) &&

View File

@ -323,4 +323,16 @@ test_expect_success 'auto tag following fetches minimum' '
) )
' '
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 test_done

View File

@ -29,6 +29,18 @@ test_expect_success 'checking the results' '
diff file cloned/file 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' ' test_expect_success 'test . as a remote' '
git branch copy master && git branch copy master &&

View File

@ -983,7 +983,7 @@ test_expect_success \
git checkout subuse1 && git checkout subuse1 &&
rm -rf sub && mkdir sub && cd sub && rm -rf sub && mkdir sub && cd sub &&
git init && git init &&
git fetch .. refs/heads/sub:refs/heads/master && git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
git checkout master && git checkout master &&
cd .. && cd .. &&
git submodule init && git submodule init &&