]> git.phdru.name Git - ppu.git/blob - scripts/cmp.py
Feat(cmp): Add option -s --silent --quiet
[ppu.git] / scripts / cmp.py
1 #! /usr/bin/env python
2 """cmp.py: compare two files. Portable replacement for cmp."""
3
4 import argparse
5 import os
6 import sys
7
8
9 def report(silent):
10     if show_pbar:
11         global pbar
12         del pbar
13     if not silent:
14         sys.stderr.write("Files differ at %d megabayte block\n" % count)
15     global diff
16     diff = True
17
18
19 if __name__ == '__main__':
20     parser = argparse.ArgumentParser(description='Remove old files')
21     parser.add_argument('-i', '--inhibit-progress-bar', action='store_true',
22                         help='inhibit progress bar')
23     parser.add_argument('-s', '--silent', '--quiet', action='store_true',
24                         help='be silent (implied -i)')
25     parser.add_argument('fname1', help='the first file name')
26     parser.add_argument('fname2', help='the second file name')
27     args = parser.parse_args()
28
29     show_pbar = not args.inhibit_progress_bar and not args.silent \
30         and sys.stderr.isatty()
31
32     if show_pbar:
33         try:
34             from m_lib.pbar.tty_pbar import ttyProgressBar
35         except ImportError:
36             show_pbar = False
37
38     if show_pbar:
39         try:
40             size = os.path.getsize(args.fname1)
41         except Exception:
42             print(args.fname1, ": no such file")
43             sys.exit(1)
44
45     if show_pbar:
46         pbar = ttyProgressBar(0, size)
47
48     file1 = open(args.fname1, 'rb')
49     file2 = open(args.fname2, 'rb')
50
51     M = 1024*1024
52     diff = False
53     count = 0
54
55     while True:
56         block1 = file1.read(M)
57         block2 = file2.read(M)
58
59         if show_pbar:
60             pbar.display(file1.tell())
61
62         if block1 and block2:
63             if len(block1) != len(block2):
64                 report(args.silent)
65                 break
66         elif block1:
67             report(args.silent)
68             break
69         elif block2:
70             report(args.silent)
71             break
72         else:
73             break
74
75         if block1 != block2:
76             report(args.silent)
77             break
78
79         count += 1
80
81     if show_pbar and not diff:
82         del pbar
83
84     file1.close()
85     file2.close()
86
87     if diff:
88         sys.exit(1)