git-commit-vandalism/git_remote_helpers/git/repo.py
Brandon Casey 23b093ee08 Remove python 2.5'isms
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>
2010-06-13 20:02:50 -07:00

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, ' ')