[PATCH] fetch: refuse to fetch into the current branch in a non-bare repository
From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:45:28
Some confusing tutorials suggest that it would be a good idea to call something like this: git pull origin master:master While it might make sense to store what you want to merge, it typically is plain wrong. Especially so when the current branch is "master". Be at least a little bit helpful by refusing to fetch something into the current branch. Signed-off-by: Johannes Schindelin <redacted> --- builtin-fetch.c | 20 ++++++++++++++++++++ t/t5505-remote.sh | 2 +- t/t5510-fetch.sh | 6 ++++++ 3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/builtin-fetch.c b/builtin-fetch.c
index ee93d3a..d701550 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c@@ -534,6 +534,25 @@ static void find_non_local_tags(struct transport *transport, string_list_clear(&new_refs, 0); } +static void check_ref_map(struct ref *ref_map) +{ + int flag; + unsigned char sha1[20]; + const char *HEAD; + + if (is_bare_repository()) + return; + + HEAD = resolve_ref("HEAD", sha1, 1, &flag); + + if (!HEAD || !(flag & REF_ISSYMREF)) + return; + + for (; ref_map; ref_map = ref_map->next) + if (ref_map->peer_ref && !strcmp(HEAD, 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 +577,7 @@ static int do_fetch(struct transport *transport, } ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags); + check_ref_map(ref_map); for (rm = ref_map; rm; rm = rm->next) { if (rm->peer_ref)
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index c449663..0103e1a 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh@@ -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) &&
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 9aae496..cd8b550 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh@@ -323,4 +323,10 @@ 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_done
--
1.6.0.2.749.g0cc32