diff --git a/news/5F187A50-7217-4F88-8902-548C9F534E55.trivial b/news/5F187A50-7217-4F88-8902-548C9F534E55.trivial new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/pip/_internal/utils/unpacking.py b/src/pip/_internal/utils/unpacking.py index fe71d26e355..8966052d903 100644 --- a/src/pip/_internal/utils/unpacking.py +++ b/src/pip/_internal/utils/unpacking.py @@ -95,6 +95,15 @@ def is_within_directory(directory, target): return prefix == abs_directory +def set_extracted_file_to_default_mode_plus_executable(path): + # type: (Union[str, Text]) -> None + """ + Make file present at path have execute for user/group/world + (chmod +x) is no-op on windows per python docs + """ + os.chmod(path, (0o777 & ~current_umask() | 0o111)) + + def unzip_file(filename, location, flatten=True): # type: (str, str, bool) -> None """ @@ -140,9 +149,7 @@ def unzip_file(filename, location, flatten=True): # if mode and regular file and any execute permissions for # user/group/world? if mode and stat.S_ISREG(mode) and mode & 0o111: - # make dest file have execute for user/group/world - # (chmod +x) no-op on windows per python docs - os.chmod(fn, (0o777 - current_umask() | 0o111)) + set_extracted_file_to_default_mode_plus_executable(fn) finally: zipfp.close() @@ -225,9 +232,7 @@ def untar_file(filename, location): tar.utime(member, path) # type: ignore # member have any execute permissions for user/group/world? if member.mode & 0o111: - # make dest file have execute for user/group/world - # no-op on windows per python docs - os.chmod(path, (0o777 - current_umask() | 0o111)) + set_extracted_file_to_default_mode_plus_executable(path) finally: tar.close()