in de/fileutils.py [0:0]
def checkout_file_revisions(file_path, target_dir) -> list[str]:
"""
Returns a list of short commit hashes for all revisions of the given file.
"""
file_path = Path(file_path)
target_dir = Path(target_dir)
cwd = Path.cwd()
try:
os.chdir(file_path.parent)
git_dir = Path(
subprocess.check_output(
["git", "rev-parse", "--show-toplevel"], text=True
).strip()
)
finally:
os.chdir(cwd)
git_file = file_path.relative_to(git_dir)
git_cmd = ["git", "-C", str(git_dir)]
try:
command = git_cmd + [
"log",
"--pretty=format:%h",
"--follow",
"--diff-filter=d",
"--",
str(git_file),
]
output = subprocess.check_output(command, text=True)
except subprocess.CalledProcessError as e:
raise RuntimeError(f"Failed to retrieve revisions for {git_file}") from e
revisions = output.strip().split("\n")
print(f"{git_file} has {len(revisions)} revisions")
for rev in revisions:
print("Checking out", rev)
command = git_cmd + [
f"--work-tree={target_dir}",
"checkout",
rev,
"--",
str(git_file),
]
try:
subprocess.run(command, check=True)
except subprocess.CalledProcessError as e:
raise RuntimeError(
f"Failed to checkout {file_path} at revision {rev}"
) from e
# rename the file to include the commit hash
new_file = target_dir / f"{file_path.stem}-{rev}{file_path.suffix}"
os.rename(target_dir / git_file, new_file)