git.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import logging
  2. import os
  3. import subprocess
  4. import tempfile
  5. logger = logging.getLogger(__name__)
  6. class GitException(Exception):
  7. pass
  8. class Repo(object):
  9. def __init__(self, path, repo_url):
  10. self.path = path
  11. self.repo_url = repo_url
  12. def clone(self):
  13. logger.debug('Cloning {0} into {1}'.format(self.repo_url, self.path))
  14. result = _execute('clone', [self.repo_url, '.'], self.path)
  15. if result != 0:
  16. raise GitException('git clone failed')
  17. def _execute(command, args, cwd):
  18. cmd = ['git', command] + args
  19. logger.debug('Executing "{0}" in {1}'.format(' '.join(cmd), cwd))
  20. return subprocess.Popen(cmd, cwd=cwd).wait()
  21. def clone_branch(repo_url, branch="master", folder=None):
  22. return clone(repo_url, branch, folder)
  23. def clone_tag(repo_url, tag, folder=None):
  24. return clone(repo_url, 'refs/tags/' + tag, folder)
  25. def checkout(rep, ref=None):
  26. if ref is None:
  27. ref = 'refs/heads/master'
  28. logger.debug("Checkout ref:{0} in {1}".format(ref, rep.path))
  29. result = _execute('checkout', [ref], rep.path)
  30. if result != 0:
  31. raise GitException('git checkout failed')
  32. return rep.path
  33. def pull(origin, rep, ref=None):
  34. if ref is None:
  35. ref = 'refs/heads/master'
  36. logger.debug("Pull ref:{0} in {1}".format(ref, rep.path))
  37. result = _execute('pull', ['origin', ref], rep.path)
  38. if result != 0:
  39. raise GitException('git pull failed')
  40. checkout(rep, ref)
  41. return rep, rep.path
  42. def clone(repo_url, ref=None, folder=None, rep=None):
  43. if ref is None:
  44. ref = 'refs/heads/master'
  45. logger.debug("Cloning repo_url={0}, ref={1}".format(repo_url, ref))
  46. if folder is None:
  47. folder = tempfile.mkdtemp()
  48. else:
  49. os.mkdir(folder)
  50. logger.debug("folder = {0}".format(folder))
  51. rep = Repo(folder, repo_url)
  52. rep.clone()
  53. if ref:
  54. checkout(rep, ref)
  55. return rep, folder