From 8c90a15bfd612c059611400c43fa748e95d6c8c0 Mon Sep 17 00:00:00 2001
From: pollenjp <polleninjp@gmail.com>
Date: Sat, 30 Nov 2024 00:48:57 +0900
Subject: [PATCH] enable latest cache by calling getLatestReleaseVersion

---
 dist/setup/index.js              | 94 +++++++-------------------------
 src/download/download-latest.ts  | 83 +++++-----------------------
 src/download/download-version.ts |  2 +-
 src/setup-uv.ts                  | 53 ++++++++----------
 4 files changed, 57 insertions(+), 175 deletions(-)

diff --git a/dist/setup/index.js b/dist/setup/index.js
index e038284..ac48421 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -89685,62 +89685,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
     });
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.downloadLatest = downloadLatest;
-const core = __importStar(__nccwpck_require__(7484));
-const tc = __importStar(__nccwpck_require__(3472));
-const exec = __importStar(__nccwpck_require__(5236));
-const path = __importStar(__nccwpck_require__(6760));
-const node_fs_1 = __nccwpck_require__(3024);
-const checksum_1 = __nccwpck_require__(5391);
+exports.getLatestReleaseVersion = getLatestReleaseVersion;
 const constants_1 = __nccwpck_require__(6156);
-function downloadLatest(platform, arch, checkSum, githubToken) {
+const github = __importStar(__nccwpck_require__(3228));
+function getLatestReleaseVersion(githubToken) {
     return __awaiter(this, void 0, void 0, function* () {
-        const artifact = `uv-${arch}-${platform}`;
-        let extension = ".tar.gz";
-        if (platform === "pc-windows-msvc") {
-            extension = ".zip";
+        const octokit = github.getOctokit(githubToken);
+        const { data: latestRelease } = yield octokit.rest.repos.getLatestRelease({
+            owner: constants_1.OWNER,
+            repo: constants_1.REPO,
+        });
+        if (latestRelease) {
+            return latestRelease.tag_name;
         }
-        const downloadUrl = `https://github.com/${constants_1.OWNER}/${constants_1.REPO}/releases/latest/download/${artifact}${extension}`;
-        core.info(`Downloading uv from "${downloadUrl}" ...`);
-        const downloadPath = yield tc.downloadTool(downloadUrl, undefined, githubToken);
-        let uvExecutablePath;
-        let uvDir;
-        if (platform === "pc-windows-msvc") {
-            const fullPathWithExtension = `${downloadPath}${extension}`;
-            yield node_fs_1.promises.copyFile(downloadPath, fullPathWithExtension);
-            uvDir = yield tc.extractZip(fullPathWithExtension);
-            // On windows extracting the zip does not create an intermediate directory
-            uvExecutablePath = path.join(uvDir, "uv.exe");
-        }
-        else {
-            const extractedDir = yield tc.extractTar(downloadPath);
-            uvDir = path.join(extractedDir, artifact);
-            uvExecutablePath = path.join(uvDir, "uv");
-        }
-        const version = yield getVersion(uvExecutablePath);
-        yield (0, checksum_1.validateChecksum)(checkSum, downloadPath, arch, platform, version);
-        const cachedToolDir = yield tc.cacheDir(uvDir, constants_1.TOOL_CACHE_NAME, version, arch);
-        return { cachedToolDir, version };
-    });
-}
-function getVersion(uvExecutablePath) {
-    return __awaiter(this, void 0, void 0, function* () {
-        // Parse the output of `uv --version` to get the version
-        // The output looks like
-        // uv 0.3.1 (be17d132a 2024-08-21)
-        const options = {
-            silent: !core.isDebug(),
-        };
-        const execArgs = ["--version"];
-        let output = "";
-        options.listeners = {
-            stdout: (data) => {
-                output += data.toString();
-            },
-        };
-        yield exec.exec(uvExecutablePath, execArgs, options);
-        const parts = output.split(" ");
-        return parts[1].trim();
+        throw new Error("No releases found for this repository.");
     });
 }
 
@@ -89787,6 +89745,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 exports.tryGetFromToolCache = tryGetFromToolCache;
 exports.downloadVersion = downloadVersion;
+exports.resolveVersion = resolveVersion;
 const core = __importStar(__nccwpck_require__(7484));
 const tc = __importStar(__nccwpck_require__(3472));
 const path = __importStar(__nccwpck_require__(6760));
@@ -90045,27 +90004,16 @@ function run() {
 }
 function setupUv(platform, arch, versionInput, checkSum, githubToken) {
     return __awaiter(this, void 0, void 0, function* () {
-        let installedPath;
-        let cachedToolDir;
-        let version;
-        if (versionInput === "latest") {
-            const latestResult = yield (0, download_latest_1.downloadLatest)(platform, arch, checkSum, githubToken);
-            version = latestResult.version;
-            cachedToolDir = latestResult.cachedToolDir;
+        const resolvedVersion = yield (0, download_version_1.resolveVersion)(versionInput === "latest"
+            ? yield (0, download_latest_1.getLatestReleaseVersion)(githubToken)
+            : versionInput, githubToken);
+        const toolCacheResult = (0, download_version_1.tryGetFromToolCache)(arch, resolvedVersion);
+        if (toolCacheResult.installedPath) {
+            core.info(`Found uv in tool-cache for ${resolvedVersion}`);
+            return { uvDir: toolCacheResult.installedPath, version: resolvedVersion };
         }
-        else {
-            const toolCacheResult = (0, download_version_1.tryGetFromToolCache)(arch, versionInput);
-            version = toolCacheResult.version;
-            installedPath = toolCacheResult.installedPath;
-            if (installedPath) {
-                core.info(`Found uv in tool-cache for ${versionInput}`);
-                return { uvDir: installedPath, version };
-            }
-            const versionResult = yield (0, download_version_1.downloadVersion)(platform, arch, versionInput, checkSum, githubToken);
-            cachedToolDir = versionResult.cachedToolDir;
-            version = versionResult.version;
-        }
-        return { uvDir: cachedToolDir, version };
+        const versionResult = yield (0, download_version_1.downloadVersion)(platform, arch, resolvedVersion, checkSum, githubToken);
+        return { uvDir: versionResult.cachedToolDir, version: versionResult.version };
     });
 }
 function addUvToPath(cachedPath) {
diff --git a/src/download/download-latest.ts b/src/download/download-latest.ts
index edb8926..5723cf1 100644
--- a/src/download/download-latest.ts
+++ b/src/download/download-latest.ts
@@ -1,73 +1,16 @@
-import * as core from "@actions/core";
-import * as tc from "@actions/tool-cache";
-import * as exec from "@actions/exec";
-import * as path from "node:path";
-import { promises as fs } from "node:fs";
-import type { Architecture, Platform } from "../utils/platforms";
-import { validateChecksum } from "./checksum/checksum";
-import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
+import { OWNER, REPO } from "../utils/constants";
+import * as github from "@actions/github";
 
-export async function downloadLatest(
-  platform: Platform,
-  arch: Architecture,
-  checkSum: string | undefined,
-  githubToken: string | undefined,
-): Promise<{ cachedToolDir: string; version: string }> {
-  const artifact = `uv-${arch}-${platform}`;
-  let extension = ".tar.gz";
-  if (platform === "pc-windows-msvc") {
-    extension = ".zip";
+export async function getLatestReleaseVersion(githubToken: string) {
+  const octokit = github.getOctokit(githubToken);
+
+  const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
+    owner: OWNER,
+    repo: REPO,
+  });
+
+  if (latestRelease) {
+    return latestRelease.tag_name;
   }
-  const downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/latest/download/${artifact}${extension}`;
-  core.info(`Downloading uv from "${downloadUrl}" ...`);
-
-  const downloadPath = await tc.downloadTool(
-    downloadUrl,
-    undefined,
-    githubToken,
-  );
-  let uvExecutablePath: string;
-  let uvDir: string;
-  if (platform === "pc-windows-msvc") {
-    const fullPathWithExtension = `${downloadPath}${extension}`;
-    await fs.copyFile(downloadPath, fullPathWithExtension);
-    uvDir = await tc.extractZip(fullPathWithExtension);
-    // On windows extracting the zip does not create an intermediate directory
-    uvExecutablePath = path.join(uvDir, "uv.exe");
-  } else {
-    const extractedDir = await tc.extractTar(downloadPath);
-    uvDir = path.join(extractedDir, artifact);
-    uvExecutablePath = path.join(uvDir, "uv");
-  }
-  const version = await getVersion(uvExecutablePath);
-  await validateChecksum(checkSum, downloadPath, arch, platform, version);
-  const cachedToolDir = await tc.cacheDir(
-    uvDir,
-    TOOL_CACHE_NAME,
-    version,
-    arch,
-  );
-
-  return { cachedToolDir, version };
-}
-
-async function getVersion(uvExecutablePath: string): Promise<string> {
-  // Parse the output of `uv --version` to get the version
-  // The output looks like
-  // uv 0.3.1 (be17d132a 2024-08-21)
-
-  const options: exec.ExecOptions = {
-    silent: !core.isDebug(),
-  };
-  const execArgs = ["--version"];
-
-  let output = "";
-  options.listeners = {
-    stdout: (data: Buffer) => {
-      output += data.toString();
-    },
-  };
-  await exec.exec(uvExecutablePath, execArgs, options);
-  const parts = output.split(" ");
-  return parts[1].trim();
+  throw new Error("No releases found for this repository.");
 }
diff --git a/src/download/download-version.ts b/src/download/download-version.ts
index 3e9fb59..ba09aff 100644
--- a/src/download/download-version.ts
+++ b/src/download/download-version.ts
@@ -70,7 +70,7 @@ export async function downloadVersion(
   return { version: resolvedVersion, cachedToolDir };
 }
 
-async function resolveVersion(
+export async function resolveVersion(
   version: string,
   githubToken: string,
 ): Promise<string> {
diff --git a/src/setup-uv.ts b/src/setup-uv.ts
index 43a469a..40e1e3a 100644
--- a/src/setup-uv.ts
+++ b/src/setup-uv.ts
@@ -3,10 +3,11 @@ import * as path from "node:path";
 import {
   downloadVersion,
   tryGetFromToolCache,
+  resolveVersion,
 } from "./download/download-version";
 import { restoreCache } from "./cache/restore-cache";
 
-import { downloadLatest } from "./download/download-latest";
+import { getLatestReleaseVersion } from "./download/download-latest";
 import {
   type Architecture,
   getArch,
@@ -69,38 +70,28 @@ async function setupUv(
   checkSum: string | undefined,
   githubToken: string,
 ): Promise<{ uvDir: string; version: string }> {
-  let installedPath: string | undefined;
-  let cachedToolDir: string;
-  let version: string;
-  if (versionInput === "latest") {
-    const latestResult = await downloadLatest(
-      platform,
-      arch,
-      checkSum,
-      githubToken,
-    );
-    version = latestResult.version;
-    cachedToolDir = latestResult.cachedToolDir;
-  } else {
-    const toolCacheResult = tryGetFromToolCache(arch, versionInput);
-    version = toolCacheResult.version;
-    installedPath = toolCacheResult.installedPath;
-    if (installedPath) {
-      core.info(`Found uv in tool-cache for ${versionInput}`);
-      return { uvDir: installedPath, version };
-    }
-    const versionResult = await downloadVersion(
-      platform,
-      arch,
-      versionInput,
-      checkSum,
-      githubToken,
-    );
-    cachedToolDir = versionResult.cachedToolDir;
-    version = versionResult.version;
+  const resolvedVersion = await resolveVersion(
+    versionInput === "latest"
+      ? await getLatestReleaseVersion(githubToken)
+      : versionInput,
+    githubToken,
+  );
+
+  const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion);
+  if (toolCacheResult.installedPath) {
+    core.info(`Found uv in tool-cache for ${resolvedVersion}`);
+    return { uvDir: toolCacheResult.installedPath, version: resolvedVersion };
   }
 
-  return { uvDir: cachedToolDir, version };
+  const versionResult = await downloadVersion(
+    platform,
+    arch,
+    resolvedVersion,
+    checkSum,
+    githubToken,
+  );
+
+  return { uvDir: versionResult.cachedToolDir, version: versionResult.version };
 }
 
 function addUvToPath(cachedPath: string): void {