xeps/tools/ci-restore-timestamps.py

72 lines
1.7 KiB
Python

#!/usr/bin/python3
import os
import pathlib
import subprocess
import time
def parse_timestamp_line(s: str):
author_ts, committer_ts = s.split(" ", 1)
return max(int(author_ts), int(committer_ts))
def restore_commit_timestamps(basedir: pathlib.Path):
env = dict(os.environ)
env["LANG"] = "C.UTF-8"
# NOTE: the build image is still only on Python 3.4 because texml and stuff
# so we cannot use encoding= here and have to do decoding ourselves.
proc = subprocess.Popen(
[
"git", "log", "--pretty=%at %ct", "--name-status",
],
stdout=subprocess.PIPE,
env=env,
)
seen = set()
last_timestamp = None
for line in proc.stdout:
if not line:
continue
if not line.endswith(b"\n"):
raise ValueError("line not terminated")
line = line[:-1].decode("utf-8")
if not line:
continue
try:
timestamp = parse_timestamp_line(line)
except ValueError:
pass
else:
last_timestamp = timestamp
continue
_, filename = line.split("\t", 1)
if filename in seen:
continue
seen.add(filename)
filepath = basedir / filename
try:
os.utime(str(filepath), (last_timestamp, last_timestamp))
except FileNotFoundError:
pass
def main():
basedir = pathlib.Path.cwd()
t0 = time.monotonic()
try:
restore_commit_timestamps(basedir)
finally:
t1 = time.monotonic()
print("timestamp restoration took {:.2f}s".format(t1-t0))
return 0
if __name__ == "__main__":
import sys
sys.exit(main() or 0)