mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-08 21:46:58 +02:00
You can access this by passing: --tracker-user="user@chromium.org" --tracker-passfile="fileContainingPassword" ...to access anonymously, just set --tracker-user="" ...if you don't include the --tracker-user option, we won't try to fetch priority/milestone. To use this feature, you need the GData library. Until we get that put in hard-host-depends, the script will simply print instructions for installing GData if it detects that you don't have it. At the moment, I believe that logging in isn't giving you any extra access. Therefore, any bugs that don't allow anonymous access will not show their priority/milestone. I am working on figuring out what the problem is there. Change-Id: If388c20c43ee2fb0c1ab8f748ffea65e354eeb1e BUG=chromium-os:8205 TEST=Ran ./cros_changelog 0.9.104.0 --tracker-user="" and verified that some bugs got priority/milestone. Review URL: http://codereview.chromium.org/4102013
167 lines
5.1 KiB
Python
167 lines
5.1 KiB
Python
#!/usr/bin/python
|
|
|
|
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Helper functions for accessing the issue tracker in a pythonic way."""
|
|
|
|
import os.path
|
|
import pprint
|
|
import sys
|
|
|
|
# import the GData libraries
|
|
import gdata.client
|
|
import gdata.projecthosting.client
|
|
|
|
DEFAULT_TRACKER_SOURCE = "chromite-tracker-access-1.0"
|
|
VERBOSE = True # Set to True to get extra debug info...
|
|
|
|
class TrackerAccess(object):
|
|
"""Class for accessing the tracker on code.google.com."""
|
|
|
|
def __init__(self, email="", password="",
|
|
tracker_source=DEFAULT_TRACKER_SOURCE):
|
|
"""TrackerAccess constructor.
|
|
|
|
Args:
|
|
email: The email address to Login with; may be "" for anonymous access.
|
|
password: The password that goes with the email address; may be "" if
|
|
the email is "".
|
|
tracker_source: A string describing this program. This can be anything
|
|
you like but should should give some indication of which
|
|
app is making the request.
|
|
"""
|
|
# Save parameters...
|
|
self._email = email
|
|
self._password = password
|
|
self._tracker_source = tracker_source
|
|
|
|
# This will be initted on first login...
|
|
self._tracker_client = None
|
|
|
|
def Login(self):
|
|
"""Login, if needed. This may be safely called more than once.
|
|
|
|
Commands will call this function as their first line, so the client
|
|
of this class need not call it themselves unless trying to debug login
|
|
problems.
|
|
|
|
This function should be called even if we're accessing anonymously.
|
|
"""
|
|
# Bail immediately if we've already logged in...
|
|
if self._tracker_client is not None:
|
|
return
|
|
|
|
self._tracker_client = gdata.projecthosting.client.ProjectHostingClient()
|
|
if self._email and self._password:
|
|
self._tracker_client.client_login(self._email, self._password,
|
|
source=self._tracker_source,
|
|
service="code", account_type='GOOGLE')
|
|
|
|
def GetKeyedLabels(self, project_name, issue_id):
|
|
"""Get labels of the form "Key-Value" attached to the given issue.
|
|
|
|
Any labels that don't have a dash in them are ignored.
|
|
|
|
Args:
|
|
project_name: The tracker project to query.
|
|
issue_id: The ID of the issue to query; should be an int but a string
|
|
will probably work too.
|
|
|
|
Returns:
|
|
A dictionary mapping key/value pairs from the issue's labels, like:
|
|
|
|
{'Area': 'Build',
|
|
'Iteration': '15',
|
|
'Mstone': 'R9.x',
|
|
'Pri': '1',
|
|
'Type': 'Bug'}
|
|
"""
|
|
# Login if needed...
|
|
self.Login()
|
|
|
|
# Construct the query...
|
|
query = gdata.projecthosting.client.Query(issue_id=issue_id)
|
|
try:
|
|
feed = self._tracker_client.get_issues(project_name, query=query)
|
|
except gdata.client.RequestError, e:
|
|
if VERBOSE:
|
|
print >>sys.stderr, "ERROR: Unable to access bug %s:%s: %s" % (
|
|
project_name, issue_id, str(e))
|
|
return {}
|
|
|
|
# There should be exactly one result...
|
|
assert len(feed.entry) == 1, "Expected exactly 1 result"
|
|
(entry,) = feed.entry
|
|
|
|
# We only care about labels that look like: Key-Value
|
|
# We'll return a dictionary of those.
|
|
keyed_labels = {}
|
|
for label in entry.label:
|
|
if "-" in label.text:
|
|
label_key, label_val = label.text.split("-", 1)
|
|
keyed_labels[label_key] = label_val
|
|
|
|
return keyed_labels
|
|
|
|
|
|
def _TestGetKeyedLabels(project_name, email, passwordFile, *bug_ids):
|
|
"""Test code for GetKeyedLabels().
|
|
|
|
Args:
|
|
project_name: The name of the project we're looking at.
|
|
email: The email address to use to login. May be ""
|
|
passwordFile: A file containing the password for the email address.
|
|
May be "" if email is "" for anon access.
|
|
bug_ids: A list of bug IDs to query.
|
|
"""
|
|
# If password was specified as a file, read it.
|
|
if passwordFile:
|
|
password = open(passwordFile, "r").read().strip()
|
|
else:
|
|
password = ""
|
|
|
|
ta = TrackerAccess(email, password)
|
|
|
|
if not bug_ids:
|
|
print "No bugs were specified"
|
|
else:
|
|
for bug_id in bug_ids:
|
|
print bug_id, ta.GetKeyedLabels(project_name, int(bug_id))
|
|
|
|
|
|
def _DoHelp(commands, *args):
|
|
"""Print help for the script."""
|
|
|
|
if len(args) >= 2 and args[0] == "help" and args[1] in commands:
|
|
# If called with arguments 'help' and 'command', show that commands's doc.
|
|
command_name = args[1]
|
|
print commands[command_name].__doc__
|
|
else:
|
|
# Something else: show generic help...
|
|
print (
|
|
"Usage %s <command> <command args>\n"
|
|
"\n"
|
|
"Known commands: \n"
|
|
" %s\n"
|
|
) % (sys.argv[0], pprint.pformat(["help"] + sorted(commands)))
|
|
|
|
|
|
def main():
|
|
"""Main function of the script."""
|
|
|
|
commands = {
|
|
"TestGetKeyedLabels": _TestGetKeyedLabels,
|
|
}
|
|
|
|
if len(sys.argv) <= 1 or sys.argv[1] not in commands:
|
|
# Argument 1 isn't in list of commands; show help and pass all arguments...
|
|
_DoHelp(commands, *sys.argv[1:])
|
|
else:
|
|
command_name = sys.argv[1]
|
|
commands[command_name](*sys.argv[2:])
|
|
|
|
if __name__ == "__main__":
|
|
main()
|