Closed gvanrossum closed 15 years ago
Testing.
didn't keep his finger on his nose
does it stay?
wish we could expunge the deleted ones
closing this one again
Reviewers: ,
Message: While this is a test issue, the attached diff is a crude first draft of a patched upload.py that makes linking to the Python Tracker a bit easier.
Here's the command line and output: $ python static/upload.py -R 400608 -F msg32813 Upload server: [...] Loaded authentication cookies [...] Issue created. URL: http://codereview.appspot.com/25073 Uploading base file for static/upload.py
And the help is: $ python static/upload.py -h | tail -n5 Link options: -R ROUNDUP, --roundup=ROUNDUP Python tracker issue number to link with. -F FETCHDESCR, --fetch_descr=FETCHDESCR Tracker file or message to fetch description from.
I like it :)
Description: wish we could expunge the deleted ones
Please review this at http://codereview.appspot.com/25073
Affected files: M static/upload.py
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
This is specific to the Python tracker, which Rietveld tries to avoid. You could maintain this as a locally modified version, but a better approach would be to make just enough changes to upload.py itself so that you can write the rest of this script as a *wrapper* around upload.py. That's how the Chrome people manage their workflow, and that's a generally recommended approach: the wrapper does the project-specific stuff, passing everything to upload.py for the actual interaction with Rietveld.
PS. What do you mean by "wish we could expunge the deleted ones"? If you delete a Rietveld issue it is really gone. If you merely close it, you can still delete it later. But I'm probably missing something.
Thanks for the feedback, Guido!
gvanrossum wrote:
You could maintain this as a locally modified version, but a better approach would be to make just enough changes to upload.py itself so that you can write the rest of this script as a *wrapper* around upload.py.
Yes, a wrapper is an option. MvL suggested a patch[1] and for this initial implementation it makes things simpler. IIUC, in this case upload.py would need no changes, as we simply populate existing options with fetched values.
PS. What do you mean by "wish we could expunge the deleted ones"? If you delete a Rietveld issue it is really gone. If you merely close it, you can still delete it later. But I'm probably missing something.
Yes, you're missing the fact that you were the one saying "wish we could expunge the deleted ones" :)
upload.py fetched that from http://bugs.python.org/msg32813 because I told it to: python static/upload.py -R 400608 -F msg32813
[1] http://mail.python.org/pipermail/tracker-discuss/2009-March/001875.html
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields: ```python assignee = 'https://github.com/gvanrossum' closed_at =
created_at =
labels = []
title = 'just testing'
updated_at =
user = 'https://github.com/gvanrossum'
```
bugs.python.org fields:
```python
activity =
actor = 'ajaksu2'
assignee = 'gvanrossum'
closed = True
closed_date = None
closer = None
components = ['None']
creation =
creator = 'gvanrossum'
dependencies = []
files = ['2460']
hgrepos = []
issue_num = 400608
keywords = ['patch']
message_count = 9.0
messages = ['32809', '32810', '32811', '32812', '32813', '32814', '83237', '83239', '83243']
nosy_count = 3.0
nosy_names = ['gvanrossum', 'nobody', 'ajaksu2']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'closed'
superseder = None
type = None
url = 'https://bugs.python.org/issue400608'
versions = []
```