def setProperties(self, path, **props): """See `IGitHostingClient`.""" try: self._patch("/repo/%s" % path, json=props) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to set properties of Git repository: %s" % unicode(e))
def getProperties(self, path): """See `IGitHostingClient`.""" try: return self._get("/repo/%s" % path) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to get properties of Git repository: %s" % unicode(e))
def getRefs(self, path, exclude_prefixes=None): """See `IGitHostingClient`.""" try: return self._get("/repo/%s/refs" % path, params={"exclude_prefix": exclude_prefixes}) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to get refs from Git repository: %s" % unicode(e))
def getCommits(self, path, commit_oids, logger=None): """See `IGitHostingClient`.""" commit_oids = list(commit_oids) try: if logger is not None: logger.info("Requesting commit details for %s" % commit_oids) return self._post("/repo/%s/commits" % path, json={"commits": commit_oids}) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to get commit details from Git repository: %s" % unicode(e))
def detectMerges(self, path, target, sources, logger=None): """See `IGitHostingClient`.""" sources = list(sources) try: if logger is not None: logger.info("Detecting merges for %s from %s to %s" % (path, sources, target)) return self._post("/repo/%s/detect-merges/%s" % (path, quote(target)), json={"sources": sources}) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to detect merges in Git repository: %s" % unicode(e))
def getMergeDiff(self, path, base, head, prerequisite=None, logger=None): """See `IGitHostingClient`.""" try: if logger is not None: logger.info("Requesting merge diff for %s from %s to %s" % (path, base, head)) url = "/repo/%s/compare-merge/%s:%s" % (path, quote(base), quote(head)) return self._get(url, params={"sha1_prerequisite": prerequisite}) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to get merge diff from Git repository: %s" % unicode(e))
def getBlob(self, path, filename, rev=None, logger=None): """See `IGitHostingClient`.""" try: if logger is not None: logger.info("Fetching file %s from repository %s" % (filename, path)) url = "/repo/%s/blob/%s" % (path, quote(filename)) response = self._get(url, params={"rev": rev}) except requests.RequestException as e: if (e.response is not None and e.response.status_code == requests.codes.NOT_FOUND): raise GitRepositoryBlobNotFound(path, filename, rev=rev) else: raise GitRepositoryScanFault( "Failed to get file from Git repository: %s" % unicode(e)) try: blob = base64.b64decode(response["data"].encode("UTF-8")) if len(blob) != response["size"]: raise GitRepositoryScanFault("Unexpected size (%s vs %s)" % (len(blob), response["size"])) return blob except Exception as e: raise GitRepositoryScanFault( "Failed to get file from Git repository: %s" % unicode(e))
def getLog(self, path, start, limit=None, stop=None, logger=None): """See `IGitHostingClient`.""" try: if logger is not None: logger.info("Requesting commit log for %s: " "start %s, limit %s, stop %s" % (path, start, limit, stop)) return self._get("/repo/%s/log/%s" % (path, quote(start)), params={ "limit": limit, "stop": stop }) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to get commit log from Git repository: %s" % unicode(e))
def _fetch_blob_from_launchpad(repository_url, ref_path, filename): repo_path = urlsplit(repository_url).path.strip("/") try: response = urlfetch( "https://git.launchpad.net/%s/plain/%s" % ( repo_path, quote(filename)), params={"h": ref_path}) except requests.RequestException as e: if (e.response is not None and e.response.status_code == requests.codes.NOT_FOUND): raise GitRepositoryBlobNotFound( repository_url, filename, rev=ref_path) else: raise GitRepositoryScanFault( "Failed to get file from Git repository at %s: %s" % (repository_url, str(e))) return response.content
def getDiff(self, path, old, new, common_ancestor=False, context_lines=None, logger=None): """See `IGitHostingClient`.""" try: if logger is not None: logger.info("Requesting diff for %s from %s to %s" % (path, old, new)) separator = "..." if common_ancestor else ".." url = "/repo/%s/compare/%s%s%s" % (path, quote(old), separator, quote(new)) return self._get(url, params={"context_lines": context_lines}) except requests.RequestException as e: raise GitRepositoryScanFault( "Failed to get diff from Git repository: %s" % unicode(e))
def _fetch_blob_from_github(repository_url, ref_path, filename): repo_path = urlsplit(repository_url).path.strip("/") if repo_path.endswith(".git"): repo_path = repo_path[:-len(".git")] try: response = urlfetch( "https://raw.githubusercontent.com/%s/%s/%s" % ( repo_path, # GitHub supports either branch or tag names here, but both # must be shortened. (If both a branch and a tag exist with # the same name, it appears to pick the branch.) quote(re.sub(r"^refs/(?:heads|tags)/", "", ref_path)), quote(filename)), use_proxy=True) except requests.RequestException as e: if (e.response is not None and e.response.status_code == requests.codes.NOT_FOUND): raise GitRepositoryBlobNotFound( repository_url, filename, rev=ref_path) else: raise GitRepositoryScanFault( "Failed to get file from Git repository at %s: %s" % (repository_url, str(e))) return response.content