aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-12-04 16:30:00 -0800
committerJunio C Hamano <junkio@cox.net>2006-12-04 16:30:00 -0800
commitba988a83f0cfdafdcfdc7ed44253840ea83578fb (patch)
treecee119a3eccf55b60a44fe29974fb108cd527739
parent4cd75359ad5d4c90ba6ae6d68ffb6d00e5092b8a (diff)
parent562cefbdbfaeb92f91c961c67960a93a7772220c (diff)
downloadgit-ba988a83f0cfdafdcfdc7ed44253840ea83578fb.tar.gz
git-ba988a83f0cfdafdcfdc7ed44253840ea83578fb.tar.xz
Merge branch 'maint'
* maint: receive-pack: do not insist on fast-forward outside refs/heads/ git-mv: search more precisely for source directory in index Conflicts: receive-pack.c
-rw-r--r--builtin-mv.c11
-rw-r--r--receive-pack.c3
-rwxr-xr-xt/t7001-mv.sh13
3 files changed, 22 insertions, 5 deletions
diff --git a/builtin-mv.c b/builtin-mv.c
index 54dd3bfe8..d14a4a7f5 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -146,21 +146,24 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
&& lstat(dst, &st) == 0)
bad = "cannot move directory over file";
else if (src_is_dir) {
+ const char *src_w_slash = add_slash(src);
+ int len_w_slash = length + 1;
int first, last;
modes[i] = WORKING_DIRECTORY;
- first = cache_name_pos(src, length);
+ first = cache_name_pos(src_w_slash, len_w_slash);
if (first >= 0)
- die ("Huh? %s/ is in index?", src);
+ die ("Huh? %.*s is in index?",
+ len_w_slash, src_w_slash);
first = -1 - first;
for (last = first; last < active_nr; last++) {
const char *path = active_cache[last]->name;
- if (strncmp(path, src, length)
- || path[length] != '/')
+ if (strncmp(path, src_w_slash, len_w_slash))
break;
}
+ free((char *)src_w_slash);
if (last - first < 1)
bad = "source directory is empty";
diff --git a/receive-pack.c b/receive-pack.c
index 1a141dc1e..a20bc924d 100644
--- a/receive-pack.c
+++ b/receive-pack.c
@@ -120,7 +120,8 @@ static int update(struct command *cmd)
"but I can't find it!", new_hex);
}
if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
- !is_null_sha1(old_sha1)) {
+ !is_null_sha1(old_sha1) &&
+ !strncmp(name, "refs/heads/", 11)) {
struct commit *old_commit, *new_commit;
struct commit_list *bases, *ent;
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 23a1eff3b..2f4ff82e1 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -105,4 +105,17 @@ test_expect_success "Michael Cassar's test case" '
}
'
+rm -fr papers partA path?
+
+test_expect_success "Sergey Vlasov's test case" '
+ rm -fr .git &&
+ git init-db &&
+ mkdir ab &&
+ date >ab.c &&
+ date >ab/d &&
+ git add ab.c ab &&
+ git commit -m 'initial' &&
+ git mv ab a
+'
+
test_done