##// END OF EJS Templates
tests: remove unused import from 'f' utility...
Yuya Nishihara -
r29230:b68af177 default
parent child Browse files
Show More
@@ -1,165 +1,164 b''
1 1 #!/usr/bin/env python
2 2
3 3 """
4 4 Utility for inspecting files in various ways.
5 5
6 6 This tool is like the collection of tools found in a unix environment but are
7 7 cross platform and stable and suitable for our needs in the test suite.
8 8
9 9 This can be used instead of tools like:
10 10 [
11 11 dd
12 12 find
13 13 head
14 14 hexdump
15 15 ls
16 16 md5sum
17 17 readlink
18 18 sha1sum
19 19 stat
20 20 tail
21 21 test
22 22 readlink.py
23 23 md5sum.py
24 24 """
25 25
26 26 from __future__ import absolute_import
27 27
28 import errno
29 28 import glob
30 29 import optparse
31 30 import os
32 31 import re
33 32 import sys
34 33
35 34 def visit(opts, filenames, outfile):
36 35 """Process filenames in the way specified in opts, writing output to
37 36 outfile."""
38 37 for f in sorted(filenames):
39 38 isstdin = f == '-'
40 39 if not isstdin and not os.path.lexists(f):
41 40 outfile.write('%s: file not found\n' % f)
42 41 continue
43 42 quiet = opts.quiet and not opts.recurse or isstdin
44 43 isdir = os.path.isdir(f)
45 44 islink = os.path.islink(f)
46 45 isfile = os.path.isfile(f) and not islink
47 46 dirfiles = None
48 47 content = None
49 48 facts = []
50 49 if isfile:
51 50 if opts.type:
52 51 facts.append('file')
53 52 if opts.hexdump or opts.dump or opts.md5:
54 53 content = file(f, 'rb').read()
55 54 elif islink:
56 55 if opts.type:
57 56 facts.append('link')
58 57 content = os.readlink(f)
59 58 elif isstdin:
60 59 content = sys.stdin.read()
61 60 if opts.size:
62 61 facts.append('size=%s' % len(content))
63 62 elif isdir:
64 63 if opts.recurse or opts.type:
65 64 dirfiles = glob.glob(f + '/*')
66 65 facts.append('directory with %s files' % len(dirfiles))
67 66 elif opts.type:
68 67 facts.append('type unknown')
69 68 if not isstdin:
70 69 stat = os.lstat(f)
71 70 if opts.size and not isdir:
72 71 facts.append('size=%s' % stat.st_size)
73 72 if opts.mode and not islink:
74 73 facts.append('mode=%o' % (stat.st_mode & 0o777))
75 74 if opts.links:
76 75 facts.append('links=%s' % stat.st_nlink)
77 76 if opts.newer:
78 77 # mtime might be in whole seconds so newer file might be same
79 78 if stat.st_mtime >= os.stat(opts.newer).st_mtime:
80 79 facts.append('newer than %s' % opts.newer)
81 80 else:
82 81 facts.append('older than %s' % opts.newer)
83 82 if opts.md5 and content is not None:
84 83 try:
85 84 from hashlib import md5
86 85 except ImportError:
87 86 from md5 import md5
88 87 facts.append('md5=%s' % md5(content).hexdigest()[:opts.bytes])
89 88 if opts.sha1 and content is not None:
90 89 try:
91 90 from hashlib import sha1
92 91 except ImportError:
93 92 from sha import sha as sha1
94 93 facts.append('sha1=%s' % sha1(content).hexdigest()[:opts.bytes])
95 94 if isstdin:
96 95 outfile.write(', '.join(facts) + '\n')
97 96 elif facts:
98 97 outfile.write('%s: %s\n' % (f, ', '.join(facts)))
99 98 elif not quiet:
100 99 outfile.write('%s:\n' % f)
101 100 if content is not None:
102 101 chunk = content
103 102 if not islink:
104 103 if opts.lines:
105 104 if opts.lines >= 0:
106 105 chunk = ''.join(chunk.splitlines(True)[:opts.lines])
107 106 else:
108 107 chunk = ''.join(chunk.splitlines(True)[opts.lines:])
109 108 if opts.bytes:
110 109 if opts.bytes >= 0:
111 110 chunk = chunk[:opts.bytes]
112 111 else:
113 112 chunk = chunk[opts.bytes:]
114 113 if opts.hexdump:
115 114 for i in range(0, len(chunk), 16):
116 115 s = chunk[i:i + 16]
117 116 outfile.write('%04x: %-47s |%s|\n' %
118 117 (i, ' '.join('%02x' % ord(c) for c in s),
119 118 re.sub('[^ -~]', '.', s)))
120 119 if opts.dump:
121 120 if not quiet:
122 121 outfile.write('>>>\n')
123 122 outfile.write(chunk)
124 123 if not quiet:
125 124 if chunk.endswith('\n'):
126 125 outfile.write('<<<\n')
127 126 else:
128 127 outfile.write('\n<<< no trailing newline\n')
129 128 if opts.recurse and dirfiles:
130 129 assert not isstdin
131 130 visit(opts, dirfiles, outfile)
132 131
133 132 if __name__ == "__main__":
134 133 parser = optparse.OptionParser("%prog [options] [filenames]")
135 134 parser.add_option("-t", "--type", action="store_true",
136 135 help="show file type (file or directory)")
137 136 parser.add_option("-m", "--mode", action="store_true",
138 137 help="show file mode")
139 138 parser.add_option("-l", "--links", action="store_true",
140 139 help="show number of links")
141 140 parser.add_option("-s", "--size", action="store_true",
142 141 help="show size of file")
143 142 parser.add_option("-n", "--newer", action="store",
144 143 help="check if file is newer (or same)")
145 144 parser.add_option("-r", "--recurse", action="store_true",
146 145 help="recurse into directories")
147 146 parser.add_option("-S", "--sha1", action="store_true",
148 147 help="show sha1 hash of the content")
149 148 parser.add_option("-M", "--md5", action="store_true",
150 149 help="show md5 hash of the content")
151 150 parser.add_option("-D", "--dump", action="store_true",
152 151 help="dump file content")
153 152 parser.add_option("-H", "--hexdump", action="store_true",
154 153 help="hexdump file content")
155 154 parser.add_option("-B", "--bytes", type="int",
156 155 help="number of characters to dump")
157 156 parser.add_option("-L", "--lines", type="int",
158 157 help="number of lines to dump")
159 158 parser.add_option("-q", "--quiet", action="store_true",
160 159 help="no default output")
161 160 (opts, filenames) = parser.parse_args(sys.argv[1:])
162 161 if not filenames:
163 162 filenames = ['-']
164 163
165 164 visit(opts, filenames, sys.stdout)
General Comments 0
You need to be logged in to leave comments. Login now