예제 #1
0
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
예제 #2
0
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("已经是最新版本,不需要更新")
예제 #3
0
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("已经是最新版本,不需要更新")
예제 #4
0
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("已经是最新版本,不需要更新")
예제 #5
0
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
예제 #6
0
 def __lt__(self, other):
     return need_update(self.version, other.version)