mirror of
				https://git.launchpad.net/livecd-rootfs
				synced 2025-11-04 10:54:07 +00:00 
			
		
		
		
	lb_binary_layered: second take on fixing mtimes
This commit is contained in:
		
							parent
							
								
									20820cc567
								
							
						
					
					
						commit
						f33c8ba809
					
				
							
								
								
									
										1
									
								
								debian/install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/install
									
									
									
									
										vendored
									
									
								
							@ -4,3 +4,4 @@ get-ppa-fingerprint usr/share/livecd-rootfs
 | 
			
		||||
minimize-manual usr/share/livecd-rootfs
 | 
			
		||||
checkout-translations-branch usr/share/livecd-rootfs
 | 
			
		||||
update-source-catalog usr/share/livecd-rootfs
 | 
			
		||||
sync-mtime usr/share/livecd-rootfs
 | 
			
		||||
 | 
			
		||||
@ -163,15 +163,24 @@ build_layered_squashfs () {
 | 
			
		||||
			#    (rather than the default which is to skip copies based
 | 
			
		||||
			#    on size + mtime)
 | 
			
		||||
			#  --no-times to not copy mtimes from source to dest (we
 | 
			
		||||
			#    don't care about mtime in the image and want to
 | 
			
		||||
			#    do care about mtime in the image but want to
 | 
			
		||||
			#    deduplicate files that have indentical contents but
 | 
			
		||||
			#    different mtimes)
 | 
			
		||||
			#    different mtimes, and mtime will be fixed below)
 | 
			
		||||
			#  --del because we want to remove files that have been
 | 
			
		||||
			#    deleted in this layer.
 | 
			
		||||
			rsync -aXHAS --checksum --no-times --del chroot/ chroot-2/
 | 
			
		||||
			umount chroot-2
 | 
			
		||||
			rmdir chroot-2
 | 
			
		||||
			overlay_dir="$overlay_dir-2"
 | 
			
		||||
			# We use rsync with --no-times rsync (see above)
 | 
			
		||||
			# for the absolute best size reduction.  But there are
 | 
			
		||||
			# cases where we want mtime preservation to match what
 | 
			
		||||
			# was found in the original archive packages, such as
 | 
			
		||||
			# keeping .py mtime in sync with the matching .pyc.
 | 
			
		||||
			# Operate on the upperdir directly, so that we are only
 | 
			
		||||
			# modifying mtime on files that are actually changed in
 | 
			
		||||
			# this layer. LP: #2107332
 | 
			
		||||
			/usr/share/livecd-rootfs/sync-mtime chroot "$overlay_dir"
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		create_squashfs "${overlay_dir}" ${squashfs_f}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										38
									
								
								sync-mtime
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										38
									
								
								sync-mtime
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
#!/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)
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user