]> git.phdru.name Git - dotfiles.git/blob - bin/cmp.py
Initial import
[dotfiles.git] / bin / cmp.py
1 #! /usr/bin/env python
2 """cmp.py: compare two files. Replace cmp because standard cmp cannot compare
3 large files.
4 """
5
6 import sys, os
7
8 if sys.argv[1] in ("-h", "--help"):
9    print "Broytman cmp.py 1.0, Copyright (C) 2003 PhiloSoft Design"
10    print "Usage: cmp.py [-h|--help|-V|--version] [-i] file1 file2"
11    sys.exit()
12 elif sys.argv[1] in ("-V", "--version"):
13    print "Broytman cmp.py 1.0, Copyright (C) 2003 PhiloSoft Design"
14    sys.exit()
15 elif sys.argv[1] == "-i":
16    show_pbar = False
17    fname1 = sys.argv[2]
18    fname2 = sys.argv[3]
19 else:
20    show_pbar = sys.stderr.isatty()
21    fname1 = sys.argv[1]
22    fname2 = sys.argv[2]
23
24 if show_pbar:
25    try:
26       from m_lib.pbar.tty_pbar import ttyProgressBar
27    except ImportError:
28       show_pbar = 0
29
30 if show_pbar:
31    try:
32       size = os.path.getsize(fname1)
33    except:
34       print filename, ": no such file"
35       sys.exit(1)
36
37 if show_pbar:
38    pbar = ttyProgressBar(0, size)
39
40 file1 = open(fname1, 'rb')
41 file2 = open(fname2, 'rb')
42
43 M = 1024*1024
44 diff = False
45 count = 0
46
47
48 def report():
49    if show_pbar:
50       global pbar
51       del pbar
52    sys.stderr.write("Files differ at %d megabayte block\n" % count)
53    global diff
54    diff = True
55
56
57 while True:
58    block1 = file1.read(M)
59    block2 = file2.read(M)
60
61    if show_pbar:
62       pbar.display(file1.tell())
63
64    if block1 and block2:
65       if len(block1) <> len(block2):
66          report()
67          break
68    elif block1:
69       report()
70       break
71    elif block2:
72       report()
73       break
74    else:
75       break
76
77    if block1 <> block2:
78       report()
79       break
80
81    count += 1
82
83 if show_pbar and not diff:
84    del pbar
85
86 file1.close()
87 file2.close()
88
89 if diff:
90    sys.exit(1)