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