Пример #1
0
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)
Пример #2
0
    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))
Пример #3
0
 def tearDown(self):
     """
     结束测试执行的销毁
     """
     os.chdir(self.current_path)
     FileTools.remove_dir(TEST_PATH)
     FileTools.remove_file('fcmm.json')
     return
Пример #4
0
    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
Пример #5
0
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)
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
    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']]
Пример #9
0
    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命令处理失败')