These days I am using Bitbucket for the git repository hosting and task management on my commercial projects. One thing I often need to do is fetch a list of current tasks so that I can update a client with what is on our current agenda for them, get feedback about priorities etc. Here's a short Python script I hacked together to do that based on some other public domain scripts I found out there:
import base64
import cookielib
import urllib2
import json
class API:
api_url = 'http://api.bitbucket.org/1.0/'
def __init__(self, username, password, proxy=None):
encodedstring = base64.encodestring("%s:%s" % (username, password))[:-1]
self._auth = "Basic %s" % encodedstring
self._opener = self._create_opener(proxy)
def _create_opener(self, proxy=None):
cj = cookielib.LWPCookieJar()
cookie_handler = urllib2.HTTPCookieProcessor(cj)
if proxy:
proxy_handler = urllib2.ProxyHandler(proxy)
opener = urllib2.build_opener(cookie_handler, proxy_handler)
else:
opener = urllib2.build_opener(cookie_handler)
return opener
def get_issues(self, username, repository, arguments):
query_url = self.api_url + 'repositories/%s/%s/issues/' % (username, repository)
if arguments:
query_url += "?" + "&".join(["=".join(a) for a in arguments])
try:
req = urllib2.Request(query_url, None, {"Authorization": self._auth})
handler = self._opener.open(req)
except urllib2.HTTPError, e:
print e.headers
raise e
return json.load(handler)
if __name__ == "__main__":
import sys
if len(sys.argv) < 5:
print "Usage: %s username password baseuser repository" % (sys.argv[0],)
else:
result = API(sys.argv[1], sys.argv[2]).get_issues(sys.argv[3], sys.argv[4], (("status", "new"), ("status", "open"), ("limit", "50")))
for p in result["issues"]:
print " *%s %s" % (p.has_key("responsible") and "**" or "", p["title"])
#print p["content"]
print
Run it to get a usage message.
I secretly wish that bzr had won the distributed version control wars because of its superior user interface, but these days I am resigned to using git because pretty much everybody I have to inter-operate with is using it. It's not that bad.