summaryrefslogtreecommitdiff
path: root/git_remote_helpers/git/repo.py
blob: 82d5f78c7eeb3eef7e307d654b424b4c831bf2ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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"]
 
    return any(url.startswith(i) for i in prefixes)
 
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")
 
        subprocess.check_call(args, stdout=ofile)
        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, ' ')