Files for 2.1b1 distribution.
[python/dscho.git] / Tools / scripts / sum5.py
blob6d3b96528282204136f64fc8df0694b8c8bfea07
1 #! /usr/bin/env python
3 # print md5 checksum for files
5 bufsize = 8096
6 fnfilter = None
7 rmode = 'r'
9 usage = """
10 usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...]
11 -b : read files in binary mode
12 -t : read files in text mode (default)
13 -l : print last pathname component only
14 -s bufsize: read buffer size (default %d)
15 file ... : files to sum; '-' or no files means stdin
16 """ % bufsize
18 import sys
19 import string
20 import os
21 import md5
22 import regsub
24 StringType = type('')
25 FileType = type(sys.stdin)
27 def sum(*files):
28 sts = 0
29 if files and type(files[-1]) == FileType:
30 out, files = files[-1], files[:-1]
31 else:
32 out = sys.stdout
33 if len(files) == 1 and type(files[0]) != StringType:
34 files = files[0]
35 for f in files:
36 if type(f) == StringType:
37 if f == '-':
38 sts = printsumfp(sys.stdin, '<stdin>', out) or sts
39 else:
40 sts = printsum(f, out) or sts
41 else:
42 sts = sum(f, out) or sts
43 return sts
45 def printsum(file, out = sys.stdout):
46 try:
47 fp = open(file, rmode)
48 except IOError, msg:
49 sys.stderr.write('%s: Can\'t open: %s\n' % (file, msg))
50 return 1
51 if fnfilter:
52 file = fnfilter(file)
53 sts = printsumfp(fp, file, out)
54 fp.close()
55 return sts
57 def printsumfp(fp, file, out = sys.stdout):
58 m = md5.md5()
59 try:
60 while 1:
61 data = fp.read(bufsize)
62 if not data: break
63 m.update(data)
64 except IOError, msg:
65 sys.stderr.write('%s: I/O error: %s\n' % (file, msg))
66 return 1
67 out.write('%s %s\n' % (hexify(m.digest()), file))
68 return 0
70 def hexify(s):
71 res = ''
72 for c in s:
73 res = res + '%02x' % ord(c)
74 return res
76 def main(args = sys.argv[1:], out = sys.stdout):
77 global fnfilter, rmode, bufsize
78 import getopt
79 try:
80 opts, args = getopt.getopt(args, 'blts:')
81 except getopt.error, msg:
82 sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
83 return 2
84 for o, a in opts:
85 if o == '-l':
86 fnfilter = os.path.basename
87 if o == '-b':
88 rmode = 'rb'
89 if o == '-t':
90 rmode = 'r'
91 if o == '-s':
92 bufsize = string.atoi(a)
93 if not args: args = ['-']
94 return sum(args, out)
96 if __name__ == '__main__' or __name__ == sys.argv[0]:
97 sys.exit(main(sys.argv[1:], sys.stdout))