Browse Source

print替换为logger

liuyuqi-cnb 3 months ago
parent
commit
f574f812ca

+ 4 - 2
repo_sync/__init__.py

@@ -1,6 +1,7 @@
 from .repo_sync import RepoSync
 from .version import __version__
 from .options import parser_args
+from .utils.logger import logger
 import sys
 
 def main(argv=None):
@@ -8,7 +9,7 @@ def main(argv=None):
     try:
         args = parser_args()
         if args.get('version'):
-            print(__version__)
+            logger.info(__version__)
             sys.exit(0)
         if args.get('command', '') == '':
             # logging.error("command is empty")
@@ -17,6 +18,7 @@ def main(argv=None):
         rs = RepoSync(args)
         rs.run()
     except KeyboardInterrupt:
-        sys.exit('\nERROR: Interrupted by user')
+        logger.error('ERROR: Interrupted by user')
+        sys.exit(1)
 
 # GUI入口预留

+ 14 - 15
repo_sync/platform/aliyun.py

@@ -9,14 +9,13 @@ read docs:
 https://help.aliyun.com/document_detail/460450.html?spm=a2c4g.460449.0.0.4cc62367VCclNI
 '''
 
-from traceback import print_tb
 from repo_sync.platform.base_platform import BasePlatform
 import csv,subprocess
 import os
 from repo_sync.models import Repo
 from repo_sync.utils.colors import bcolors
 import json
-
+from repo_sync.utils.logger import logger
 class AliyunDevOpsIE(BasePlatform):
     """aliyun devops"""
 
@@ -37,7 +36,7 @@ class AliyunDevOpsIE(BasePlatform):
         url = f'{self._api}/codeup/organizations/{self.companyId}/repositories/{repo_name}'
         r = self.sess.get(url)
         if r.status_code != 200:
-            print(f"{bcolors.FAIL}get repo info failed, status code {r.status_code}{bcolors.ENDC}")
+            logger.error(f'get repo info failed, status code {r.status_code}')
             return False
         return True
 
@@ -53,15 +52,15 @@ class AliyunDevOpsIE(BasePlatform):
             r = self.sess.post(url, data=json.dumps(form_data))
             # r = self.sess.post(url, json=json.dumps(form_data))
             if r.status_code != 200:
-                print(f"{bcolors.FAIL}create repo {repo_name} failed, status code {r.status_code}{bcolors.ENDC}")
-                print(f"{bcolors.FAIL}response: {r.text}{bcolors.ENDC}")
+                logger.error(f'create repo {repo_name} failed, status code {r.status_code}')
+                logger.error(f'response: {r.text}')
                 return False
-            print(f"{bcolors.OKGREEN}create repo {repo_name} success{bcolors.ENDC}")
-            print(f"{bcolors.OKGREEN}https://codeup.aliyun.com/{self.companyId}/{repo_name}{bcolors.ENDC}")
+            logger.info(f'create repo {repo_name} success')
+            logger.info(f'https://codeup.aliyun.com/{self.companyId}/{repo_name}')
             return True
         else:
-            print(f"{bcolors.OKGREEN}repo {repo_name} already exists{bcolors.ENDC}")
-            print(f"{bcolors.OKGREEN}https://codeup.aliyun.com/{self.companyId}/{repo_name}{bcolors.ENDC}")
+            logger.info(f'repo {repo_name} already exists')
+            logger.info(f'https://codeup.aliyun.com/{self.companyId}/{repo_name}')
             return True 
 
     def delete(self, repo_name: str):
@@ -71,15 +70,15 @@ class AliyunDevOpsIE(BasePlatform):
 
             response = self.sess.delete(url)
             if response.status_code == 200:
-                print(f"{bcolors.OKGREEN}Project: {repo_name} deleted from aliyun successfully!{bcolors.ENDC}")
+                logger.info(f'Project: {repo_name} deleted from aliyun successfully!')
             else:
-                print(f'{bcolors.FAIL}Failed to delete project: {repo_name} from aliyun. Error {response.status_code}: {response.text}{bcolors.ENDC}')
+                logger.error(f'Failed to delete project: {repo_name} from aliyun. Error {response.status_code}: {response.text}')
     
     def pull(self, local_repo_path: str):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f"{bcolors.OKGREEN}pull repo:{self.username}/{repo_name} from aliyun{bcolors.ENDC}")
+        logger.info(f'pull repo:{self.username}/{repo_name} from aliyun')
         os.chdir(local_repo_path)
 
         os.system('git remote remove origin_aliyun')
@@ -90,14 +89,14 @@ class AliyunDevOpsIE(BasePlatform):
         os.system('git remote remove origin_aliyun')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'pull from aliyun success' + bcolors.ENDC)
+        logger.info(f'pull from aliyun success')
 
     def push(self, local_repo_path: str):
         """ push local repo to aliyun"""
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'push repo:{self.username}/{repo_name} to aliyun' + bcolors.ENDC)
+        logger.info(f'push repo:{self.username}/{repo_name} to aliyun')
         self.create_repo(repo_name)
         os.chdir(local_repo_path)
         os.system('git remote remove origin_aliyun')
@@ -111,7 +110,7 @@ class AliyunDevOpsIE(BasePlatform):
         os.system('git remote remove origin_aliyun')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'push to aliyun success' + bcolors.ENDC)
+        logger.info(f'push to aliyun success')
 
 
     def clone(self):

+ 2 - 2
repo_sync/platform/base_platform.py

@@ -1,6 +1,6 @@
 import requests,csv,os
 from repo_sync.models import Repo
-from repo_sync.utils.colors import bcolors
+from repo_sync.utils.logger import logger
 
 class BasePlatform(object):
     """base platform"""
@@ -57,7 +57,7 @@ class BasePlatform(object):
     def save_csv(self):
         with open(self.repo_list_path, 'w', newline='') as f:
             if len(self.repos) == 0:
-                print(f"{bcolors.WARNING}repo list is empty, please delete repo_list.csv and try again{bcolors.ENDC}")
+                logger.warning("repo list is empty, please delete repo_list.csv and try again")
                 return
             writer = csv.DictWriter(f, fieldnames=self.repos[0].__dict__.keys(), lineterminator='\n')
             writer.writeheader()

+ 13 - 13
repo_sync/platform/cnb.py

@@ -9,7 +9,7 @@
 from .base_platform import BasePlatform
 from repo_sync.utils.colors import bcolors
 import os, subprocess,json
-
+from repo_sync.utils.logger import logger
 
 class CnbIE(BasePlatform):
     """ cnb platform """
@@ -33,29 +33,29 @@ class CnbIE(BasePlatform):
              "visibility": "private" if self.repo_private else "public"
              })
             if response.status_code == 201:
-                print(bcolors.OKGREEN + f'create repo {self.group}/{repo_name} success' + bcolors.ENDC)
+                logger.info(f'create repo {self.group}/{repo_name} success')
             else:
-                print(bcolors.FAIL + f'create repo {self.group}/{repo_name} failed. {response.text}' + bcolors.ENDC)
+                logger.error(f'create repo {self.group}/{repo_name} failed. {response.text}')
         else:
-            print(bcolors.WARNING + f'repo {self.group}/{repo_name} already exists' + bcolors.ENDC)
+            logger.warning(f'repo {self.group}/{repo_name} already exists')
 
     def delete(self, repo_name: str):
         """ delete a repo """
         url = f'{self._api}/{self.group}/{repo_name}'
         response = self.sess.delete(url)
         if response.status_code == 200:
-            print(bcolors.OKGREEN + f'delete repo {self.group}/{repo_name} success' + bcolors.ENDC)
+            logger.info(f'delete repo {self.group}/{repo_name} success')
         else:
-            print(bcolors.FAIL + f'delete repo {self.group}/{repo_name} failed. {response.text}' + bcolors.ENDC)
+            logger.error(f'delete repo {self.group}/{repo_name} failed. {response.text}')
             return
-        print(bcolors.OKGREEN + f'create repo {self.group}/{repo_name} success' + bcolors.ENDC)
-        print(f'{bcolors.OKGREEN}{self._host}/{self.group}/{repo_name}{bcolors.ENDC}')
+        logger.info(f'create repo {self.group}/{repo_name} success')
+        logger.info(f'{self._host}/{self.group}/{repo_name}')
             
     def push(self, local_repo_path: str):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'push repo:{self.group}/{repo_name} to cnb' + bcolors.ENDC)
+        logger.info(f'push repo:{self.group}/{repo_name} to cnb')
         self.create_repo(repo_name)
         os.chdir(local_repo_path)
         os.system('git remote remove origin_cnb')
@@ -69,13 +69,13 @@ class CnbIE(BasePlatform):
         os.system('git remote remove origin_cnb')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'push to cnb success' + bcolors.ENDC)
+        logger.info(f'push to cnb success')
 
     def pull(self, local_repo_path: str):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'pull repo:{self.group}/{repo_name} from cnb' + bcolors.ENDC)
+        logger.info(f'pull repo:{self.group}/{repo_name} from cnb')
         
         os.chdir(local_repo_path)
         os.system('git remote remove origin_cnb')
@@ -87,7 +87,7 @@ class CnbIE(BasePlatform):
         os.system('git remote remove origin_cnb')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'pull from cnb success' + bcolors.ENDC)
+        logger.info(f'pull from cnb success')
     
 
     def _repo_exists(self, repo_name: str) -> bool:
@@ -96,7 +96,7 @@ class CnbIE(BasePlatform):
         try:
             response = self.sess.get(url)
             if response.status_code == 200:
-                print(f'{bcolors.OKGREEN}repo: {repo_name} is existed. {bcolors.ENDC}')
+                logger.info(f'repo: {repo_name} is existed.')
                 return True
         except Exception as e:
             return False

+ 23 - 23
repo_sync/platform/coding/coding.py

@@ -14,6 +14,7 @@ from repo_sync.platform.base_platform import BasePlatform
 from .project import Project
 from .repo import Repo
 from repo_sync.utils.colors import bcolors
+from repo_sync.utils.logger import logger
 
 class CodingIE(BasePlatform):
     """coding util"""
@@ -44,10 +45,10 @@ class CodingIE(BasePlatform):
         r = self.sess.post(self.url, json=data)
         if r.status_code == 200:
             res_data = r.json()
-            print(bcolors.OKGREEN + 'Create project success' + bcolors.ENDC)
+            logger.info(f'Create project success: {res_data}')
             return True
         else:
-            print(bcolors.FAIL + 'Failed to create project' + bcolors.ENDC)
+            logger.error(f'Failed to create project: {r.text}')
             return False
     
     def delete_project(self):
@@ -58,10 +59,10 @@ class CodingIE(BasePlatform):
         r = self.sess.post(self.url, json=data)
         if r.status_code == 200:
             res_data = r.json()
-            print(bcolors.OKGREEN + 'Delete project success' + bcolors.ENDC)
+            logger.info(f'Delete project success: {res_data}')
             return True
         else:
-            print(bcolors.FAIL + 'Failed to delete project' + bcolors.ENDC)
+            logger.error(f'Failed to delete project: {r.text}')
             return False
     
     def get_project_list(self):
@@ -134,9 +135,9 @@ class CodingIE(BasePlatform):
                         currentPage += 1
                     return DepotList
                 else:
-                    print(bcolors.WARNING + f'Cannot find repo in project {self.project_name}' + bcolors.ENDC)
+                    logger.warning(f'Cannot find repo in project {self.project_name}')
             except Exception as e:
-                print(bcolors.FAIL + str(e) + bcolors.ENDC)
+                logger.error(f'Error retrieving repo list: {str(e)}')
         
     def _repo_exists(self, repo_name: str):
         """get repo list"""
@@ -170,14 +171,14 @@ class CodingIE(BasePlatform):
                             )
                         break
                     if depot is None:
-                        print(bcolors.WARNING + f'Cannot find repo {repo_name} in project {self.project_name}' + bcolors.ENDC)
+                        logger.warning(f'Cannot find repo {repo_name} in project {self.project_name}')
                     else:
-                        print(bcolors.OKGREEN + f'Find repo {repo_name} in project {self.project_name}' + bcolors.ENDC)
+                        logger.info(f'Find repo {repo_name} in project {self.project_name}')
                     return depot
                 else:
-                    print(bcolors.WARNING + f'Cannot find repo {repo_name} in project {self.project_name}' + bcolors.ENDC)
+                    logger.warning(f'Cannot find repo {repo_name} in project {self.project_name}')
             except Exception as e:
-                print(bcolors.FAIL + f'Cannot find repo {repo_name} in project {self.project_name}: {str(e)}' + bcolors.ENDC)
+                logger.error(f'Cannot find repo {repo_name} in project {self.project_name}: {str(e)}')
     
     def get_project_info(self) -> Project:
         data = {
@@ -203,8 +204,8 @@ class CodingIE(BasePlatform):
                     )
                     return project
             except Exception as e:
-                print(bcolors.FAIL + 'Error retrieving project info: ' + str(e) + bcolors.ENDC)
-                print(bcolors.FAIL + str(res_data) + bcolors.ENDC)
+                logger.error(f'Error retrieving project info: {str(e)}')
+                logger.error(f'{res_data}')
     
     def create_repo(self, repo_name: str):
         """create a repo"""
@@ -222,14 +223,14 @@ class CodingIE(BasePlatform):
                 }
                 r = self.sess.post(self.url, json=data)
                 if r.status_code == 200:
-                    print(bcolors.OKGREEN + f'Create repo {repo_name} success' + bcolors.ENDC)
-                    print(bcolors.OKGREEN + f'https://e.coding.net/{self.username}/{self.project_name}/{repo_name}' + bcolors.ENDC)
+                    logger.info(f'Create repo {repo_name} success')
+                    logger.info(f'https://e.coding.net/{self.username}/{self.project_name}/{repo_name}')
                     return True
                 else:
-                    print(bcolors.FAIL + 'Failed to create repo' + bcolors.ENDC)
+                    logger.error(f'Failed to create repo')
                     return False
         else:
-            print(bcolors.FAIL + f"Project: {self.project_name} does not exist, cannot create repo in it." + bcolors.ENDC)
+            logger.error(f"Project: {self.project_name} does not exist, cannot create repo in it.")
     
     def delete(self, repo_name: str):
             """delete a repo"""
@@ -241,7 +242,7 @@ class CodingIE(BasePlatform):
                     }
                 r = self.sess.post(self.url, json=data)
                 if r.status_code == 200:
-                    print(f'{bcolors.OKGREEN}delete repo {repo_name} success{bcolors.ENDC}', data, r.json())
+                    logger.info(f'delete repo {repo_name} success')
                     return True
                 else:
                     return False
@@ -253,7 +254,7 @@ class CodingIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f'{bcolors.OKGREEN} pull repo:{self.username}/{repo_name} from coding{bcolors.ENDC}')
+        logger.info(f'pull repo:{self.username}/{repo_name} from coding')
         os.chdir(local_repo_path)
         try:
             os.system('git remote remove origin_coding')
@@ -268,7 +269,7 @@ class CodingIE(BasePlatform):
         os.system(f'git pull origin_coding {current_branch}')
         os.system('git remote remove origin_coding')
         os.chdir('..')
-        print(f'{bcolors.OKGREEN}pull from coding success{bcolors.ENDC}')
+        logger.info(f'pull from coding success')
 
     def push(self, local_repo_path: str):
         ''' push a local repo to remote
