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
|
# repository.py -- For dealing wih git repositories.
# Copyright (C) 2007 James Westby <jw+debian@jameswestby.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2
# of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
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)
|