diff options
-rw-r--r-- | builtin-update-index.c | 6 | ||||
-rw-r--r-- | read-cache.c | 6 | ||||
-rwxr-xr-x | t/t3700-add.sh | 14 |
3 files changed, 18 insertions, 8 deletions
diff --git a/builtin-update-index.c b/builtin-update-index.c index 7f9c638466..182331d341 100644 --- a/builtin-update-index.c +++ b/builtin-update-index.c @@ -112,13 +112,13 @@ static int add_file_to_cache(const char *path) 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 0f5fb5bc33..eae4745d28 100644 --- a/read-cache.c +++ b/read-cache.c @@ -347,13 +347,13 @@ int add_file_to_index(const char *path, int verbose) 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 c20e4c29fc..c09c53f20b 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -27,7 +27,7 @@ test_expect_success \ 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 \ @@ -38,7 +38,17 @@ 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 |