summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 5d1faf8)
raw | patch | inline | side by side (parent: 5d1faf8)
author | Junio C Hamano <junkio@cox.net> | |
Thu, 23 Nov 2006 00:33:32 +0000 (16:33 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Thu, 23 Nov 2006 00:36:49 +0000 (16:36 -0800) |
An earlier commit f28b34a broke symlinks when trust-executable-bit
is not set because it incorrectly assumed that everything was a
regular file.
Reported by Juergen Ruehle.
Signed-off-by: Junio C Hamano <junkio@cox.net>
is not set because it incorrectly assumed that everything was a
regular file.
Reported by Juergen Ruehle.
Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-update-index.c | patch | blob | history | |
read-cache.c | patch | blob | history | |
t/t3700-add.sh | patch | blob | history |
diff --git a/builtin-update-index.c b/builtin-update-index.c
index 7f9c638466f79fee7d2914b8ec76d713c3670e7e..182331d34156dd6b88d16a068efad591e07ae6b3 100644 (file)
--- a/builtin-update-index.c
+++ b/builtin-update-index.c
ce->ce_mode = create_ce_mode(st.st_mode);
if (!trust_executable_bit) {
/* If there is an existing entry, pick the mode bits
- * from it, otherwise force to 644.
+ * from it, otherwise assume unexecutable.
*/
int pos = cache_name_pos(path, namelen);
if (0 <= pos)
ce->ce_mode = active_cache[pos]->ce_mode;
- else
- ce->ce_mode = create_ce_mode(S_IFREG | 0644);
+ else if (S_ISREG(st.st_mode))
+ ce->ce_mode = create_ce_mode(S_IFREG | 0666);
}
if (index_path(ce->sha1, path, &st, !info_only))
diff --git a/read-cache.c b/read-cache.c
index 0f5fb5bc3350f7def1eb14e792507098118d1e66..eae4745d284e00e279b5b8f4b032bdb9ca433984 100644 (file)
--- a/read-cache.c
+++ b/read-cache.c
ce->ce_mode = create_ce_mode(st.st_mode);
if (!trust_executable_bit) {
/* If there is an existing entry, pick the mode bits
- * from it, otherwise force to 644.
+ * from it, otherwise assume unexecutable.
*/
int pos = cache_name_pos(path, namelen);
if (pos >= 0)
ce->ce_mode = active_cache[pos]->ce_mode;
- else
- ce->ce_mode = create_ce_mode(S_IFREG | 0644);
+ else if (S_ISREG(st.st_mode))
+ ce->ce_mode = create_ce_mode(S_IFREG | 0666);
}
if (index_path(ce->sha1, path, &st, 1))
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index c20e4c29fcc864dff80e5ae73a8ad7ede1f794f0..c09c53f20bbc04f36d26ff37f060f42233a1c0db 100755 (executable)
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
git-add xfoo1 &&
case "`git-ls-files --stage xfoo1`" in
100644" "*xfoo1) echo ok;;
- *) echo fail; git-ls-files --stage xfoo1; exit 1;;
+ *) echo fail; git-ls-files --stage xfoo1; (exit 1);;
esac'
test_expect_success \
git-update-index --add xfoo2 &&
case "`git-ls-files --stage xfoo2`" in
100644" "*xfoo2) echo ok;;
- *) echo fail; git-ls-files --stage xfoo2; exit 1;;
+ *) echo fail; git-ls-files --stage xfoo2; (exit 1);;
+ esac'
+
+test_expect_success \
+ 'git-update-index --add: Test that executable bit is not used...' \
+ 'git repo-config core.filemode 0 &&
+ ln -s xfoo2 xfoo3 &&
+ git-update-index --add xfoo3 &&
+ case "`git-ls-files --stage xfoo3`" in
+ 120000" "*xfoo3) echo ok;;
+ *) echo fail; git-ls-files --stage xfoo3; (exit 1);;
esac'
test_done