初始化仓库
This commit is contained in:
+77
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
"use strict";
|
||||
|
||||
const { execFileSync, execSync } = require("child_process");
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
|
||||
const PACKAGE = require("./package.json");
|
||||
const EXPECTED_VER = PACKAGE.version; // e.g. "1.1.0-beta.4"
|
||||
const NAME = "cc-connect";
|
||||
const binDir = path.join(__dirname, "bin");
|
||||
const ext = process.platform === "win32" ? ".exe" : "";
|
||||
const binaryPath = path.join(binDir, NAME + ext);
|
||||
|
||||
// parseVersion splits "1.2.3-beta.1" into { nums: [1,2,3], preTag: "beta", preNum: 1 }
|
||||
function parseVersion(v) {
|
||||
v = v.replace(/^v/, "").trim();
|
||||
const [base, ...rest] = v.split("-");
|
||||
const nums = base.split(".").map(Number);
|
||||
const pre = rest.join("-");
|
||||
const m = pre.match(/^([a-zA-Z]+)\.?(\d+)?$/);
|
||||
return { nums, preTag: m ? m[1] : pre, preNum: m && m[2] ? parseInt(m[2], 10) : 0, hasPre: pre !== "" };
|
||||
}
|
||||
|
||||
// isNewerOrEqual returns true if installed >= expected
|
||||
function isNewerOrEqual(installed, expected) {
|
||||
const a = parseVersion(installed);
|
||||
const b = parseVersion(expected);
|
||||
const len = Math.max(a.nums.length, b.nums.length);
|
||||
for (let i = 0; i < len; i++) {
|
||||
const av = a.nums[i] || 0;
|
||||
const bv = b.nums[i] || 0;
|
||||
if (av > bv) return true;
|
||||
if (av < bv) return false;
|
||||
}
|
||||
// Same base: no pre-release >= any pre-release (1.2.3 >= 1.2.3-beta.1)
|
||||
if (!a.hasPre && b.hasPre) return true;
|
||||
if (a.hasPre && !b.hasPre) return false;
|
||||
if (!a.hasPre && !b.hasPre) return true;
|
||||
// Both pre-release: compare tag then number (rc > beta, beta.10 > beta.9)
|
||||
if (a.preTag !== b.preTag) return a.preTag > b.preTag;
|
||||
return a.preNum >= b.preNum;
|
||||
}
|
||||
|
||||
function needsReinstall() {
|
||||
if (!fs.existsSync(binaryPath)) return true;
|
||||
try {
|
||||
const out = execFileSync(binaryPath, ["--version"], { encoding: "utf8", timeout: 5000 });
|
||||
if (out.includes(EXPECTED_VER)) return false;
|
||||
// Extract version from output (e.g. "cc-connect 1.2.2-beta.1" or "1.2.2-beta.1")
|
||||
const match = out.match(/(\d+\.\d+\.\d+[^\s]*)/);
|
||||
if (match && isNewerOrEqual(match[1], EXPECTED_VER)) return false;
|
||||
return true;
|
||||
} catch {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (needsReinstall()) {
|
||||
console.log(`[cc-connect] Binary missing or outdated, installing v${EXPECTED_VER}...`);
|
||||
try {
|
||||
execSync("node " + JSON.stringify(path.join(__dirname, "install.js")), {
|
||||
stdio: "inherit",
|
||||
cwd: __dirname,
|
||||
});
|
||||
} catch {
|
||||
console.error("[cc-connect] Auto-install failed. Run manually: npm uninstall -g cc-connect && npm install -g cc-connect@beta");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
execFileSync(binaryPath, process.argv.slice(2), { stdio: "inherit" });
|
||||
} catch (err) {
|
||||
process.exit(err.status || 1);
|
||||
}
|
||||
Reference in New Issue
Block a user