Skip to content

Commit c2f1aac

Browse files
committed
fix
1 parent 04a303b commit c2f1aac

2 files changed

Lines changed: 39 additions & 1 deletion

File tree

tools/imported_dynamic_framework_processor/imported_dynamic_framework_processor.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,9 @@ def _create_framework_zip(framework_temp_path: str, output_zip: str) -> None:
157157
zip_info.external_attr = (stat.S_IFLNK | 0o755) << 16
158158
out_zip.writestr(zip_info, os.readlink(path).encode("utf-8"))
159159
elif os.path.isdir(path):
160+
if os.listdir(path):
161+
# File entries create their parent directories when extracted.
162+
continue
160163
zip_info = zipfile.ZipInfo(zip_path + "/", fixed_date_time)
161164
zip_info.create_system = 3
162165
zip_info.compress_type = zipfile.ZIP_STORED

tools/imported_dynamic_framework_processor/imported_dynamic_framework_processor_test.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ def _scratch_file(self, path, content=""):
4343
fp.write(content)
4444
return full_path
4545

46+
def _scratch_directory(self, path):
47+
full_path = os.path.join(self._scratch_dir, path)
48+
os.makedirs(full_path, exist_ok=True)
49+
return full_path
50+
4651
def _scratch_symlink(self, path, target):
4752
full_path = os.path.join(self._scratch_dir, path)
4853
os.makedirs(os.path.dirname(full_path), exist_ok=True)
@@ -296,7 +301,11 @@ def test_create_framework_zip_preserves_versioned_framework_symlinks(self):
296301
temp_path, output_zip)
297302

298303
with zipfile.ZipFile(output_zip) as zip_file:
299-
self.assertNotIn("Foo.framework/Resources/", zip_file.namelist())
304+
zip_names = zip_file.namelist()
305+
self.assertNotIn("Foo.framework/Versions/", zip_names)
306+
self.assertNotIn("Foo.framework/Versions/A/", zip_names)
307+
self.assertNotIn("Foo.framework/Versions/A/Resources/", zip_names)
308+
self.assertNotIn("Foo.framework/Resources/", zip_names)
300309
self.assertEqual(
301310
b"Versions/Current/Resources",
302311
zip_file.read("Foo.framework/Resources"),
@@ -311,5 +320,31 @@ def test_create_framework_zip_preserves_versioned_framework_symlinks(self):
311320
zip_file.getinfo(
312321
"Foo.framework/Versions/Current").external_attr >> 16))
313322

323+
def test_create_framework_zip_preserves_empty_versioned_directory(self):
324+
temp_path = os.path.join(self._scratch_dir, "out", "Foo.framework")
325+
output_zip = os.path.join(self._scratch_dir, "Foo.zip")
326+
self._scratch_file("out/Foo.framework/Versions/A/Foo", "binary")
327+
self._scratch_directory("out/Foo.framework/Versions/A/Headers")
328+
self._scratch_symlink("out/Foo.framework/Versions/Current", "A")
329+
self._scratch_symlink(
330+
"out/Foo.framework/Headers", "Versions/Current/Headers")
331+
332+
imported_dynamic_framework_processor._create_framework_zip(
333+
temp_path, output_zip)
334+
335+
with zipfile.ZipFile(output_zip) as zip_file:
336+
zip_names = zip_file.namelist()
337+
self.assertIn("Foo.framework/Versions/A/Headers/", zip_names)
338+
self.assertNotIn("Foo.framework/Headers/", zip_names)
339+
self.assertEqual(
340+
b"Versions/Current/Headers",
341+
zip_file.read("Foo.framework/Headers"),
342+
)
343+
self.assertTrue(stat.S_ISLNK(
344+
zip_file.getinfo("Foo.framework/Headers").external_attr >> 16))
345+
self.assertTrue(stat.S_ISDIR(
346+
zip_file.getinfo(
347+
"Foo.framework/Versions/A/Headers/").external_attr >> 16))
348+
314349
if __name__ == "__main__":
315350
unittest.main()

0 commit comments

Comments
 (0)