archive.py: fix include_parent_directories=True with path_to_name (#48570)
This commit is contained in:
		@@ -154,3 +154,35 @@ def test_gzip_compressed_tarball_is_reproducible(tmpdir):
 | 
				
			|||||||
                == spack.util.crypto.checksum_stream(hashlib.sha256, f)
 | 
					                == spack.util.crypto.checksum_stream(hashlib.sha256, f)
 | 
				
			||||||
                == spack.util.crypto.checksum_stream(hashlib.sha256, g)
 | 
					                == spack.util.crypto.checksum_stream(hashlib.sha256, g)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test_reproducible_tarfile_from_prefix_path_to_name(tmp_path: Path):
 | 
				
			||||||
 | 
					    prefix = tmp_path / "example"
 | 
				
			||||||
 | 
					    prefix.mkdir()
 | 
				
			||||||
 | 
					    (prefix / "file1").write_bytes(b"file")
 | 
				
			||||||
 | 
					    (prefix / "file2").write_bytes(b"file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def map_prefix(path: str) -> str:
 | 
				
			||||||
 | 
					        """maps <prefix>/<path> to some/common/prefix/<path>"""
 | 
				
			||||||
 | 
					        p = PurePath(path)
 | 
				
			||||||
 | 
					        assert p.parts[: len(prefix.parts)] == prefix.parts, f"{path} is not under {prefix}"
 | 
				
			||||||
 | 
					        return PurePath("some", "common", "prefix", *p.parts[len(prefix.parts) :]).as_posix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with tarfile.open(tmp_path / "example.tar", "w") as tar:
 | 
				
			||||||
 | 
					        reproducible_tarfile_from_prefix(
 | 
				
			||||||
 | 
					            tar,
 | 
				
			||||||
 | 
					            str(tmp_path / "example"),
 | 
				
			||||||
 | 
					            include_parent_directories=True,
 | 
				
			||||||
 | 
					            path_to_name=map_prefix,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with tarfile.open(tmp_path / "example.tar", "r") as tar:
 | 
				
			||||||
 | 
					        assert [t.name for t in tar.getmembers() if t.isdir()] == [
 | 
				
			||||||
 | 
					            "some",
 | 
				
			||||||
 | 
					            "some/common",
 | 
				
			||||||
 | 
					            "some/common/prefix",
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					        assert [t.name for t in tar.getmembers() if t.isfile()] == [
 | 
				
			||||||
 | 
					            "some/common/prefix/file1",
 | 
				
			||||||
 | 
					            "some/common/prefix/file2",
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -172,10 +172,10 @@ def reproducible_tarfile_from_prefix(
 | 
				
			|||||||
    hardlink_to_tarinfo_name: Dict[Tuple[int, int], str] = dict()
 | 
					    hardlink_to_tarinfo_name: Dict[Tuple[int, int], str] = dict()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if include_parent_directories:
 | 
					    if include_parent_directories:
 | 
				
			||||||
        parent_dirs = reversed(pathlib.Path(prefix).parents)
 | 
					        parent_dirs = reversed(pathlib.PurePosixPath(path_to_name(prefix)).parents)
 | 
				
			||||||
        next(parent_dirs)  # skip the root: slices are supported from python 3.10
 | 
					        next(parent_dirs)  # skip the root: slices are supported from python 3.10
 | 
				
			||||||
        for parent_dir in parent_dirs:
 | 
					        for parent_dir in parent_dirs:
 | 
				
			||||||
            dir_info = tarfile.TarInfo(path_to_name(str(parent_dir)))
 | 
					            dir_info = tarfile.TarInfo(str(parent_dir))
 | 
				
			||||||
            dir_info.type = tarfile.DIRTYPE
 | 
					            dir_info.type = tarfile.DIRTYPE
 | 
				
			||||||
            dir_info.mode = 0o755
 | 
					            dir_info.mode = 0o755
 | 
				
			||||||
            tar.addfile(dir_info)
 | 
					            tar.addfile(dir_info)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user