git.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import tempfile
  2. import logging
  3. from dulwich import index
  4. from dulwich.client import get_transport_and_path
  5. from dulwich.repo import Repo
  6. logger = logging.getLogger(__name__)
  7. def clone_branch(repo_url, branch="master", folder=None):
  8. return clone(repo_url, 'refs/heads/' + branch, folder)
  9. def clone_tag(repo_url, tag, folder=None):
  10. return clone(repo_url, 'refs/tags/' + tag, folder)
  11. def checkout(rep, ref=None):
  12. is_commit = False
  13. if ref is None:
  14. ref = 'refs/heads/master'
  15. elif not ref.startswith('refs/'):
  16. is_commit = True
  17. if is_commit:
  18. rep['HEAD'] = rep.commit(ref)
  19. else:
  20. rep['HEAD'] = rep.refs[ref]
  21. indexfile = rep.index_path()
  22. tree = rep["HEAD"].tree
  23. index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree)
  24. return rep.path
  25. def clone(repo_url, ref=None, folder=None):
  26. is_commit = False
  27. if ref is None:
  28. ref = 'refs/heads/master'
  29. elif not ref.startswith('refs/'):
  30. is_commit = True
  31. logger.debug("clone repo_url={0}, ref={1}".format(repo_url, ref))
  32. if folder is None:
  33. folder = tempfile.mkdtemp()
  34. logger.debug("folder = {0}".format(folder))
  35. rep = Repo.init(folder)
  36. client, relative_path = get_transport_and_path(repo_url)
  37. logger.debug("client={0}".format(client))
  38. remote_refs = client.fetch(relative_path, rep)
  39. for k, v in remote_refs.iteritems():
  40. try:
  41. rep.refs.add_if_new(k, v)
  42. except:
  43. pass
  44. if ref.startswith('refs/tags'):
  45. ref = rep.ref(ref)
  46. is_commit = True
  47. if is_commit:
  48. rep['HEAD'] = rep.commit(ref)
  49. else:
  50. rep['HEAD'] = remote_refs[ref]
  51. indexfile = rep.index_path()
  52. tree = rep["HEAD"].tree
  53. index.build_index_from_tree(rep.path, indexfile, rep.object_store, tree)
  54. logger.debug("done")
  55. return rep, folder