| Index: static/upload.py |
| =================================================================== |
| --- static/upload.py (revision 402) |
| +++ static/upload.py (working copy) |
| @@ -61,7 +61,31 @@ |
| # Max size of patch or base file. |
| MAX_UPLOAD_SIZE = 900 * 1024 |
| +fields = {'issue':'title', 'msg':'content', 'file':'description', } |
| +def fetch_item(nodeid, kind='issue', tracker='http://bugs.python.org'): |
| + query_tpl = [('@action', 'export_csv'), ('@filter', 'id'), |
| + ('id', nodeid), ('@columns', fields[kind])] |
| + item_url = '/%s?%s' % (kind, urllib.urlencode(query_tpl)) |
| + content = urllib.urlopen(tracker + item_url).read().split('\r\n') |
| + if content[0] == 'title': |
| + return '[issue%s] %s' % (nodeid, content[1].strip()) |
| + elif content[0] == 'content' or content[0] == 'description': |
| + return content[1].strip() |
| +def fetch(nodeid): |
| + try: |
| + result = fetch_item(int(nodeid)) |
| + except ValueError: |
| + if nodeid.startswith('msg'): |
| + nodeid = nodeid.replace('msg', '') |
| + result = fetch_item(int(nodeid), 'msg') |
| + elif nodeid.startswith('file'): |
| + nodeid = nodeid.replace('file', '') |
| + result = fetch_item(int(nodeid), 'file') |
| + else: |
| + raise |
| + return result |
| + |
| def GetEmail(prompt): |
| """Prompts the user for their email address and returns it. |
| @@ -453,6 +477,14 @@ |
| group.add_option("--send_mail", action="store_true", |
| dest="send_mail", default=False, |
| help="Send notification email to reviewers.") |
| +# Link options |
| +group = parser.add_option_group("Link options") |
| +group.add_option("-R", "--roundup", action="store", dest="roundup", |
| + metavar="ROUNDUP", default=None, |
| + help="Python tracker issue number to link with.") |
| +group.add_option("-F", "--fetch_descr", action="store", dest="fetch_descr", |
| + metavar="FETCHDESCR", default=None, |
| + help="Tracker file or message to fetch description from.") |
| def GetRpcServer(options): |
| @@ -1291,7 +1323,10 @@ |
| prompt = "Message describing this patch set: " |
| else: |
| prompt = "New issue subject: " |
| - message = options.message or raw_input(prompt).strip() |
| + if options.roundup: |
| + message = fetch(options.roundup) |
| + else: |
| + message = options.message or raw_input(prompt).strip() |
| if not message: |
| ErrorExit("A non-empty message is required") |
| rpc_server = GetRpcServer(options) |
| @@ -1307,11 +1342,16 @@ |
| if "@" in reviewer and not reviewer.split("@")[1].count(".") == 1: |
| ErrorExit("Invalid email address: %s" % reviewer) |
| form_fields.append(("reviewers", options.reviewers)) |
| + tracker_email = 'report@bugs.python.org,' |
| if options.cc: |
| for cc in options.cc.split(','): |
| if "@" in cc and not cc.split("@")[1].count(".") == 1: |
| ErrorExit("Invalid email address: %s" % cc) |
| - form_fields.append(("cc", options.cc)) |
| + if options.roundup: |
| + cc = tracker_email + options.cc |
| + form_fields.append(("cc", cc)) |
| + elif options.roundup: |
| + form_fields.append(("cc", tracker_email[:-1])) |
| description = options.description |
| if options.description_file: |
| if options.description: |
| @@ -1319,6 +1359,9 @@ |
| file = open(options.description_file, 'r') |
| description = file.read() |
| file.close() |
| + elif options.fetch_descr: |
| + # XXX Add error handling as above |
| + description = fetch(options.fetch_descr) |
| if description: |
| form_fields.append(("description", description)) |
| # Send a hash of all the base file so the server can determine if a copy |