@@ -279,7 +280,7 @@ class CodingIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f'{bcolors.OKGREEN}push repo:{self.username}/{repo_name} to coding{bcolors.ENDC}')
+        logger.info(f'push repo:{self.username}/{repo_name} to coding')
         self.create_repo(repo_name=repo_name)
         os.chdir(local_repo_path)
 
@@ -295,7 +296,7 @@ class CodingIE(BasePlatform):
         os.system(f'git push -u origin_coding {current_branch}')
         os.system('git remote remove origin_coding')
         os.chdir('..')
-        print(f'{bcolors.OKGREEN}push to coding success{bcolors.ENDC}')
+        logger.info(f'push to coding success')
 
     def clone(self, repo_path: str):
         ''' clone all repo from remote
@@ -305,9 +306,8 @@ class CodingIE(BasePlatform):
         for repo in repos:
             try:
                 cmd = f'git clone https://{self.username}:{self.token}@e.coding.net/{self.username}/{self.project_name}/{repo["Name"]}.git {repo_path}/{repo["Name"]}'
-                # print(cmd)
                 os.system(cmd)
-                print(f'{bcolors.OKGREEN}clone success{bcolors.ENDC}')
+                logger.info(f'clone success')
             except Exception as e:
                 pass
 

+ 11 - 11
repo_sync/platform/gitcode.py

@@ -14,7 +14,7 @@ api 和 gitcode 类似
 from .base_platform import BasePlatform
 from repo_sync.utils.colors import bcolors
 import os, subprocess,json
-
+from repo_sync.utils.logger import logger
 class GitcodeIE(BasePlatform):
     """ gitcode platform """
     
@@ -45,19 +45,19 @@ class GitcodeIE(BasePlatform):
             # r = self.sess.post(url, params=json.dumps(form_data))
             r = self.sess.post(url, data=json.dumps(form_data))
             if r.status_code != 200:
-                print(bcolors.FAIL + f'create repo {repo_name} failed, status code {r.status_code}' + bcolors.ENDC)
+                logger.error(f'create repo {repo_name} failed, status code {r.status_code}')
                 return
-            print(bcolors.OKGREEN + f'create repo {repo_name} success' + bcolors.ENDC)
-            print(f'{bcolors.OKGREEN}{self._host}/{self.username}/{repo_name}{bcolors.ENDC}')
+            logger.info(f'create repo {repo_name} success')
+            logger.info(f'{self._host}/{self.username}/{repo_name}')
             
     def delete(self, repo_name: str):
         """ delete a repo """
         url = f'{self._api}/repos/{self.username}/{repo_name}'
         response = self.sess.delete(url)
         if response.status_code == 204:
-            print(bcolors.OKBLUE + f'Repository: {repo_name} deleted from gitcode successfully!' + bcolors.ENDC)
+            logger.info(f'Repository: {repo_name} deleted from gitcode successfully!')
         else:
-            print(bcolors.FAIL + f'Failed to delete repository: {repo_name} from gitcode. Error {response.status_code}: {response.text}' + bcolors.ENDC)
+            logger.error(f'Failed to delete repository: {repo_name} from gitcode. Error {response.status_code}: {response.text}')
     
 
     def get_repo_list(self) -> list:
@@ -71,7 +71,7 @@ class GitcodeIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'push repo:{self.username}/{repo_name} to gitcode' + bcolors.ENDC)
+        logger.info(f'push repo:{self.username}/{repo_name} to gitcode')
         self.create_repo(repo_name)
         os.chdir(local_repo_path)
         os.system('git remote remove origin_gitcode')
@@ -85,13 +85,13 @@ class GitcodeIE(BasePlatform):
         os.system('git remote remove origin_gitcode')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'push to gitcode success' + bcolors.ENDC)
+        logger.info(f'push to gitcode success')
 
     def pull(self, local_repo_path: str):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'pull repo:{self.username}/{repo_name} from gitcode' + bcolors.ENDC)
+        logger.info(f'pull repo:{self.username}/{repo_name} from gitcode')
         
         os.chdir(local_repo_path)
         os.system('git remote remove origin_gitcode')
@@ -103,7 +103,7 @@ class GitcodeIE(BasePlatform):
         os.system('git remote remove origin_gitcode')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'pull from gitcode success' + bcolors.ENDC)
+        logger.info(f'pull from gitcode success')
     
     def _repo_exists(self, repo_name: str) -> bool:
         """ check if repo exists """
@@ -111,7 +111,7 @@ class GitcodeIE(BasePlatform):
         try:
             response = self.sess.get(url)
             if response.status_code == 200:
-                print(f'{bcolors.OKGREEN}repo: {repo_name} is existed. {bcolors.ENDC}')
+                logger.info(f'repo: {repo_name} is existed.')
                 return True
         except Exception as e:
             return False

+ 12 - 12
repo_sync/platform/gitee.py

@@ -12,7 +12,7 @@ import csv, subprocess
 import os
 from repo_sync.models import Repo
 from repo_sync.utils.colors import bcolors
-
+from repo_sync.utils.logger import logger
 class GiteeIE(BasePlatform):
     """gitee async"""
     _host = 'https://gitee.com'
@@ -33,19 +33,19 @@ class GiteeIE(BasePlatform):
             }
             r = self.sess.post(url, params=form_data)
             if r.status_code != 201:
-                print(bcolors.FAIL + f'create repo {repo_name} failed, status code {r.status_code}' + bcolors.ENDC)
+                logger.error(f'create repo {repo_name} failed, status code {r.status_code}')
                 return
-            print(bcolors.OKGREEN + f'create repo {repo_name} success' + bcolors.ENDC)
-            print(bcolors.OKGREEN + f'{self._host}/{self.username}/{repo_name}' + bcolors.ENDC)
+            logger.info(f'create repo {repo_name} success')
+            logger.info(f'{self._host}/{self.username}/{repo_name}')
 
     def delete(self, repo_name: str):
         """delete a repo"""
         url = f'{self._api}/repos/{self.username}/{repo_name}'
         response = self.sess.delete(url)
         if response.status_code == 204:
-            print(bcolors.OKBLUE + f'Repository: {repo_name} deleted from gitee successfully!' + bcolors.ENDC)
+            logger.info(f'Repository: {repo_name} deleted from gitee successfully!')
         else:
-            print(bcolors.FAIL + f'Failed to delete repository: {repo_name} from gitee. Error {response.status_code}: {response.text}' + bcolors.ENDC)
+            logger.error(f'Failed to delete repository: {repo_name} from gitee. Error {response.status_code}: {response.text}')
     
     def get_repo_list(self) -> list:
         """get repo list"""
@@ -61,7 +61,7 @@ class GiteeIE(BasePlatform):
         url = f'{self._api}/user/repos'
         r = self.sess.get(url)
         if r.status_code != 200:
-            print(bcolors.FAIL + f'get repo list failed, status code {r.status_code}' + bcolors.ENDC)
+            logger.error(f'get repo list failed, status code {r.status_code}')
             return
         
         repo_list = r.json()
@@ -75,7 +75,7 @@ class GiteeIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'pull repo:{self.username}/{repo_name} from gitee' + bcolors.ENDC)
+        logger.info(f'pull repo:{self.username}/{repo_name} from gitee')
         
         os.chdir(local_repo_path)
         os.system('git remote remove origin_gitee')
@@ -87,13 +87,13 @@ class GiteeIE(BasePlatform):
         os.system('git remote remove origin_gitee')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'pull from gitee success' + bcolors.ENDC)
+        logger.info(f'pull from gitee success')
     
     def push(self, local_repo_path: str):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(bcolors.WARNING + f'push repo:{self.username}/{repo_name} to gitee' + bcolors.ENDC)
+        logger.info(f'push repo:{self.username}/{repo_name} to gitee')
         self.create_repo(repo_name)
         os.chdir(local_repo_path)
         os.system('git remote remove origin_gitee')
@@ -107,7 +107,7 @@ class GiteeIE(BasePlatform):
         os.system('git remote remove origin_gitee')
         os.chdir('..')
         
-        print(bcolors.OKGREEN + 'push to gitee success' + bcolors.ENDC)
+        logger.info(f'push to gitee success')
     
     def _repo_exists(self, repo_name: str):
         """check if a repo exists
@@ -120,7 +120,7 @@ class GiteeIE(BasePlatform):
         try:
             response = self.sess.get(url)
             if response.status_code == 200 and response.json()['message'] != 'Not Found Project':
-                print(f'{bcolors.OKGREEN}repo: {repo_name} is existed. {bcolors.ENDC}')
+                logger.info(f'repo: {repo_name} is existed.')
                 return True
         except Exception as e:
             return False

+ 14 - 14
repo_sync/platform/github.py

@@ -11,7 +11,7 @@ import json
 import csv, subprocess
 from repo_sync.models import Repo
 from .base_platform import BasePlatform
-from repo_sync.utils.colors import bcolors
+from repo_sync.utils.logger import logger
 
 class GithubIE(BasePlatform):
     """github util"""
@@ -37,20 +37,20 @@ class GithubIE(BasePlatform):
             }
             r = self.sess.post(url, data=json.dumps(payload))
             if r.status_code != 201:
-                print(f'{bcolors.FAIL}create repo {repo_name} failed, status code {r.status_code}{bcolors.ENDC}')
+                logger.error(f'create repo {repo_name} failed, status code {r.status_code}')
                 return
-            print(f'{bcolors.OKGREEN}create repo {repo_name} success{bcolors.ENDC}')
-            print(f'{bcolors.OKGREEN}{self._host}/{self.username}/{repo_name}{bcolors.ENDC}')
+            logger.info(f'create repo {repo_name} success')
+            logger.info(f'{self._host}/{self.username}/{repo_name}')
             
     def delete(self, repo_name: str):
         """delete a repo, maybe request a confirm by input"""
         url = f'{self._host}/repos/{self.username}/{repo_name}'
         response = self.sess.delete(url)
         if response.status_code == 204:
-            print(f'{bcolors.OKGREEN}Repository: {repo_name} deleted from github successfully!{bcolors.ENDC}')
+            logger.info(f'Repository: {repo_name} deleted from github successfully!')
         else:
-            print(f'{bcolors.FAIL}Failed to delete repository: {repo_name} from github. Error {response.status_code}: {response.text}{bcolors.ENDC}')
-        print(f'{bcolors.WARNING}delete repo: {repo_name} from github success{bcolors.ENDC}')
+            logger.error(f'Failed to delete repository: {repo_name} from github. Error {response.status_code}: {response.text}')
+        logger.warning(f'delete repo: {repo_name} from github success')
 
     def _repo_exists(self, repo_name: str):
         """check if a repo exists"""
@@ -58,7 +58,7 @@ class GithubIE(BasePlatform):
         try:
             response = self.sess.get(url)
             if response.status_code == 200:
-                print(f'{bcolors.OKGREEN}repo: {repo_name} is existed. {bcolors.ENDC}')
+                logger.info(f'repo: {repo_name} is existed.')
                 return True
         except Exception as e:
             return False
@@ -68,7 +68,7 @@ class GithubIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f'{bcolors.OKGREEN}pull repo: {self.username}/{repo_name} from github{bcolors.ENDC}')
+        logger.info(f'pull repo: {self.username}/{repo_name} from github')
         
         os.chdir(local_repo_path)
         os.system('git remote remove origin_github')
@@ -82,14 +82,14 @@ class GithubIE(BasePlatform):
         os.system(f'git pull origin_github {current_branch}')
         os.system('git remote remove origin_github')
         os.chdir('..')
-        print(f'{bcolors.OKGREEN}pull from github success{bcolors.ENDC}')
+        logger.info(f'pull from github success')
 
     def push(self, local_repo_path: str):
         """push a local repo to remote"""
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f'{bcolors.OKGREEN}push repo: {self.username}/{repo_name} to github{bcolors.ENDC}')
+        logger.info(f'push repo: {self.username}/{repo_name} to github')
         self.create_repo(repo_name)
         os.chdir(local_repo_path)
         os.system('git remote remove origin_github')
@@ -105,12 +105,12 @@ class GithubIE(BasePlatform):
         os.system(f'git push -u origin_github {current_branch}')
         os.system('git remote remove origin_github')
         os.chdir('..')
-        print(f'{bcolors.OKGREEN}push to github success{bcolors.ENDC}')
+        logger.info(f'push to github success')
 
     def get_repo_list(self) -> list:
         """get all repo list of a user"""
         if os.path.exists(self.repo_list_path):
-            print(f'{bcolors.OKGREEN}repo is exist, please read from {self.repo_list_path} file{bcolors.ENDC}')
+            logger.info(f'repo is exist, please read from {self.repo_list_path} file')
             with open(self.repo_list_path, 'r', newline='') as csvfile:
                 reader = csv.reader(csvfile)
                 for row in reader:
@@ -123,7 +123,7 @@ class GithubIE(BasePlatform):
             while True:
                 r = self.sess.get(url, params={'type': 'all', 'page': page_num})
                 if r.status_code != 200:
-                    print(f'{bcolors.FAIL}request url {url} failed, status code {r.status_code}{bcolors.ENDC}')
+                    logger.error(f'request url {url} failed, status code {r.status_code}')
                     return
                 repo_list = r.json()
                 for repo in repo_list:

+ 15 - 15
repo_sync/platform/gitlab.py

@@ -13,7 +13,7 @@ import csv
 import subprocess
 from .base_platform import BasePlatform
 from repo_sync.models import Repo
-from repo_sync.utils.colors import bcolors
+from repo_sync.utils.logger import logger
 
 class GitlabIE(BasePlatform):
     """gitlab async"""
@@ -35,10 +35,10 @@ class GitlabIE(BasePlatform):
             }
             r = self.sess.post(url, data=json.dumps(payload))
             if r.status_code != 201:
-                print(f"{bcolors.FAIL}create repo {repo_name} failed, status code {r.status_code}{bcolors.ENDC}")
+                logger.error(f"create repo {repo_name} failed, status code {r.status_code}")
                 return
-            print(f"{bcolors.OKGREEN}create repo {repo_name} success{bcolors.ENDC}")
-            print(f'{bcolors.OKGREEN}{self.host}/{self.username}/{repo_name}{bcolors.ENDC}')
+            logger.info(f"create repo {repo_name} success")
+            logger.info(f'{self.host}/{self.username}/{repo_name}')
             # for repo in self.repos:
             #     if repo.name == repo_name:
             #         repo.url = r.json()["web_url"]
@@ -58,22 +58,22 @@ class GitlabIE(BasePlatform):
                 url = f"{self.host}/api/v4/projects/{project_id}"
                 response = self.sess.delete(url)
                 if response.status_code == 202:
-                    print(f"{bcolors.OKGREEN}Repository: {repo_name} deleted from gitlab successfully!{bcolors.ENDC}")
+                    logger.info(f"Repository: {repo_name} deleted from gitlab successfully!")
                 else:
-                    print(
-                        f"{bcolors.FAIL}Failed to delete repository: {repo_name} from gitlab. Error {response.status_code}: {response.text}{bcolors.ENDC}"
+                    logger.error(
+                        f"Failed to delete repository: {repo_name} from gitlab. Error {response.status_code}: {response.text}"
                     )
             except Exception as e:
-                print(f"{bcolors.FAIL}Failed to delete repository: {repo_name} from gitlab. Error {e}, check repo is exist first.{bcolors.ENDC}")
+                logger.error(f"Failed to delete repository: {repo_name} from gitlab. Error {e}, check repo is exist first.")
         else:
-            print(f"{bcolors.FAIL}Failed to delete repository: {repo_name} from gitlab. Error {r.status_code}: {r.text}{bcolors.ENDC}")
+            logger.error(f"Failed to delete repository: {repo_name} from gitlab. Error {r.status_code}: {r.text}")
     
     def get_repo_list(self, username: str) -> list:
         """get repo list"""
         url = f"{self.host}/api/v4/users/{username}/projects"
         r = self.sess.get(url)
         if r.status_code != 200:
-            print(f"{bcolors.FAIL}get repo list failed, status code {r.status_code}{bcolors.ENDC}")
+            logger.error(f"get repo list failed, status code {r.status_code}")
             return []
         repo_list = []
         for res in r.json():
@@ -94,7 +94,7 @@ class GitlabIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f"{bcolors.OKGREEN}push repo:{self.username}/{repo_name} to gitlab{bcolors.ENDC}")
+        logger.info(f"pull repo:{self.username}/{repo_name} from gitlab")
         self.create_repo(repo_name)
         pur_host = re.search(r'(?<=//)[^/]+', self.host).group()
         os.chdir(local_repo_path)
@@ -108,7 +108,7 @@ class GitlabIE(BasePlatform):
         os.system(f'git pull origin_gitlab {current_branch}')
         os.system("git remote remove origin_gitlab")
         os.chdir("..")
-        print(f"{bcolors.OKGREEN}pull repo:{self.username}/{repo_name} from gitlab success{bcolors.ENDC}")
+        logger.info(f"pull repo:{self.username}/{repo_name} from gitlab success")
     
     def push(self, local_repo_path: str):
         """push a local repo to remote
@@ -118,7 +118,7 @@ class GitlabIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f"{bcolors.OKGREEN}push repo:{self.username}/{repo_name} to gitlab{bcolors.ENDC}")
+        logger.info(f"push repo:{self.username}/{repo_name} to gitlab")
         self.create_repo(repo_name)
         pur_host = re.search(r'(?<=//)[^/]+', self.host).group()
         os.chdir(local_repo_path)
@@ -133,7 +133,7 @@ class GitlabIE(BasePlatform):
         os.system(f"git push -u origin_gitlab {current_branch}")
         os.system("git remote remove origin_gitlab")
         os.chdir("..")
-        print(f"{bcolors.OKGREEN}push repo:{self.username}/{repo_name} to gitlab success{bcolors.ENDC}")
+        logger.info(f"push repo:{self.username}/{repo_name} to gitlab success")
     
     def clone(self):
         pass
@@ -147,7 +147,7 @@ class GitlabIE(BasePlatform):
         if r.status_code == 200:
             try:
                 project_id = r.json()[0]["id"]
-                print(f'{bcolors.OKGREEN}repo: {repo_name} is existed. {bcolors.ENDC}')
+                logger.info(f'repo: {repo_name} is existed.')
                 return True
             except Exception as e:
                 return False

+ 12 - 12
repo_sync/platform/gogs.py

@@ -10,7 +10,7 @@ from .base_platform import BasePlatform
 import csv, re, subprocess
 import json, os
 from repo_sync.utils.colors import bcolors
-
+from repo_sync.utils.logger import logger
 class GogsIE(BasePlatform):
     """ gogs plotform class """
     gityoqi_repo_list = 'gityoqi_repo_list.csv'
@@ -33,10 +33,10 @@ class GogsIE(BasePlatform):
         }
         r = self.sess.post(url, data=json.dumps(payload))
         if r.status_code != 201:
-            print(bcolors.FAIL + f'create org repo {repo_name} failed, status code {r.status_code}' + bcolors.ENDC)
+            logger.error(f'create org repo {repo_name} failed, status code {r.status_code}')
             return
-        print(bcolors.OKGREEN + f'create org repo {repo_name} success' + bcolors.ENDC)
-        print(f'{bcolors.OKGREEN}{self._host}/{org_name}/{repo_name}{bcolors.ENDC}')
+        logger.info(f'create org repo {repo_name} success')
+        logger.info(f'{self._host}/{org_name}/{repo_name}')
         
     def create_repo(self, repo_name: str):
         """create a repo"""
@@ -52,28 +52,28 @@ class GogsIE(BasePlatform):
         }
         r = self.sess.post(url, data=json.dumps(payload))
         if r.status_code != 201:
-            print(bcolors.FAIL + f'create repo {repo_name} failed, status code {r.status_code}' + bcolors.ENDC)
+            logger.error(f'create repo {repo_name} failed, status code {r.status_code}')
             return
-        print(bcolors.OKGREEN + f'create repo {repo_name} success' + bcolors.ENDC)
+        logger.info(f'create repo {repo_name} success')
 
     def delete(self, repo_name: str):
         """delete a repo, maybe request a confirm by input"""
         url = f'{self._host}/api/v1/repos/{self.username}/{repo_name}'
         r = self.sess.delete(url)
         if r.status_code != 204:
-            print(bcolors.FAIL + f'delete repo {repo_name} failed, status code {r.status_code}' + bcolors.ENDC)
+            logger.error(f'delete repo {repo_name} failed, status code {r.status_code}')
             return
-        print(bcolors.OKGREEN + f'delete repo {repo_name} success' + bcolors.ENDC)
+        logger.info(f'delete repo {repo_name} success')
 
     def get_repo_list(self, repo_name: str):
         """get repo list"""
         url = f'{self._host}/api/v1/users/{self.username}/repos'
         r = self.sess.get(url)
         if r.status_code != 200:
-            print(bcolors.FAIL + f'get repo list failed, status code {r.status_code}' + bcolors.ENDC)
+            logger.error(f'get repo list failed, status code {r.status_code}')
             return
         self.repos = r.json()
-        print(bcolors.OKGREEN + 'get repo list success' + bcolors.ENDC)
+        logger.info(f'get repo list success')
 
     def clone(self):
         pass
@@ -82,7 +82,7 @@ class GogsIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f'{bcolors.WARNING}pull repo:{self.username}/{repo_name} from {self._host}{bcolors.ENDC}')
+        logger.info(f'pull repo:{self.username}/{repo_name} from {self._host}')
         pur_host = re.search(r'(?<=//)[^/]+', self._host).group()
         os.chdir(local_repo_path)
         os.system('git remote remove origin_gogs')
@@ -100,7 +100,7 @@ class GogsIE(BasePlatform):
         if local_repo_path[-1] == os.path.sep:
             local_repo_path = local_repo_path[:-1]
         repo_name = local_repo_path.split(os.path.sep)[-1]
-        print(f'{bcolors.WARNING}push repo:{self.username}/{repo_name} to {self._host}{bcolors.ENDC}')
+        logger.info(f'push repo:{self.username}/{repo_name} to {self._host}')
         pur_host = re.search(r'(?<=//)[^/]+', self._host).group()
         os.chdir(local_repo_path)
         os.system('git remote remove origin_gogs')

+ 8 - 24
repo_sync/repo_sync.py

@@ -8,9 +8,9 @@
 '''
 import os,csv,re
 import logging
