diff options
Diffstat (limited to 'testing/mozharness/external_tools/detect_repo.py')
-rw-r--r-- | testing/mozharness/external_tools/detect_repo.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/testing/mozharness/external_tools/detect_repo.py b/testing/mozharness/external_tools/detect_repo.py new file mode 100644 index 000000000..67466a03e --- /dev/null +++ b/testing/mozharness/external_tools/detect_repo.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# Stolen from taskcluster-vcs +# https://github.com/taskcluster/taskcluster-vcs/blob/master/src/vcs/detect_remote.js + +from urllib2 import Request, urlopen +from urlparse import urlsplit, urlunsplit +from os.path import exists, join + +def first(seq): + return next(iter(filter(lambda x: x, seq)), '') + +def all_first(*sequences): + return map(lambda x: first(x), sequences) + +# http://codereview.stackexchange.com/questions/13027/joining-url-path-components-intelligently +# I wonder why this is not a builtin feature in Python +def urljoin(*parts): + schemes, netlocs, paths, queries, fragments = zip(*(urlsplit(part) for part in parts)) + scheme, netloc, query, fragment = all_first(schemes, netlocs, queries, fragments) + path = '/'.join(p.strip('/') for p in paths if p) + return urlunsplit((scheme, netloc, path, query, fragment)) + +def _detect_remote(url, content): + try: + response = urlopen(url) + except Exception: + return False + + if response.getcode() != 200: + return False + + content_type = response.headers.get('content-type', '') + return True if content in content_type else False + +def detect_git(url): + location = urljoin(url, '/info/refs?service=git-upload-pack') + req = Request(location, headers={'User-Agent':'git/2.0.1'}) + return _detect_remote(req, 'x-git') + +def detect_hg(url): + location = urljoin(url, '?cmd=lookup&key=0') + return _detect_remote(location, 'mercurial') + +def detect_local(url): + if exists(join(url, '.git')): + return 'git' + + if exists(join(url, '.hg')): + return 'hg' + + return '' + |