| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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)
|