OSDN Git Service

trust-executable-bit: fix breakage for symlinks
authorJunio C Hamano <junkio@cox.net>
Thu, 23 Nov 2006 00:33:32 +0000 (16:33 -0800)
committerJunio 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>
builtin-update-index.c
read-cache.c
t/t3700-add.sh

index 7f9c638..182331d 100644 (file)
@@ -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))
index 0f5fb5b..eae4745 100644 (file)
@@ -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))
index c20e4c2..c09c53f 100755 (executable)
@@ -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