blob: 0711db8dea40c8d843078a8f98e069ff66de6143 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossum07c96451994-10-03 16:45:35 +00002
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +00003"""Python utility to print MD5 checksums of argument files.
4"""
5
Guido van Rossum07c96451994-10-03 16:45:35 +00006
7bufsize = 8096
8fnfilter = None
9rmode = 'r'
10
11usage = """
12usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...]
13-b : read files in binary mode
14-t : read files in text mode (default)
15-l : print last pathname component only
16-s bufsize: read buffer size (default %d)
17file ... : files to sum; '-' or no files means stdin
18""" % bufsize
19
20import sys
Guido van Rossum07c96451994-10-03 16:45:35 +000021import os
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000022import getopt
Guido van Rossum07c96451994-10-03 16:45:35 +000023import md5
Guido van Rossum07c96451994-10-03 16:45:35 +000024
25def sum(*files):
Tim Peters70c43782001-01-17 08:48:39 +000026 sts = 0
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000027 if files and isinstance(files[-1], file):
Tim Peters70c43782001-01-17 08:48:39 +000028 out, files = files[-1], files[:-1]
29 else:
30 out = sys.stdout
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000031 if len(files) == 1 and not isinstance(files[0], str):
Tim Peters70c43782001-01-17 08:48:39 +000032 files = files[0]
33 for f in files:
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000034 if isinstance(f, str):
Tim Peters70c43782001-01-17 08:48:39 +000035 if f == '-':
36 sts = printsumfp(sys.stdin, '<stdin>', out) or sts
37 else:
38 sts = printsum(f, out) or sts
39 else:
40 sts = sum(f, out) or sts
41 return sts
Guido van Rossum07c96451994-10-03 16:45:35 +000042
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000043def printsum(filename, out = sys.stdout):
Tim Peters70c43782001-01-17 08:48:39 +000044 try:
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000045 fp = open(filename, rmode)
Tim Peters70c43782001-01-17 08:48:39 +000046 except IOError, msg:
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000047 sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg))
Tim Peters70c43782001-01-17 08:48:39 +000048 return 1
49 if fnfilter:
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000050 filename = fnfilter(filename)
51 sts = printsumfp(fp, filename, out)
Tim Peters70c43782001-01-17 08:48:39 +000052 fp.close()
53 return sts
Guido van Rossum07c96451994-10-03 16:45:35 +000054
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000055def printsumfp(fp, filename, out = sys.stdout):
Andrew M. Kuchlinga90a3b42002-04-17 21:53:21 +000056 m = md5.new()
Tim Peters70c43782001-01-17 08:48:39 +000057 try:
58 while 1:
59 data = fp.read(bufsize)
60 if not data: break
61 m.update(data)
62 except IOError, msg:
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000063 sys.stderr.write('%s: I/O error: %s\n' % (filename, msg))
Tim Peters70c43782001-01-17 08:48:39 +000064 return 1
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000065 out.write('%s %s\n' % (m.hexdigest(), filename))
Tim Peters70c43782001-01-17 08:48:39 +000066 return 0
Guido van Rossum07c96451994-10-03 16:45:35 +000067
Guido van Rossum07c96451994-10-03 16:45:35 +000068def main(args = sys.argv[1:], out = sys.stdout):
Tim Peters70c43782001-01-17 08:48:39 +000069 global fnfilter, rmode, bufsize
Tim Peters70c43782001-01-17 08:48:39 +000070 try:
71 opts, args = getopt.getopt(args, 'blts:')
72 except getopt.error, msg:
73 sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
74 return 2
75 for o, a in opts:
76 if o == '-l':
77 fnfilter = os.path.basename
78 if o == '-b':
79 rmode = 'rb'
80 if o == '-t':
81 rmode = 'r'
82 if o == '-s':
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000083 bufsize = int(a)
Andrew M. Kuchlingfb9653a2003-05-13 17:38:05 +000084 if not args:
85 args = ['-']
Tim Peters70c43782001-01-17 08:48:39 +000086 return sum(args, out)
Guido van Rossum07c96451994-10-03 16:45:35 +000087
88if __name__ == '__main__' or __name__ == sys.argv[0]:
Tim Peters70c43782001-01-17 08:48:39 +000089 sys.exit(main(sys.argv[1:], sys.stdout))