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:
commit
ca6c06b2ef
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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 &&
|
||||||
|
@ -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) &&
|
||||||
|
@ -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
|
||||||
|
@ -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 &&
|
||||||
|
@ -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 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user