def fcmm_init(): """ 初始化fcmm程序 """ # 获取启动参数 config = load_fcmm_config() # 处理真实路径(在其他路径被调用的情况不会找错位置) fcmm_path = os.path.split( os.path.realpath(inspect.getfile(inspect.currentframe())))[0] temp_str = os.getcwd() os.chdir(fcmm_path) config['fcmm_path'] = fcmm_path config['temp_path'] = os.path.realpath(config['temp_path']) config['backup_path'] = os.path.realpath(config['backup_path']) os.chdir(temp_str) RunTools.set_global_var('config', config) # 设置到全局变量中 # 创建临时目录 with ExceptionTools.ignored((FileExistsError)): FileTools.create_dir(config['temp_path']) RunTools.set_global_var('temp_path', config['temp_path']) # 创建备份目录 if config['backup_before'] != 'false': with ExceptionTools.ignored((FileExistsError)): FileTools.create_dir(config['backup_path']) RunTools.set_global_var('backup_path', config['backup_path']) # 初始化命令行参数 config_cmd_para = cmd_para_init(config) RunTools.set_global_var('config_cmd_para', config_cmd_para)
def clone_remote_repo(url, path, rename=None, is_del_exit_dir=False): """ 克隆远程库到本地 @decorators staticmethod @param {string} url - 远程库的地址 @param {string} path - 本地主路径(不含repo目录) @param {string} rename=None - 本地目录重命名 @param {bool} is_del_exit_dir=False - 如果本地目录已存在是否删除 @returns {list} - 执行结果[returncode, msgstring] returncode - 0代表成功,其他代表失败 msgstring - 要返回显示的内容 """ repo_name = rename if repo_name is None: repo_name = FCMMGitTools.get_remote_repo_name(url) full_path = os.path.realpath(path).rstrip('\\/') + '/' full_repo_path = full_path + repo_name # 删除已存在的目录 if os.path.exists(full_repo_path): if is_del_exit_dir: FileTools.remove_dir(full_repo_path) else: print('path is already exists: %s !' % (full_repo_path)) return [1, ''] # 克隆远程库 os.chdir(full_path) # 转到目录下 return FCMMTools.run_sys_cmd('git clone %s %s' % (url, repo_name))
def tearDown(self): """ 结束测试执行的销毁 """ os.chdir(self.current_path) FileTools.remove_dir(TEST_PATH) FileTools.remove_file('fcmm.json') return
def setUp(self): """ 启动测试执行的初始化 """ self.current_path = os.path.realpath('') if os.path.exists(TEST_PATH): FileTools.remove_dir(TEST_PATH) FileTools.create_dir(TEST_PATH) shutil.copyfile('../fcmm4git/fcmm.json', 'fcmm.json') fcmm.fcmm_init() return
def load_fcmm_config(): """ 装载fcmm的程序启动参数,返回参数JSON对象 """ config_file_path = FileTools.get_exefile_path() + '/fcmm.json' json_str = '' with open(config_file_path, 'r', encoding='utf-8') as f: json_str = f.read() return json.loads(json_str)
def test_json_file(self): """ 测试JSON文件处理 """ FileTools.create_dir(TEST_PATH + 'json_file/') json_obj = dict() json_obj['key_1'] = 'value1' json_obj['key_2'] = 'value2' json_obj['key_3'] = dict() json_obj['key_3']['key_3_1'] = 'value3_1' json_obj['key_3']['key_3_2'] = 'value3_2' json_obj['key_4'] = ['value4_1', 'value4_2'] FCMMTools.save_to_json_file(TEST_PATH + 'json_file/.fcmm4git', json_obj) get_json_obj = FCMMTools.get_fcmm_config(TEST_PATH + 'json_file/') self.assertDictEqual(json_obj, get_json_obj, 'JSON文件处理失败') return
def setUp(self): """ 启动测试执行的初始化 """ global TEST_PATH if os.path.exists(TEST_PATH): FileTools.remove_dir(TEST_PATH) FileTools.create_dir(TEST_PATH) # 删除临时和备份目录 if os.path.exists(TEMP_PATH): FileTools.remove_dir(TEMP_PATH) if os.path.exists(BACKUP_PATH): FileTools.remove_dir(BACKUP_PATH) return
def cmd_init(dict_cmd_para=None): """ 初始化FCMM版本库:根据指定的参数建立及初始化FCMM版本库 @decorators staticmethod @param {dict} dict_cmd_para=None - 参数字典 @returns {list} - 执行结果[returncode, msgstring] returncode - 0代表成功,其他代表失败 msgstring - 要返回显示的内容 """ # 判断是否有帮助 if '-h' in dict_cmd_para.keys() or '-help' in dict_cmd_para.keys(): return FCMMGitCmd.cmd_help({'init': ''}) # 需要获取的参数 config = RunTools.get_global_var('config') # 最基础的参数校验 res = FCMMTools.vailidate_cmd_para(dict_cmd_para, 'init') if res[0] != 0: return res # 要处理的参数 url = FCMMTools.get_cmd_para_value(dict_cmd_para, '-u', '-url') base = FCMMTools.get_cmd_para_value(dict_cmd_para, '-b', '-base') ver = FCMMTools.get_cmd_para_value(dict_cmd_para, '-v', '-version') # 常用信息获取 repo_info = FCMMGitTools.get_repo_info(os.getcwd()) # 获取git库原生信息有建库 repo_name = FileTools.get_dir_name(repo_info['work_dir']) # 获取fcmm4git配置信息 fcmm_config = FCMMTools.get_fcmm_config(repo_info['work_dir']) remote_name = FCMMGitTools.get_remote_repo_name(url) # 远程仓库命名 remote_repo_info = None remote_has_pkg = False remote_has_tag = False # 进行是否可处理的校验 if base == 'local': if fcmm_config is not None: # 已经除初始化过fcmm4git,不允许重复处理exit_fcmm_file return [2, config['i18n_tips']['exit_fcmm_file']] else: # 检查本地目录是否为空 if not ('-f' in dict_cmd_para.keys() or '-force' in dict_cmd_para.keys()): if os.listdir(repo_info['work_dir']): return [3, config['i18n_tips']['local_not_bare']] # 需要将远程版本库下载下来比较处理 fun_res = FCMMGitTools.clone_remote_repo(url, config['temp_path'], None, True) if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] remote_repo_info = FCMMGitTools.get_repo_info( config['temp_path'].rstrip('\\/') + '/' + remote_name) # 尝试找远程的版本分支 os.chdir(remote_repo_info['work_dir']) FCMMTools.run_sys_cmd('git checkout --track origin/lb-pkg') remote_has_pkg = FCMMGitTools.check_branch_exists( remote_repo_info, 'lb-pkg') if ver is not None and FCMMGitTools.check_tag_exists( remote_repo_info['repo'], ver): remote_has_tag = True if not ('-f' in dict_cmd_para.keys() or '-force' in dict_cmd_para.keys()): # 没有强制标志,需要进行验证 if base == 'local': if not FCMMGitTools.is_bare(remote_repo_info): return [3, config['i18n_tips']['remote_not_bare']] if remote_has_tag: # 检查版本号是否已存在 return [3, config['i18n_tips']['remote_tag_exists']] # 检查通过或强制执行 is_force_reset = False # 标记是否强制更新服务器端版本 if base == 'local': # 本地为准,打包备份到指备份目录中 if not FCMMGitTools.is_bare(remote_repo_info): FCMMTools.backup_to_tar( src_path=remote_repo_info['work_dir'], save_path=config['backup_path'], save_name='%s.bak.%s.tar' % (remote_name, datetime.datetime.now().strftime("%Y%m%d%H%M%S"))) if '-r' in dict_cmd_para.keys() or '-reset' in dict_cmd_para.keys( ): # 强制替换服务器端的版本,以本地的版本库为准,直接强制替换 # 如果不是git仓库,先初始化 os.chdir(repo_info['work_dir']) if repo_info['repo'] is None: fun_res = FCMMTools.run_sys_cmd('git init') if fun_res[0] != 0: return [ fun_res[0], config['i18n_tips']['execute_fail'] ] repo_info = FCMMGitTools.get_repo_info( repo_info['work_dir']) else: # 如果原来有远程连接,解除连接 for remote_obj in repo_info['repo'].remotes: fun_res = FCMMTools.run_sys_cmd('git remote rm %s' % (remote_obj.name)) if fun_res[0] != 0: return [ fun_res[0], config['i18n_tips']['execute_fail'] ] # 绑定远程仓库 fun_res = FCMMTools.run_sys_cmd('git remote add origin %s' % (url)) if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] # 指定强制更新服务器端 is_force_reset = True remote_has_tag = False else: # 保留服务器端版本信息,用文件清除方式实现文件替换 # 1:删除临时目录中远程分支的所有文件 os.chdir(remote_repo_info['work_dir']) FCMMTools.run_sys_cmd('git checkout master') FCMMTools.run_sys_cmd('git rm * -r') # 2: 将本地目录中的文件复制到远程目录,删除本地目录,复制远程目录到本地目录 FileTools.copy_all_with_path(repo_info['work_dir'], remote_repo_info['work_dir'], '^(?!\\.git$)') FileTools.remove_all_with_path(repo_info['work_dir']) FileTools.copy_all_with_path(remote_repo_info['work_dir'], repo_info['work_dir']) os.chdir(repo_info['work_dir']) else: # 远程为准,打包备份到指备份目录中 if os.listdir(repo_info['work_dir']): FCMMTools.backup_to_tar( src_path=repo_info['work_dir'], save_path=config['backup_path'], save_name='%s.%s.tar' % (repo_name, datetime.datetime.now().strftime("%Y%m%d%H%M%S"))) # 复制远程目录到本地目录 os.chdir(remote_repo_info['work_dir']) FileTools.remove_all_with_path(repo_info['work_dir']) FileTools.copy_all_with_path(remote_repo_info['work_dir'], repo_info['work_dir']) os.chdir(repo_info['work_dir']) # 完成本地版本库的建立和更新,统一进行配置参数处理和服务器的推送 FCMMTools.run_sys_cmd('git checkout master') fcmm_config_file = repo_info['work_dir'].rstrip('\\/') + '/.fcmm4git' if not os.path.exists(fcmm_config_file): fcmm_config = dict() fcmm_config['remote_url'] = url if '-n' in dict_cmd_para.keys() or '-nopkg' in dict_cmd_para.keys( ): fcmm_config['has_pkg'] = "false" else: fcmm_config['has_pkg'] = "true" FCMMTools.save_to_json_file(fcmm_config_file, fcmm_config) # 提交修改 FCMMTools.run_sys_cmd('git add *') fun_res = FCMMTools.run_sys_cmd( 'git commit -am "add .fcmm4git by fcmm4git"') if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] # 设置版本信息 ver = FCMMTools.get_cmd_para_value(dict_cmd_para, '-v', '-version') if ver is not None: if remote_has_tag: # 远程服务器已经有标签,应先删除标签,再新建 fun_res = FCMMTools.run_sys_cmd('git tag -d %s' % (ver)) if fun_res[0] != 0: return [ fun_res[0], config['i18n_tips']['execute_fail'] ] fun_res = FCMMTools.run_sys_cmd( 'git tag -a %s -m "add version by fcmm4git"' % (ver)) if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] else: # 如果已经有.fcmm4git配置文件说明该目录已经初始化过,同步下来即可,不用再重新推送服务器 return [0, config['i18n_tips']['just_clone_remote']] # 推送到服务器端 push_force_tag = '' if is_force_reset: push_force_tag = '-f ' fun_res = FCMMTools.run_sys_cmd( 'git push %s--follow-tags origin master' % (push_force_tag)) if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] # 添加版本分支 if not ('-n' in dict_cmd_para.keys() or '-nopkg' in dict_cmd_para.keys()): if remote_has_pkg: # 远程仓库已有版本分支,要删除并强制推送 fun_res = FCMMTools.run_sys_cmd('git branch -d lb-pkg') if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] push_force_tag = '-f ' # 指定强制推送 fun_res = FCMMTools.run_sys_cmd('git checkout -b lb-pkg') if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] fun_res = FCMMTools.run_sys_cmd( 'git push %s--follow-tags origin lb-pkg' % (push_force_tag)) if fun_res[0] != 0: return [fun_res[0], config['i18n_tips']['execute_fail']] FCMMTools.run_sys_cmd('git checkout master') # 返回执行成功 return [0, config['i18n_tips']['execute_success']]
def test_init(self): """ 测试init """ print('测试init') global TEST_PATH, TEST_REPO_URL, FCMM_PATH, TEMP_PATH, BACKUP_PATH # 常用参数 root_dir = TEST_PATH + '/init/' test_repo_name = fcmm_git_cmd.FcmmGitCmd.get_remote_repo_name( TEST_REPO_URL) repo_dir = root_dir + test_repo_name + '/' # 准备远程环境 print('准备远程环境') FileTools.create_dir(root_dir) os.chdir(root_dir) self.assertTrue( subprocess.run('git clone %s' % (TEST_REPO_URL), shell=True).returncode == 0, '准备远程环境: clone命令处理失败') os.chdir(repo_dir) # 清空文件夹 subprocess.run('git rm * -r', shell=True) repo_info = fcmm_git_cmd.FcmmGitCmd.get_repo_info(repo_dir) if repo_info['repo'].is_dirty(): # 有修改,要提交及上传 self.assertTrue( subprocess.run('git commit -m "fcmm4git test clear file"', shell=True).returncode == 0, '准备远程环境: rm命令处理失败') self.assertTrue( subprocess.run('git push -f origin master', shell=True).returncode == 0, '准备远程环境: push命令处理失败') os.chdir(root_dir) FileTools.remove_dir(repo_dir) # 测试本地目录上传服务器 print('测试本地目录上传服务器') local_repo_name = 'local' local_repo_path = root_dir + local_repo_name + '/' FileTools.create_dir(local_repo_path) os.chdir(local_repo_path) subprocess.run( 'echo "test local to remote: no pkg v0.1.2" > readme.md', shell=True) print('测试本地目录上传服务器,成功但不建立lb-pkg') self.assertTrue( subprocess.run( 'python %s/fcmm.py init -b local -url %s -v v0.1.2 -force -n -r' % (FCMM_PATH, TEST_REPO_URL), shell=True).returncode == 0, '本地目录上传: init命令处理失败') # 检查处理情况,先是备份 file_list = FileTools.get_filelist( path=BACKUP_PATH, regex_str=test_repo_name.replace('.', '\.') + '\.bak\..*\.tar') self.assertTrue(len(file_list) > 0, '本地目录上传: 备份文件不存在') # 分支信息 repo_info = fcmm_git_cmd.FcmmGitCmd.get_repo_info(local_repo_path) has_pkg = False for branch in repo_info['repo'].branches: if branch.name == 'lb-pkg': has_pkg = True break self.assertFalse(has_pkg, '本地目录上传: 不应建立lb-pkg') print('测试本地目录上传服务器,非强制被拒绝') self.assertFalse( subprocess.run( 'python %s/fcmm.py init -b local -url %s -v v0.0.9' % (FCMM_PATH, TEST_REPO_URL), shell=True).returncode == 0, '本地目录上传: init命令处理失败') print('测试本地目录上传服务器,成功并建立lb-pkg') subprocess.run( 'echo "test local to remote: with pkg v0.0.9" > readme1.md', shell=True) FileTools.remove_file(local_repo_path + '.fcmm4git') FileTools.remove_file(local_repo_path + 'readme.md') self.assertTrue( subprocess.run( 'python %s/fcmm.py init -b local -url %s -v v0.0.9 -force' % (FCMM_PATH, TEST_REPO_URL), shell=True).returncode == 0, '本地目录上传: init命令处理失败') # 检查处理情况,先是备份 file_list = FileTools.get_filelist( path=BACKUP_PATH, regex_str=test_repo_name.replace('.', '\.') + '\.bak\..*\.tar') self.assertTrue(len(file_list) > 0, '本地目录上传: 备份文件不存在') # 分支信息 repo_info = fcmm_git_cmd.FcmmGitCmd.get_repo_info(local_repo_path) has_pkg = False for branch in repo_info['repo'].branches: if branch.name == 'lb-pkg': has_pkg = True break self.assertTrue(has_pkg, '本地目录上传: 没有成功建立lb-pkg') print('测试从服务器下载并建立本地目录,远程已带有fcmm4git') local_repo_name = 'remote1' local_repo_path = root_dir + local_repo_name + '/' FileTools.create_dir(local_repo_path) os.chdir(local_repo_path) subprocess.run( 'echo "test remote to local: no pkg v0.1.3" > readme.md', shell=True) self.assertTrue( subprocess.run( 'python %s/fcmm.py init -b remote -url %s -v v0.1.3 -force -n' % (FCMM_PATH, TEST_REPO_URL), shell=True).returncode == 0, '服务器下载并建立本地目录: init命令处理失败')