repopick: support auth'ing to gerrit and picking drafts

* Use requests if installed. If not fall back to urllib. This is
  done because users may or may not have requests installed and
  requiring them to do so for simple http stuff isn't really
  reasonable.

* If requests is installed and a .gerritrc file exists in the
  user's HOME directory, try to get credentials out of it
  for the given gerrit instance. If auth for the correct gerrit
  instance exists, use it to auth to gerrit. If no .gerritrc
  exists, just use requests with no auth.

  Example ~/.gerritrc entry:
  review.lineageos.org|invisiblek|httppasswordhere

Change-Id: I95be26d51bfd31b53f3613e8dbfb7bba46324571
This commit is contained in:
Dan Pasanen 2017-01-23 15:08:52 -06:00
parent 2965342b9a
commit 1cdd380e69

View file

@ -32,16 +32,19 @@ import textwrap
from xml.etree import ElementTree
try:
# For python3
import urllib.error
import urllib.request
import requests
except ImportError:
# For python2
import imp
import urllib2
urllib = imp.new_module('urllib')
urllib.error = urllib2
urllib.request = urllib2
try:
# For python3
import urllib.error
import urllib.request
except ImportError:
# For python2
import imp
import urllib2
urllib = imp.new_module('urllib')
urllib.error = urllib2
urllib.request = urllib2
# Verifies whether pathA is a subdirectory (or the same) as pathB
@ -100,11 +103,29 @@ def fetch_query_via_ssh(remote_url, query):
def fetch_query_via_http(remote_url, query):
"""Given a query, fetch the change numbers via http"""
url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query)
data = urllib.request.urlopen(url).read().decode('utf-8')
reviews = json.loads(data[5:])
if "requests" in sys.modules:
auth = None
if os.path.isfile(os.getenv("HOME") + "/.gerritrc"):
f = open(os.getenv("HOME") + "/.gerritrc", "r")
for line in f:
parts = line.rstrip().split("|")
if parts[0] in remote_url:
auth = requests.auth.HTTPBasicAuth(username=parts[1], password=parts[2])
statusCode = '-1'
if auth:
url = '{0}/a/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query)
data = requests.get(url, auth=auth)
statusCode = str(data.status_code)
if statusCode != '200':
#They didn't get good authorization or data, Let's try the old way
url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query)
data = requests.get(url)
reviews = json.loads(data.text[5:])
else:
"""Given a query, fetch the change numbers via http"""
url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query)
data = urllib.request.urlopen(url).read().decode('utf-8')
reviews = json.loads(data[5:])
for review in reviews:
review['number'] = review.pop('_number')