diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools.py @@ -35,16 +35,42 @@ class ReindentTests(unittest.TestCase): assert_python_ok(self.script) def test_help(self): rc, out, err = assert_python_ok(self.script, '-h') self.assertEqual(out, b'') self.assertGreater(err, b'') +class Md5sumTests(unittest.TestCase): + script = os.path.join(scriptsdir, 'md5sum.py') + + def test_md5sum(self): + rc, out, err = assert_python_ok(self.script, self.script) + self.assertEqual(rc, 0) + self.assertIn(self.script.encode('ascii'), out) + self.assertEqual(err, b'') + + def test_md5sum_multiple_files(self): + rc, out, err = assert_python_ok(self.script, self.script, + ReindentTests.script) + self.assertEqual(rc, 0) + self.assertEqual(len(out.splitlines()), 2) + self.assertIn(self.script.encode('ascii'), out) + self.assertIn(ReindentTests.script.encode('ascii'), out) + self.assertEqual(err, b'') + + def test_md5sum_l_option(self): + rc, out, err = assert_python_ok(self.script, '-l', self.script) + self.assertEqual(rc, 0) + self.assertNotIn(self.script.encode('ascii'), out) + self.assertIn(os.path.basename(self.script).encode('ascii'), out) + self.assertEqual(err, b'') + + class PindentTests(unittest.TestCase): script = os.path.join(scriptsdir, 'pindent.py') def assertFileEqual(self, fn1, fn2): with open(fn1) as f1, open(fn2) as f2: self.assertEqual(f1.readlines(), f2.readlines()) def pindent(self, source, *args): diff --git a/Tools/scripts/md5sum.py b/Tools/scripts/md5sum.py --- a/Tools/scripts/md5sum.py +++ b/Tools/scripts/md5sum.py @@ -12,24 +12,25 @@ usage = """ usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...] -b : read files in binary mode (default) -t : read files in text mode (you almost certainly don't want this!) -l : print last pathname component only -s bufsize: read buffer size (default %d) file ... : files to sum; '-' or no files means stdin """ % bufsize +import io import sys import os import getopt from hashlib import md5 def sum(*files): sts = 0 - if files and isinstance(files[-1], file): + if files and isinstance(files[-1], io.IOBase): out, files = files[-1], files[:-1] else: out = sys.stdout if len(files) == 1 and not isinstance(files[0], str): files = files[0] for f in files: if isinstance(f, str): if f == '-': @@ -48,17 +49,17 @@ def printsum(filename, out=sys.stdout): return 1 if fnfilter: filename = fnfilter(filename) sts = printsumfp(fp, filename, out) fp.close() return sts def printsumfp(fp, filename, out=sys.stdout): - m = md5.new() + m = md5() try: while 1: data = fp.read(bufsize) if not data: break m.update(data) except IOError as msg: sys.stderr.write('%s: I/O error: %s\n' % (filename, msg))