Skip to content

Commit e0b8c7c

Browse files
committed
pkg_tar: load attributes for TreeArtifacts
This change teaches pkg_tar to reinvoke file_attributes for each individual file in a TreeArtifact; this function is used to load the attributes passed via pkg_tar arguments (like `mode`). Before this change, there's no way to set individual attributes for files in a TreeArtifact. NOTE: This is actually a breaking change, because previously all intermediate directories were automatically 0o755, and now they will obey the global defaults.
1 parent 4b1d677 commit e0b8c7c

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

pkg/private/tar/build_tar.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def add_deb(self, deb):
218218
self.add_tar(tmpfile[1])
219219
os.remove(tmpfile[1])
220220

221-
def add_tree(self, tree_top, destpath, mode=None, ids=None, names=None):
221+
def add_tree(self, tree_top, destpath, file_attributes, mode=None, ids=None, names=None):
222222
"""Add a tree artifact to the tar file.
223223
224224
Args:
@@ -273,31 +273,42 @@ def add_tree(self, tree_top, destpath, mode=None, ids=None, names=None):
273273
to_write[dest_dir + file] = content_path
274274

275275
for path in sorted(to_write.keys()):
276+
if file_attributes:
277+
attrs = file_attributes(path)
278+
use_ids = attrs.get("ids")
279+
use_names = attrs.get("names")
280+
use_mode = attrs.get("mode")
281+
else:
282+
use_ids = ids
283+
use_names = names
284+
use_mode = mode
285+
276286
content_path = to_write[path]
277287
if not content_path:
278288
# This is an intermediate directory. Bazel has no API to specify modes
279289
# for this, so the least surprising thing we can do is make it the
280290
# canonical rwxr-xr-x
291+
if use_mode is None:
292+
use_mode = 0o755
281293
self.add_empty_file(
282294
path,
283-
mode=0o755,
284-
ids=ids,
285-
names=names,
295+
mode=use_mode,
296+
ids=use_ids,
297+
names=use_names,
286298
kind=tarfile.DIRTYPE)
287299
else:
288300
# If mode is unspecified, derive the mode from the file's mode.
289-
if mode is None:
290-
f_mode = 0o755 if os.access(content_path, os.X_OK) else 0o644
291-
else:
292-
f_mode = mode
301+
if use_mode is None:
302+
use_mode = 0o755 if os.access(content_path, os.X_OK) else 0o644
303+
293304
self.tarfile.add_file(
294305
path,
295306
file_content=content_path,
296-
mode=f_mode,
297-
uid=ids[0],
298-
gid=ids[1],
299-
uname=names[0],
300-
gname=names[1])
307+
mode=use_mode,
308+
uid=use_ids[0],
309+
gid=use_ids[1],
310+
uname=use_names[0],
311+
gname=use_names[1])
301312

302313
def add_manifest_entry(self, entry, file_attributes):
303314
# Use the pkg_tar mode/owner remapping as a fallback
@@ -325,7 +336,7 @@ def add_manifest_entry(self, entry, file_attributes):
325336
elif entry.type == manifest.ENTRY_IS_DIR:
326337
self.add_empty_dir(self.normalize_path(entry.dest), **attrs)
327338
elif entry.type == manifest.ENTRY_IS_TREE:
328-
self.add_tree(entry.src, entry.dest, **attrs)
339+
self.add_tree(entry.src, entry.dest, file_attributes, **attrs)
329340
elif entry.type == manifest.ENTRY_IS_EMPTY_FILE:
330341
self.add_empty_file(self.normalize_path(entry.dest), **attrs)
331342
else:

tests/tar/pkg_tar_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,12 @@ def test_tar_with_tree_artifact(self):
222222
content = [
223223
{'name': 'a_tree', 'isdir': True},
224224
{'name': 'a_tree/generate_tree', 'isdir': True, 'mode': 0o755},
225-
{'name': 'a_tree/generate_tree/a', 'isdir': True, 'mode': 0o755},
225+
{'name': 'a_tree/generate_tree/a', 'isdir': True, 'mode': 0o555},
226226
{'name': 'a_tree/generate_tree/a/a'},
227-
{'name': 'a_tree/generate_tree/a/b', 'isdir': True, 'mode': 0o755},
227+
{'name': 'a_tree/generate_tree/a/b', 'isdir': True, 'mode': 0o555},
228228
{'name': 'a_tree/generate_tree/a/b/c'},
229-
{'name': 'a_tree/generate_tree/b', 'isdir': True, 'mode': 0o755},
230-
{'name': 'a_tree/generate_tree/b/c', 'isdir': True, 'mode': 0o755},
229+
{'name': 'a_tree/generate_tree/b', 'isdir': True, 'mode': 0o555},
230+
{'name': 'a_tree/generate_tree/b/c', 'isdir': True, 'mode': 0o555},
231231
{'name': 'a_tree/generate_tree/b/c/d'},
232232
{'name': 'a_tree/generate_tree/b/d'},
233233
{'name': 'a_tree/generate_tree/b/e'},

0 commit comments

Comments
 (0)