Mercurial > hgrepos > Python > apps > py-cutils
annotate cutils/treesum.py @ 125:12d6ec1f8613
Implement "--logical" and "--physical" to control following symlinked directories when given on the commandline
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Thu, 02 Jan 2025 17:03:10 +0100 |
| parents | 3bd3f32b5e60 |
| children | 6a50d02fe0ca |
| 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 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
19 import os |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
20 import sys |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
21 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
22 from . import (__version__, __revision__) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
23 from . import util |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
24 from .util import cm |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
25 from .util import digest |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
26 from .util import walk |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
27 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
28 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
29 def main(argv=None): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
30 aparser = argparse.ArgumentParser( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
31 description="Generate checksums for directory trees", |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
32 fromfile_prefix_chars='@') |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
33 aparser.add_argument( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
34 "--algorithm", "-a", action="store", type=util.argv2algo, |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
35 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
|
36 "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
|
37 "blake2b, blake2b-256 (default), blake2s, " |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
38 "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
|
39 "md5") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
40 aparser.add_argument( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
41 "--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
|
42 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
|
43 aparser.add_argument( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
44 "--base64", action="store_true", |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
45 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
|
46 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
|
47 "--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
|
48 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
|
49 " 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
|
50 " 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
|
51 aparser.add_argument( |
|
124
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
52 "--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
|
53 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
|
54 "from the filesize.") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
55 aparser.add_argument( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
56 "--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
|
57 help="Dont use mmap.") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
58 aparser.add_argument( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
59 "--output", "-o", action="store", metavar="OUTPUT", |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
60 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
|
61 " as `-' then stdout is used.") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
62 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
|
63 "--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
|
64 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
|
65 " 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
|
66 aparser.add_argument( |
|
124
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
67 "--version", "-v", action="version", |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
68 version="%s (rv:%s)" % (__version__, __revision__)) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
69 aparser.add_argument( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
70 "directories", nargs="*", metavar="DIRECTORY") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
71 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
72 opts = aparser.parse_args(args=argv) |
|
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 if not opts.algorithm: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
75 opts.algorithm = util.argv2algo("blake2b-256") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
76 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
77 return treesum(opts) |
|
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 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
80 def gen_opts(directories=[], |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
81 algorithm="BLAKE2b-256", |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
82 append_output=False, |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
83 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
|
84 logical=None, |
|
124
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
85 mmap=None, |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
86 output=None): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
87 opts = argparse.Namespace(directories=directories, |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
88 algorithm=(util.algotag2algotype(algorithm), |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
89 algorithm), |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
90 append_output=append_output, |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
91 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
|
92 logical=logical, |
|
124
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
93 mmap=mmap, |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
94 output=output) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
95 return opts |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
96 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
97 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
98 def treesum(opts): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
99 # 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
|
100 return generate_treesum(opts) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
101 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
102 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
103 def generate_treesum(opts): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
104 if not opts.directories: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
105 opts.directories.append(".") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
106 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
107 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
|
108 if hasattr(sys.stdout, "buffer"): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
109 out_cm = cm.nullcontext(sys.stdout.buffer) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
110 else: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
111 out_cm = cm.nullcontext(sys.stdout) |
|
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 if opts.append_output: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
114 out_cm = open(opts.output, "ab") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
115 else: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
116 out_cm = open(opts.output, "wb") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
117 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
118 with out_cm as outfp: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
119 for d in opts.directories: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
120 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
|
121 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
|
122 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
123 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
124 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
|
125 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
|
126 """ |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
127 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
128 :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
|
129 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
130 """ |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
131 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
|
132 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
|
133 |
|
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
|
134 # 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
|
135 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 |
|
124
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
141 dir_digests = {} |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
142 |
|
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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 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
|
149 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
|
150 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
|
151 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
|
152 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
|
153 "/./@", |
|
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 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
|
155 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
|
156 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
|
157 |
|
124
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
158 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
|
159 dir_dgst = algorithm[0]() |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
160 for dn in dirs: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
161 if dn.is_symlink: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
162 linktgt = util.fsencode(os.readlink(dn.path)) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
163 linkdgst = algorithm[0]() |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
164 linkdgst.update(linktgt) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
165 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
|
166 dir_dgst.update(linkdgst.digest()) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
167 if top: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
168 opath = "/".join(top) + "/" + dn.name |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
169 else: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
170 opath = dn.name |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
171 outfp.write( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
172 format_bsd_line( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
173 algorithm[1], |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
174 linkdgst.digest(), |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
175 "%s/./@" % (opath,), |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
176 use_base64)) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
177 outfp.flush() |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
178 else: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
179 # fetch from dir_digests |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
180 dgst = dir_digests[top + (dn.name,)] |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
181 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
|
182 dir_dgst.update(dgst) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
183 for fn in nondirs: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
184 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
|
185 dgst = digest.compute_digest_file( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
186 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
|
187 dir_dgst.update(dgst) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
188 if top: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
189 opath = "/".join(top) + "/" + fn.name |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
190 else: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
191 opath = fn.name |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
192 outfp.write(format_bsd_line( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
193 algorithm[1], dgst, opath, use_base64)) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
194 outfp.flush() |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
195 outfp.write(format_bsd_line( |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
196 algorithm[1], dir_dgst.digest(), "/".join(top) + "/", use_base64)) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
197 outfp.flush() |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
198 dir_digests[top] = dir_dgst.digest() |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
199 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
200 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
201 def format_bsd_line(digestname, digest, filename, use_base64): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
202 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
|
203 else os.linesep.encode("utf-8") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
204 if not isinstance(digestname, bytes): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
205 digestname = digestname.encode("ascii") |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
206 if not isinstance(filename, bytes): |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
207 filename = util.fsencode(filename) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
208 if digest is None: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
209 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
|
210 if use_base64: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
211 digest = base64.b64encode(digest) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
212 else: |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
213 digest = binascii.hexlify(digest) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
214 return b"%s (%s) = %s%s" \ |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
215 % (digestname, util.normalize_filename(filename, True), digest, ls) |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
216 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
217 |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
218 if __name__ == "__main__": |
|
3bd3f32b5e60
A first version of "treesum" is working
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
219 sys.exit(main()) |
