diff --git a/package.json b/package.json index 42c8094..54a7e16 100644 --- a/package.json +++ b/package.json @@ -288,6 +288,12 @@ "title": "Remove", "icon": "$(close)" }, + { + "category": "GitHub Local Actions", + "command": "githubLocalActions.deleteSettingFile", + "title": "Delete", + "icon": "$(trash)" + }, { "category": "GitHub Local Actions", "command": "githubLocalActions.editSetting", @@ -414,6 +420,10 @@ "command": "githubLocalActions.removeSettingFile", "when": "never" }, + { + "command": "githubLocalActions.deleteSettingFile", + "when": "never" + }, { "command": "githubLocalActions.editSetting", "when": "never" @@ -585,6 +595,11 @@ "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input)File.*/", "group": "inline@1" }, + { + "command": "githubLocalActions.deleteSettingFile", + "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input)File.*/", + "group": "inline@2" + }, { "command": "githubLocalActions.editSetting", "when": "view == settings && viewItem =~ /^githubLocalActions.(secret|variable|input|runner)(?!(File|s)).*/", diff --git a/src/act.ts b/src/act.ts index 051cc4e..f3923c7 100644 --- a/src/act.ts +++ b/src/act.ts @@ -298,7 +298,7 @@ export class Act { try { await workspace.fs.createDirectory(this.context.globalStorageUri); - } catch (error) { } + } catch (error: any) { } // Build command with settings const settings = await this.settingsManager.getSettings(workspaceFolder, true); diff --git a/src/githubManager.ts b/src/githubManager.ts index 722d302..8b56e3a 100644 --- a/src/githubManager.ts +++ b/src/githubManager.ts @@ -147,7 +147,7 @@ export class GitHubManager { private async getSession(): Promise { try { return await authentication.getSession('github', ['repo'], { createIfNone: true }); - } catch (error) { + } catch (error: any) { window.showErrorMessage(`Failed to authenticate to GitHub. Error ${error}`); return; } diff --git a/src/historyManager.ts b/src/historyManager.ts index 3bc45b8..1f8e629 100644 --- a/src/historyManager.ts +++ b/src/historyManager.ts @@ -48,7 +48,7 @@ export class HistoryManager { for (const history of existingHistory) { try { await workspace.fs.delete(Uri.file(history.logPath)); - } catch (error) { } + } catch (error: any) { } } this.workspaceHistory[workspaceFolder.uri.fsPath] = []; @@ -60,7 +60,7 @@ export class HistoryManager { try { const document = await workspace.openTextDocument(history.logPath); await window.showTextDocument(document); - } catch (error) { + } catch (error: any) { window.showErrorMessage(`${history.name} #${history.count} log file not found`); } } @@ -75,11 +75,13 @@ export class HistoryManager { async remove(history: History) { const historyIndex = this.workspaceHistory[history.commandArgs.path].findIndex(workspaceHistory => workspaceHistory.index === history.index); - this.workspaceHistory[history.commandArgs.path].splice(historyIndex, 1); - this.storageManager.update(StorageKey.WorkspaceHistory, this.workspaceHistory); + if (historyIndex > -1) { + this.workspaceHistory[history.commandArgs.path].splice(historyIndex, 1); + this.storageManager.update(StorageKey.WorkspaceHistory, this.workspaceHistory); - try { - await workspace.fs.delete(Uri.file(history.logPath)); - } catch (error) { } + try { + await workspace.fs.delete(Uri.file(history.logPath)); + } catch (error: any) { } + } } } \ No newline at end of file diff --git a/src/settingsManager.ts b/src/settingsManager.ts index 95424e0..cfcb334 100644 --- a/src/settingsManager.ts +++ b/src/settingsManager.ts @@ -1,4 +1,4 @@ -import { WorkspaceFolder } from "vscode"; +import { Uri, window, workspace, WorkspaceFolder } from "vscode"; import { act } from "./extension"; import { GitHubManager } from "./githubManager"; import { SecretManager } from "./secretManager"; @@ -169,6 +169,27 @@ export class SettingsManager { await this.storageManager.update(storageKey, existingSettingFiles); } + async removeSettingFile(workspaceFolder: WorkspaceFolder, settingFile: SettingFile, storageKey: StorageKey) { + const existingSettingFiles = this.storageManager.get<{ [path: string]: SettingFile[] }>(storageKey) || {}; + if (existingSettingFiles[workspaceFolder.uri.fsPath]) { + const settingFileIndex = existingSettingFiles[workspaceFolder.uri.fsPath].findIndex(settingFile => settingFile.path === settingFile.path); + if (settingFileIndex > -1) { + existingSettingFiles[workspaceFolder.uri.fsPath].splice(settingFileIndex, 1); + } + } + + await this.storageManager.update(storageKey, existingSettingFiles); + } + + async deleteSettingFile(workspaceFolder: WorkspaceFolder, settingFile: SettingFile, storageKey: StorageKey) { + try { + await workspace.fs.delete(Uri.file(settingFile.path)); + await this.removeSettingFile(workspaceFolder, settingFile, storageKey); + } catch (error: any) { + window.showErrorMessage(`Failed to delete file. Error ${error}`) + } + } + async editSetting(workspaceFolder: WorkspaceFolder, newSetting: Setting, storageKey: StorageKey) { const value = newSetting.value; if (storageKey === StorageKey.Secrets) { diff --git a/src/views/settings/inputs.ts b/src/views/settings/inputs.ts index 590a3ba..1b17339 100644 --- a/src/views/settings/inputs.ts +++ b/src/views/settings/inputs.ts @@ -1,6 +1,6 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; import { act } from "../../extension"; -import { Setting } from "../../settingsManager"; +import { Setting, SettingFile } from "../../settingsManager"; import { StorageKey } from "../../storageManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import SettingTreeItem from "./setting"; @@ -10,9 +10,10 @@ export default class InputsTreeItem extends TreeItem implements GithubLocalActio static contextValue = 'githubLocalActions.inputs'; storageKey = StorageKey.InputFiles; - constructor(public workspaceFolder: WorkspaceFolder, inputs: Setting[]) { + constructor(public workspaceFolder: WorkspaceFolder, inputs: Setting[], inputFiles: SettingFile[]) { super('Inputs', TreeItemCollapsibleState.Collapsed); - this.description = `${inputs.filter(input => input.selected).length}/${inputs.length}`; + this.description = `${inputs.filter(input => input.selected).length}/${inputs.length}` + + (inputFiles.length > 0 ? ` + ${inputFiles.length} input file(s)` : ``); this.contextValue = InputsTreeItem.contextValue; this.iconPath = new ThemeIcon('record-keys'); } diff --git a/src/views/settings/secrets.ts b/src/views/settings/secrets.ts index 28eefda..577ff06 100644 --- a/src/views/settings/secrets.ts +++ b/src/views/settings/secrets.ts @@ -1,6 +1,6 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; import { act } from "../../extension"; -import { Setting } from "../../settingsManager"; +import { Setting, SettingFile } from "../../settingsManager"; import { StorageKey } from "../../storageManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import SettingTreeItem from "./setting"; @@ -10,9 +10,10 @@ export default class SecretsTreeItem extends TreeItem implements GithubLocalActi static contextValue = 'githubLocalActions.secrets'; storageKey = StorageKey.SecretFiles; - constructor(public workspaceFolder: WorkspaceFolder, secrets: Setting[]) { + constructor(public workspaceFolder: WorkspaceFolder, secrets: Setting[], secretFiles: SettingFile[]) { super('Secrets', TreeItemCollapsibleState.Collapsed); - this.description = `${secrets.filter(secret => secret.selected).length}/${secrets.length}`; + this.description = `${secrets.filter(secret => secret.selected).length}/${secrets.length}` + + (secretFiles.length > 0 ? ` + ${secretFiles.length} secret file(s)` : ``); this.contextValue = SecretsTreeItem.contextValue; this.iconPath = new ThemeIcon('lock'); } diff --git a/src/views/settings/settingsTreeDataProvider.ts b/src/views/settings/settingsTreeDataProvider.ts index dfff2bf..96be3b0 100644 --- a/src/views/settings/settingsTreeDataProvider.ts +++ b/src/views/settings/settingsTreeDataProvider.ts @@ -69,7 +69,12 @@ export default class SettingsTreeDataProvider implements TreeDataProvider { - + await act.settingsManager.removeSettingFile(settingFileTreeItem.workspaceFolder, settingFileTreeItem.settingFile, settingFileTreeItem.storageKey); + this.refresh(); + }), + commands.registerCommand('githubLocalActions.deleteSettingFile', async (settingFileTreeItem: SettingFileTreeItem) => { + await act.settingsManager.deleteSettingFile(settingFileTreeItem.workspaceFolder, settingFileTreeItem.settingFile, settingFileTreeItem.storageKey); + this.refresh(); }), commands.registerCommand('githubLocalActions.show', async (settingTreeItem: SettingTreeItem) => { const newSetting = settingTreeItem.setting; diff --git a/src/views/settings/variables.ts b/src/views/settings/variables.ts index 10316ef..9f335a4 100644 --- a/src/views/settings/variables.ts +++ b/src/views/settings/variables.ts @@ -1,6 +1,6 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; import { act } from "../../extension"; -import { Setting } from "../../settingsManager"; +import { Setting, SettingFile } from "../../settingsManager"; import { StorageKey } from "../../storageManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import SettingTreeItem from "./setting"; @@ -10,9 +10,10 @@ export default class VariablesTreeItem extends TreeItem implements GithubLocalAc static contextValue = 'githubLocalActions.variables'; storageKey = StorageKey.VariableFiles; - constructor(public workspaceFolder: WorkspaceFolder, variables: Setting[]) { + constructor(public workspaceFolder: WorkspaceFolder, variables: Setting[], variableFiles: SettingFile[]) { super('Variables', TreeItemCollapsibleState.Collapsed); - this.description = `${variables.filter(variable => variable.selected).length}/${variables.length}`; + this.description = `${variables.filter(variable => variable.selected).length}/${variables.length}` + + (variableFiles.length > 0 ? ` + ${variableFiles.length} variable file(s)` : ``); this.contextValue = VariablesTreeItem.contextValue; this.iconPath = new ThemeIcon('symbol-key'); } diff --git a/src/views/settings/workspaceFolderSettings.ts b/src/views/settings/workspaceFolderSettings.ts index 9b068a0..02379ba 100644 --- a/src/views/settings/workspaceFolderSettings.ts +++ b/src/views/settings/workspaceFolderSettings.ts @@ -20,9 +20,9 @@ export default class WorkspaceFolderSettingsTreeItem extends TreeItem implements const settings = await act.settingsManager.getSettings(this.workspaceFolder, false); items.push(...[ - new SecretsTreeItem(this.workspaceFolder, settings.secrets), - new VariablesTreeItem(this.workspaceFolder, settings.variables), - new InputsTreeItem(this.workspaceFolder, settings.inputs), + new SecretsTreeItem(this.workspaceFolder, settings.secrets, settings.secretFiles), + new VariablesTreeItem(this.workspaceFolder, settings.variables, settings.variableFiles), + new InputsTreeItem(this.workspaceFolder, settings.inputs, settings.inputFiles), new RunnersTreeItem(this.workspaceFolder, settings.runners) ]); diff --git a/src/workflowsManager.ts b/src/workflowsManager.ts index 9c3bf56..c487d33 100644 --- a/src/workflowsManager.ts +++ b/src/workflowsManager.ts @@ -34,7 +34,7 @@ export class WorkflowsManager { fileContent: fileContent, yaml: yaml.parse(fileContent) }); - } catch (error) { + } catch (error: any) { workflows.push({ name: (yamlContent ? yamlContent.name : undefined) || path.parse(workflowFileUri.fsPath).name, uri: workflowFileUri,