/Tools/scripts/md5sum.py

http://unladen-swallow.googlecode.com/ · Python · 90 lines · 77 code · 10 blank · 3 comment · 30 complexity · ba4771beba5ab87b26fd549c5a7329ee MD5 · raw file

  1. #! /usr/bin/env python
  2. """Python utility to print MD5 checksums of argument files.
  3. """
  4. bufsize = 8096
  5. fnfilter = None
  6. rmode = 'rb'
  7. usage = """
  8. usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...]
  9. -b : read files in binary mode (default)
  10. -t : read files in text mode (you almost certainly don't want this!)
  11. -l : print last pathname component only
  12. -s bufsize: read buffer size (default %d)
  13. file ... : files to sum; '-' or no files means stdin
  14. """ % bufsize
  15. import sys
  16. import os
  17. import getopt
  18. import md5
  19. def sum(*files):
  20. sts = 0
  21. if files and isinstance(files[-1], file):
  22. out, files = files[-1], files[:-1]
  23. else:
  24. out = sys.stdout
  25. if len(files) == 1 and not isinstance(files[0], str):
  26. files = files[0]
  27. for f in files:
  28. if isinstance(f, str):
  29. if f == '-':
  30. sts = printsumfp(sys.stdin, '<stdin>', out) or sts
  31. else:
  32. sts = printsum(f, out) or sts
  33. else:
  34. sts = sum(f, out) or sts
  35. return sts
  36. def printsum(filename, out=sys.stdout):
  37. try:
  38. fp = open(filename, rmode)
  39. except IOError, msg:
  40. sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg))
  41. return 1
  42. if fnfilter:
  43. filename = fnfilter(filename)
  44. sts = printsumfp(fp, filename, out)
  45. fp.close()
  46. return sts
  47. def printsumfp(fp, filename, out=sys.stdout):
  48. m = md5.new()
  49. try:
  50. while 1:
  51. data = fp.read(bufsize)
  52. if not data:
  53. break
  54. m.update(data)
  55. except IOError, msg:
  56. sys.stderr.write('%s: I/O error: %s\n' % (filename, msg))
  57. return 1
  58. out.write('%s %s\n' % (m.hexdigest(), filename))
  59. return 0
  60. def main(args = sys.argv[1:], out=sys.stdout):
  61. global fnfilter, rmode, bufsize
  62. try:
  63. opts, args = getopt.getopt(args, 'blts:')
  64. except getopt.error, msg:
  65. sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
  66. return 2
  67. for o, a in opts:
  68. if o == '-l':
  69. fnfilter = os.path.basename
  70. elif o == '-b':
  71. rmode = 'rb'
  72. elif o == '-t':
  73. rmode = 'r'
  74. elif o == '-s':
  75. bufsize = int(a)
  76. if not args:
  77. args = ['-']
  78. return sum(args, out)
  79. if __name__ == '__main__' or __name__ == sys.argv[0]:
  80. sys.exit(main(sys.argv[1:], sys.stdout))