git_api.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. import os
  10. '''
  11. '''
  12. def get_users_folders():
  13. fullpath = join_path(settings.GIT_PATH)
  14. folders = list_files_and_folders(fullpath)
  15. return folders.get('items', [])
  16. '''
  17. '''
  18. def get_repos_paths():
  19. users_folders = get_users_folders()
  20. repos = []
  21. for folder in users_folders:
  22. fullpath = join_path(settings.GIT_PATH, folder)
  23. subfolders = list_files_and_folders(fullpath)
  24. for subfolder in subfolders.get('items', []):
  25. fullpath = join_path(settings.GIT_PATH, folder, subfolder)
  26. if not is_git_dir(fullpath):
  27. continue
  28. repos.append(fullpath)
  29. return repos
  30. '''
  31. '''
  32. def resolve_owner_by_name(name=None):
  33. if not name:
  34. return None
  35. paths = [r for r in get_odoo_modules_repos_paths() if r.endswith('/%s.git' % name)]
  36. if len(paths) == 0:
  37. return None
  38. return paths[0].replace('%s/' % settings.GIT_PATH, '').replace('/%s.git' % name, '')
  39. '''
  40. '''
  41. def clone_repo(name=None, to=None, branch='master'):
  42. return clone_repos([name], to, branch)
  43. '''
  44. '''
  45. def clone_repos(repo_names=[], to=None, branch='master'):
  46. if len(repo_names) == 0:
  47. return False
  48. for user_folder in get_users_folders():
  49. for repo_name in repo_names:
  50. repo_path = '%s.git' % join_path(settings.GIT_PATH, user_folder, repo_name)
  51. if not os.path.exists(repo_path):
  52. continue
  53. try:
  54. repo = Repo(repo_path)
  55. repo.clone(join_path(to, repo_name), branch=branch)
  56. repo.close()
  57. except GitCommandError:
  58. pass
  59. return True
  60. '''
  61. '''
  62. def pull_repo(name=None, to=None):
  63. if not name or not to:
  64. return False
  65. '''
  66. '''
  67. def get_odoo_modules_repos_paths():
  68. repos_paths = get_repos_paths()
  69. modules_paths = []
  70. for repo_path in repos_paths:
  71. r = Repo(repo_path)
  72. try:
  73. if '__openerp__.py' in [o.path for o in r.tree()]:
  74. modules_paths.append(repo_path)
  75. except ValueError:
  76. continue
  77. finally:
  78. r.close()
  79. return modules_paths
  80. '''
  81. '''
  82. def get_odoo_modules_repos_names(include_owners=False):
  83. repos_paths = get_odoo_modules_repos_paths()
  84. repos_names = []
  85. for repos_path in repos_paths:
  86. repo_with_user = repos_path.replace('%s/' % settings.GIT_PATH, '')
  87. repo_with_user = repo_with_user.split('/')
  88. repo_with_user[1] = repo_with_user[1].replace('.git', '')
  89. if not include_owners:
  90. repos_names.append(repo_with_user[1])
  91. continue
  92. repos_names.append({
  93. 'name': repo_with_user[1],
  94. 'owner': repo_with_user[0]
  95. })
  96. return repos_names