git_api.py 2.8 KB

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