trust-executable-bit: fix breakage for symlinks
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>
This commit is contained in:
parent
5d1faf8791
commit
2bbaaed9ee
@ -112,13 +112,13 @@ static int add_file_to_cache(const char *path)
|
|||||||
ce->ce_mode = create_ce_mode(st.st_mode);
|
ce->ce_mode = create_ce_mode(st.st_mode);
|
||||||
if (!trust_executable_bit) {
|
if (!trust_executable_bit) {
|
||||||
/* If there is an existing entry, pick the mode bits
|
/* 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);
|
int pos = cache_name_pos(path, namelen);
|
||||||
if (0 <= pos)
|
if (0 <= pos)
|
||||||
ce->ce_mode = active_cache[pos]->ce_mode;
|
ce->ce_mode = active_cache[pos]->ce_mode;
|
||||||
else
|
else if (S_ISREG(st.st_mode))
|
||||||
ce->ce_mode = create_ce_mode(S_IFREG | 0644);
|
ce->ce_mode = create_ce_mode(S_IFREG | 0666);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index_path(ce->sha1, path, &st, !info_only))
|
if (index_path(ce->sha1, path, &st, !info_only))
|
||||||
|
@ -347,13 +347,13 @@ int add_file_to_index(const char *path, int verbose)
|
|||||||
ce->ce_mode = create_ce_mode(st.st_mode);
|
ce->ce_mode = create_ce_mode(st.st_mode);
|
||||||
if (!trust_executable_bit) {
|
if (!trust_executable_bit) {
|
||||||
/* If there is an existing entry, pick the mode bits
|
/* 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);
|
int pos = cache_name_pos(path, namelen);
|
||||||
if (pos >= 0)
|
if (pos >= 0)
|
||||||
ce->ce_mode = active_cache[pos]->ce_mode;
|
ce->ce_mode = active_cache[pos]->ce_mode;
|
||||||
else
|
else if (S_ISREG(st.st_mode))
|
||||||
ce->ce_mode = create_ce_mode(S_IFREG | 0644);
|
ce->ce_mode = create_ce_mode(S_IFREG | 0666);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index_path(ce->sha1, path, &st, 1))
|
if (index_path(ce->sha1, path, &st, 1))
|
||||||
|
@ -27,7 +27,7 @@ test_expect_success \
|
|||||||
git-add xfoo1 &&
|
git-add xfoo1 &&
|
||||||
case "`git-ls-files --stage xfoo1`" in
|
case "`git-ls-files --stage xfoo1`" in
|
||||||
100644" "*xfoo1) echo ok;;
|
100644" "*xfoo1) echo ok;;
|
||||||
*) echo fail; git-ls-files --stage xfoo1; exit 1;;
|
*) echo fail; git-ls-files --stage xfoo1; (exit 1);;
|
||||||
esac'
|
esac'
|
||||||
|
|
||||||
test_expect_success \
|
test_expect_success \
|
||||||
@ -38,7 +38,17 @@ test_expect_success \
|
|||||||
git-update-index --add xfoo2 &&
|
git-update-index --add xfoo2 &&
|
||||||
case "`git-ls-files --stage xfoo2`" in
|
case "`git-ls-files --stage xfoo2`" in
|
||||||
100644" "*xfoo2) echo ok;;
|
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'
|
esac'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user