def __init__(self, options): self.__options__ = options self.mark_dict = {} if not self.detect(self.__options__['source_dirs']): Message.ShowError('无法成功定位所有需要的代码注入点, 程序终止!') Common.exit_with_pause(-1) else: Message.ShowStatus('已成功定位所有代码注入点.\n')
def main(): # 显示欢迎信息 Common.welcome('符号归档辅助脚本') print('') # 检查是否已经完成了编译 if not Common.is_compiled(project_slndir): Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.') Common.exit_with_pause(-1) # 检查符号仓库是否存在, 不存在则创建 if not ensure_store(): Message.ShowWarning('你放弃了拉取符号仓库, 后续工作无法继续. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('符号仓库已经存在于本地, 开始确认工作区状态...') # 若符号文件存在, 则确保工作区干净 if not ensure_store_clean(): Message.ShowWarning('为了防止出现意外, 请确保符号仓库的工作区是干净的. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('很好, 符号仓库的工作区是干净的.') # 尝试更新本地的符号仓库到最新 if not update_store(): Message.ShowWarning('为了防止出现意外, 请确保符号仓库同步到最新. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('符号仓库已经同步到最新, 开始归档新的符号文件...') # 搜索工程目录全部 pdb 文件和 exe 文件, 进行归档 deploy_symbols(project_slndir) # 自动进行 git 提交操作 Message.ShowStatus('归档完毕, 正在提交...') if not make_commit(): Message.ShowWarning('很抱歉, 提交失败! 请确认失败的原因. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('提交成功, 请手工推送到远程仓库.') # 友好退出, 主要是在 Windows 环境里给予暂停 Common.exit_with_pause()
def update_store(): repo = git.Repo(project_symstoredir) if repo.is_dirty() or repo.untracked_files: return False Message.ShowStatus('正在尝试拉取最新的符号数据, 请稍候...') try: repo.remotes.origin.pull() except git.GitError as _err: Message.ShowWarning('更新失败, 原因: %s' % _err) return False else: return True
def updateall(self, increase_version=True): ''' 更新全部翻译对照表文件, 并保留现有的翻译结果 ''' yamlfiles = glob.glob('../../conf/msg_conf/translation_*.yml') Message.ShowStatus('即将更新全部翻译对照表, 并保留现有的翻译结果...') if increase_version: Message.ShowInfo('对照表更新完成后会提升数据版本号.') else: Message.ShowWarning('本次对照表更新操作不会提升数据版本号.') for relpath in yamlfiles: fullpath = os.path.abspath(relpath) Message.ShowInfo('正在升级: %s' % os.path.relpath(fullpath, project_slndir)) _backup_body = self.body[:] self.updatefrom(fullpath, increase_version) if '_tw.yml' in relpath: for x in self.body: x['Translation'] = self.__convert_backslash_step1( x['Translation']) self.dump(fullpath) self.body = _backup_body Message.ShowStatus('感谢您的使用, 全部对照表翻译完毕.')
def ensure_store_clean(): if not Common.is_dir_exists(project_symstoredir): return False repo = git.Repo(project_symstoredir) if not repo.is_dirty() and not repo.untracked_files: return True if Inputer().requireBool({ 'tips' : '本地符号仓库的工作区不干净, 是否重置工作区?', 'default' : False }): repo.git.reset('--hard') repo.git.clean('-xdf') Message.ShowStatus('已成功重置本地符号仓库到干净状态.') return True return False
def main(): ''' 主入口函数 ''' # 加载 .env 中的配置信息 load_dotenv(dotenv_path='.config.env', encoding='UTF-8') # 若无配置信息则自动复制一份文件出来 if not Common.is_file_exists('.config.env'): shutil.copyfile('.config.env.sample', '.config.env') # 显示欢迎信息 Common.welcome('编译流程辅助脚本') # 只能在 Windows 环境运行 if platform.system() != 'Windows': Message.ShowError('很抱歉, 此脚本只能在 Windows 环境上运行') Common.exit_with_pause(-1) # 判断本机是否安装了支持的 Visual Studio detected_vs, vs_name = detect_vs() if not detected_vs: Message.ShowError('无法检测到合适的 Visual Studio 版本 (2015 或 2017)') Common.exit_with_pause(-1) else: Message.ShowStatus('检测到已安装: %s 应可正常编译' % vs_name) print('') # 读取当前的 Pandas 主程序版本号 pandas_ver = Common.get_pandas_ver(os.path.abspath(project_slndir)) Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver) # 判断是否已经写入了对应的更新日志, 若没有则要给予提示再继续 if (has_changelog(pandas_ver)): Message.ShowStatus('已经在更新日志中找到了 %s 的版本信息.' % pandas_ver) else: Message.ShowWarning('没有在更新日志中找到 %s 版本的信息, 请注意完善!' % pandas_ver) # 判断当前 git 工作区是否干净, 若工作区不干净要给予提示 if git.Repo(project_slndir).is_dirty(): if not Inputer().requireBool({ 'tips': '当前模拟器代码仓库的工作区不干净, 要继续编译吗?', 'default': False }): Message.ShowStatus('您主动放弃了继续操作') Common.exit_with_pause(-1) else: Message.ShowStatus('当前模拟器代码仓库的工作区是干净的.') # 检查 Crashrpt 使用的信息是否都设置好了, 若没有且企图编译正式版, 则给与提示 if Common.is_pandas_release(os.path.abspath(project_slndir)): if not os.getenv("DEFINE_CRASHRPT_APPID"): Message.ShowWarning('当前并未设置 AppID, 且企图编译正式版.') Common.exit_with_pause(-1) if Common.md5(os.getenv("DEFINE_CRASHRPT_APPID") ) != '952648de2d8f063a07331ae3827bc406': Message.ShowWarning('当前已设置了 AppID, 但并非正式版使用的 AppID.') Common.exit_with_pause(-1) if not os.getenv("DEFINE_CRASHRPT_PUBLICKEY"): Message.ShowWarning('当前并未设置 PublicKey, 且企图编译正式版.') Common.exit_with_pause(-1) Message.ShowStatus('即将开始编译, 编译速度取决于电脑性能, 请耐心...') # 清理目前的工作目录, 把一些可明确移除的删掉 clean_environment() # 编译 Pandas 的复兴前版本 compile_prere(pandas_ver) # 编译 Pandas 的复兴后版本 compile_renewal(pandas_ver) Message.ShowStatus('编译工作已经全部结束, 请归档符号并执行打包流程.') # 友好退出, 主要是在 Windows 环境里给予暂停 Common.exit_with_pause()
def guide(inject): define = Inputer().requireText({ 'tips' : '请输入该战斗配置选项的宏定义开关名称 (Pandas_BattleConfig_的末尾部分)', 'prefix' : 'Pandas_BattleConfig_' }) # -------- option_name = Inputer().requireText({ 'tips' : '请输入该战斗配置选项的选项名称' }) # -------- var_name = Inputer().requireText({ 'tips' : '请输入该战斗配置选项的变量名称 (不填默认与选项名称一致)', 'default' : option_name.replace('.', '_') }) # -------- def_val = Inputer().requireInt({ 'tips' : '请输入默认值 (不填则默认为 0)', 'allow_empty' : True }) # -------- min_val = Inputer().requireInt({ 'tips' : '请输入允许设置的最小值 (不填则默认为 0)', 'allow_empty' : True }) # -------- max_val = Inputer().requireInt({ 'tips' : '请输入允许设置的最大值 (不填则默认为 INT_MAX)', 'allow_empty' : True }) if max_val == 0: max_val = 2147483647 if max_val <= min_val: Message.ShowError('最大值比最小值还要小, 这不合理...') Common.exit_with_pause(-1) def_val = str(def_val) min_val = str(min_val) max_val = 'INT_MAX' if max_val == 2147483647 else str(max_val) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('选项名称 : %s' % option_name) Message.ShowInfo('变量名称 : %s' % var_name) print('') Message.ShowInfo('选项默认值 : %s' % def_val) Message.ShowInfo('选项最小值 : %s' % min_val) Message.ShowInfo('选项最大值 : %s' % max_val) print('-' * 70) print('\n') nextstep = Inputer().requireBool({ 'tips' : '请仔细阅读上述信息, 确认要开始写入操作么?', 'default' : False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exit_with_pause(-1) # -------- Message.ShowStatus('开始将战斗配置选项写入到源代码...') options = { 'define' : define, 'option_name' : option_name, 'var_name' : var_name, 'def_val' : def_val, 'min_val' : min_val, 'max_val' : max_val } insert_battle_config(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 战斗配置选项添加助手已经执行完毕'.center(50)) print('') print('=' * 70)
def guide(inject): define = Inputer().requireText({ 'tips': '请输入该脚本指令的宏定义开关名称 (Pandas_ScriptCommand_的末尾部分)', 'prefix': 'Pandas_ScriptCommand_' }) # -------- funcname = Inputer().requireText({ 'tips': '请输入该脚本指令的处理函数名称 (BUILDIN_FUNC 部分的函数名)', 'lower': True }) # -------- samefunc = Inputer().requireBool({ 'tips': '脚本指令是否与处理函数名称一致 (%s)?' % funcname, 'default': True }) # -------- cmdname = funcname if not samefunc: cmdname = Inputer().requireText({ 'tips': '请输入该脚本指令的名称 (BUILDIN_DEF2 使用)', 'lower': True }) # -------- argsmode = Inputer().requireText({ 'tips': r'请输入该脚本指令的参数模式 (如一个或多个的: i\s\? 为空则直接回车)', 'lower': True, 'allow_empty': True }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('脚本处理函数名称 : %s' % funcname) Message.ShowInfo('脚本指令名称 : %s' % cmdname) Message.ShowInfo('脚本指令的参数模式 : %s' % argsmode) print('-' * 70) print('\n') nextstep = Inputer().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exit_with_pause(-1) # -------- Message.ShowStatus('开始将脚本指令信息写入到源代码...') options = { 'define': define, 'funcname': funcname, 'cmdname': cmdname, 'argsmode': argsmode } insert_scriptcmd(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 脚本指令添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def guide(inject): define = Inputer().requireText({ 'tips': '请输入该地图标记的宏定义开关名称 (Pandas_MapFlag_的末尾部分)', 'prefix': 'Pandas_MapFlag_' }) # -------- constant = Inputer().requireText({ 'tips': '请输入该地图标记的 MF 常量名称 (自动大写, MF_的末尾部分)', 'prefix': 'MF_', 'upper': True }) # -------- flaglist = [{ 'name': '普通开关式的地图标记', 'desc': '0 - 普通的地图标记开关, 只有两个状态(开/关)' }, { 'name': '携带单个数值参数的地图标记', 'desc': '1 - 携带单个数值参数的地图标记, 可以记录数值变量 (例如 bexp 标记)' }] # flagtype = 0 # 0 为普通开关 | 1 为数值开关 flagtype = Inputer().requireSelect({ 'prompt': '想创建的地图标记类型', 'option_name': '地图标记类型', 'data': flaglist }) # -------- default_val = 0 if flagtype == 1: default_val = Inputer().requireInt({ 'tips': '请输入"第一个数值参数"的默认值 (不填则默认为 0)', 'allow_empty': True }) # -------- default_disable = False if flagtype == 1: default_disable = Inputer().requireBool({ 'tips': '当"第一个数值参数"的值为 %d 时, 是否表示移除此地图标记?' % default_val, 'default': False }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('常量名称 : %s' % constant) Message.ShowInfo('标记类型 : %s' % flaglist[flagtype]['name']) print('') Message.ShowInfo('第一个数值参数的默认值 : %d' % default_val) Message.ShowInfo('第一个数值参数的值为 %d 时, 是否禁用此标记 : %s' % (default_val, default_disable)) print('-' * 70) print('\n') nextstep = Inputer().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exit_with_pause(-1) # -------- Message.ShowStatus('开始将地图标记信息写入到源代码...') options = { 'flagtype': flagtype, 'define': define, 'constant': constant, 'default_val': default_val, 'default_disable': default_disable } if flagtype == 0: insert_for_normal_mapflag(inject, options) elif flagtype == 1: insert_for_one_param_mapflag(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 地图标记添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def guide(inject): eventlist = [{ 'name': 'Event 类型的标准事件', 'desc': '0 - Event 类型的标准事件, 不能被 processhalt 指令打断' }, { 'name': 'Filter 类型的过滤事件', 'desc': '1 - Filter 类型的过滤事件, 可以被 processhalt 指令打断' }] # 0 为 Event 类型的事件 | 1 为 Filter 类型的事件 eventtype = InputController().requireSelect({ 'name': '想创建的 NPC 事件类型', 'data': eventlist }) # -------- constant_prefix = 'NPCE_' if eventtype == 0 else 'NPCF_' constant = InputController().requireText({ 'tips': '请输入该 NPC 事件的 {prefix} 常量名称 (自动大写, {prefix}的末尾部分)'.format( prefix=constant_prefix), 'prefix': constant_prefix, 'upper': True }) if eventtype == 0: define = 'rAthenaCN_NpcEvent_' + constant.replace(constant_prefix, '') eventvar = constant.replace(constant_prefix, '').lower() + '_event_name' elif eventtype == 1: define = 'rAthenaCN_NpcFilter_' + constant.replace(constant_prefix, '') eventvar = constant.replace(constant_prefix, '').lower() + '_filter_name' else: Message.ShowError('发现无效的事件类型, 请确认..') Common.exitWithPause(-1) # -------- eventname = InputController().requireText({ 'tips': '请输入该 NPC 事件的名称 (以 On 开头, 末尾应为 Event 或 Filter)', 'prefix': '' }) if not eventname.startswith('On'): Message.ShowError('无论是什么类型的事件, 事件名称必须以 On 开头 (严格区分大小写)') Common.exitWithPause(-1) if eventtype == 0: if not eventname.endswith('Event'): Message.ShowError('Event 类型的事件, 事件名称必须以 Event 结尾 (严格区分大小写)') Common.exitWithPause(-1) if eventtype == 1: if not eventname.endswith('Filter'): Message.ShowError('Filter 类型的事件, 事件名称必须以 Filter 结尾 (严格区分大小写)') Common.exitWithPause(-1) # -------- eventdesc = InputController().requireText({ 'tips': '请输入该 NPC 事件的简短说明 (如: 当玩家杀死 MVP 魔物时触发事件)', 'prefix': '' }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('事件类型 : %s' % eventlist[eventtype]['name']) Message.ShowInfo('常量名称 : %s' % constant) Message.ShowInfo('事件名称 : %s' % eventname) Message.ShowInfo('事件说明 : %s' % eventdesc) print('') Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('变量名称 : %s' % eventvar) print('-' * 70) print('\n') nextstep = InputController().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exitWithPause(-1) # -------- Message.ShowStatus('开始将 NPC 事件写入到源代码...') options = { 'define': define, 'constant': constant, 'eventname': eventname, 'eventvar': eventvar, 'eventdesc': eventdesc } if eventtype == 0: insert_for_normal_npcevent(inject, options) elif eventtype == 1: insert_for_filter_npcevent(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, NPC 事件添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def main(): ''' 主入口函数 ''' # 加载 .env 中的配置信息 load_dotenv(dotenv_path='pyhelp.conf', encoding='UTF-8-SIG') # 若无配置信息则自动复制一份文件出来 if not Common.is_file_exists('pyhelp.conf'): shutil.copyfile('pyhelp.conf.sample', 'pyhelp.conf') # 显示欢迎信息 Common.welcome('编译流程辅助脚本') # 只能在 Windows 环境运行 if platform.system() != 'Windows': Message.ShowError('很抱歉, 此脚本只能在 Windows 环境上运行') Common.exit_with_pause(-1) # 判断本机是否安装了支持的 Visual Studio detected_vs, vs_name = detect_vs() if not detected_vs: Message.ShowError('无法检测到合适的 Visual Studio 版本 (2015 或 2017)') Common.exit_with_pause(-1) else: Message.ShowStatus('检测到已安装: %s 应可正常编译' % vs_name) print('') # 读取当前的 Pandas 主程序版本号 pandas_ver = get_pandas_ver() Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver) # 判断是否已经写入了对应的更新日志, 若没有则要给予提示再继续 if (has_changelog(pandas_ver)): Message.ShowStatus('已经在更新日志中找到了 %s 的版本信息.' % pandas_ver) else: Message.ShowWarning('没有在更新日志中找到 %s 版本的信息, 请注意完善!' % pandas_ver) # 检查创建并尝试更新符号仓库 update_symstore() # 判断当前 git 工作区是否干净, 若工作区不干净要给予提示 if git.Repo(project_slndir).is_dirty(): if not Inputer().requireBool({ 'tips' : '当前模拟器代码仓库的工作区不干净, 要继续编译吗?', 'default' : False }): Message.ShowStatus('您主动放弃了继续操作') Common.exit_with_pause(-1) else: Message.ShowStatus('当前模拟器代码仓库的工作区是干净的.') Message.ShowStatus('即将开始编译, 编译速度取决于电脑性能, 请耐心...') # 清理目前的工作目录, 把一些可明确移除的删掉 clean_environment() # 编译 Pandas 的复兴前版本 compile_prere(pandas_ver) # 将复兴前版本的编译产物重命名一下, 避免编译复兴后版本时被覆盖 shutil.move(slndir('login-server.exe'), slndir('login-server-pre.exe')) shutil.move(slndir('login-server.pdb'), slndir('login-server-pre.pdb')) shutil.move(slndir('char-server.exe'), slndir('char-server-pre.exe')) shutil.move(slndir('char-server.pdb'), slndir('char-server-pre.pdb')) shutil.move(slndir('map-server.exe'), slndir('map-server-pre.exe')) shutil.move(slndir('map-server.pdb'), slndir('map-server-pre.pdb')) # 编译 Pandas 的复兴后版本 print('') compile_renewal(pandas_ver) print('') Message.ShowStatus('编译工作已经全部结束.') Message.ShowStatus('编译时产生的符号文件已存储, 记得提交符号文件.\n') # 友好退出, 主要是在 Windows 环境里给予暂停 Common.exit_with_pause(0)
def guide(inject): define = Inputer().requireText({ 'tips': '请输入该管理员指令的宏定义开关名称 (Pandas_AtCommand_的末尾部分)', 'prefix': 'Pandas_AtCommand_' }) # -------- funcname = Inputer().requireText({ 'tips': '请输入该管理员指令的处理函数名称 (ACMD_FUNC 部分的函数名)', 'lower': True }) # -------- samefunc = Inputer().requireBool({ 'tips': '管理员指令是否与处理函数名称一致 (%s)?' % funcname, 'default': True }) # -------- cmdname = funcname if not samefunc: cmdname = Inputer().requireText({ 'tips': '请输入该管理员指令的名称 (ACMD_DEF2 使用)', 'lower': True }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('管理员指令处理函数名称 : %s' % funcname) Message.ShowInfo('管理员指令名称 : %s' % cmdname) print('-' * 70) print('\n') nextstep = Inputer().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exit_with_pause(-1) # -------- Message.ShowStatus('开始将管理员指令信息写入到源代码...') options = {'define': define, 'funcname': funcname, 'cmdname': cmdname} insert_atcmd(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 管理员指令添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def guide(inject): define = InputController().requireText({ 'tips': '请输入该地图标记的宏定义开关名称 (Pandas_MapFlag_的末尾部分)', 'prefix': 'Pandas_MapFlag_' }) # -------- constant = InputController().requireText({ 'tips': '请输入该地图标记的 MF 常量名称 (自动大写, MF_的末尾部分)', 'prefix': 'MF_', 'upper': True }) # -------- flaglist = [{ 'name': '普通开关式的地图标记', 'desc': '0 - 普通的地图标记开关, 只有两个状态(开/关)' }, { 'name': '携带单个数值参数的地图标记', 'desc': '1 - 携带单个数值参数的地图标记, 可以记录数值变量 (例如 bexp 标记)' }, { 'name': '复杂赋值标记', 'desc': '2 - 复杂的赋值标记, 只单纯添加宏定义和 MF 常量, 其他的手动添加' }] # flagtype = 0 # 0 为普通开关 | 1 为数值开关 flagtype = InputController().requireSelect({ 'name': '想创建的地图标记类型', 'data': flaglist }) # -------- var_name_1 = None if flagtype == 1: var_name_1 = InputController().requireText({ 'tips': '请输入用于记录"第一个数值参数"的 map_data 结构成员变量名', 'prefix': '' }) # -------- zero_disable = False if flagtype == 1: zero_disable = InputController().requireBool({ 'tips': '当"第一个数值参数"的值为 0 时, 是否表示移除此地图标记?', 'default': False }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('常量名称 : %s' % constant) Message.ShowInfo('标记类型 : %s' % flaglist[flagtype]['name']) print('') Message.ShowInfo('第一个数值参数名称 : %s' % var_name_1) Message.ShowInfo('第一个数值参数的值为 0 时, 是否禁用此标记 : %s' % zero_disable) print('-' * 70) print('\n') nextstep = InputController().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exitWithPause(-1) # -------- Message.ShowStatus('开始将地图标记信息写入到源代码...') options = { 'define': define, 'constant': constant, 'var_name_1': var_name_1, 'zero_disable': zero_disable } if flagtype == 0: insert_for_normal_mapflag(inject, options) elif flagtype == 1: insert_for_one_param_mapflag(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 地图标记添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def main(): # 加载 .env 中的配置信息 load_dotenv(dotenv_path='.config.env', encoding='UTF-8') # 若无配置信息则自动复制一份文件出来 if not Common.is_file_exists('.config.env'): shutil.copyfile('.config.env.sample', '.config.env') # 显示欢迎信息 Common.welcome('符号归档辅助脚本') print('') # 由于 pdbparse 只能在 Windows 环境下安装, 此处进行限制 if platform.system() != 'Windows': Message.ShowWarning('该脚本只能在 Windows 环境下运行, 程序终止.') Common.exit_with_pause(-1) # 若环境变量为空则设置个默认值 if not os.getenv('DEFINE_PROJECT_NAME'): os.environ["DEFINE_PROJECT_NAME"] = "Pandas" if not os.getenv('DEFINE_SYMBOLS_SOURCE'): os.environ["DEFINE_SYMBOLS_SOURCE"] = "PandasWS/Pandas" if not os.getenv('DEFINE_COMPILE_MODE'): os.environ["DEFINE_COMPILE_MODE"] = "re,pre" # 符号仓库工程路径 global project_symstoredir project_symstoredir = os.path.abspath(project_slndir + '../Symbols/' + os.getenv('DEFINE_PROJECT_NAME')) Message.ShowInfo('当前输出的项目名称为: %s' % os.getenv('DEFINE_PROJECT_NAME')) # 检查是否已经完成了编译 if 're' in os.getenv('DEFINE_COMPILE_MODE').split(','): if not Common.is_compiled(project_slndir, checkmodel='re'): Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.') Common.exit_with_pause(-1) if 'pre' in os.getenv('DEFINE_COMPILE_MODE').split(','): if not Common.is_compiled(project_slndir, checkmodel='pre'): Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.') Common.exit_with_pause(-1) # 检查符号仓库是否存在, 不存在则创建 if not ensure_store(): Message.ShowWarning('你放弃了拉取符号仓库, 后续工作无法继续. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('符号仓库已经存在于本地, 开始确认工作区状态...') # 若符号文件存在, 则确保工作区干净 if not ensure_store_clean(): Message.ShowWarning('为了防止出现意外, 请确保符号仓库的工作区是干净的. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('很好, 符号仓库的工作区是干净的.') # 尝试更新本地的符号仓库到最新 if not update_store(): Message.ShowWarning('为了防止出现意外, 请确保符号仓库同步到最新. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('符号仓库已经同步到最新, 开始归档新的符号文件...') # 搜索工程目录全部 pdb 文件和 exe 文件, 进行归档 deploy_symbols(project_slndir) # 若环境变量为空则设置个默认值 if not os.getenv('DEFINE_SYMBOLS_COMMIT'): os.environ["DEFINE_SYMBOLS_COMMIT"] = "3" commit_flag = int(os.getenv('DEFINE_SYMBOLS_COMMIT')) # 自动进行 git 提交操作 if commit_flag & 1 == 1: if not Common.is_pandas_release(os.path.abspath(project_slndir)): Message.ShowStatus('符号文件已经归档完毕, 但并非正式版所以未自动提交...') Common.exit_with_pause() if commit_flag & 2 == 2: if Common.md5(os.getenv("DEFINE_CRASHRPT_APPID") ) != '952648de2d8f063a07331ae3827bc406': Message.ShowStatus( '符号文件已经归档完毕, 但未设置熊猫模拟器官方正式版的崩溃上报 APPID, 所以并未自动提交...') Common.exit_with_pause() Message.ShowStatus('符号文件已经归档完毕, 正在提交...') if not make_commit(): Message.ShowWarning('很抱歉, 提交失败! 请确认失败的原因. 程序终止.') Common.exit_with_pause(-1) else: Message.ShowStatus('提交成功, 请手工推送到远程仓库.') # 友好退出, 主要是在 Windows 环境里给予暂停 Common.exit_with_pause()