From a0a682826500f2042ad6aa30abd06ae4a414c5e1 Mon Sep 17 00:00:00 2001 From: Haroon Chaudhry Date: Fri, 7 Nov 2025 10:50:44 -0500 Subject: [PATCH] fix: Downloading release assets from private GitHub repository #11928 (#12682) --- .../cli/src/config/extensions/github.test.ts | 18 +++++++-------- packages/cli/src/config/extensions/github.ts | 22 +++++++++++++------ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/cli/src/config/extensions/github.test.ts b/packages/cli/src/config/extensions/github.test.ts index c78f156d07..1b1f3b0e82 100644 --- a/packages/cli/src/config/extensions/github.test.ts +++ b/packages/cli/src/config/extensions/github.test.ts @@ -310,11 +310,11 @@ describe('git extension helpers', () => { describe('findReleaseAsset', () => { const assets = [ - { name: 'darwin.arm64.extension.tar.gz', browser_download_url: 'url1' }, - { name: 'darwin.x64.extension.tar.gz', browser_download_url: 'url2' }, - { name: 'linux.x64.extension.tar.gz', browser_download_url: 'url3' }, - { name: 'win32.x64.extension.tar.gz', browser_download_url: 'url4' }, - { name: 'extension-generic.tar.gz', browser_download_url: 'url5' }, + { name: 'darwin.arm64.extension.tar.gz', url: 'url1' }, + { name: 'darwin.x64.extension.tar.gz', url: 'url2' }, + { name: 'linux.x64.extension.tar.gz', url: 'url3' }, + { name: 'win32.x64.extension.tar.gz', url: 'url4' }, + { name: 'extension-generic.tar.gz', url: 'url5' }, ]; it.each([ @@ -334,9 +334,7 @@ describe('git extension helpers', () => { ); it('should find generic asset if it is the only one', () => { - const singleAsset = [ - { name: 'extension.tar.gz', browser_download_url: 'url' }, - ]; + const singleAsset = [{ name: 'extension.tar.gz', url: 'aurl5' }]; mockPlatform.mockReturnValue('darwin'); mockArch.mockReturnValue('arm64'); @@ -346,8 +344,8 @@ describe('git extension helpers', () => { it('should return undefined if multiple generic assets exist', () => { const multipleGenericAssets = [ - { name: 'extension-1.tar.gz', browser_download_url: 'url1' }, - { name: 'extension-2.tar.gz', browser_download_url: 'url2' }, + { name: 'extension-1.tar.gz', url: 'aurl1' }, + { name: 'extension-2.tar.gz', url: 'aurl2' }, ]; mockPlatform.mockReturnValue('darwin'); diff --git a/packages/cli/src/config/extensions/github.ts b/packages/cli/src/config/extensions/github.ts index f2b1973064..4f5316e2d7 100644 --- a/packages/cli/src/config/extensions/github.ts +++ b/packages/cli/src/config/extensions/github.ts @@ -306,8 +306,11 @@ export async function downloadFromGitHubRelease( let archiveUrl: string | undefined; let isTar = false; let isZip = false; + let fileName: string | undefined; + if (asset) { - archiveUrl = asset.browser_download_url; + archiveUrl = asset.url; + fileName = asset.name; } else { if (releaseData.tarball_url) { archiveUrl = releaseData.tarball_url; @@ -326,10 +329,10 @@ export async function downloadFromGitHubRelease( errorMessage: `No assets found for release with tag ${releaseData.tag_name}`, }; } - let downloadedAssetPath = path.join( - destination, - path.basename(new URL(archiveUrl).pathname), - ); + if (!fileName) { + fileName = path.basename(new URL(archiveUrl).pathname); + } + let downloadedAssetPath = path.join(destination, fileName); if (isTar && !downloadedAssetPath.endsWith('.tar.gz')) { downloadedAssetPath += '.tar.gz'; } else if (isZip && !downloadedAssetPath.endsWith('.zip')) { @@ -414,7 +417,7 @@ interface GithubReleaseData { interface Asset { name: string; - browser_download_url: string; + url: string; } export function findReleaseAsset(assets: Asset[]): Asset | undefined { @@ -455,8 +458,13 @@ export function findReleaseAsset(assets: Asset[]): Asset | undefined { } async function downloadFile(url: string, dest: string): Promise { - const headers: { 'User-agent': string; Authorization?: string } = { + const headers: { + 'User-agent': string; + Accept: string; + Authorization?: string; + } = { 'User-agent': 'gemini-cli', + Accept: 'application/octet-stream', }; const token = getGitHubToken(); if (token) {