gitee.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. """
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2023/11/09 17:40:42
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc : gitee async
  8. """
  9. from .base_platform import BasePlatform
  10. import csv, subprocess
  11. import os
  12. from repo_sync.models import Repo
  13. from repo_sync.utils.colors import bcolors
  14. from repo_sync.utils.logger import logger
  15. class GiteeIE(BasePlatform):
  16. """gitee async"""
  17. _host = 'https://gitee.com'
  18. _api = _host + '/api/v5'
  19. def __init__(self, username:str, token:str, host:str=None, params: dict=None) -> None:
  20. super().__init__(username=username, token=token)
  21. self.sess.headers.update({'Content-Type': 'multipart/form-data'})
  22. self.repo_private = True if params.get('gitee_private', "true").lower() == 'true' else False
  23. def create_repo(self, repo_name: str):
  24. """create a repo"""
  25. if not self._repo_exists(repo_name=repo_name):
  26. url = f'{self._api}/user/repos'
  27. form_data = {
  28. 'name': repo_name,
  29. 'private': self.repo_private,
  30. }
  31. r = self.sess.post(url, params=form_data)
  32. if r.status_code != 201:
  33. logger.error(f'create repo {repo_name} failed, status code {r.status_code}')
  34. return
  35. logger.info(f'create repo {repo_name} success')
  36. logger.info(f'{self._host}/{self.username}/{repo_name}')
  37. def delete(self, repo_name: str):
  38. """delete a repo"""
  39. url = f'{self._api}/repos/{self.username}/{repo_name}'
  40. response = self.sess.delete(url)
  41. if response.status_code == 204:
  42. logger.info(f'Repository: {repo_name} deleted from gitee successfully!')
  43. else:
  44. logger.error(f'Failed to delete repository: {repo_name} from gitee. Error {response.status_code}: {response.text}')
  45. def get_repo_list(self) -> list:
  46. """get repo list"""
  47. if os.path.exists(self.repo_list_path):
  48. with open(self.repo_list_path, 'r', encoding='utf8') as f:
  49. reader = csv.reader(f)
  50. for row in reader:
  51. repo = Repo()
  52. repo.__dict__ = row
  53. self.repos.append(repo)
  54. return self.repos
  55. url = f'{self._api}/user/repos'
  56. r = self.sess.get(url)
  57. if r.status_code != 200:
  58. logger.error(f'get repo list failed, status code {r.status_code}')
  59. return
  60. repo_list = r.json()
  61. self.save_csv()
  62. return repo_list
  63. def clone(self):
  64. pass
  65. def pull(self, local_repo_path: str):
  66. if local_repo_path[-1] == os.path.sep:
  67. local_repo_path = local_repo_path[:-1]
  68. repo_name = local_repo_path.split(os.path.sep)[-1]
  69. logger.info(f'pull repo:{self.username}/{repo_name} from gitee')
  70. os.chdir(local_repo_path)
  71. os.system('git remote remove origin_gitee')
  72. os.system(f'git remote add origin_gitee https://{self.username}:{self.token}@gitee.com/{self.username}/{repo_name}.git')
  73. result = subprocess.run(['git', 'symbolic-ref', '--short', 'HEAD'], capture_output=True, text=True, encoding='utf-8')
  74. current_branch = result.stdout.strip()
  75. os.system(f'git pull origin_gitee {current_branch}')
  76. os.system('git remote remove origin_gitee')
  77. os.chdir('..')
  78. logger.info(f'pull from gitee success')
  79. def push(self, local_repo_path: str):
  80. if local_repo_path[-1] == os.path.sep:
  81. local_repo_path = local_repo_path[:-1]
  82. repo_name = local_repo_path.split(os.path.sep)[-1]
  83. logger.info(f'push repo:{self.username}/{repo_name} to gitee')
  84. self.create_repo(repo_name)
  85. os.chdir(local_repo_path)
  86. os.system('git remote remove origin_gitee')
  87. os.system(f'git remote add origin_gitee https://{self.username}:{self.token}@gitee.com/{self.username}/{repo_name}.git')
  88. result = subprocess.run(['git', 'symbolic-ref', '--short', 'HEAD'], capture_output=True, text=True, encoding='utf-8')
  89. current_branch = result.stdout.strip()
  90. os.system(f'git pull origin_gitee {current_branch}')
  91. os.system(f'git push -u origin_gitee {current_branch}')
  92. os.system('git remote remove origin_gitee')
  93. os.chdir('..')
  94. logger.info(f'push to gitee success')
  95. def _repo_exists(self, repo_name: str):
  96. """check if a repo exists
  97. 不存在,{
  98. "message": "Not Found Project"
  99. }
  100. 存在:返回 repo 数据
  101. """
  102. url = f'{self._api}/repos/{self.username}/{repo_name}'
  103. try:
  104. response = self.sess.get(url)
  105. if response.status_code == 200 and response.json()['message'] != 'Not Found Project':
  106. logger.info(f'repo: {repo_name} is existed.')
  107. return True
  108. except Exception as e:
  109. return False
  110. @classmethod
  111. def suitable(cls, extractor: str) -> bool:
  112. """check if this extractor is suitable for this platform"""
  113. return extractor == 'gitee'