initial import
This commit is contained in:
commit
f2e836da0d
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# by Erik osheim
|
||||
import optparse, os
|
||||
|
||||
epilog = 'Remove various junky files left lying around.'
|
||||
patterns = ('*~', '.#*', '#*', '*.orig', '*-')
|
||||
|
||||
parser = optparse.OptionParser(epilog=epilog)
|
||||
parser.add_option('-f', '--fake', dest='fake', action='store_true',
|
||||
help="print files; do not remove them")
|
||||
opts, args = parser.parse_args()
|
||||
|
||||
stanzas = ' -o '.join(["-name '%s'" % x for x in patterns])
|
||||
cmd = "find . -type f \\( %s \\) -print" % stanzas
|
||||
|
||||
if opts.fake:
|
||||
print "files that would be deleted:"
|
||||
else:
|
||||
cmd += " -exec rm {} ';'";
|
||||
|
||||
os.system(cmd)
|
|
@ -0,0 +1,105 @@
|
|||
#!/usr/bin/python
|
||||
import optparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
# this is a dictionary of all the "items" (lines) that have been seen, mapping
|
||||
# to a count of how many times it was seen.
|
||||
seen = {}
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
parser.set_defaults(draw=False, nullok=False, valsort=False, reverse=False,
|
||||
hwidth=None, percent=False, strip=False, delim=' ',
|
||||
swap=False, josh=False, nopad=False)
|
||||
parser.add_option('-d', '--draw', action='store_true', dest='draw',
|
||||
help='draw histogram with horizontal graph')
|
||||
parser.add_option('-D', '--delim', action='store', type="string", dest='delim',
|
||||
help='use STR as delimiter (default: " ")', metavar='STR')
|
||||
parser.add_option('-f', '--frequency', action='store_true', dest='valsort',
|
||||
help='sort by frequency')
|
||||
parser.add_option('-J', '--josh', action='store_true', dest='josh',
|
||||
help='josh rosenberg compatibility mode')
|
||||
parser.add_option('-N', '--nopad', action='store_true', dest='nopad',
|
||||
help='do not column-align output')
|
||||
parser.add_option('-p', '--percent', action='store_true', dest='percent',
|
||||
help='show percent rather than count')
|
||||
parser.add_option('-r', '--reverse', action='store_true', dest='reverse',
|
||||
help='reverse sort')
|
||||
parser.add_option('-s', '--strip', action='store_true', dest='strip',
|
||||
help='strip input lines')
|
||||
parser.add_option('-S', '--swap', action='store_true', dest='swap',
|
||||
help='swap output fields')
|
||||
parser.add_option('-w', '--width', action='store', type='int', dest='hwidth',
|
||||
help='use NUM characters for graph drawing', metavar="NUM")
|
||||
parser.add_option('-z', '--null', action='store_true', dest='nullok',
|
||||
help='allow null lines')
|
||||
(opts, args) = parser.parse_args()
|
||||
|
||||
# allow some special delimiters to be translated
|
||||
delims = {'\\t': '\t', '\\v': '\v', '\\0': '\0'}
|
||||
opts.delim = delims.get(opts.delim, opts.delim)
|
||||
|
||||
# josh rosenberg compatiblity mode
|
||||
if opts.josh:
|
||||
opts.delim = '\t'
|
||||
opts.swap = True
|
||||
opts.nopad = True
|
||||
|
||||
# process each line on stdin. we can optionally strip whitespace, and we always
|
||||
# strip a trailing newline. by default we ignore empty lines, but nullok causes
|
||||
# us to count them as well.
|
||||
for line in sys.stdin:
|
||||
key = line[:-1]
|
||||
if opts.strip:
|
||||
key = key.strip()
|
||||
if key or opts.nullok:
|
||||
seen.setdefault(key, 0)
|
||||
seen[key] += 1
|
||||
|
||||
# sort either by key or by count, depending on the user wanted
|
||||
keys = seen.keys()
|
||||
if opts.valsort:
|
||||
cmpf = lambda a, b: cmp(seen[b], seen[a])
|
||||
else:
|
||||
cmpf = lambda a, b: cmp(a, b)
|
||||
keys.sort(cmpf)
|
||||
|
||||
# optionally reverse the sort if the user wanted
|
||||
if opts.reverse: keys.reverse()
|
||||
|
||||
# determine max key length, max count, and total count; also, the printed length
|
||||
# of the max count.
|
||||
kmax, cmax, total = 0, 0, 0
|
||||
for key in keys:
|
||||
cmax, kmax, total = max(seen[key], cmax), max(len(key), kmax), total + seen[key]
|
||||
smax = len(str(cmax))
|
||||
|
||||
# if we need to draw, we should make some guesses about the screen size. we
|
||||
# should probably never try to draw more than 40 characters worth of stars.
|
||||
width = os.environ.get("COLUMNS", 80)
|
||||
if opts.hwidth is None:
|
||||
opts.hwidth = min(abs(width - kmax), 40)
|
||||
|
||||
for key in keys:
|
||||
# figure out how to draw the key
|
||||
if opts.nopad:
|
||||
vkey = key
|
||||
else:
|
||||
vkey = '%-*s' % (kmax, key)
|
||||
|
||||
# figure out how to draw the value
|
||||
if opts.draw:
|
||||
ratio = float(seen[key]) / cmax
|
||||
nstar = int(round(opts.hwidth * ratio))
|
||||
value = '%*s' % (opts.hwidth, '*' * nstar)
|
||||
elif opts.percent:
|
||||
perc = float(seen[key]) * 100 / total
|
||||
value = '%5.1f%%' % perc
|
||||
else:
|
||||
value = '%*d' % (smax, seen[key])
|
||||
|
||||
# figure out which order to write them in
|
||||
if opts.swap:
|
||||
print "%s%s%s" % (vkey, opts.delim, value)
|
||||
else:
|
||||
print "%s%s%s" % (value, opts.delim, key)
|
|
@ -0,0 +1,83 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# by Erik Osheim
|
||||
#
|
||||
# available under the GNU GPL version 2.
|
||||
#
|
||||
# This program is designed to provide analysis of patches or diff files.
|
||||
|
||||
import optparse
|
||||
import re
|
||||
import sys
|
||||
|
||||
# matches the diff stanza, which have no leading identifier
|
||||
diff_re = re.compile('^[0-9a-zA-Z,]+$')
|
||||
|
||||
# analyze a particular patch, which is assumed to contain multiple files
|
||||
def info(f, verbose=False):
|
||||
paths = []
|
||||
l = 0
|
||||
first = True
|
||||
for line in f:
|
||||
if first:
|
||||
if diff_re.match(line):
|
||||
paths.append(['-', 0, 0, 0, 0])
|
||||
first = False
|
||||
|
||||
if diff_re.match(line):
|
||||
if not paths:
|
||||
paths.append(['-', 0, 0, 0, 0])
|
||||
paths[-1][1] += 1
|
||||
elif line.startswith('diff'):
|
||||
path = line.split()[-1]
|
||||
l = max(l, len(path))
|
||||
paths.append([path, 0, 0, 0, 0])
|
||||
elif line.startswith('Index'):
|
||||
path = line.split()[1]
|
||||
l = max(l, len(path))
|
||||
paths.append([path, 0, 0, 0, 0])
|
||||
elif line.startswith('---') or line.startswith('+++') or line.startswith('='):
|
||||
pass
|
||||
elif line.startswith('@@'):
|
||||
paths[-1][1] += 1
|
||||
elif line.startswith('+') or line.startswith('>'):
|
||||
paths[-1][2] += 1
|
||||
paths[-1][3] += 1
|
||||
elif line.startswith('-') or line.startswith('<'):
|
||||
paths[-1][2] -= 1
|
||||
paths[-1][4] += 1
|
||||
|
||||
if len(paths) != 1:
|
||||
title = '%d paths' % len(paths)
|
||||
else:
|
||||
title = '1 path'
|
||||
|
||||
if verbose:
|
||||
title = 'TOTAL ' + title
|
||||
else:
|
||||
l = len(title)
|
||||
|
||||
totals = [0, 0, 0, 0]
|
||||
for info in paths:
|
||||
for i in range(0, 4):
|
||||
totals[i] += info[i + 1]
|
||||
|
||||
lens = [len(str(n)) + 1 for n in totals[:2]]
|
||||
fmt = '%%-%ds %%%dd groups, %%+%dd lines (+%%d -%%d)' % tuple([l] + lens)
|
||||
for info in paths:
|
||||
if verbose:
|
||||
print fmt % tuple(info)
|
||||
|
||||
print fmt % tuple([title] + totals)
|
||||
|
||||
if __name__ == "__main__":
|
||||
op = optparse.OptionParser()
|
||||
op.add_option('-v', '--verbose', dest='verbose', action='store_true')
|
||||
|
||||
opts, args = op.parse_args()
|
||||
|
||||
if args:
|
||||
for arg in args:
|
||||
info(open(arg, 'r'), verbose=opts.verbose)
|
||||
else:
|
||||
info(sys.stdin, verbose=opts.verbose)
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
grep --binary-files=without-match \
|
||||
--exclude-dir=CVS \
|
||||
--exclude-dir=.svn \
|
||||
--exclude-dir=.hg \
|
||||
--exclude-dir=.git \
|
||||
--exclude '*~' \
|
||||
--exclude '.#*' \
|
||||
--exclude '#*' \
|
||||
--exclude '*-' \
|
||||
"$@"
|
|
@ -0,0 +1,78 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# by Erik Osheim
|
||||
#
|
||||
# This program unboxes various archive
|
||||
|
||||
import os
|
||||
import shutil
|
||||
from subprocess import call
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
# list each kind of archive in terms of extension, and then program and
|
||||
# arguments to use. Use None to indicate where the filename should be placed.
|
||||
handlers = {
|
||||
'.zip': ['unzip', None],
|
||||
'.tgz': ['tar', 'xvzf', None],
|
||||
'.tbz': ['tar', 'xvjf', None],
|
||||
'.tar.gz': ['tar', 'xvzf', None],
|
||||
'.tar.bz2': ['tar', 'xvjf', None],
|
||||
#'.tar.xz': ['tar', 'xvJz', None],
|
||||
}
|
||||
|
||||
# program usage
|
||||
def usage(err=None):
|
||||
retval = 0
|
||||
if err:
|
||||
retval = 1
|
||||
print 'error: %s' % err
|
||||
print 'usage: unbox ARCHIVE'
|
||||
sys.exit(retval)
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = sys.argv[1:]
|
||||
if not args:
|
||||
usage()
|
||||
elif len(args) > 1:
|
||||
usage('too many arguments')
|
||||
path = args[0]
|
||||
if not os.path.exists(path):
|
||||
usage('path %r does not exist' % path)
|
||||
|
||||
cmd = None
|
||||
for ext in handlers:
|
||||
if path.endswith(ext):
|
||||
cmd = handlers[ext]
|
||||
base = path[:-len(ext)]
|
||||
if not cmd:
|
||||
usage("can't handle path %r" % path)
|
||||
|
||||
d = tempfile.mkdtemp(prefix='unbox-')
|
||||
|
||||
fd, path2 = tempfile.mkstemp(dir=d)
|
||||
os.write(fd, open(path, 'rb').read())
|
||||
os.close(fd)
|
||||
|
||||
cwd = os.getcwd()
|
||||
print d
|
||||
os.chdir(d)
|
||||
|
||||
base2 = os.path.basename(path2)
|
||||
|
||||
# put the path into the command
|
||||
cmd = [x or base2 for x in cmd]
|
||||
|
||||
retcode = call(cmd)
|
||||
if retcode != 0:
|
||||
print 'error: %s failed (%d)' % (cmd[0], retcode)
|
||||
sys.exit(1)
|
||||
|
||||
os.unlink(path2)
|
||||
|
||||
items = os.listdir(d)
|
||||
if len(items) == 1:
|
||||
shutil.move(d + '/' + items[0], cwd)
|
||||
shutil.rmtree(d)
|
||||
else:
|
||||
shutil.move(d, cwd + '/' + base)
|
Loading…
Reference in New Issue