| #!/usr/bin/env python |
| # -*- Python -*- |
| """Transform find-fix.py output into Excellable csv.""" |
| |
| __date__ = "Time-stamp: <2003-10-16 13:26:27 jrepenning>"[13:30] |
| __author__ = "Jack Repenning <jrepenning@collab.net>" |
| |
| import getopt |
| try: |
| my_getopt = getopt.gnu_getopt |
| except AttributeError: |
| my_getopt = getopt.getopt |
| import inspect |
| import os |
| import os.path |
| import pydoc |
| import re |
| import shutil |
| import string |
| import sys |
| import time |
| |
| # Long options and their usage strings; "=" means it takes an argument. |
| # To get a list suitable for getopt, just do |
| # |
| # [x[0] for x in long_opts] |
| # |
| # Make sure to sacrifice a lamb to Guido for each element of the list. |
| long_opts = [ |
| ["doc", """Optional, print pydocs."""], |
| ["help", """Optional, print usage (this text)."""], |
| ["verbose", """Optional, print more progress messages."""], |
| ] |
| |
| help = 0 |
| verbose = 0 |
| me = os.path.basename(sys.argv[0]) |
| |
| DATA_FILE = "http://subversion.tigris.org/iz-data/query-set-1.tsv" |
| |
| def main(): |
| """Run find-fix.py with arguments du jour for drawing pretty |
| manager-speak pictures.""" |
| |
| global verbose |
| |
| try: |
| opts, args = my_getopt(sys.argv[1:], "", [x[0] for x in long_opts]) |
| except getopt.GetoptError, e: |
| print "Error: ", e.msg |
| shortusage() |
| print me + " --help for options." |
| sys.exit(1) |
| |
| for opt, arg in opts: |
| if opt == "--help": |
| usage() |
| sys.exit(0) |
| elif opt == "--verbose": |
| verbose = 1 |
| elif opt == "--doc": |
| pydoc.doc(pydoc.importfile(sys.argv[0])) |
| sys.exit(0) |
| |
| # do something fruitful with your life |
| if len(args) == 0: |
| args = ["query-set-1.tsv", "core-history.csv"] |
| print ("ff2csv %s %s" % args) |
| |
| if len(args) != 2: |
| print "%s: Wrong number of args." % me |
| shortusage() |
| sys.exit(1) |
| |
| if os.system("curl " + DATA_FILE + "> " + args[0]): |
| os.system("wget " + DATA_FILE) |
| |
| outfile = file(args[1], "w") |
| outfile.write("Date,found,fixed,inval,dup,other,remain\n") |
| |
| totalsre = re.compile("totals:.*found= +([0-9]+) +" |
| "fixed= +([0-9]+) +" |
| "inval= +([0-9]+) +" |
| "dup= +([0-9]+) +" |
| "other= +([0-9]+) +" |
| "remain= *([0-9]+)") |
| for year in ("2001", "2002", "2003", "2004"): |
| for month in ("01", "02", "03", "04", "05", "06", "07", "08", |
| "09", "10", "11", "12"): |
| for dayrange in (("01", "08"), |
| ("08", "15"), |
| ("15", "22"), |
| ("22", "28")): |
| if verbose: |
| print "searching %s-%s-%s to %s" % (year, |
| month, |
| dayrange[0], |
| dayrange[1]) |
| ffpy = os.popen("python ./find-fix.py --m=beta " |
| "%s %s-%s-%s %s-%s-%s" |
| % (args[0], |
| year, month, dayrange[0], |
| year, month, dayrange[1])) |
| if verbose: |
| print "ffpy: ", ffpy |
| |
| line = ffpy.readline() |
| if verbose: |
| print "initial line is: ", line |
| matches = totalsre.search(line) |
| if verbose: |
| print "initial match is: ", matches |
| while line and not matches: |
| line = ffpy.readline() |
| if verbose: |
| print "%s: read line '%s'" % (me, line) |
| matches = totalsre.search(line) |
| if verbose: |
| print "subsequent line is: ", line |
| |
| ffpy.close() |
| |
| if verbose: |
| print "line is ", line |
| |
| if matches.group(1) != "0" \ |
| or matches.group(2) != "0" \ |
| or matches.group(3) != "0" \ |
| or matches.group(4) != "0" \ |
| or matches.group(5) != "0": |
| |
| outfile.write("%s-%s-%s,%s,%s,%s,%s,%s,%s\n" |
| % (year, month, dayrange[1], |
| matches.group(1), |
| matches.group(2), |
| matches.group(3), |
| matches.group(4), |
| matches.group(5), |
| matches.group(6), |
| )) |
| elif matches.group(6) != "0": |
| # quit at first nothing-done week |
| # allows slop in loop controls |
| break |
| outfile.close() |
| |
| |
| def shortusage(): |
| "Print one-line usage summary." |
| print "%s - %s" % (me, pydoc.synopsis(sys.argv[0])) |
| |
| def usage(): |
| "Print multi-line usage tome." |
| shortusage() |
| print '''%s [opts] [queryfile [outfile]] |
| Option keywords may be abbreviated to any unique prefix. |
| Option order is not important. |
| Most options require "=xxx" arguments:''' % me |
| for x in long_opts: |
| padding_limit = 18 |
| if x[0][-1:] == '=': |
| print " --" + x[0][:-1], |
| padding_limit = 19 |
| else: |
| print " --" + x[0], |
| print (' ' * (padding_limit - len(x[0]))), x[1] |
| |
| if __name__ == "__main__": |
| main() |