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
|
import os
from objects import ShaFile
objectdir = 'objects'
symref = 'ref: '
class Repository(object):
ref_locs = ['', 'refs', 'refs/tags', 'refs/heads', 'refs/remotes']
def __init__(self, root):
self._basedir = root
def basedir(self):
return self._basedir
def object_dir(self):
return os.path.join(self.basedir(), objectdir)
def _get_ref(self, file):
f = open(file, 'rb')
try:
contents = f.read()
if contents.startswith(symref):
ref = contents[len(symref):]
if ref[-1] == '\n':
ref = ref[:-1]
return self.ref(ref)
assert len(contents) == 41, 'Invalid ref'
return contents[:-1]
finally:
f.close()
def ref(self, name):
for dir in self.ref_locs:
file = os.path.join(self.basedir(), dir, name)
if os.path.exists(file):
return self._get_ref(file)
def head(self):
return self.ref('HEAD')
def get_object(self, sha):
assert len(sha) == 40, "Incorrect sha length"
dir = sha[:2]
file = sha[2:]
path = os.path.join(self.object_dir(), dir, file)
if not os.path.exists(path):
return None
return ShaFile.from_file(path)
|