diff --git a/package.json b/package.json index e10a8bdf..9db6bc4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.2.2", + "version": "v2.2.3-alpha", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev -- --profile fast-dev", @@ -17,6 +17,7 @@ "portable": "node scripts/portable.mjs", "portable-fixed-webview2": "node scripts/portable-fixed-webview2.mjs", "fix-alpha-version": "node scripts/fix-alpha_version.mjs", + "release-version": "node scripts/release_version.mjs", "release-alpha-version": "node scripts/release-alpha_version.mjs", "prepare": "husky", "clean": "cd ./src-tauri && cargo clean && cd -" @@ -109,4 +110,4 @@ }, "type": "module", "packageManager": "pnpm@9.13.2" -} +} \ No newline at end of file diff --git a/scripts/release-alpha_version.mjs b/scripts/release-alpha_version.mjs index 7319aa63..e810dabd 100644 --- a/scripts/release-alpha_version.mjs +++ b/scripts/release-alpha_version.mjs @@ -1,38 +1,48 @@ import fs from "fs/promises"; import path from "path"; +import { program } from "commander"; /** * 更新 package.json 文件中的版本号 + * @param {string} versionTag 版本标签 (如 "alpha", "beta", "rc") */ -async function updatePackageVersion() { +async function updatePackageVersion(versionTag) { const _dirname = process.cwd(); const packageJsonPath = path.join(_dirname, "package.json"); try { const data = await fs.readFile(packageJsonPath, "utf8"); const packageJson = JSON.parse(data); - let result = packageJson.version; - if (!result.includes("alpha")) { - result = `${result}-alpha`; - } + // 获取当前版本并清理可能存在的旧标签 + let currentVersion = packageJson.version.replace( + /-(alpha|beta|rc)\.?\d*$/i, + "", + ); + let newVersion = `${currentVersion}-${versionTag}`; - console.log("[INFO]: Current package.json version is: ", result); - packageJson.version = result; + console.log( + "[INFO]: Current package.json version is: ", + packageJson.version, + ); + packageJson.version = newVersion; await fs.writeFile( packageJsonPath, JSON.stringify(packageJson, null, 2), "utf8", ); - console.log(`[INFO]: package.json version updated to: ${result}`); + console.log(`[INFO]: package.json version updated to: ${newVersion}`); + return newVersion; } catch (error) { console.error("Error updating package.json version:", error); + throw error; } } /** * 更新 Cargo.toml 文件中的版本号 + * @param {string} versionTag 版本标签 */ -async function updateCargoVersion() { +async function updateCargoVersion(versionTag) { const _dirname = process.cwd(); const cargoTomlPath = path.join(_dirname, "src-tauri", "Cargo.toml"); try { @@ -40,10 +50,12 @@ async function updateCargoVersion() { const lines = data.split("\n"); const updatedLines = lines.map((line) => { - if (line.startsWith("version =")) { - const versionMatch = line.match(/version\s*=\s*"([^"]+)"/); - if (versionMatch && !versionMatch[1].includes("alpha")) { - const newVersion = `${versionMatch[1]}-alpha`; + if (line.trim().startsWith("version =")) { + // 清理可能存在的旧标签 + const cleanedVersion = line.replace(/-(alpha|beta|rc)\.?\d*"/i, '"'); + const versionMatch = cleanedVersion.match(/version\s*=\s*"([^"]+)"/); + if (versionMatch) { + const newVersion = `${versionMatch[1]}-${versionTag}`; return line.replace(versionMatch[1], newVersion); } } @@ -51,46 +63,83 @@ async function updateCargoVersion() { }); await fs.writeFile(cargoTomlPath, updatedLines.join("\n"), "utf8"); + console.log(`[INFO]: Cargo.toml version updated with ${versionTag} tag`); } catch (error) { console.error("Error updating Cargo.toml version:", error); + throw error; } } /** * 更新 tauri.conf.json 文件中的版本号 + * @param {string} versionTag 版本标签 */ -async function updateTauriConfigVersion() { +async function updateTauriConfigVersion(versionTag) { const _dirname = process.cwd(); const tauriConfigPath = path.join(_dirname, "src-tauri", "tauri.conf.json"); try { const data = await fs.readFile(tauriConfigPath, "utf8"); const tauriConfig = JSON.parse(data); - let version = tauriConfig.version; - if (!version.includes("alpha")) { - version = `${version}-alpha`; - } + // 清理可能存在的旧标签 + let currentVersion = tauriConfig.version.replace( + /-(alpha|beta|rc)\.?\d*$/i, + "", + ); + let newVersion = `${currentVersion}-${versionTag}`; - console.log("[INFO]: Current tauri.conf.json version is: ", version); - tauriConfig.version = version; + console.log( + "[INFO]: Current tauri.conf.json version is: ", + tauriConfig.version, + ); + tauriConfig.version = newVersion; await fs.writeFile( tauriConfigPath, JSON.stringify(tauriConfig, null, 2), "utf8", ); - console.log(`[INFO]: tauri.conf.json version updated to: ${version}`); + console.log(`[INFO]: tauri.conf.json version updated to: ${newVersion}`); } catch (error) { console.error("Error updating tauri.conf.json version:", error); + throw error; } } /** * 主函数,依次更新所有文件的版本号 + * @param {string} versionTag 版本标签 */ -async function main() { - await updatePackageVersion(); - await updateCargoVersion(); - await updateTauriConfigVersion(); +async function main(versionTag) { + if (!versionTag) { + console.error("Error: Version tag is required"); + process.exit(1); + } + + // 验证版本标签是否有效 + const validTags = ["alpha", "beta", "rc"]; + if (!validTags.includes(versionTag.toLowerCase())) { + console.error( + `Error: Invalid version tag. Must be one of: ${validTags.join(", ")}`, + ); + process.exit(1); + } + + try { + console.log(`[INFO]: Updating versions with ${versionTag} tag...`); + await updatePackageVersion(versionTag); + await updateCargoVersion(versionTag); + await updateTauriConfigVersion(versionTag); + console.log("[SUCCESS]: All version updates completed successfully!"); + } catch (error) { + console.error("[ERROR]: Failed to update versions:", error); + process.exit(1); + } } -main().catch(console.error); +// 设置命令行界面 +program + .name("pnpm release-version") + .description("Add version tag (alpha/beta/rc) to project version numbers") + .argument("", "version tag to add (alpha, beta, or rc)") + .action(main) + .parse(process.argv); diff --git a/scripts/release_version.mjs b/scripts/release_version.mjs new file mode 100644 index 00000000..d083a26d --- /dev/null +++ b/scripts/release_version.mjs @@ -0,0 +1,195 @@ +import fs from "fs/promises"; +import path from "path"; +import { program } from "commander"; + +/** + * 验证版本号格式 + * @param {string} version + * @returns {boolean} + */ +function isValidVersion(version) { + return /^v?\d+\.\d+\.\d+(-(alpha|beta|rc)(\.\d+)?)?$/i.test(version); +} + +/** + * 标准化版本号(确保v前缀可选) + * @param {string} version + * @returns {string} + */ +function normalizeVersion(version) { + return version.startsWith("v") ? version : `v${version}`; +} + +/** + * 更新 package.json 文件中的版本号 + * @param {string} newVersion 新版本号 + */ +async function updatePackageVersion(newVersion) { + const _dirname = process.cwd(); + const packageJsonPath = path.join(_dirname, "package.json"); + try { + const data = await fs.readFile(packageJsonPath, "utf8"); + const packageJson = JSON.parse(data); + + console.log( + "[INFO]: Current package.json version is: ", + packageJson.version, + ); + packageJson.version = newVersion.startsWith("v") + ? newVersion.slice(1) + : newVersion; + await fs.writeFile( + packageJsonPath, + JSON.stringify(packageJson, null, 2), + "utf8", + ); + console.log( + `[INFO]: package.json version updated to: ${packageJson.version}`, + ); + return packageJson.version; + } catch (error) { + console.error("Error updating package.json version:", error); + throw error; + } +} + +/** + * 更新 Cargo.toml 文件中的版本号 + * @param {string} newVersion 新版本号 + */ +async function updateCargoVersion(newVersion) { + const _dirname = process.cwd(); + const cargoTomlPath = path.join(_dirname, "src-tauri", "Cargo.toml"); + try { + const data = await fs.readFile(cargoTomlPath, "utf8"); + const lines = data.split("\n"); + + const versionWithoutV = newVersion.startsWith("v") + ? newVersion.slice(1) + : newVersion; + + const updatedLines = lines.map((line) => { + if (line.trim().startsWith("version =")) { + return line.replace( + /version\s*=\s*"[^"]+"/, + `version = "${versionWithoutV}"`, + ); + } + return line; + }); + + await fs.writeFile(cargoTomlPath, updatedLines.join("\n"), "utf8"); + console.log(`[INFO]: Cargo.toml version updated to: ${versionWithoutV}`); + } catch (error) { + console.error("Error updating Cargo.toml version:", error); + throw error; + } +} + +/** + * 更新 tauri.conf.json 文件中的版本号 + * @param {string} newVersion 新版本号 + */ +async function updateTauriConfigVersion(newVersion) { + const _dirname = process.cwd(); + const tauriConfigPath = path.join(_dirname, "src-tauri", "tauri.conf.json"); + try { + const data = await fs.readFile(tauriConfigPath, "utf8"); + const tauriConfig = JSON.parse(data); + + const versionWithoutV = newVersion.startsWith("v") + ? newVersion.slice(1) + : newVersion; + + console.log( + "[INFO]: Current tauri.conf.json version is: ", + tauriConfig.version, + ); + tauriConfig.version = versionWithoutV; + await fs.writeFile( + tauriConfigPath, + JSON.stringify(tauriConfig, null, 2), + "utf8", + ); + console.log( + `[INFO]: tauri.conf.json version updated to: ${versionWithoutV}`, + ); + } catch (error) { + console.error("Error updating tauri.conf.json version:", error); + throw error; + } +} + +/** + * 获取当前版本号(从package.json) + */ +async function getCurrentVersion() { + const _dirname = process.cwd(); + const packageJsonPath = path.join(_dirname, "package.json"); + try { + const data = await fs.readFile(packageJsonPath, "utf8"); + const packageJson = JSON.parse(data); + return packageJson.version; + } catch (error) { + console.error("Error getting current version:", error); + throw error; + } +} + +/** + * 主函数,更新所有文件的版本号 + * @param {string} versionArg 版本参数(可以是标签或完整版本号) + */ +async function main(versionArg) { + if (!versionArg) { + console.error("Error: Version argument is required"); + process.exit(1); + } + + try { + let newVersion; + const validTags = ["alpha", "beta", "rc"]; + + // 判断参数是标签还是完整版本号 + if (validTags.includes(versionArg.toLowerCase())) { + // 标签模式:在当前版本基础上添加标签 + const currentVersion = await getCurrentVersion(); + const baseVersion = currentVersion.replace( + /-(alpha|beta|rc)(\.\d+)?$/i, + "", + ); + newVersion = `${baseVersion}-${versionArg.toLowerCase()}`; + } else { + // 完整版本号模式 + if (!isValidVersion(versionArg)) { + console.error( + "Error: Invalid version format. Expected format: vX.X.X or vX.X.X-tag (e.g. v2.2.3 or v2.2.3-alpha)", + ); + process.exit(1); + } + newVersion = normalizeVersion(versionArg); + } + + console.log(`[INFO]: Updating versions to: ${newVersion}`); + await updatePackageVersion("v" + newVersion); + await updateCargoVersion(newVersion); + await updateTauriConfigVersion(newVersion); + console.log("[SUCCESS]: All version updates completed successfully!"); + } catch (error) { + console.error("[ERROR]: Failed to update versions:", error); + process.exit(1); + } +} + +// 设置命令行界面 +program + .name("pnpm release-version") + .description( + "Update project version numbers. Can add tag (alpha/beta/rc) or set full version (e.g. v2.2.3 or v2.2.3-alpha)", + ) + .argument( + "", + "version tag (alpha/beta/rc) or full version (e.g. v2.2.3 or v2.2.3-alpha)", + ) + .action(main) + .parse(process.argv); diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 364c4767..d1963833 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1132,7 +1132,7 @@ dependencies = [ [[package]] name = "clash-verge" -version = "2.2.2" +version = "2.2.3-alpha" dependencies = [ "ab_glyph", "aes-gcm", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index fae48b51..e36f47ee 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clash-verge" -version = "2.2.2" +version = "2.2.3-alpha" description = "clash verge" authors = ["zzzgydi", "wonfen", "MystiPanda"] license = "GPL-3.0-only" diff --git a/src-tauri/src/cmd/proxy.rs b/src-tauri/src/cmd/proxy.rs index a196000a..c22a4329 100644 --- a/src-tauri/src/cmd/proxy.rs +++ b/src-tauri/src/cmd/proxy.rs @@ -1,8 +1,9 @@ use super::CmdResult; -use crate::module::mihomo::MihomoManager; +use crate::{logging, module::mihomo::MihomoManager}; #[tauri::command] pub async fn get_proxies() -> CmdResult { + println!("get_proxies"); let mannager = MihomoManager::global(); let proxies = mannager .refresh_proxies() @@ -14,7 +15,8 @@ pub async fn get_proxies() -> CmdResult { #[tauri::command] pub async fn get_providers_proxies() -> CmdResult { - let mannager = MihomoManager::global(); + println!("get_providers_proxies"); + let manager = MihomoManager::global(); let providers = mannager .refresh_providers_proxies() .await diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 0e548093..df206959 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,5 +1,5 @@ { - "version": "2.2.2", + "version": "2.2.3-alpha", "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "bundle": { "active": true, @@ -11,9 +11,15 @@ "icons/icon.icns", "icons/icon.ico" ], - "resources": ["resources", "resources/locales/*"], + "resources": [ + "resources", + "resources/locales/*" + ], "publisher": "Clash Verge Rev", - "externalBin": ["sidecar/verge-mihomo", "sidecar/verge-mihomo-alpha"], + "externalBin": [ + "sidecar/verge-mihomo", + "sidecar/verge-mihomo-alpha" + ], "copyright": "GNU General Public License v3.0", "category": "DeveloperTool", "shortDescription": "Clash Verge Rev", @@ -44,18 +50,28 @@ }, "deep-link": { "desktop": { - "schemes": ["clash", "clash-verge"] + "schemes": [ + "clash", + "clash-verge" + ] } } }, "app": { "security": { - "capabilities": ["desktop-capability", "migrated"], + "capabilities": [ + "desktop-capability", + "migrated" + ], "assetProtocol": { - "scope": ["$APPDATA/**", "$RESOURCE/../**", "**"], + "scope": [ + "$APPDATA/**", + "$RESOURCE/../**", + "**" + ], "enable": true }, "csp": null } } -} +} \ No newline at end of file