mirror of
https://github.com/moparisthebest/xeps
synced 2024-11-23 09:42:20 -05:00
72 lines
1.7 KiB
Python
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)
|