annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
2 # :-
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
3 # :Copyright: (c) 2020-2025 Franz Glasner
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
4 # :License: BSD-3-Clause
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
5 # :-
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
6 r"""Generate and verify checksums for directory trees.
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
7
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
8 """
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
9
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
10 from __future__ import print_function, absolute_import
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
11
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
12
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
13 __all__ = []
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
14
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
15
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
16 import argparse
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
17 import base64
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
18 import binascii
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
19 import datetime
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
20 import os
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
21 import sys
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
22 import time
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
23
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
24 from . import (__version__, __revision__)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
25 from . import util
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
26 from .util import cm
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
27 from .util import digest
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
28 from .util import walk
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
29
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
30
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
31 def main(argv=None):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
32 aparser = argparse.ArgumentParser(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
33 description="Generate checksums for directory trees",
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
34 fromfile_prefix_chars='@')
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
35 aparser.add_argument(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
36 "--algorithm", "-a", action="store", type=util.argv2algo,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
37 help="1 (aka sha1), 224, 256, 384, 512, "
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
38 "3 (alias for sha3-512), 3-224, 3-256, 3-384, 3-512, "
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
39 "blake2b, blake2b-256 (default), blake2s, "
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
40 "blake2 (alias for blake2b), blake2-256 (alias for blake2b-256), "
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
41 "md5")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
42 aparser.add_argument(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
43 "--append-output", action="store_true", dest="append_output",
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
44 help="Append to the output file instead of overwriting it.")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
45 aparser.add_argument(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
46 "--base64", action="store_true",
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
47 help="Output checksums in base64 notation, not hexadecimal (OpenBSD).")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
48 aparser.add_argument(
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
49 "--logical", "-L", dest="logical", action="store_true", default=None,
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
50 help="Follow symbolic links given on command line arguments."
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
51 " Note that this is a different setting as to follow symbolic"
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
52 " links to directories when traversing a directory tree.")
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
53 aparser.add_argument(
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
54 "--mmap", action="store_true", dest="mmap", default=None,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
55 help="Use mmap if available. Default is to determine automatically "
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
56 "from the filesize.")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
57 aparser.add_argument(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
58 "--no-mmap", action="store_false", dest="mmap", default=None,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
59 help="Dont use mmap.")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
60 aparser.add_argument(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
61 "--output", "-o", action="store", metavar="OUTPUT",
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
62 help="Put the checksum into given file. If not given of if it is given"
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
63 " as `-' then stdout is used.")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
64 aparser.add_argument(
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
65 "--physical", "-P", dest="logical", action="store_false", default=None,
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
66 help="Do not follow symbolic links given on comment line arguments."
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
67 " This is the default.")
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
68 aparser.add_argument(
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
69 "--version", "-v", action="version",
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
70 version="%s (rv:%s)" % (__version__, __revision__))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
71 aparser.add_argument(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
72 "directories", nargs="*", metavar="DIRECTORY")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
73
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
74 opts = aparser.parse_args(args=argv)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
75
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
76 if not opts.algorithm:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
77 opts.algorithm = util.argv2algo("blake2b-256")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
78
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
79 return treesum(opts)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
80
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
81
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
82 def gen_opts(directories=[],
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
83 algorithm="BLAKE2b-256",
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
84 append_output=False,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
85 base64=False,
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
86 logical=None,
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
87 mmap=None,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
88 output=None):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
89 opts = argparse.Namespace(directories=directories,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
90 algorithm=(util.algotag2algotype(algorithm),
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
91 algorithm),
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
92 append_output=append_output,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
93 base64=base64,
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
94 logical=logical,
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
95 mmap=mmap,
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
96 output=output)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
97 return opts
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
98
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
99
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
100 def treesum(opts):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
101 # XXX TBD: opts.check and opts.checklist (as in shasum.py)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
102 return generate_treesum(opts)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
103
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
104
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
105 def generate_treesum(opts):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
106 if not opts.directories:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
107 opts.directories.append(".")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
108
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
109 if opts.output is None or opts.output == "-":
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
110 if hasattr(sys.stdout, "buffer"):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
111 out_cm = cm.nullcontext(sys.stdout.buffer)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
112 else:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
113 out_cm = cm.nullcontext(sys.stdout)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
114 else:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
115 if opts.append_output:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
116 out_cm = open(opts.output, "ab")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
117 else:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
118 out_cm = open(opts.output, "wb")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
119
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
120 with out_cm as outfp:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
121 for d in opts.directories:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
122 generate_treesum_for_directory(
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
123 outfp, d, opts.algorithm, opts.mmap, opts.base64, opts.logical)
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
125
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
126 def generate_treesum_for_directory(
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
127 outfp, root, algorithm, use_mmap, use_base64, handle_root_logical):
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
128 """
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
129
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
130 :param outfp: a *binary* file with a "write()" and a "flush()" method
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
131
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
132 """
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
133 outfp.write(format_bsd_line("ROOT", None, root, False))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
134 outfp.flush()
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
135
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
136 # Note given non-default flags that are relevant for directory traversal
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
137 flags = []
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
138 if handle_root_logical:
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
139 flags.append(b"logical")
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
140 if flags:
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
141 outfp.write(format_bsd_line("FLAGS", None, b",".join(flags), False))
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
142
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
143 # Write execution timestamps in POSIX epoch and ISO format
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
144 ts = time.time()
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
145 outfp.write(format_bsd_line("TIMESTAMP", ts, None, False))
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
146 ts = (datetime.datetime.utcfromtimestamp(ts)).isoformat("T")
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
147 outfp.write(format_bsd_line("ISOTIMESTAMP", ts, None, False))
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
148
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
149 dir_digests = {}
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
150
125
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
151 if not handle_root_logical and os.path.islink(root):
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
152 linktgt = util.fsencode(os.readlink(root))
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
153 linkdgst = algorithm[0]()
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
154 linkdgst.update(linktgt)
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
155 dir_dgst = algorithm[0]()
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
156 dir_dgst.update(b"1:S,4:/./@,")
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
157 dir_dgst.update(linkdgst.digest())
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
158 outfp.write(format_bsd_line(
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
159 algorithm[1],
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
160 dir_dgst.digest(),
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
161 "/./@",
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
162 use_base64))
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
163 outfp.flush()
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
164 return
12d6ec1f8613 Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
Franz Glasner <fzglas.hg@dom66.de>
parents: 124
diff changeset
165
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
166 for top, dirs, nondirs in walk.walk(root, follow_symlinks=False):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
167 dir_dgst = algorithm[0]()
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
168 for dn in dirs:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
169 if dn.is_symlink:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
170 linktgt = util.fsencode(os.readlink(dn.path))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
171 linkdgst = algorithm[0]()
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
172 linkdgst.update(linktgt)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
173 dir_dgst.update(b"1:S,%d:%s," % (len(dn.fsname), dn.fsname))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
174 dir_dgst.update(linkdgst.digest())
127
6a50d02fe0ca Change the filename output: make it more consistent
Franz Glasner <fzglas.hg@dom66.de>
parents: 125
diff changeset
175 opath = "/".join(top) + "/" + dn.name if top else dn.name
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
176 outfp.write(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
177 format_bsd_line(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
178 algorithm[1],
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
179 linkdgst.digest(),
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
180 "%s/./@" % (opath,),
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
181 use_base64))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
182 outfp.flush()
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
183 else:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
184 # fetch from dir_digests
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
185 dgst = dir_digests[top + (dn.name,)]
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
186 dir_dgst.update(b"1:d,%d:%s," % (len(dn.fsname), dn.fsname))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
187 dir_dgst.update(dgst)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
188 for fn in nondirs:
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
189 dir_dgst.update(b"1:f,%d:%s," % (len(fn.fsname), fn.fsname))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
190 dgst = digest.compute_digest_file(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
191 algorithm[0], fn.path, use_mmap=use_mmap)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
192 dir_dgst.update(dgst)
127
6a50d02fe0ca Change the filename output: make it more consistent
Franz Glasner <fzglas.hg@dom66.de>
parents: 125
diff changeset
193 opath = "/".join(top) + "/" + fn.name if top else fn.name
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
194 outfp.write(format_bsd_line(
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
195 algorithm[1], dgst, opath, use_base64))
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
196 outfp.flush()
127
6a50d02fe0ca Change the filename output: make it more consistent
Franz Glasner <fzglas.hg@dom66.de>
parents: 125
diff changeset
197 opath = "/".join(top) + "/" if top else ""
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
198 outfp.write(format_bsd_line(
127
6a50d02fe0ca Change the filename output: make it more consistent
Franz Glasner <fzglas.hg@dom66.de>
parents: 125
diff changeset
199 algorithm[1], dir_dgst.digest(), opath, use_base64))
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
200 outfp.flush()
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
201 dir_digests[top] = dir_dgst.digest()
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
202
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
203
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
204 def format_bsd_line(digestname, value, filename, use_base64):
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
205 ls = os.linesep if isinstance(os.linesep, bytes) \
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
206 else os.linesep.encode("utf-8")
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
207 if not isinstance(digestname, bytes):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
208 digestname = digestname.encode("ascii")
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
209 if digestname == b"TIMESTAMP":
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
210 return b"TIMESTAMP = %d%s" % (value, ls)
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
211 if digestname == b"ISOTIMESTAMP":
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
212 if not isinstance(value, bytes):
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
213 value = value.encode("ascii")
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
214 return b"ISOTIMESTAMP = %s%s" % (value, ls)
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
215 if not isinstance(filename, bytes):
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
216 filename = util.fsencode(filename)
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
217 if value is None:
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
218 return b"%s (%s)%s" % (digestname, filename, ls)
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
219 if use_base64:
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
220 value = base64.b64encode(value)
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
221 else:
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
222 value = binascii.hexlify(value)
127
6a50d02fe0ca Change the filename output: make it more consistent
Franz Glasner <fzglas.hg@dom66.de>
parents: 125
diff changeset
223 if filename != b"/./@":
6a50d02fe0ca Change the filename output: make it more consistent
Franz Glasner <fzglas.hg@dom66.de>
parents: 125
diff changeset
224 filename = util.normalize_filename(filename, True)
128
7c646921a479 Add TIMESTAMP and ISOTIMESTAMP to the output
Franz Glasner <fzglas.hg@dom66.de>
parents: 127
diff changeset
225 return b"%s (%s) = %s%s" % (digestname, filename, value, ls)
124
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
226
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
227
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
228 if __name__ == "__main__":
3bd3f32b5e60 A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
229 sys.exit(main())