Skip to content

Commit 9240bc7

Browse files
committed
Fix samm cli selection on network errors
1 parent dee5c4b commit 9240bc7

2 files changed

Lines changed: 34 additions & 15 deletions

File tree

extension/src/extension.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,12 @@ type SammCliQuickPickItem = vscode.QuickPickItem & {
116116
};
117117

118118
async function selectSammCliExecutable(): Promise<void> {
119-
const releases = await sammCliDownloader.getRecentSammCliReleaseTags(10);
119+
const releases = await sammCliDownloader.getRecentSammCliReleaseTags(10).catch(error => {
120+
outputChannel.error(`Failed to fetch SAMM-CLI releases for quick pick: ${error instanceof Error ? error.message : String(error)}`);
121+
return [];
122+
});
120123
const currentSelection = settings.getSammCliSelection();
121124

122-
const releaseItems: SammCliQuickPickItem[] = releases.map(releaseTag => ({
123-
label: releaseTag,
124-
detail: currentSelection?.kind === 'release' && currentSelection.releaseTag === releaseTag ? 'Currently selected' : 'Download and use this GitHub release',
125-
selection: { kind: 'release', releaseTag },
126-
}));
127-
128125
const customPathItem: SammCliQuickPickItem = {
129126
label: '$(folder-opened) Use custom SAMM CLI executable or jar. Jar requires Java to be installed',
130127
detail: currentSelection?.kind === 'customPath' ? `Currently selected: ${currentSelection.path}` : 'Choose an executable from your file system',
@@ -137,13 +134,33 @@ async function selectSammCliExecutable(): Promise<void> {
137134
selection: { kind: 'noSammCli' },
138135
};
139136

140-
const pick = await vscode.window.showQuickPick([customPathItem, noSammCliItem, ...releaseItems], {
137+
const separator: SammCliQuickPickItem = {
138+
label: 'GitHub Releases',
139+
kind: vscode.QuickPickItemKind.Separator,
140+
selection: { kind: 'release', releaseTag: 'this is not clickable, so does not matter' },
141+
};
142+
143+
const releaseItems: SammCliQuickPickItem[] = releases.map(releaseTag => ({
144+
label: releaseTag,
145+
detail: currentSelection?.kind === 'release' && currentSelection.releaseTag === releaseTag ? 'Currently selected' : 'Download and use this GitHub release',
146+
selection: { kind: 'release', releaseTag },
147+
}));
148+
149+
if (releaseItems.length === 0) {
150+
releaseItems.push({
151+
label: '$(error) No GitHub releases available',
152+
detail: 'Failed to fetch releases from GitHub. Check output channel for details.',
153+
selection: { kind: 'release', releaseTag: '' },
154+
});
155+
}
156+
157+
const pick = await vscode.window.showQuickPick([customPathItem, noSammCliItem, separator, ...releaseItems], {
141158
title: 'Select SAMM-CLI executable',
142159
placeHolder: 'Choose a recent release or select a custom executable path',
143160
matchOnDetail: true,
144161
});
145162

146-
if (!pick) {
163+
if (!pick || (pick.selection.kind === 'release' && !pick.selection.releaseTag)) {
147164
return;
148165
}
149166

extension/src/sammCliDownloader.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Readable } from 'node:stream';
55
import { pipeline } from 'node:stream/promises';
66
import extractZip = require('extract-zip');
77
import * as tar from 'tar';
8-
import {TurtleExtensionSettings, SammCliSelection } from './settings';
8+
import { TurtleExtensionSettings, SammCliSelection } from './settings';
99
import type { ExtensionLogger } from './outputChannel';
1010

1111
interface GitHubReleaseAsset {
@@ -37,7 +37,9 @@ export class SammCliDownloader {
3737
}
3838

3939
const configuredVersion = selection.releaseTag;
40-
const latestVersion = await this.getLatestAvailabeSammCliReleaseTag();
40+
const latestVersion = await this.getLatestAvailabeSammCliReleaseTag().catch(error => {
41+
throw new Error(`Failed to check for latest SAMM-CLI release: ${error instanceof Error ? error.message : String(error)}`);
42+
});
4143
if (configuredVersion !== latestVersion) {
4244
vscode.window.showInformationMessage(`There is a new SAMM-CLI release available: ${configuredVersion} -> ${latestVersion}`, 'Download & Use').then(async (selection) => {
4345
if (selection === 'Download & Use') {
@@ -74,15 +76,15 @@ export class SammCliDownloader {
7476
});
7577

7678
if (!response.ok) {
77-
throw new Error(`Failed to fetch samm-cli releases: ${response.status} ${response.statusText}`);
79+
return Promise.reject(new Error(`Failed to fetch SAMM-CLI releases from GitHub: ${response.status} ${response.statusText}`));
7880
}
7981

8082
const fetchedReleases = response.json() as Promise<Array<GitHubRelease>>;
8183
return fetchedReleases.then(releases => releases
8284
.filter(release => !release.draft && !release.prerelease)
8385
.map(release => release.tag_name));
8486
}
85-
87+
8688
async getSammCli(): Promise<string> {
8789
const releaseSelection = this.settings.getSammCliSelection();
8890
if (releaseSelection.kind === 'customPath') {
@@ -109,7 +111,7 @@ export class SammCliDownloader {
109111
}
110112

111113
await mkdir(targetDirectory.fsPath, { recursive: true });
112-
this.outputChannel.info(`Downloading ${asset.name} (${release.tag_name})...`);
114+
this.outputChannel.info(`Downloading ${asset.name}(${release.tag_name})...`);
113115
await this.downloadAndExtractAsset(asset.browser_download_url, targetDirectory.fsPath, platform);
114116
await this.ensureExecutableIsReady(targetPath.fsPath, platform, release.tag_name);
115117

@@ -118,7 +120,7 @@ export class SammCliDownloader {
118120

119121
private async fetchRelease(releaseVersion: string): Promise<GitHubRelease> {
120122
const releasePath = releaseVersion && releaseVersion !== 'latest'
121-
? `releases/tags/${encodeURIComponent(releaseVersion)}`
123+
? `releases / tags / ${encodeURIComponent(releaseVersion)}`
122124
: 'releases/latest';
123125

124126
const response = await fetch(`https://api.github.com/repos/${GITHUB_RELEASE_REPOSITORY}/${releasePath}`, {

0 commit comments

Comments
 (0)