23b093ee08
The following python 2.5 features were worked around: * the sha module is used as a fallback when the hashlib module is not available * the 'any' built-in method was replaced with a 'for' loop * a conditional expression was replaced with an 'if' statement * the subprocess.check_call method was replaced by a call to subprocess.Popen followed by a call to subprocess.wait with a check of its return status These changes allow the python infrastructure to be used with python 2.4 which is distributed with RedHat's RHEL 5, for example. t5800 was updated to check for python >= 2.4 to reflect these changes. Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil> Signed-off-by: Junio C Hamano <gitster@pobox.com>
76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
import os
|
|
import subprocess
|
|
|
|
def sanitize(rev, sep='\t'):
|
|
"""Converts a for-each-ref line to a name/value pair.
|
|
"""
|
|
|
|
splitrev = rev.split(sep)
|
|
branchval = splitrev[0]
|
|
branchname = splitrev[1].strip()
|
|
if branchname.startswith("refs/heads/"):
|
|
branchname = branchname[11:]
|
|
|
|
return branchname, branchval
|
|
|
|
def is_remote(url):
|
|
"""Checks whether the specified value is a remote url.
|
|
"""
|
|
|
|
prefixes = ["http", "file", "git"]
|
|
|
|
for prefix in prefixes:
|
|
if url.startswith(prefix):
|
|
return True
|
|
return False
|
|
|
|
class GitRepo(object):
|
|
"""Repo object representing a repo.
|
|
"""
|
|
|
|
def __init__(self, path):
|
|
"""Initializes a new repo at the given path.
|
|
"""
|
|
|
|
self.path = path
|
|
self.head = None
|
|
self.revmap = {}
|
|
self.local = not is_remote(self.path)
|
|
|
|
if(self.path.endswith('.git')):
|
|
self.gitpath = self.path
|
|
else:
|
|
self.gitpath = os.path.join(self.path, '.git')
|
|
|
|
if self.local and not os.path.exists(self.gitpath):
|
|
os.makedirs(self.gitpath)
|
|
|
|
def get_revs(self):
|
|
"""Fetches all revs from the remote.
|
|
"""
|
|
|
|
args = ["git", "ls-remote", self.gitpath]
|
|
path = ".cached_revs"
|
|
ofile = open(path, "w")
|
|
|
|
child = subprocess.Popen(args, stdout=ofile)
|
|
if child.wait() != 0:
|
|
raise CalledProcessError
|
|
output = open(path).readlines()
|
|
self.revmap = dict(sanitize(i) for i in output)
|
|
if "HEAD" in self.revmap:
|
|
del self.revmap["HEAD"]
|
|
self.revs = self.revmap.keys()
|
|
ofile.close()
|
|
|
|
def get_head(self):
|
|
"""Determines the head of a local repo.
|
|
"""
|
|
|
|
if not self.local:
|
|
return
|
|
|
|
path = os.path.join(self.gitpath, "HEAD")
|
|
head = open(path).readline()
|
|
self.head, _ = sanitize(head, ' ')
|