mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 00:01:50 +00:00
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.
This commit is contained in:
parent
4cb326c21c
commit
9a10e523d1
@ -7,7 +7,7 @@ This file is encoded in UTF8 for purposes of contributor names.
|
||||
|
||||
This directory includes:
|
||||
|
||||
bug-bugzilla/ -- A standalone bug submission script.
|
||||
bugzilla-submit/ -- A standalone bug submission program.
|
||||
|
||||
mysqld-watcher.pl -- This script can be installed as a frequent cron
|
||||
job to clean up stalled/dead queries.
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -1,10 +1,10 @@
|
||||
Bug-Bugzilla
|
||||
============
|
||||
bugzilla-submit
|
||||
===============
|
||||
|
||||
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
|
||||
bugzilla-submit 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
|
||||
@ -23,10 +23,10 @@ Usage Notes
|
||||
* 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.
|
||||
Run "bugzilla-submit --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
|
||||
in as standard input to bugzilla-submit, providing a Bugzilla URI through
|
||||
the command-line.
|
||||
|
||||
Note that you must create a ~/.netrc entry to authenticate against the
|
||||
@ -41,6 +41,6 @@ your password password. An example entry follows:
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Documentation for bug-bugzilla is provided in Docbook format; see
|
||||
bug-bugzilla.xml.
|
||||
Documentation for bugzilla-submit is provided in Docbook format; see
|
||||
bugzilla-submit.xml.
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# bug-bugzilla: a command-line script to post bugs to a Bugzilla instance
|
||||
# bugzilla-submit: 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
|
||||
# For a usage hint run bugzilla-submit --help
|
||||
#
|
||||
# TODO: use RDF output to pick up valid options, as in
|
||||
# http://www.async.com.br/~kiko/mybugzilla/config.cgi?ctype=rdf
|
||||
@ -15,7 +15,7 @@
|
||||
import sys
|
||||
|
||||
def error(m):
|
||||
sys.stderr.write("bug-bugzilla: %s\n" % m)
|
||||
sys.stderr.write("bugzilla-submit: %s\n" % m)
|
||||
sys.stderr.flush()
|
||||
sys.exit(1)
|
||||
|
||||
|
@ -2,20 +2,20 @@
|
||||
<!DOCTYPE refentry PUBLIC
|
||||
"-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
"docbook/docbookx.dtd">
|
||||
<refentry id='bug-bugzilla.1'>
|
||||
<refentry id='bugzilla-submit.1'>
|
||||
<refmeta>
|
||||
<refentrytitle>bug-bugzilla</refentrytitle>
|
||||
<refentrytitle>bugzilla-submit</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
<refmiscinfo class='date'>Oct 30, 2003</refmiscinfo>
|
||||
</refmeta>
|
||||
<refnamediv id='name'>
|
||||
<refname>bug-bugzilla</refname>
|
||||
<refname>bugzilla-submit</refname>
|
||||
<refpurpose>post bugs to a Bugzilla instance</refpurpose>
|
||||
</refnamediv>
|
||||
<refsynopsisdiv id='synopsis'>
|
||||
|
||||
<cmdsynopsis>
|
||||
<command>bug-bugzilla</command>
|
||||
<command>bugzilla-submit</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>
|
||||
@ -40,12 +40,12 @@
|
||||
|
||||
<refsect1 id='description'><title>DESCRIPTION</title>
|
||||
|
||||
<para><application>bug-bugzilla</application> is a command-line tool
|
||||
<para><application>bugzilla-submit</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>
|
||||
fields have not been set, <application>bugzilla-submit</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
|
||||
|
Loading…
Reference in New Issue
Block a user