# HG changeset patch # User David A. Holland # Date 1407894908 14400 # Node ID 73e6dac2939140a157bbf0fbfd74b0de51d2caa7 # Parent 233dcc4d80e158eb036a98e0a61619f93ce67438 new stuff (checkpoint when moved between machines) diff -r 233dcc4d80e1 -r 73e6dac29391 shelltools/query-pr/query.py --- a/shelltools/query-pr/query.py Mon Jun 16 01:27:54 2014 -0400 +++ b/shelltools/query-pr/query.py Tue Aug 12 21:55:08 2014 -0400 @@ -51,9 +51,6 @@ # end querydb ############################################################ -# - -############################################################ # query class for searches class Query: @@ -112,167 +109,6 @@ # end daterange_constraint ############################################################ -# arg handling - -def getargs(classification_schemes, classification_schemetypes): - global outmaterial - global outformat - - p = argparse.ArgumentParser(program_description) - - # note: -h/--help is built in by default - p.add_argument("-v", "--version", - action='version' version=program_version, - help="Print program version and exit") - - p.add_argument("--short", - action='store_const', const="short", - dest='outmaterial', - help="Output in short form (one per line)") - p.add_argument("--headers", - action='store_const', const="headers", - dest='outmaterial', - help="Output in default form (headers only)") - p.add_argument("--full", - action='store_const', const="full", - dest='outmaterial', - help="Output in full form (all material)") - p.add_argument("--attach", nargs=1, - type=int, - action='store', - dest='attach', - help="Output specified attachment") - p.add_argument("--message", nargs=1, - type=int, - action='store', - dest='message', - help="Output specified message") - - p.add_argument("--text", - action='store_const', const="text", - dest='outformat', - help="Output as text (default)") - p.add_argument("--csv", - action='store_const', const="csv", - dest='outformat', - help="Output as comma-separated values") - p.add_argument("--xml", - action='store_const', const="xml", - dest='outformat', - help="Output as XML") - p.add_argument("--json", - action='store_const', const="json", - dest='outformat', - help="Output as JSON") - p.add_argument("--rdf", - action='store_const', const="rdf", - dest='outformat', - help="Output as RDF") - p.add_argument("--rdflike", - action='store_const', const="rdflike", - dest='outformat', - help="Output as RDF-like text") - - p.add_argument("--closed", - action='store_true', - dest='closed', default=False, - help="Search closed PRs as well as open") - p.add_argument("--public", - action='store_true', - dest='public', default=False, - help="Search only public information") - - p.add_argument("--number", nargs=1, - type=intrange, - dest='number', - help="Restrict search to a range of PRs by number") - p.add_argument("--synopsis", nargs=1, - dest='synopsis', - help="Search PRs by their synopsis field") - p.add_argument("--confidential", nargs=1, - type=yesno, choices=["yes", "no"], - dest='confidential', - help="Search PRs by their confidentiality setting") - p.add_argument("--state", nargs=1, - dest='state', - help="Search PRs by their state") - p.add_argument("--locked", nargs=1, - type=yesno, choices=["yes", "no"], - dest='locked', - help="Search PRs by their locked setting") - p.add_argument("--arrival-schemaversion", nargs=1, - type=intrange, - dest='arrival_schemaversion', - help="Search PRs by their original schema version") - p.add_argument("--arrival-date", nargs=1, - type=daterange, - dest='arrival_date', - help="Search PRs by arrival date") - p.add_argument("--closed-date", nargs=1, - type=daterange, - dest='closed_date', - help="Search PRs by the date they were closed") - p.add_argument("--last-modified", nargs=1, - type=daterange, - dest='last_modified', - help="Search PRs by the date they were last modified") - p.add_argument("--release", nargs=1, - dest='release', - help="Search PRs by their release information") - p.add_argument("--environment", nargs=1, - dest='environment', - help="Search PRs by their environment information") - - p.add_argument("--originator-name", nargs=1, - dest='originator_name', - help="Search PRs by the name of their originator") - p.add_argument("--originator-email", nargs=1, - dest='originator_email', - help="Search PRs by the email of their originator") - p.add_argument("--originator-id", nargs=1, - type=intrange, - dest='originator_id', - help="Search PRs by the database ID of their originator") - - - p.add_argument("--responsible", nargs=1, - dest='responsible', - help="Search PRs by who's responsible for them") - p.add_argument("--respondent", nargs=1, - dest='respondent', - help="Search PRs by who's a respondent") - p.add_argument("--subscribed", nargs=1, - dest='subscribed', - help="Search PRs by who's subscribed") - - p.add_argument("--messages", nargs=1, - dest='messages', - help="Search PRs by text in the message log") - p.add_argument("--adminlog", nargs=1, - dest='adminlog', - help="Search PRs by text in the administrative log") - p.add_argument("--anytext", nargs=1, - dest='anytext', - help="Search PRs by text in various fields") - - for scheme in classification_schemes: - p.add_argument("--%s" % scheme, nargs=1, - dest=scheme, - help="Search PRs by the %s classification scheme" % - scheme) - - p.add_argument("prs", nargs='*', metavar="PR", - type=int, - action='append', - dest='prs', - help="Specific PRs to retrieve by number") - - args = p.parse_args() - - if args.outmaterial is not None: - outmaterial = args.outmaterial - if args.outformat is not None: - outformat = args.outformat # If we're doing something other than a search, do it now if args.attach is not None: @@ -431,12 +267,235 @@ querytexts = [q.textify() for q in queries] return "INTERSECT\n".join(querytexts) + + +############################################################ +# arg handling + +class Invocation: + class Op: + # operation codes + OP_FIELDS = 1 + OP_SHOW = 2 + OP_RANGE = 3 + OP_SEARCH = 4 + + def __init__(self, op): + self.op = op + + def dofields(): + return Op(OP_FIELDS) + def doshow(field): + self = Op(OP_SHOW) + self.field = field + return self + def dorange(field): + self = Op(OP_RANGE) + self.field = field + return self + def doquery( + + + # output formats + FMT_TXT = 1 + + def __init__(self): + self.op = OP_SEARCH + self.searchstrings = [] + self.searchsql = [] + +# end Invocation + +def getargs(): + p = argparse.ArgumentParser(program_description) + + # note: -h/--help is built in by default + p.add_argument("-v", "--version", + action='version', version=program_version, + help="Print program version and exit") + + p.add_argument("--show", nargs=1, + action = 'store', dest='show', + help="Show description of field") + p.add_argument("--range", nargs=1, + action = 'store', dest='range', + help="Show range of extant values for field") + + p.add_argument("--search", nargs=1, + action = 'store', dest='search', + help="Force string to be read as a search string") + p.add_argument("-s", "--sql", nargs=1, + action = 'store', dest='sql', + help="Supply explicit sql query as search") + + p.add_argument("--open", + action = 'store_const', const="True", + dest = 'openonly', + help="Exclude closed PRs (default)") + p.add_argument("--closed", + action = 'store_const', const="False", + dest = 'openonly', + help="Include closed PRs in search") + p.add_argument("--public", + action = 'store_const', const="True", + dest = 'publiconly', + help="Exclude confidential PRs") + p.add_argument("--privileged", + action = 'store_const', const="False", + dest = 'publiconly', + help="Allow confidential PRs (default)") + + p.add_argument("--oldest", + action = 'store_const', const="OLDEST", + dest = 'order', + help="Sort output with oldest PRs first") + p.add_argument("--newest", + action = 'store_const', const="NEWEST", + dest = 'order', + help="Sort output with newest PRs first") + p.add_argument("--staleness", + action = 'store_const', const="STALENESS", + dest = 'order', + help="Sort output by time since last modification") + p.add_argument("--orderby", nargs=1, + action = 'store', dest = 'orderfield', + help="Sort output by specific field") + p.add_argument("--revorderby", nargs=1, + action = 'store', dest = 'revorderfield', + help="Sort output by specific field, reversed") + + p.add_argument("-m", "--message", nargs=1, + action = 'store', dest = 'message', + help="Print selected message (single PR only)") + p.add_argument("-a", "--attachment", nargs=1, + action = 'store', dest = 'attachment', + help="Print selected attachment (single PR only)") + + p.add_argument("-r", "--raw", + action = 'store_const', const="RAW", + dest = 'output', + help="Print exactly what the database returns") + p.add_argument("-l", "--list", + action = 'store_const', const="LIST", + dest = 'output', + help="Print in list form (default)") + p.add_argument("--headers", + action = 'store_const', const="HEADERS", + dest = 'output', + help="Print header information only") + p.add_argument("--meta", + action = 'store_const', const="META", + dest = 'output', + help="Print all metadata") + p.add_argument("--metadata", + action = 'store_const', const="META", + dest = 'output') + p.add_argument("-f", "--full", + action = 'store_const', const="FULL", + dest = 'output', + help="Print everything") + + p.add_argument("--text", + action = 'store_const', const="TEXT", + dest = 'outformat', + help="Print in text format (default)") + p.add_argument("--csv", + action = 'store_const', const="CSV", + dest = 'outformat', + help="Print a CSV file") + p.add_argument("--xml", + action = 'store_const', const="XML", + dest = 'outformat', + help="Print in XML") + p.add_argument("--json", + action = 'store_const', const="JSON", + dest = 'outformat', + help="Print in JSON") + p.add_argument("--rdf", + action = 'store_const', const="RDF", + dest = 'outbformat', + help="Print in RDF") + p.add_argument("--rdflike", + action = 'store_const', const="RDFLIKE", + dest = 'outformat', + help="Print RDF-like text") + + args = p.parse_args() + + p = Invocation() + + if args.show is not None: + do_showfield(args.show) + exit(0) + if args.range is not None: + do_fieldrange(args.range) + exit(0) + + searchstring = args.search + explicitsql = args.sql + + openonly = args.openonly + if openonly is None: + openonly = True + publiconly = args.publiconly + if publiconly is None: + publiconly = False + + if args.orderfield is not None: + orderby = args.orderfield + orderrev = False + elif args.revorderfield is not None: + orderby = args.revorderfield + orderrev = True + elif args.order == "OLDEST": + orderby = "number" + orderrev = False + elif args.order == "NEWEST": + orderby = "number" + orderrev = True + elif args.order == "STALENESS": + orderby = "last-modified" + orderrev = True + else: + orderby = "number" + orderrev = False + + if args.message is not None: + printwhat = "MESSAGE" + printwhich = args.message + elif args.attachment is not None: + printwhat = "ATTACHMENT" + printwhich = args.attachment + else: + printwhat = "PR" + printwhich = None + + output = args.output + if output is None: + output = "LIST" + + outformat = args.outformat + if outformat is None: + outformat = "TEXT" + + query = buildquery(searchstring, explicitsql, + orderby=orderby, orderrev=orderrev, + openonly=openonly, publiconly=publiconly) + if printwhat == "PR": + printer = buildprinter(output, outformat) + else if printwhat == "MESSAGE": + printer = getmessage(printwhich) + else if printwhat == "ATTACHMENT": + printer = getattachment(printwhich) + + return (query, printer) # end getargs ############################################################ # main def main(): + opendb() (classification_schemes, classification_schemetypes) = getclassify() query = getargs(classification_schemes, classification_schemetypes)