Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Unified Diff: infra/libs/gitiles/gitiles.py

Issue 1403313002: Added `cros_pin` CrOS pin-bump tool. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: contextmanager, cleanup. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | infra/tools/cros_pin/__init__.py » ('j') | infra/tools/cros_pin/cros_pin.py » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: infra/libs/gitiles/gitiles.py
diff --git a/infra/libs/gitiles/gitiles.py b/infra/libs/gitiles/gitiles.py
index 97d16db8e5f9ee8eb8fc7ac47512938cb4b97355..4bf984fd81e8cd84637b4171baf186356ddb0c46 100644
--- a/infra/libs/gitiles/gitiles.py
+++ b/infra/libs/gitiles/gitiles.py
@@ -8,6 +8,7 @@
import base64
import logging
+import httplib
import httplib2
import json
import urlparse
@@ -18,11 +19,15 @@ import time
LOGGER = logging.getLogger(__name__)
+# The default number of retries when a Gitiles error is encountered.
+DEFAULT_RETRIES = 10
+
+
class GitilesError(Exception):
pass
-def call_gitiles(url, response_format, netrc_path=None, max_attempts=10):
+def call_gitiles(url, response_format, netrc_path=None, max_attempts=None):
"""Invokes Gitiles API and parses the JSON result.
Given a gitiles URL, makes a ?format=json or ?format=text call and interprets
@@ -38,12 +43,13 @@ def call_gitiles(url, response_format, netrc_path=None, max_attempts=10):
not specified, no authentication is used.
max_attempts is the number of attempts to call gitiles before giving up on
- error.
+ error. If None/zero, DEFAULT_RETRIES will be used.
"""
assert response_format in ('json', 'text'), (
'response must be either json or text')
assert '?' not in url, 'url must not have a query parameter (?)'
+ max_attempts = max_attempts or DEFAULT_RETRIES
http = httplib2.Http()
headers = {}
if netrc_path:
@@ -59,8 +65,10 @@ def call_gitiles(url, response_format, netrc_path=None, max_attempts=10):
'GET',
headers=headers
)
- if response['status'] != '200':
- LOGGER.warning('GET %s failed with HTTP code %s', url, response['status'])
+ if response.status != httplib.OK:
+ LOGGER.warning('GET %s failed with HTTP code %d', url, response.status)
+ if response.status < httplib.INTERNAL_SERVER_ERROR:
+ break
if attempt != max_attempts:
LOGGER.warning('Retrying...')
continue # pragma: no cover (actually reached, see https://goo.gl/QA8B2U)
@@ -85,3 +93,28 @@ def get_oauth_token_from_netrc(url, netrc_path):
'netrc file %s is missing an entry for %s' % (
netrc_path, parsed.hostname))
return auth[2]
+
+
+class Repository(object):
+ def __init__(self, base_url, netrc_path=None, max_attempts=None):
+ self._base_url = self._trim_slashes(base_url)
+ self._netrc_path = netrc_path
+ self._max_attempts = max_attempts
+
+ @staticmethod
+ def _trim_slashes(v):
+ return v.strip('/')
+
+ def __call__(self, ref='master', subpath=None):
+ url = [self._base_url, '+', ref]
+ if subpath:
+ url.append(self._trim_slashes(subpath))
+ url = '/'.join(url)
+ return call_gitiles(
+ url,
+ 'json',
+ netrc_path=self._netrc_path,
+ max_attempts=self._max_attempts)
+
+ def ref_info(self, ref):
+ return self(ref)
« no previous file with comments | « no previous file | infra/tools/cros_pin/__init__.py » ('j') | infra/tools/cros_pin/cros_pin.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698