update python.ts

This commit is contained in:
2026-01-27 22:19:37 +08:00
parent 3ec67f241e
commit 95486035e5
3 changed files with 38 additions and 26 deletions

View File

@@ -13,6 +13,7 @@ import {
writeStringToFile,
} from "https://global.hatter.ink/script/get/@16/deno-commons-mod.ts";
import { parseArgs } from "jsr:@std/cli/parse-args";
import { assertEquals } from "jsr:@std/assert";
const PYTHON_CONFIG_FILE = "~/.config/python-config.json";
const PYTHON_VENV_DEFAULT_BASE_DIR = "~/.venv/";
@@ -128,7 +129,7 @@ async function addVirtualEnv(
pythonVersion: string | null,
pythonVenv: string,
comment?: string,
) {
): Promise<void> {
const pythonConfig = await loadPythonConfig();
if (!pythonVersion) {
throw `No Python version assigned.`;
@@ -190,6 +191,23 @@ async function addVirtualEnv(
await savePythonConfig(pythonConfig);
}
function versionSort(a: string, b: string): number {
const versionAParts = a.split(".");
const versionBParts = b.split(".");
const minLen = Math.min(versionAParts.length, versionBParts.length);
for (let i: number = 0; i < minLen; i++) {
const ai = parseInt(versionAParts[i], 10);
const bi = parseInt(versionBParts[i], 10);
if (ai !== bi) {
return (ai < bi) ? -1 : 1;
}
}
if (versionAParts.length === versionBParts.length) {
return 0;
}
return (versionAParts.length < versionBParts.length) ? -1 : 1;
}
async function handlePython(args: string[]) {
const flags = parseArgs(Deno.args, {
boolean: ["help"],
@@ -206,31 +224,16 @@ async function handlePython(args: string[]) {
const versions: string[] = [];
let maxVersionLength = 0;
for (let version in pythonConfig.versions) {
for (const version in pythonConfig.versions) {
versions.push(version);
if (version.length > maxVersionLength) {
maxVersionLength = version.length;
}
}
versions.sort((a, b) => {
const versionAParts = a.split(".");
const versionBParts = b.split(".");
const minLen = Math.min(versionAParts.length, versionBParts.length);
for (let i = 0; i < minLen; i++) {
const ai = parseInt(versionAParts[i], 10);
const bi = parseInt(versionBParts[i], 10);
if (ai !== bi) {
return (ai < bi) ? -1 : 1;
}
}
if (versionAParts.length === versionBParts.length) {
return 0;
}
return (versionAParts.length < versionBParts.length) ? -1 : 1;
});
versions.sort(versionSort);
console.log(`Found ${versions.length} Python version(s)`);
for (let version in pythonConfig.versions) {
for (const version of versions) {
const pythonVersion = pythonConfig.versions[version];
const versionPadding = " ".repeat(
maxVersionLength - version.length,
@@ -519,5 +522,14 @@ async function main() {
main().catch((e) => log.error(e));
// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260126T224501+08:00.MEYCIQCcH+T4kogAD0bc8MS7
// 1HmKATErZhVwcyiJRc0NVYl8cQIhAMObac/Id8AZcSdrvZ/dow5a+RXdRjREPSkMqJe7w4TW
Deno.test("versionSort", () => {
const versions1 = ["3.10", "3.7"];
versions1.sort(versionSort);
assertEquals(["3.7", "3.10"], versions1);
const versions2 = ["3.10", "3.10.1", "3.11", "3.7"];
versions2.sort(versionSort);
assertEquals(["3.7", "3.10", "3.10.1", "3.11"], versions2);
});
// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260127T221900+08:00.MEYCIQC/ePZbN/H3JAOhZ43u
// 4ek90MK1IFKLKTynP9RHYRgxTAIhALWtaXAarv25CKcd1ok4AYfuw5ooR68smBzOokmBsEfI