git_api.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf import settings
  4. from api.utils.command import list_files_and_folders
  5. from git.repo.base import Repo
  6. from git.repo.fun import is_git_dir
  7. from git.util import join_path
  8. from git.exc import GitCommandError
  9. '''
  10. '''
  11. def get_users_folders():
  12. fullpath = join_path(settings.GIT_PATH)
  13. folders = list_files_and_folders(fullpath)
  14. return folders.get('items', [])
  15. '''
  16. '''
  17. def get_repos_paths():
  18. users_folders = get_users_folders()
  19. repos = []
  20. for folder in users_folders:
  21. fullpath = join_path(settings.GIT_PATH, folder)
  22. subfolders = list_files_and_folders(fullpath)
  23. for subfolder in subfolders.get('items', []):
  24. fullpath = join_path(settings.GIT_PATH, folder, subfolder)
  25. if not is_git_dir(fullpath):
  26. continue
  27. repos.append(fullpath)
  28. return repos
  29. '''
  30. '''
  31. def resolve_owner_by_name(name=None):
  32. if not name:
  33. return None
  34. paths = [r for r in get_odoo_modules_repos_paths() if r.endswith('/%s.git' % name)]
  35. if len(paths) == 0:
  36. return None
  37. return paths[0].replace('%s/' % settings.GIT_PATH, '').replace('/%s.git' % name, '')
  38. '''
  39. '''
  40. def clone_repo(name=None, to=None, branch='master'):
  41. if not name or not to:
  42. return False
  43. owner = resolve_owner_by_name(name)
  44. if not owner:
  45. return False
  46. repo_path = '%s.git' % join_path(settings.GIT_PATH, owner, name)
  47. try:
  48. repo = Repo(repo_path)
  49. repo.clone(join_path(to, name), branch=branch)
  50. repo.close()
  51. return True
  52. except GitCommandError:
  53. return False
  54. '''
  55. '''
  56. def pull_repo(name=None, to=None):
  57. if not name or not to:
  58. return False
  59. '''
  60. '''
  61. def get_odoo_modules_repos_paths():
  62. repos_paths = get_repos_paths()
  63. modules_paths = []
  64. for repo_path in repos_paths:
  65. r = Repo(repo_path)
  66. try:
  67. if '__openerp__.py' in [o.path for o in r.tree()]:
  68. modules_paths.append(repo_path)
  69. except ValueError:
  70. continue
  71. finally:
  72. r.close()
  73. return modules_paths
  74. '''
  75. '''
  76. def get_odoo_modules_repos_names(include_owners=False):
  77. repos_paths = get_odoo_modules_repos_paths()
  78. repos_names = []
  79. for repos_path in repos_paths:
  80. repo_with_user = repos_path.replace('%s/' % settings.GIT_PATH, '')
  81. repo_with_user = repo_with_user.split('/')
  82. repo_with_user[1] = repo_with_user[1].replace('.git', '')
  83. if not include_owners:
  84. repos_names.append(repo_with_user[1])
  85. continue
  86. repos_names.append({
  87. 'name': repo_with_user[1],
  88. 'owner': repo_with_user[0]
  89. })
  90. return repos_names