+from .utils.logger import logger
 from .platform import gen_extractor_classes
 from .models import Repo
-from repo_sync.utils.colors import bcolors
 
 class RepoSync(object):
     '''
@@ -20,11 +20,12 @@ class RepoSync(object):
 
     def __init__(self, params: dict, debug=False):
         self.args = None
-        self.logger = None
-        self.init_logger(debug)
+        
+        if debug:
+            logger.setLevel(logging.DEBUG)
 
         self.params = params
-        self.params['logger'] = self.logger
+        self.params['logger'] = logger
         self.platforms = []
         self.repos = []
         for p in gen_extractor_classes():
@@ -45,7 +46,7 @@ class RepoSync(object):
                     self._find_git_repo(path=current_path, repo_name=dir)
         with open(self.repo_list_path, 'w') as f:
             if len(self.repos) == 0:
-                print(f"{bcolors.WARNING}repo list is empty, please delete repo_list.csv and try again{bcolors.ENDC}")
+                logger.warning("repo list is empty, please delete repo_list.csv and try again")
                 return
             writer = csv.DictWriter(
                 f, fieldnames=self.repos[0].__dict__.keys(), lineterminator='\n'
@@ -68,7 +69,7 @@ class RepoSync(object):
                 repo.local_path = path
                 self.repos.append(repo)
         except Exception as e:
-            print(f"{bcolors.OKGREEN}skip {path} because of {e}{bcolors.ENDC}")
+            logger.info(f"skip {path} because of {e}")
 
     def run(self):
         '''
