diff options
author | kiko%async.com.br <> | 2003-12-11 08:36:20 +0100 |
---|---|---|
committer | kiko%async.com.br <> | 2003-12-11 08:36:20 +0100 |
commit | 9e3ebb48f4ea3d78e25e1e7b021bbfbcefd58409 (patch) | |
tree | 3ef5e7475cb37cd40945f44536d12aecf95ae8c1 /contrib/bug-bugzilla | |
parent | a68d8e889aa22f82315c7106bf5ed27d6de2365b (diff) | |
download | bugzilla-9e3ebb48f4ea3d78e25e1e7b021bbfbcefd58409.tar.gz bugzilla-9e3ebb48f4ea3d78e25e1e7b021bbfbcefd58409.tar.xz |
Bug 227724: rename bug-bugzilla to bugzilla-submit. Justdave did the
repository copy, and this is the follow-up patch that implements the
content rename. r=gerv, a=justdave.
Diffstat (limited to 'contrib/bug-bugzilla')
-rw-r--r-- | contrib/bug-bugzilla/README | 46 | ||||
-rwxr-xr-x | contrib/bug-bugzilla/bug-bugzilla | 279 | ||||
-rw-r--r-- | contrib/bug-bugzilla/bug-bugzilla.xml | 199 | ||||
-rw-r--r-- | contrib/bug-bugzilla/bugdata.txt | 11 |
4 files changed, 0 insertions, 535 deletions
diff --git a/contrib/bug-bugzilla/README b/contrib/bug-bugzilla/README deleted file mode 100644 index 08bc3d85c..000000000 --- a/contrib/bug-bugzilla/README +++ /dev/null @@ -1,46 +0,0 @@ -Bug-Bugzilla -============ - -Authors: Christian Reis <kiko@async.com.br> - Eric Raymond <esr@thyrsus.com> - -Bug-Bugzilla is a simple Python program that creates bugs in a Bugzilla -instance. It takes as input text resembling message headers (RFC-822 -formatted) via standard input, or optionally a number of commandline -parameters. It communicates using HTTP, which allows it to work over a -network. - -Requirements ------------- - -Its only requirement is Python 2.3 or higher; you should have the -"python" executable in your path. - -Usage Notes ------------ - -* Please constrain testing to your own installation of Bugzilla, or use -* http://landfill.bugzilla.org/ for testing purposes -- opening test -* bugs on production instances of Bugzilla is definitely not a good idea - -Run "bug-bugzilla --help" for a description of the possible options. - -An example input file, named bugdata.txt, is provided. You can pipe it -in as standard input to bug-bugzilla, providing a Bugzilla URI through -the command-line. - -Note that you must create a ~/.netrc entry to authenticate against the -Bugzilla instance. The entry's machine field is a *quoted* Bugzilla URI, -the login field is your ID on that host, and the password field is the -your password password. An example entry follows: - - machine "http://bugzilla.mozilla.org/" - login foo@bar.loo - password snarf - -Documentation -------------- - -Documentation for bug-bugzilla is provided in Docbook format; see -bug-bugzilla.xml. - diff --git a/contrib/bug-bugzilla/bug-bugzilla b/contrib/bug-bugzilla/bug-bugzilla deleted file mode 100755 index e16a968e7..000000000 --- a/contrib/bug-bugzilla/bug-bugzilla +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env python -# -# bug-bugzilla: a command-line script to post bugs to a Bugzilla instance -# -# Authors: Christian Reis <kiko@async.com.br> -# Eric S. Raymond <esr@thyrsus.com> -# -# This is version 0.5. -# -# For a usage hint run bug-bugzilla --help -# -# TODO: use RDF output to pick up valid options, as in -# http://www.async.com.br/~kiko/mybugzilla/config.cgi?ctype=rdf - -import sys - -def error(m): - sys.stderr.write("bug-bugzilla: %s\n" % m) - sys.stderr.flush() - sys.exit(1) - -if sys.version[:6] < '2.3.0': - error("you must upgrade to Python 2.3 or higher to use this script.") - -import urllib, re, os, netrc, email.Parser, optparse - -# Set up some aliases -- partly to hide the less friendly fieldnames -# behind the names actually used for them in the stock web page presentation, -# and partly to provide a place for mappings if the Bugzilla fieldnames -# ever change. -field_aliases = (('hardware', 'rep_platform'), - ('os', 'op_sys'), - ('summary', 'short_desc'), - ('description', 'comment'), - ('depends-on', 'dependson'), - ('status', 'bug_status'), - ('severity', 'bug_severity'), - ('URL', 'bug_file_loc'),) - -def header_to_field(hdr): - hdr = hdr.lower().replace("-", "_") - for (alias, name) in field_aliases: - if hdr == alias: - hdr = name - break - return hdr - -def field_to_header(hdr): - hdr = "-".join(map(lambda x: x.capitalize(), hdr.split("_"))) - for (alias, name) in field_aliases: - if hdr == name: - hdr = alias - break - return hdr - -def setup_parser(): - # Take override values from the command line - parser = optparse.OptionParser(usage="usage: %prog [options] bugzilla-url") - parser.add_option('-b', '--status', dest='bug_status', - help='Set the Status field.') - parser.add_option('-u', '--url', dest='bug_file_loc', - help='Set the URL field.') - parser.add_option('-p', '--product', dest='product', - help='Set the Product field.') - parser.add_option('-v', '--version', dest='version', - help='Set the Version field.') - parser.add_option('-c', '--component', dest='component', - help='Set the Component field.') - parser.add_option('-s', '--summary', dest='short_desc', - help='Set the Summary field.') - parser.add_option('-H', '--hardware', dest='rep_platform', - help='Set the Hardware field.') - parser.add_option('-o', '--os', dest='op_sys', - help='Set the Operating-system field.') - parser.add_option('-r', '--priority', dest='priority', - help='Set the Priority field.') - parser.add_option('-x', '--severity', dest='bug_severity', - help='Set the Severity field.') - parser.add_option('-d', '--description', dest='comment', - help='Set the Description field.') - parser.add_option('-a', '--assigned-to', dest='assigned_to', - help='Set the Assigned-To field.') - parser.add_option('-C', '--cc', dest='cc', - help='Set the Cc field.') - parser.add_option('-k', '--keywords', dest='keywords', - help='Set the Keywords field.') - parser.add_option('-D', '--depends-on', dest='dependson', - help='Set the Depends-On field.') - parser.add_option('-B', '--blocked', dest='blocked', - help='Set the Blocked field.') - parser.add_option('-n', '--no-stdin', dest='read', - default=True, action='store_false', - help='Suppress reading fields from stdin.') - return parser - -# Fetch user's credential for access to this Bugzilla instance. -def get_credentials(bugzilla): - # Work around a quirk in the Python implementation. - # The URL has to be quoted, otherwise the parser barfs on the colon. - # But the parser doesn't strip the quotes. - authenticate_on = '"' + bugzilla + '"' - try: - credentials = netrc.netrc() - except netrc.NetrcParseError, e: - error("ill-formed .netrc: %s:%s %s" % (e.filename, e.lineno, e.msg)) - except IOError, e: - error("missing .netrc file %s" % str(e).split()[-1]) - ret = credentials.authenticators(authenticate_on) - if not ret: - # Apparently, an invalid machine URL will cause credentials == None - error("no credentials for Bugzilla instance at %s" % bugzilla) - return ret - -def process_options(options): - data = {} - # Initialize bug report fields from message on standard input - if options.read: - message_parser = email.Parser.Parser() - message = message_parser.parse(sys.stdin) - for (key, value) in message.items(): - data.update({header_to_field(key) : value}) - if not 'comment' in data: - data['comment'] = message.get_payload() - - # Merge in options from the command line; they override what's on stdin. - for (key, value) in options.__dict__.items(): - if key != 'read' and value != None: - data[key] = value - return data - -def ensure_defaults(data): - # Provide some defaults if the user did not supply them. - if 'op_sys' not in data: - if sys.platform.startswith('linux'): - data['op_sys'] = 'Linux' - if 'rep_platform' not in data: - data['rep_platform'] = 'PC' - if 'bug_status' not in data: - data['bug_status'] = 'NEW' - if 'bug_severity' not in data: - data['bug_severity'] = 'normal' - if 'bug_file_loc' not in data: - data['bug_file_loc'] = 'http://' # Yes, Bugzilla needs this - if 'priority' not in data: - data['priority'] = 'P2' - -def validate_fields(data): - # Fields for validation - required_fields = ( - "bug_status", "bug_file_loc", "product", "version", "component", - "short_desc", "rep_platform", "op_sys", "priority", "bug_severity", - "comment", - ) - legal_fields = required_fields + ( - "assigned_to", "cc", "keywords", "dependson", "blocked", - ) - my_fields = data.keys() - for field in my_fields: - if field not in legal_fields: - error("invalid field: %s" % field_to_header(field)) - for field in required_fields: - if field not in my_fields: - error("required field missing: %s" % field_to_header(field)) - - if not data['short_desc']: - error("summary for bug submission must not be empty") - - if not data['comment']: - error("comment for bug submission must not be empty") - -# -# POST-specific functions -# - -def submit_bug_POST(bugzilla, data): - # Move the request over the wire - postdata = urllib.urlencode(data) - url = urllib.urlopen("%s/post_bug.cgi" % bugzilla, postdata) - ret = url.read() - check_result_POST(ret, data) - -def check_result_POST(ret, data): - # XXX We can move pre-validation out of here as soon as we pick up - # the valid options from config.cgi -- it will become a simple - # assertion and ID-grabbing step. - # - # XXX: We use get() here which may return None, but since the user - # might not have provided these options, we don't want to die on - # them. - version = data.get('version') - product = data.get('product') - component = data.get('component') - priority = data.get('priority') - severity = data.get('bug_severity') - status = data.get('bug_status') - assignee = data.get('assigned_to') - platform = data.get('rep_platform') - opsys = data.get('op_sys') - keywords = data.get('keywords') - deps = data.get('dependson', '') + " " + data.get('blocked', '') - deps = deps.replace(" ", ", ") - # XXX: we should really not be using plain find() here, as it can - # match the bug content inadvertedly - if ret.find("A legal Version was not") != -1: - error("version %r does not exist for component %s:%s" % - (version, product, component)) - if ret.find("A legal Priority was not") != -1: - error("priority %r does not exist in " - "this Bugzilla instance" % priority) - if ret.find("A legal Severity was not") != -1: - error("severity %r does not exist in " - "this Bugzilla instance" % severity) - if ret.find("A legal Status was not") != -1: - error("status %r is not a valid creation status in " - "this Bugzilla instance" % status) - if ret.find("A legal Platform was not") != -1: - error("platform %r is not a valid platform in " - "this Bugzilla instance" % platform) - if ret.find("A legal OS/Version was not") != -1: - error("%r is not a valid OS in " - "this Bugzilla instance" % opsys) - if ret.find("Invalid Username") != -1: - error("invalid credentials submitted") - if ret.find("Component Needed") != -1: - error("the component %r does not exist in " - "this Bugzilla instance" % component) - if ret.find("Unknown Keyword") != -1: - error("keyword(s) %r not registered in " - "this Bugzilla instance" % keywords) - if ret.find("The product name") != -1: - error("Product %r does not exist in this " - "Bugzilla instance" % product) - # XXX: this should be smarter - if ret.find("does not exist") != -1: - error("Could not mark dependencies for bugs %s: one or " - "more bugs didn't exist in this Bugzilla instance" % deps) - if ret.find("Match Failed") != -1: - # XXX: invalid CC hits on this error too - error("the bug assignee %r isn't registered in " - "this Bugzilla instance" % assignee) - # If all is well, return bug number posted - m = re.search("Bug ([0-9]+) Submitted", ret) - if not m: - print ret - error("Internal error: bug id not found; please report a bug") - id = m.group(1) - print "Bug %s posted." % id - -# -# -# - -if __name__ == "__main__": - parser = setup_parser() - - # Parser will print help and exit here if we specified --help - (options, args) = parser.parse_args() - - if len(args) != 1: - parser.error("missing Bugzilla host URL") - - bugzilla = args[0] - data = process_options(options) - - login, account, password = get_credentials(bugzilla) - if "@" not in login: # no use even trying to submit - error("login %r is invalid (it should be an email address)" % login) - - ensure_defaults(data) - validate_fields(data) - - # Attach authentication information - data.update({'Bugzilla_login' : login, - 'Bugzilla_password' : password, - 'GoAheadAndLogIn' : 1, - 'form_name' : 'enter_bug'}) - - submit_bug_POST(bugzilla, data) - diff --git a/contrib/bug-bugzilla/bug-bugzilla.xml b/contrib/bug-bugzilla/bug-bugzilla.xml deleted file mode 100644 index da8a34c77..000000000 --- a/contrib/bug-bugzilla/bug-bugzilla.xml +++ /dev/null @@ -1,199 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> -<!DOCTYPE refentry PUBLIC - "-//OASIS//DTD DocBook XML V4.1.2//EN" - "docbook/docbookx.dtd"> -<refentry id='bug-bugzilla.1'> -<refmeta> -<refentrytitle>bug-bugzilla</refentrytitle> -<manvolnum>1</manvolnum> -<refmiscinfo class='date'>Oct 30, 2003</refmiscinfo> -</refmeta> -<refnamediv id='name'> -<refname>bug-bugzilla</refname> -<refpurpose>post bugs to a Bugzilla instance</refpurpose> -</refnamediv> -<refsynopsisdiv id='synopsis'> - -<cmdsynopsis> - <command>bug-bugzilla</command> - <arg choice='opt'>--status <replaceable>bug_status</replaceable></arg> - <arg choice='opt'>--url <replaceable>bug_file_loc</replaceable></arg> - <arg choice='opt'>--product <replaceable>product</replaceable></arg> - <arg choice='opt'>--version <replaceable>version</replaceable></arg> - <arg choice='opt'>--component <replaceable>component</replaceable></arg> - <arg choice='opt'>--summary <replaceable>short_desc</replaceable></arg> - <arg choice='opt'>--hardware <replaceable>rep_platform</replaceable></arg> - <arg choice='opt'>--os <replaceable>op_sys</replaceable></arg> - <arg choice='opt'>--priority <replaceable>priority</replaceable></arg> - <arg choice='opt'>--severity <replaceable>bug_severity</replaceable></arg> - <arg choice='opt'>--assigned-to <replaceable>assigned-to</replaceable></arg> - <arg choice='opt'>--cc <replaceable>cc</replaceable></arg> - <arg choice='opt'>--keywords <replaceable>keywords</replaceable></arg> - <arg choice='opt'>--depends-on <replaceable>dependson</replaceable></arg> - <arg choice='opt'>--blocked <replaceable>blocked</replaceable></arg> - <arg choice='opt'>--description <replaceable>comment</replaceable></arg> - <arg choice='opt'>--no-read </arg> - <arg choice='plain'><replaceable>bugzilla-url</replaceable></arg> -</cmdsynopsis> - -</refsynopsisdiv> - -<refsect1 id='description'><title>DESCRIPTION</title> - -<para><application>bug-bugzilla</application> is a command-line tool -for posting bug reports to any instance of Bugzilla. It accepts on -standard input text resembling an RFC-822 message. The headers of -that message, and its body, are used to set error-report field values. -More field values are merged in from command-line options. If required -fields have not been set, <application>bug-bugzilla</application> -tries to compute them. Finally, the resulting error report is -validated. If all required fields are present, and there are no -illegal fields or values, the report is shipped off to the Mozilla -instance specified by the single positional argument. Login/password -credentials are read from the calling user's <filename>~/.netrc</filename> -file.</para> - -<para>The program accepts the following options to set or override fields:</para> -<variablelist> -<varlistentry> -<term>-b. --bug-status</term> -<listitem> -<para>Set the bug_status field, overriding the Status header from -standard input if present. (The stock Bugzilla web presentation -identifies this field as <quote>Status</quote>.)</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-u, --url</term> -<listitem> -<para>Set the bug_file_loc field, overriding the URL header from -standard input if present. (The stock Bugzilla web presentation -identifies this field as <quote>URL</quote>.)</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-p, --product</term> -<listitem> -<para>Set the product field, overriding the Product header from -standard input if necessary.</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-v, --version</term> -<listitem><para>Set the version field, overriding the Version header -from standard input if necessary.</para></listitem> -</varlistentry> -<varlistentry> -<term>-c, --component</term> -<listitem><para>Set the component field, overriding the Component header -from standard input if necessary.</para></listitem> -</varlistentry> -<varlistentry> -<term>-s, --summary</term> -<listitem><para>Set the short_desc field, overriding the Summary header -from standard input if necessary. (The stock Bugzilla web presentation -identifies this field as <quote>Summary</quote>.)</para></listitem> -</varlistentry> -<varlistentry> -<term>-H, --hardware</term> -<listitem><para>Set the rep_platform field, overriding the Hardware header -from standard input if necessary. (The stock Bugzilla web presentation -identifies this field as <quote>Hardware</quote>.)</para></listitem> -</varlistentry> -<varlistentry> -<term>-o, --os</term> -<listitem><para>Set the op_sys field, overriding the Operating-System header -from standard input if necessary. (The stock Bugzilla web presentation -identifies this field as <quote>OS</quote>.)</para></listitem> -</varlistentry> -<varlistentry> -<term>-r, --priority</term> -<listitem><para>Set the priority field, overriding the Priority header -from standard input if necessary.</para></listitem> -</varlistentry> -<varlistentry> -<term>-x, --severity</term> -<listitem><para>Set the severity field, overriding the Severity header -from standard input if necessary.</para></listitem> -</varlistentry> -<varlistentry> -<term>-d, --description</term> -<listitem><para>Set the comment field, overriding the Description header -from standard input if necessary. (The stock Bugzilla web presentation -identifies this field as <quote>Description</quote>.) If there is a -message body and no Description field and this option is not -specified, the message body is used as a description. -</para></listitem> -</varlistentry> -<varlistentry> -<term>-a, --assigned-to</term> -<listitem> -<para>Set the optional assigned_to field, overriding the Assigned-To -header from standard input if necessary.</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-C, --cc</term> -<listitem> -<para>Set the optional cc field, overriding the Cc -header from standard input if necessary.</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-k, --keywords</term> -<listitem> -<para>Set the optional keywords field, overriding the Keywords -header from standard input if necessary.</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-D, --depends-on</term> -<listitem> -<para>Set the optional dependson field, overriding the Depends-On -header from standard input if necessary.</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-B, --assigned-to</term> -<listitem> -<para>Set the optional blocked field, overriding the Blocked -header from standard input if necessary.</para> -</listitem> -</varlistentry> -<varlistentry> -<term>-n, --no-stdin</term> -<listitem><para>Suppress reading fields from standard input.</para></listitem> -</varlistentry> -<varlistentry> -<term>-h, --help</term> -<listitem><para>Print usage help and exit.</para></listitem> -</varlistentry> -</variablelist> - -<para>This program will try to deduce OS and Hardware if those are not -specified. If it fails, validation will fail before shipping the -report.</para> - -<para>There is expected to be a single positional argument following -any options. It should be the URL of the Bugzilla instance to which -the bug is to be submitted.</para> - -</refsect1> -<refsect1 id='files'><title>FILES</title> -<variablelist> -<varlistentry> -<term><filename>~/.netrc</filename></term> -<listitem><para>Must contain an entry in which the machine field is -the Bugzilla instance URL, the login field is your ID on that host, and the -password field is the right password. The URL in the machine field -must be enclosed in double quotes.</para></listitem> -</varlistentry> -</variablelist> - -</refsect1> -<refsect1 id='author'><title>AUTHORS</title> -<para>Christian Reis <kiko@async.com.br>, Eric S. Raymond -<esr@thyrsus.com>.</para> -</refsect1> -</refentry> - diff --git a/contrib/bug-bugzilla/bugdata.txt b/contrib/bug-bugzilla/bugdata.txt deleted file mode 100644 index 56f70b9f1..000000000 --- a/contrib/bug-bugzilla/bugdata.txt +++ /dev/null @@ -1,11 +0,0 @@ -Product: FoodReplicator -Component: Salt -Version: 1.0 -Priority: P2 -Hardware: PC -OS: Linux -Severity: critical -Summary: Impending electron shortage - -We need an emergency supply of electrons. - |