livecd-rootfs/sync-mtime
Dan Bungert eec13dad68 lb_binary_layered: fix mtimes in layered squashfses
layer construction involves rsync, and that process ignores times to
avoid some of the layers being larger than they would otherwise where
the only difference is times.  This saves a small amount of space,
around 14MiB, but results in files in the layers having non-intended
time values.  Ensure mtime and atime in the source chroot match what is
found in the destination chroot.
2025-06-02 12:23:02 -06:00

39 lines
1.1 KiB
Python
Executable File

#!/usr/bin/python3
# usage: sync-mtime src dst
#
# synchronize atime/mtime on files between src and dst.
#
# src and dst are directories, where dst is expected to contain a subset of the
# files found in src. for each file present in dst or a subdirectory thereof,
# if atime/mtime differ between the same file in src and that file in dst,
# update atime/mtime on the file in dst.
import os
import sys
from pathlib import Path
def time_eq(a: os.stat_result, b: os.stat_result) -> bool:
return (
(a.st_mtime_ns == b.st_mtime_ns) and
(a.st_atime_ns == b.st_atime_ns)
)
src, dst = sys.argv[1:]
for dirpath, dirnames, filenames in Path(dst).walk():
for filename in filenames:
dst_file = dirpath / filename
if not dst_file.is_file():
continue
src_file = src / dst_file.relative_to(dst)
src_stat = src_file.stat(follow_symlinks=False)
dst_stat = dst_file.stat(follow_symlinks=False)
if time_eq(src_stat, dst_stat):
continue
ns = (src_stat.st_atime_ns, src_stat.st_mtime_ns)
os.utime(dst_file, ns=ns, follow_symlinks=False)