@@ -103,24 +104,7 @@ class RepoSync(object):
                         elif command == 'pull':
                             current_platform(username, token, host, self.params).pull(repo.local_path)
             else:
-                logging.info(
-                    'repo list is not exist, please run list_local command first'
-                )
-
-    def init_logger(self, debug:bool):
-        '''
-        init logger
-        '''
-        self.logger = logging.getLogger(__name__)
-        if debug:
-            self.logger.setLevel(logging.DEBUG)
-        else:
-            self.logger.setLevel(logging.INFO)
-        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-        console_handler = logging.StreamHandler()
-        console_handler.setLevel(logging.DEBUG)
-        console_handler.setFormatter(formatter)
-        self.logger.addHandler(console_handler)
+                logger.info('repo list is not exist, please run list_local command first')
 
     def update(self):
         '''

+ 51 - 0
repo_sync/utils/logger.py

@@ -0,0 +1,51 @@
+import logging
+from termcolor import colored
+
+class ColoredFormatter(logging.Formatter):
+    def format(self, record):
+        # 保留原始消息不变
+        original_msg = record.msg
+        if record.levelno == logging.DEBUG:
+            record.msg = colored(record.msg, 'blue')
+        elif record.levelno == logging.INFO:
+            record.msg = colored(record.msg, 'green')
+        elif record.levelno == logging.WARNING:
+            record.msg = colored(record.msg, 'yellow')
+        elif record.levelno == logging.ERROR:
+            record.msg = colored(record.msg, 'red')
+        elif record.levelno == logging.CRITICAL:
+            record.msg = colored(record.msg, 'magenta')
+        
+        # 调用父类格式化方法
+        formatted_message = super().format(record)
+        
+        # 恢复原始消息
+        record.msg = original_msg
+        
+        return formatted_message
+
+# Configure logger
+logger = logging.getLogger('repo_sync')
+logger.setLevel(logging.INFO)
+
+# Create console handler
+console_handler = logging.StreamHandler()
+console_handler.setLevel(logging.INFO)
+
+# Create file handler
+file_handler = logging.FileHandler('repo_sync.log')
+file_handler.setLevel(logging.INFO)
+
+# Use the custom colored formatter
+console_formatter = ColoredFormatter('%(asctime)s - %(levelname)s - %(message)s')
+console_handler.setFormatter(console_formatter)
+
+file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
+file_handler.setFormatter(file_formatter)
+
+# Add handler to logger
+logger.addHandler(console_handler)
+logger.addHandler(file_handler)
+
+# Export logger
+__all__ = ['logger'] 

+ 5 - 0
requirements-win.txt

@@ -0,0 +1,5 @@
+requests==2.27.1
+python-dotenv==1.0.0
+PyQt5
+pywin32
+termcolor==2.3.0

+ 1 - 2
requirements.txt

@@ -1,4 +1,3 @@
 requests==2.27.1
 python-dotenv==1.0.0
-PyQt5
-pywin32
+termcolor==2.3.0