Skip to content

Commit c5150d4

Browse files
committed
Merge pull request pypa#8166 from deveshks/fix-generated-file-mode
1 parent c513c72 commit c5150d4

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

news/8164.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix metadata permission issues when umask has the executable bit set.

src/pip/_internal/operations/install/wheel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ def is_entrypoint_wrapper(name):
567567
if msg is not None:
568568
logger.warning(msg)
569569

570-
generated_file_mode = 0o666 - current_umask()
570+
generated_file_mode = 0o666 & ~current_umask()
571571

572572
@contextlib.contextmanager
573573
def _generate_file(path, **kwargs):

tests/unit/test_wheel.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,15 +243,15 @@ def assert_permission(self, path, mode):
243243
target_mode = os.stat(path).st_mode & 0o777
244244
assert (target_mode & mode) == mode, oct(target_mode)
245245

246-
def assert_installed(self):
246+
def assert_installed(self, expected_permission):
247247
# lib
248248
assert os.path.isdir(
249249
os.path.join(self.scheme.purelib, 'sample'))
250250
# dist-info
251251
metadata = os.path.join(self.dest_dist_info, 'METADATA')
252-
self.assert_permission(metadata, 0o644)
252+
self.assert_permission(metadata, expected_permission)
253253
record = os.path.join(self.dest_dist_info, 'RECORD')
254-
self.assert_permission(record, 0o644)
254+
self.assert_permission(record, expected_permission)
255255
# data files
256256
data_file = os.path.join(self.scheme.data, 'my_data', 'data_file')
257257
assert os.path.isfile(data_file)
@@ -268,7 +268,28 @@ def test_std_install(self, data, tmpdir):
268268
scheme=self.scheme,
269269
req_description=str(self.req),
270270
)
271-
self.assert_installed()
271+
self.assert_installed(0o644)
272+
273+
@pytest.mark.parametrize("user_mask, expected_permission", [
274+
(0o27, 0o640)
275+
])
276+
def test_std_install_with_custom_umask(self, data, tmpdir,
277+
user_mask, expected_permission):
278+
"""Test that the files created after install honor the permissions
279+
set when the user sets a custom umask"""
280+
281+
prev_umask = os.umask(user_mask)
282+
try:
283+
self.prep(data, tmpdir)
284+
wheel.install_wheel(
285+
self.name,
286+
self.wheelpath,
287+
scheme=self.scheme,
288+
req_description=str(self.req),
289+
)
290+
self.assert_installed(expected_permission)
291+
finally:
292+
os.umask(prev_umask)
272293

273294
def test_std_install_with_direct_url(self, data, tmpdir):
274295
"""Test that install_wheel creates direct_url.json metadata when
@@ -340,7 +361,7 @@ def test_dist_info_contains_empty_dir(self, data, tmpdir):
340361
req_description=str(self.req),
341362
_temp_dir_for_testing=self.src,
342363
)
343-
self.assert_installed()
364+
self.assert_installed(0o644)
344365
assert not os.path.isdir(
345366
os.path.join(self.dest_dist_info, 'empty_dir'))
346367

0 commit comments

Comments
 (0)