зеркало из https://github.com/mozilla/gecko-dev.git
53 строки
1.6 KiB
Python
53 строки
1.6 KiB
Python
|
#!/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 ''
|
||
|
|