@matheusbsbs / matheus-bagliano / commits / 8ee5d73137
Fork 0

Fix fetch/pull when run without --update-head-ok

Some confusing tutorials suggested that it would be a good idea to fetch into the current branch with something like this: git fetch origin master:master (or even worse: the same command line with "pull" instead of "fetch"). While it might make sense to store what you want to pull, it typically is plain wrong when the current branch is "master". This should only be allowed when (an incorrect) "git pull origin master:master" tries to work around by giving --update-head-ok to underlying "git fetch", and otherwise we should refuse it, but somewhere along the lines we lost that behavior. The check for the current branch is now _only_ performed in non-bare repositories, which is an improvement from the original behaviour. Some newer tests were depending on the broken behaviour of "git fetch" this patch fixes, and have been adjusted. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Acked-by: Shawn O. Pearce <spearce@spearce.org> Acked-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Oct 13, 2008 at 11:36 UTC 8ee5d73137f355c21e8d4db365ae8d301e067395
5 files changed +30 -3
builtin-fetch.c
+15
@@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
534 string_list_clear(&new_refs, 0);
535 }
536
537 +static void check_not_current_branch(struct ref *ref_map)
538 +{
539 + struct branch *current_branch = branch_get(NULL);
540 +
541 + if (is_bare_repository() || !current_branch)
542 + return;
543 +
544 + for (; ref_map; ref_map = ref_map->next)
545 + if (ref_map->peer_ref && !strcmp(current_branch->refname,
546 + ref_map->peer_ref->name))
547 + die("Refusing to fetch into current branch");
548 +}
549 +
550 static int do_fetch(struct transport *transport,
551 struct refspec *refs, int ref_count)
552 {
@@ -558,6 +571,8 @@ static int do_fetch(struct transport *transport,
571 }
572
573 ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
574 + if (!update_head_ok)
575 + check_not_current_branch(ref_map);
576
577 for (rm = ref_map; rm; rm = rm->next) {
578 if (rm->peer_ref)
t/t5405-send-pack-rewind.sh
+1 -1
@@ -12,7 +12,7 @@ test_expect_success setup '
12 mkdir another && (
13 cd another &&
14 git init &&
15 - git fetch .. master:master
15 + git fetch --update-head-ok .. master:master
16 ) &&
17
18 >file2 && git add file2 && test_tick &&
t/t5505-remote.sh
+1 -1
@@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
188 test_expect_success 'add --mirror && prune' '
189 (mkdir mirror &&
190 cd mirror &&
191 - git init &&
191 + git init --bare &&
192 git remote add --mirror -f origin ../one) &&
193 (cd one &&
194 git branch -m side2 side) &&
t/t5510-fetch.sh
+12
@@ -303,4 +303,16 @@ test_expect_success 'pushing nonexistent branch by mistake should not segv' '
303
304 '
305
306 +test_expect_success 'refuse to fetch into the current branch' '
307 +
308 + test_must_fail git fetch . side:master
309 +
310 +'
311 +
312 +test_expect_success 'fetch into the current branch with --update-head-ok' '
313 +
314 + git fetch --update-head-ok . side:master
315 +
316 +'
317 +
318 test_done
t/t9300-fast-import.sh
+1 -1
@@ -983,7 +983,7 @@ test_expect_success \
983 git checkout subuse1 &&
984 rm -rf sub && mkdir sub && cd sub &&
985 git init &&
986 - git fetch .. refs/heads/sub:refs/heads/master &&
986 + git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
987 git checkout master &&
988 cd .. &&
989 git submodule init &&