comparison cutils/treesum.py @ 128:7c646921a479

Add TIMESTAMP and ISOTIMESTAMP to the output
author Franz Glasner <fzglas.hg@dom66.de>
date Thu, 02 Jan 2025 18:23:10 +0100
parents 6a50d02fe0ca
children bdd8ea43074b
comparison
equal deleted inserted replaced
127:6a50d02fe0ca 128:7c646921a479
14 14
15 15
16 import argparse 16 import argparse
17 import base64 17 import base64
18 import binascii 18 import binascii
19 import datetime
19 import os 20 import os
20 import sys 21 import sys
22 import time
21 23
22 from . import (__version__, __revision__) 24 from . import (__version__, __revision__)
23 from . import util 25 from . import util
24 from .util import cm 26 from .util import cm
25 from .util import digest 27 from .util import digest
135 flags = [] 137 flags = []
136 if handle_root_logical: 138 if handle_root_logical:
137 flags.append(b"logical") 139 flags.append(b"logical")
138 if flags: 140 if flags:
139 outfp.write(format_bsd_line("FLAGS", None, b",".join(flags), False)) 141 outfp.write(format_bsd_line("FLAGS", None, b",".join(flags), False))
142
143 # Write execution timestamps in POSIX epoch and ISO format
144 ts = time.time()
145 outfp.write(format_bsd_line("TIMESTAMP", ts, None, False))
146 ts = (datetime.datetime.utcfromtimestamp(ts)).isoformat("T")
147 outfp.write(format_bsd_line("ISOTIMESTAMP", ts, None, False))
140 148
141 dir_digests = {} 149 dir_digests = {}
142 150
143 if not handle_root_logical and os.path.islink(root): 151 if not handle_root_logical and os.path.islink(root):
144 linktgt = util.fsencode(os.readlink(root)) 152 linktgt = util.fsencode(os.readlink(root))
191 algorithm[1], dir_dgst.digest(), opath, use_base64)) 199 algorithm[1], dir_dgst.digest(), opath, use_base64))
192 outfp.flush() 200 outfp.flush()
193 dir_digests[top] = dir_dgst.digest() 201 dir_digests[top] = dir_dgst.digest()
194 202
195 203
196 def format_bsd_line(digestname, digest, filename, use_base64): 204 def format_bsd_line(digestname, value, filename, use_base64):
197 ls = os.linesep if isinstance(os.linesep, bytes) \ 205 ls = os.linesep if isinstance(os.linesep, bytes) \
198 else os.linesep.encode("utf-8") 206 else os.linesep.encode("utf-8")
199 if not isinstance(digestname, bytes): 207 if not isinstance(digestname, bytes):
200 digestname = digestname.encode("ascii") 208 digestname = digestname.encode("ascii")
209 if digestname == b"TIMESTAMP":
210 return b"TIMESTAMP = %d%s" % (value, ls)
211 if digestname == b"ISOTIMESTAMP":
212 if not isinstance(value, bytes):
213 value = value.encode("ascii")
214 return b"ISOTIMESTAMP = %s%s" % (value, ls)
201 if not isinstance(filename, bytes): 215 if not isinstance(filename, bytes):
202 filename = util.fsencode(filename) 216 filename = util.fsencode(filename)
203 if digest is None: 217 if value is None:
204 return b"%s (%s)%s" % (digestname, filename, ls) 218 return b"%s (%s)%s" % (digestname, filename, ls)
205 if use_base64: 219 if use_base64:
206 digest = base64.b64encode(digest) 220 value = base64.b64encode(value)
207 else: 221 else:
208 digest = binascii.hexlify(digest) 222 value = binascii.hexlify(value)
209 if filename != b"/./@": 223 if filename != b"/./@":
210 filename = util.normalize_filename(filename, True) 224 filename = util.normalize_filename(filename, True)
211 return b"%s (%s) = %s%s" % (digestname, filename, digest, ls) 225 return b"%s (%s) = %s%s" % (digestname, filename, value, ls)
212 226
213 227
214 if __name__ == "__main__": 228 if __name__ == "__main__":
215 sys.exit(main()) 229 sys.exit(main())