repository.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import os
  2. from objects import ShaFile
  3. objectdir = 'objects'
  4. symref = 'ref: '
  5. class Repository(object):
  6. ref_locs = ['', 'refs', 'refs/tags', 'refs/heads', 'refs/remotes']
  7. def __init__(self, root):
  8. self._basedir = root
  9. def basedir(self):
  10. return self._basedir
  11. def object_dir(self):
  12. return os.path.join(self.basedir(), objectdir)
  13. def _get_ref(self, file):
  14. f = open(file, 'rb')
  15. try:
  16. contents = f.read()
  17. if contents.startswith(symref):
  18. ref = contents[len(symref):]
  19. if ref[-1] == '\n':
  20. ref = ref[:-1]
  21. return self.ref(ref)
  22. assert len(contents) == 41, 'Invalid ref'
  23. return contents[:-1]
  24. finally:
  25. f.close()
  26. def ref(self, name):
  27. for dir in self.ref_locs:
  28. file = os.path.join(self.basedir(), dir, name)
  29. if os.path.exists(file):
  30. return self._get_ref(file)
  31. def head(self):
  32. return self.ref('HEAD')
  33. def get_object(self, sha):
  34. assert len(sha) == 40, "Incorrect sha length"
  35. dir = sha[:2]
  36. file = sha[2:]
  37. path = os.path.join(self.object_dir(), dir, file)
  38. if not os.path.exists(path):
  39. return None
  40. return ShaFile.from_file(path)