def update(args, uploader): logger.info("需要更新,开始更新流程") try: # 首先尝试使用增量更新文件 patches_range = uploader.latest_patches_range() logger.info(f"当前可以应用增量补丁更新的版本范围为{patches_range}") can_use_patch = not need_update(args.version, patches_range[0]) and not need_update( patches_range[1], args.version) if can_use_patch: logger.info(color("bold_yellow") + "当前版本可使用增量补丁,尝试进行增量更新") update_ok = incremental_update(args, uploader) if update_ok: logger.info("增量更新完毕") return else: logger.warning("增量更新失败,尝试默认的全量更新方案") except Exception as e: logger.exception("增量更新失败,尝试默认的全量更新方案", exc_info=e) # 保底使用全量更新 logger.info(color("bold_yellow") + "尝试全量更新") full_update(args, uploader) logger.info("全量更新完毕") return
def auto_update(): args = parse_args() logger.info( f"更新器的进程为{os.getpid()}, 版本为{auto_updater_version}(主代码版本为{now_version}),主进程为{args.pid}, 版本为{args.version}" ) # note: 工作目录预期为小助手的exe所在目录 if args.cwd == invalid_cwd: logger.error( "请不要直接双击打开自动更新工具,正确的用法是放到utils目录后,照常双击【DNF蚊子腿小助手.exe】来使用,小助手会自行调用自动更新DLC的" ) os.system("PAUSE") return logger.info(f"切换工作目录到{args.cwd}") os.chdir(args.cwd) uploader = Uploader(lanzou_cookie) # 进行实际的检查是否需要更新操作 latest_version = uploader.latest_version() logger.info(f"当前版本为{args.version},网盘最新版本为{latest_version}") if need_update(args.version, latest_version): update(args, uploader) start_new_version(args) else: logger.info("已经是最新版本,不需要更新")
def auto_update(): args = parse_args() change_title("自动更新DLC") logger.info(color("bold_yellow") + f"更新器的进程为{os.getpid()}, 代码版本为{now_version}") logger.info(color("bold_yellow") + f"需要检查更新的小助手主进程为{args.pid}, 版本为{args.version}") # note: 工作目录预期为小助手的exe所在目录 if args.cwd == invalid_cwd: logger.error("请不要直接双击打开自动更新工具,正确的用法是放到utils目录后,照常双击【DNF蚊子腿小助手.exe】来使用,小助手会自行调用自动更新DLC的") os.system("PAUSE") return logger.info(f"切换工作目录到{args.cwd}") os.chdir(args.cwd) if not exists_flag_file(".use_proxy"): bypass_proxy() logger.info(f"当前已默认无视系统代理(VPN),如果需要dlc使用代理,请在小助手目录创建 .use_proxy 目录或文件") uploader = Uploader() # 进行实际的检查是否需要更新操作 latest_version = uploader.latest_version() logger.info(f"当前版本为{args.version},网盘最新版本为{latest_version}") if need_update(args.version, latest_version): update(args, uploader) start_new_version(args) else: logger.info("已经是最新版本,不需要更新")
def auto_update(): args = parse_args() logger.info("更新器的进程为{},主进程为{}".format(os.getpid(), args.pid)) # note: 工作目录预期为小助手的exe所在目录 logger.info("切换工作目录到{}".format(args.cwd)) os.chdir(args.cwd) uploader = Uploader(lanzou_cookie) # 进行实际的检查是否需要更新操作 latest_version = uploader.latest_version() logger.info("当前版本为{},网盘最新版本为{}".format(args.version, latest_version)) if need_update(args.version, latest_version): update(args, uploader) start_new_version(args) else: logger.info("已经是最新版本,不需要更新")
def create_patch(dir_src, dir_all_release, create_patch_for_latest_n_version, dir_github_action_artifact) -> str: latest_version = now_version old_cwd = os.getcwd() os.chdir(dir_all_release) logger.info(f"工作目录已调整为{os.getcwd()},最新版本为v{latest_version}") version_dir_regex = r"DNF蚊子腿小助手_v(.*)_by风之凌殇" # 获取最新的几个版本的信息 old_version_infos = [] # type: List[VersionInfo] for dirpath in os.listdir("."): if not os.path.isdir(dirpath): continue # DNF蚊子腿小助手_v4.6.6_by风之凌殇.7z match = re.search(version_dir_regex, dirpath) if match is None: continue version = match.group(1) if not need_update(version, latest_version): continue old_version_infos.append(VersionInfo(version, dirpath)) if create_patch_for_latest_n_version > len(old_version_infos): create_patch_for_latest_n_version = len(old_version_infos) old_version_infos = sorted( old_version_infos)[-create_patch_for_latest_n_version:] logger.info(f"将为【{old_version_infos}】版本制作补丁包") # 创建patch目录 patch_oldest_version = old_version_infos[0].version patch_newest_version = old_version_infos[-1].version patches_dir = f"DNF蚊子腿小助手_增量更新文件_v{patch_oldest_version}_to_v{patch_newest_version}" temp_dir = "patches_temp" shutil.rmtree(patches_dir, ignore_errors=True) os.mkdir(patches_dir) shutil.rmtree(temp_dir, ignore_errors=True) os.mkdir(temp_dir) def temp_path(dir_name): return os.path.realpath(os.path.join(temp_dir, dir_name)) def preprocess_before_patch(temp_version_path): for filename in ["config.toml", "utils/auto_updater.exe"]: filepath = os.path.join(temp_version_path, filename) if os.path.isfile(filepath): os.remove(filepath) # 为旧版本创建patch文件 target_version_dir = f"DNF蚊子腿小助手_v{latest_version}_by风之凌殇" logger.info(f"目标版本目录为{target_version_dir}") shutil.copytree(target_version_dir, temp_path(target_version_dir)) preprocess_before_patch(temp_path(target_version_dir)) for idx, version_info in enumerate(old_version_infos): version = version_info.version patch_file = f"{patches_dir}/{version}.patch" logger.info("-" * 80) logger.info( f"[{idx + 1}/{len(old_version_infos)}] 创建从v{version}升级到v{latest_version}的补丁{patch_file}" ) version_dir = f"DNF蚊子腿小助手_v{version}_by风之凌殇" shutil.copytree(version_dir, temp_path(version_dir)) preprocess_before_patch(temp_path(version_dir)) subprocess.call([ os.path.realpath(os.path.join(dir_src, "utils/hdiffz.exe")), f"-p-{multiprocessing.cpu_count()}", # 设置系统最大cpu数 os.path.realpath(os.path.join(temp_dir, version_dir)), os.path.realpath(os.path.join(temp_dir, target_version_dir)), patch_file, ]) # 移除临时目录 shutil.rmtree(temp_dir, ignore_errors=True) # 压缩打包 patch_7z_file = f"{patches_dir}.7z" path_bz = os.path.join(dir_src, "bandizip_portable", "bz.exe") subprocess.call([ path_bz, 'c', '-y', '-r', '-aoa', '-fmt:7z', '-l:9', patch_7z_file, patches_dir ]) # 额外备份一份最新的供github action 使用 shutil.copyfile( patch_7z_file, os.path.join(dir_github_action_artifact, 'djc_helper_patches.7z')) os.chdir(old_cwd) return patch_7z_file
def __lt__(self, other): return need_update(self.version, other.version)