cnb.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. '''
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2025/05/05 18:19:43
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc : https://api.cnb.cool/
  8. '''
  9. from .base_platform import BasePlatform
  10. from repo_sync.utils.colors import bcolors
  11. import os, subprocess,json
  12. from repo_sync.utils.logger import logger
  13. class CnbIE(BasePlatform):
  14. """ cnb platform """
  15. def __init__(self, username:str, token:str, host:str =None ,params: dict = None) -> None:
  16. super().__init__(username=username,token=token)
  17. self._host = 'https://api.cnb.cool' if host is None else host
  18. self._api: str = self._host # + '/api/v5'
  19. self.repo_private = True if params.get('cnb_private', "true").lower() == 'true' else False
  20. self.group = params.get('cnb_group', "")
  21. if not self.group:
  22. raise ValueError("cnb_group is required")
  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}/{self.group}/-/repos'
  27. response = self.sess.post(url, json={
  28. "name": repo_name,
  29. "description": "xxx",
  30. "visibility": "private" if self.repo_private else "public"
  31. })
  32. if response.status_code == 201:
  33. logger.info(f'create repo {self.group}/{repo_name} success')
  34. else:
  35. logger.error(f'create repo {self.group}/{repo_name} failed. {response.text}')
  36. else:
  37. logger.warning(f'repo {self.group}/{repo_name} already exists')
  38. def delete(self, repo_name: str):
  39. """ delete a repo """
  40. url = f'{self._api}/{self.group}/{repo_name}'
  41. response = self.sess.delete(url)
  42. if response.status_code == 200:
  43. logger.info(f'delete repo {self.group}/{repo_name} success')
  44. else:
  45. logger.error(f'delete repo {self.group}/{repo_name} failed. {response.text}')
  46. return
  47. logger.info(f'{self._host}/{self.group}/{repo_name}')
  48. def push(self, local_repo_path: str):
  49. if local_repo_path[-1] == os.path.sep:
  50. local_repo_path = local_repo_path[:-1]
  51. repo_name = local_repo_path.split(os.path.sep)[-1]
  52. logger.info(f'push repo:{self.group}/{repo_name} to cnb')
  53. self.create_repo(repo_name)
  54. os.chdir(local_repo_path)
  55. os.system('git remote remove origin_cnb')
  56. os.system(f'git remote add origin_cnb https://git:{self.token}@cnb.cool/{self.group}/{repo_name}.git')
  57. result = subprocess.run(['git', 'symbolic-ref', '--short', 'HEAD'], capture_output=True, text=True, encoding='utf-8')
  58. current_branch = result.stdout.strip()
  59. os.system(f'git pull origin_cnb {current_branch}')
  60. os.system(f'git push -u origin_cnb {current_branch}')
  61. os.system('git remote remove origin_cnb')
  62. os.chdir('..')
  63. logger.info(f'push to cnb success')
  64. def pull(self, local_repo_path: str):
  65. if local_repo_path[-1] == os.path.sep:
  66. local_repo_path = local_repo_path[:-1]
  67. repo_name = local_repo_path.split(os.path.sep)[-1]
  68. logger.info(f'pull repo:{self.group}/{repo_name} from cnb')
  69. os.chdir(local_repo_path)
  70. os.system('git remote remove origin_cnb')
  71. os.system(f'git remote add origin_cnb https://git:{self.token}@cnb.cool/{self.group}/{repo_name}.git')
  72. result = subprocess.run(['git', 'symbolic-ref', '--short', 'HEAD'], capture_output=True, text=True, encoding='utf-8')
  73. current_branch = result.stdout.strip()
  74. os.system(f'git pull origin_cnb {current_branch}')
  75. os.system('git remote remove origin_cnb')
  76. os.chdir('..')
  77. logger.info(f'pull from cnb success')
  78. def _repo_exists(self, repo_name: str) -> bool:
  79. """ check if repo exists """
  80. url = f"{self._api}/{self.group}/{repo_name}"
  81. try:
  82. response = self.sess.get(url)
  83. if response.status_code == 200:
  84. logger.info(f'repo: {repo_name} is existed.')
  85. return True
  86. except Exception as e:
  87. return False
  88. @classmethod
  89. def suitable(cls, extractor: str) -> bool:
  90. """check if this extractor is suitable for this platform"""
  91. if extractor == 'cnb':
  92. return True
  93. else:
  94. return False