summaryrefslogtreecommitdiff
path: root/git/index/fun.py
diff options
context:
space:
mode:
authorTodd Zullinger <tmz@pobox.com>2021-05-24 17:34:42 -0400
committerTodd Zullinger <tmz@pobox.com>2021-05-25 11:42:07 -0400
commit1a04c15b1f77f908b1dd3983a27ee49c41b3a3e5 (patch)
tree81677cb062f30badff8ae37fbe05234d4d6908a7 /git/index/fun.py
parenteae0e37c88a71a3b8ca816b820eed71fd1590f11 (diff)
downloadgitpython-1a04c15b1f77f908b1dd3983a27ee49c41b3a3e5.tar.gz
improve index mode for files with executable bit
The fix for #430 in bebc4f56 (Use correct mode for executable files, 2016-05-19) is incomplete. It fails (in most cases) when files have modes which are not exactly 0644 or 0755. Git only cares whether the executable bit is set (or not). Ensure the mode we set for the index is either 100644 or 100755 based on whether the executable bit is set for the file owner. Do this similarly to how upstream git does it in cache.h¹. Add a test covering various file modes to help catch regressions. Fixes #1253 ¹ https://github.com/git/git/blob/v2.31.1/cache.h#L247
Diffstat (limited to 'git/index/fun.py')
-rw-r--r--git/index/fun.py3
1 files changed, 2 insertions, 1 deletions
diff --git a/git/index/fun.py b/git/index/fun.py
index f40928c3..1012f480 100644
--- a/git/index/fun.py
+++ b/git/index/fun.py
@@ -11,6 +11,7 @@ from stat import (
S_ISDIR,
S_IFMT,
S_IFREG,
+ S_IXUSR,
)
import subprocess
@@ -115,7 +116,7 @@ def stat_mode_to_index_mode(mode):
return S_IFLNK
if S_ISDIR(mode) or S_IFMT(mode) == S_IFGITLINK: # submodules
return S_IFGITLINK
- return S_IFREG | 0o644 | (mode & 0o111) # blobs with or without executable bit
+ return S_IFREG | (mode & S_IXUSR and 0o755 or 0o644) # blobs with or without executable bit
def write_cache(entries: Sequence[Union[BaseIndexEntry, 'IndexEntry']], stream: IO[bytes],