Fix display of settings
Signed-off-by: Sanjula Ganepola <sanjulagane@gmail.com>
This commit is contained in:
150
src/act.ts
150
src/act.ts
@@ -47,11 +47,11 @@ export enum Event {
|
|||||||
export enum Option {
|
export enum Option {
|
||||||
ActionCachePath = '--action-cache-path',
|
ActionCachePath = '--action-cache-path',
|
||||||
ActionOfflineMode = '--action-offline-mode',
|
ActionOfflineMode = '--action-offline-mode',
|
||||||
Actor = '--actor',
|
Actor = '--a',
|
||||||
ArtifactServerAddr = '--artifact-server-addr',
|
ArtifactServerAddr = '--artifact-server-addr',
|
||||||
ArtifactServerPath = '--artifact-server-path',
|
ArtifactServerPath = '--artifact-server-path',
|
||||||
ArtifactServerPort = '--artifact-server-port',
|
ArtifactServerPort = '--artifact-server-port',
|
||||||
Bind = '--bind',
|
Bind = '--b',
|
||||||
BugReport = '--bug-report',
|
BugReport = '--bug-report',
|
||||||
CacheServerAddr = '--cache-server-addr',
|
CacheServerAddr = '--cache-server-addr',
|
||||||
CacheServerPath = '--cache-server-path',
|
CacheServerPath = '--cache-server-path',
|
||||||
@@ -63,20 +63,20 @@ export enum Option {
|
|||||||
ContainerOptions = '--container-options',
|
ContainerOptions = '--container-options',
|
||||||
DefaultBranch = '--defaultbranch',
|
DefaultBranch = '--defaultbranch',
|
||||||
DetectEvent = '--detect-event',
|
DetectEvent = '--detect-event',
|
||||||
Directory = '--directory',
|
Directory = '--C',
|
||||||
DryRun = '--dryrun',
|
DryRun = '--n',
|
||||||
Env = '--env',
|
Env = '--env',
|
||||||
EnvFile = '--env-file',
|
EnvFile = '--env-file',
|
||||||
EventPath = '--eventpath',
|
EventPath = '--e',
|
||||||
GitHubInstance = '--github-instance',
|
GitHubInstance = '--github-instance',
|
||||||
Graph = '--graph',
|
Graph = '--g',
|
||||||
Help = '--help',
|
Help = '--h',
|
||||||
Input = '--input',
|
Input = '--input',
|
||||||
InputFile = '--input-file',
|
InputFile = '--input-file',
|
||||||
InsecureSecrets = '--insecure-secrets',
|
InsecureSecrets = '--insecure-secrets',
|
||||||
Job = '--job',
|
Job = '--j',
|
||||||
Json = '--json',
|
Json = '--json',
|
||||||
List = '--list',
|
List = '--l',
|
||||||
LocalRepository = '--local-repository',
|
LocalRepository = '--local-repository',
|
||||||
LogPrefixJobId = '--log-prefix-job-id',
|
LogPrefixJobId = '--log-prefix-job-id',
|
||||||
ManPage = '--man-page',
|
ManPage = '--man-page',
|
||||||
@@ -85,15 +85,15 @@ export enum Option {
|
|||||||
NoCacheServer = '--no-cache-server',
|
NoCacheServer = '--no-cache-server',
|
||||||
NoRecurse = '--no-recurse',
|
NoRecurse = '--no-recurse',
|
||||||
NoSkipCheckout = '--no-skip-checkout',
|
NoSkipCheckout = '--no-skip-checkout',
|
||||||
Platform = '--platform',
|
Platform = '--P',
|
||||||
Privileged = '--privileged',
|
Privileged = '--privileged',
|
||||||
Pull = '--pull',
|
Pull = '--p',
|
||||||
Quiet = '--quiet',
|
Quiet = '--q',
|
||||||
Rebuild = '--rebuild',
|
Rebuild = '--rebuild',
|
||||||
RemoteName = '--remote-name',
|
RemoteName = '--remote-name',
|
||||||
ReplaceGHEActionTokenWithGitHubCom = '--replace-ghe-action-token-with-github-com',
|
ReplaceGHEActionTokenWithGitHubCom = '--replace-ghe-action-token-with-github-com',
|
||||||
ReplaceGHEActionWithGitHubCom = '--replace-ghe-action-with-github-com',
|
ReplaceGHEActionWithGitHubCom = '--replace-ghe-action-with-github-com',
|
||||||
Reuse = '--reuse',
|
Reuse = '--r',
|
||||||
Rm = '--rm',
|
Rm = '--rm',
|
||||||
Secret = '--secret',
|
Secret = '--secret',
|
||||||
SecretFile = '--secret-file',
|
SecretFile = '--secret-file',
|
||||||
@@ -102,17 +102,17 @@ export enum Option {
|
|||||||
Userns = '--userns',
|
Userns = '--userns',
|
||||||
Var = '--var',
|
Var = '--var',
|
||||||
VarFile = '--var-file',
|
VarFile = '--var-file',
|
||||||
Verbose = '--verbose',
|
Verbose = '--v',
|
||||||
Version = '--version',
|
Version = '--version',
|
||||||
Watch = '--watch',
|
Watch = '--w',
|
||||||
Workflows = '--workflows'
|
Workflows = '--W'
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CommandArgs {
|
export interface CommandArgs {
|
||||||
workspaceFolder: WorkspaceFolder,
|
workspaceFolder: WorkspaceFolder,
|
||||||
options: string,
|
options: string,
|
||||||
name: string,
|
name: string,
|
||||||
typeText: string[]
|
extraHeader: { key: string, value: string }[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Act {
|
export class Act {
|
||||||
@@ -189,7 +189,7 @@ export class Act {
|
|||||||
workspaceFolder: workspaceFolder,
|
workspaceFolder: workspaceFolder,
|
||||||
options: ``,
|
options: ``,
|
||||||
name: workspaceFolder.name,
|
name: workspaceFolder.name,
|
||||||
typeText: []
|
extraHeader: []
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,8 +198,8 @@ export class Act {
|
|||||||
workspaceFolder: workspaceFolder,
|
workspaceFolder: workspaceFolder,
|
||||||
options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`,
|
options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`,
|
||||||
name: workflow.name,
|
name: workflow.name,
|
||||||
typeText: [
|
extraHeader: [
|
||||||
`Workflow: ${workflow.name}`
|
{ key: 'Workflow', value: workflow.name }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -209,9 +209,9 @@ export class Act {
|
|||||||
workspaceFolder: workspaceFolder,
|
workspaceFolder: workspaceFolder,
|
||||||
options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}" ${Option.Job} "${job.id}"`,
|
options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}" ${Option.Job} "${job.id}"`,
|
||||||
name: `${workflow.name}/${job.name}`,
|
name: `${workflow.name}/${job.name}`,
|
||||||
typeText: [
|
extraHeader: [
|
||||||
`Workflow: ${workflow.name}`,
|
{ key: 'Workflow', value: workflow.name },
|
||||||
`Job: ${job.name}`
|
{ key: 'Job', value: job.name }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -221,15 +221,13 @@ export class Act {
|
|||||||
workspaceFolder: workspaceFolder,
|
workspaceFolder: workspaceFolder,
|
||||||
options: event,
|
options: event,
|
||||||
name: event,
|
name: event,
|
||||||
typeText: [
|
extraHeader: [
|
||||||
`Event: ${event}`
|
{ key: 'Event', value: event }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async runCommand(commandArgs: CommandArgs) {
|
async runCommand(commandArgs: CommandArgs) {
|
||||||
const command = `${Act.base} ${Option.Json} ${commandArgs.options}`;
|
|
||||||
|
|
||||||
const unreadyComponents = await this.componentsManager.getUnreadyComponents();
|
const unreadyComponents = await this.componentsManager.getUnreadyComponents();
|
||||||
if (unreadyComponents.length > 0) {
|
if (unreadyComponents.length > 0) {
|
||||||
window.showErrorMessage(`The following required components are not ready: ${unreadyComponents.map(component => component.name).join(', ')}`, 'Fix...').then(async value => {
|
window.showErrorMessage(`The following required components are not ready: ${unreadyComponents.map(component => component.name).join(', ')}`, 'Fix...').then(async value => {
|
||||||
@@ -240,12 +238,6 @@ export class Act {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath]) {
|
|
||||||
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath] = [];
|
|
||||||
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
|
|
||||||
}
|
|
||||||
|
|
||||||
const historyIndex = this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length;
|
|
||||||
const taskExecution = await tasks.executeTask({
|
const taskExecution = await tasks.executeTask({
|
||||||
name: commandArgs.name,
|
name: commandArgs.name,
|
||||||
detail: 'Run workflow',
|
detail: 'Run workflow',
|
||||||
@@ -266,6 +258,48 @@ export class Act {
|
|||||||
runOptions: {},
|
runOptions: {},
|
||||||
group: TaskGroup.Build,
|
group: TaskGroup.Build,
|
||||||
execution: new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => {
|
execution: new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => {
|
||||||
|
const environments = await this.settingsManager.getEnvironments(commandArgs.workspaceFolder);
|
||||||
|
const secrets = (await this.settingsManager.getSetting(commandArgs.workspaceFolder, SettingsManager.secretsRegExp, StorageKey.Secrets)).filter(secret => secret.selected && secret.value);
|
||||||
|
const variables = (await this.settingsManager.getSetting(commandArgs.workspaceFolder, SettingsManager.variablesRegExp, StorageKey.Variables)).filter(variable => variable.selected && variable.value);
|
||||||
|
const inputs = (await this.settingsManager.getSetting(commandArgs.workspaceFolder, SettingsManager.inputsRegExp, StorageKey.Inputs)).filter(input => input.selected && input.value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: Fix secrets, variables, and inputs in below command
|
||||||
|
// How to pass in secrets
|
||||||
|
// Is there any point to show environments in the header? Is it needed in the tree view?
|
||||||
|
|
||||||
|
|
||||||
|
const command = `${Act.base} ${Option.Json} ${commandArgs.options}`;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const historyIndex = this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length;
|
||||||
|
if (!this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath]) {
|
||||||
|
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath] = [];
|
||||||
|
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].push({
|
||||||
|
index: historyIndex,
|
||||||
|
name: `${commandArgs.name} #${this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length + 1}`,
|
||||||
|
status: HistoryStatus.Running,
|
||||||
|
taskExecution: taskExecution,
|
||||||
|
commandArgs: commandArgs
|
||||||
|
});
|
||||||
|
historyTreeDataProvider.refresh();
|
||||||
|
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
|
||||||
|
|
||||||
const writeEmitter = new EventEmitter<string>();
|
const writeEmitter = new EventEmitter<string>();
|
||||||
const closeEmitter = new EventEmitter<number>();
|
const closeEmitter = new EventEmitter<number>();
|
||||||
|
|
||||||
@@ -292,18 +326,6 @@ export class Act {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const handleIO = (data: any) => {
|
const handleIO = (data: any) => {
|
||||||
if (typeof this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath][historyIndex] === 'undefined') {
|
|
||||||
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].push({
|
|
||||||
index: historyIndex,
|
|
||||||
name: `${commandArgs.name} #${this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length + 1}`,
|
|
||||||
status: HistoryStatus.Running,
|
|
||||||
taskExecution: taskExecution,
|
|
||||||
commandArgs: commandArgs
|
|
||||||
});
|
|
||||||
historyTreeDataProvider.refresh();
|
|
||||||
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
|
|
||||||
}
|
|
||||||
|
|
||||||
const lines: string[] = data.toString().split('\n').filter((line: string) => line != '');
|
const lines: string[] = data.toString().split('\n').filter((line: string) => line != '');
|
||||||
for (const line of lines) {
|
for (const line of lines) {
|
||||||
let jsonLine: any;
|
let jsonLine: any;
|
||||||
@@ -351,16 +373,36 @@ export class Act {
|
|||||||
onDidWrite: writeEmitter.event,
|
onDidWrite: writeEmitter.event,
|
||||||
onDidClose: closeEmitter.event,
|
onDidClose: closeEmitter.event,
|
||||||
open: async (initialDimensions: TerminalDimensions | undefined): Promise<void> => {
|
open: async (initialDimensions: TerminalDimensions | undefined): Promise<void> => {
|
||||||
writeEmitter.fire(`Name: ${commandArgs.name}\r\n`);
|
let headerText: string = '';
|
||||||
writeEmitter.fire(`Path: ${commandArgs.workspaceFolder.uri.fsPath}\r\n`);
|
const addMultipleEntries = (key: string, values: string[]): { key: string, value: string }[] => {
|
||||||
for (const text of commandArgs.typeText) {
|
if (values.length === 0) return [];
|
||||||
writeEmitter.fire(`${text}\r\n`);
|
return values.map((value, index) => ({
|
||||||
|
key: index === 0 ? key : '', // Show the key only for the first entry
|
||||||
|
value
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const header: { key: string, value: string }[] = [
|
||||||
|
{ key: 'Name', value: commandArgs.name },
|
||||||
|
{ key: 'Path', value: commandArgs.workspaceFolder.uri.fsPath },
|
||||||
|
...commandArgs.extraHeader,
|
||||||
|
...addMultipleEntries('Environments', environments.map(env => env.name)),
|
||||||
|
...addMultipleEntries('Variables', variables.map(variable => `${variable.key}=${variable.value}`)),
|
||||||
|
...addMultipleEntries('Secrets', secrets.map(secret => `${secret.key}=••••••••`)),
|
||||||
|
...addMultipleEntries('Inputs', inputs.map(input => `${input.key}=${input.value}`)),
|
||||||
|
{ key: 'Command', value: command.replace(` ${Option.Json}`, ``) }
|
||||||
|
];
|
||||||
|
|
||||||
|
const maxKeyLength = Math.max(...header.map(item => item.key.length));
|
||||||
|
for (const { key, value } of header) {
|
||||||
|
const spaces = ' '.repeat(maxKeyLength - key.length + 1);
|
||||||
|
headerText += key ? `${key}:${spaces}${value}\r\n` : ` ${spaces}${value}\r\n`;
|
||||||
}
|
}
|
||||||
writeEmitter.fire(`Environments: OSSBUILD\r\n`);
|
|
||||||
writeEmitter.fire(`Variables: VARIABLE1=ABC, VARIABLE2=DEF\r\n`);
|
const maxValueLength = Math.max(...header.map(item => item.value.length));
|
||||||
writeEmitter.fire(`Secrets: SECRET1=ABC, SECRET2=DEF\r\n`);
|
const borderText = '-'.repeat(maxKeyLength + 2 + maxValueLength);
|
||||||
writeEmitter.fire(`Command: ${command.replace(` ${Option.Json}`, ``)}\r\n`);
|
|
||||||
writeEmitter.fire(`\r\n`);
|
writeEmitter.fire(`${borderText}\r\n${headerText}${borderText}\r\n\r\n`);
|
||||||
},
|
},
|
||||||
|
|
||||||
close: () => {
|
close: () => {
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import { window, workspace } from 'vscode';
|
import { TreeCheckboxChangeEvent, window, workspace } from 'vscode';
|
||||||
import { Act } from './act';
|
import { Act } from './act';
|
||||||
import ComponentsTreeDataProvider from './views/components/componentsTreeDataProvider';
|
import ComponentsTreeDataProvider from './views/components/componentsTreeDataProvider';
|
||||||
import { DecorationProvider } from './views/decorationProvider';
|
import { DecorationProvider } from './views/decorationProvider';
|
||||||
|
import { GithubLocalActionsTreeItem } from './views/githubLocalActionsTreeItem';
|
||||||
import HistoryTreeDataProvider from './views/history/historyTreeDataProvider';
|
import HistoryTreeDataProvider from './views/history/historyTreeDataProvider';
|
||||||
|
import InputTreeItem from './views/settings/input';
|
||||||
|
import SecretTreeItem from './views/settings/secret';
|
||||||
import SettingsTreeDataProvider from './views/settings/settingsTreeDataProvider';
|
import SettingsTreeDataProvider from './views/settings/settingsTreeDataProvider';
|
||||||
|
import VariableTreeItem from './views/settings/variable';
|
||||||
import WorkflowsTreeDataProvider from './views/workflows/workflowsTreeDataProvider';
|
import WorkflowsTreeDataProvider from './views/workflows/workflowsTreeDataProvider';
|
||||||
|
|
||||||
export let act: Act;
|
export let act: Act;
|
||||||
@@ -28,6 +32,9 @@ export function activate(context: vscode.ExtensionContext) {
|
|||||||
const historyTreeView = window.createTreeView(HistoryTreeDataProvider.VIEW_ID, { treeDataProvider: historyTreeDataProvider });
|
const historyTreeView = window.createTreeView(HistoryTreeDataProvider.VIEW_ID, { treeDataProvider: historyTreeDataProvider });
|
||||||
settingsTreeDataProvider = new SettingsTreeDataProvider(context);
|
settingsTreeDataProvider = new SettingsTreeDataProvider(context);
|
||||||
const settingsTreeView = window.createTreeView(SettingsTreeDataProvider.VIEW_ID, { treeDataProvider: settingsTreeDataProvider });
|
const settingsTreeView = window.createTreeView(SettingsTreeDataProvider.VIEW_ID, { treeDataProvider: settingsTreeDataProvider });
|
||||||
|
settingsTreeView.onDidChangeCheckboxState(async (event: TreeCheckboxChangeEvent<GithubLocalActionsTreeItem>) => {
|
||||||
|
await settingsTreeDataProvider.onDidChangeCheckboxState(event as TreeCheckboxChangeEvent<SecretTreeItem | VariableTreeItem | InputTreeItem>);
|
||||||
|
});
|
||||||
|
|
||||||
// Create file watcher
|
// Create file watcher
|
||||||
const workflowsFileWatcher = workspace.createFileSystemWatcher('**/.github/workflows/*.{yml,yaml}');
|
const workflowsFileWatcher = workspace.createFileSystemWatcher('**/.github/workflows/*.{yml,yaml}');
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ export interface Runner {
|
|||||||
|
|
||||||
export class SettingsManager {
|
export class SettingsManager {
|
||||||
storageManager: StorageManager;
|
storageManager: StorageManager;
|
||||||
|
static secretsRegExp: RegExp = /\${{\s*secrets\.(.*?)\s*}}/g;
|
||||||
|
static variablesRegExp: RegExp = /\${{\s*vars\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g;
|
||||||
|
static inputsRegExp: RegExp = /\${{\s*(?:inputs|github\.event\.inputs)\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g;
|
||||||
|
|
||||||
constructor(storageManager: StorageManager) {
|
constructor(storageManager: StorageManager) {
|
||||||
this.storageManager = storageManager;
|
this.storageManager = storageManager;
|
||||||
@@ -63,7 +66,7 @@ export class SettingsManager {
|
|||||||
|
|
||||||
return environments;
|
return environments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async getSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, regExp: RegExp, storageKey: StorageKey): Promise<T[]> {
|
async getSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, regExp: RegExp, storageKey: StorageKey): Promise<T[]> {
|
||||||
const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {};
|
const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {};
|
||||||
@@ -76,7 +79,13 @@ export class SettingsManager {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.push(...this.findInWorkflow<T>(workflow.fileContent, regExp));
|
const workflowSettings = this.findInWorkflow<T>(workflow.fileContent, regExp);
|
||||||
|
for (const workflowSetting of workflowSettings) {
|
||||||
|
const existingSetting = settings.find(setting => setting.key === workflowSetting.key);
|
||||||
|
if (!existingSetting) {
|
||||||
|
settings.push(workflowSetting);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (existingSettings[workspaceFolder.uri.fsPath]) {
|
if (existingSettings[workspaceFolder.uri.fsPath]) {
|
||||||
@@ -97,7 +106,7 @@ export class SettingsManager {
|
|||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
editSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, newSetting: T, storageKey: StorageKey) {
|
async editSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, newSetting: T, storageKey: StorageKey) {
|
||||||
const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {};
|
const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {};
|
||||||
if (existingSettings[workspaceFolder.uri.fsPath]) {
|
if (existingSettings[workspaceFolder.uri.fsPath]) {
|
||||||
const index = existingSettings[workspaceFolder.uri.fsPath].findIndex(setting => setting.key === newSetting.key);
|
const index = existingSettings[workspaceFolder.uri.fsPath].findIndex(setting => setting.key === newSetting.key);
|
||||||
@@ -110,7 +119,7 @@ export class SettingsManager {
|
|||||||
existingSettings[workspaceFolder.uri.fsPath] = [newSetting];
|
existingSettings[workspaceFolder.uri.fsPath] = [newSetting];
|
||||||
}
|
}
|
||||||
|
|
||||||
this.storageManager.update(storageKey, existingSettings);
|
await this.storageManager.update(storageKey, existingSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
private findInWorkflow<T extends Secret | Variable | Input>(content: string, regExp: RegExp) {
|
private findInWorkflow<T extends Secret | Variable | Input>(content: string, regExp: RegExp) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
|
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
|
||||||
import { act } from "../../extension";
|
import { act } from "../../extension";
|
||||||
|
import { SettingsManager } from "../../settingsManager";
|
||||||
import { StorageKey } from "../../storageManager";
|
import { StorageKey } from "../../storageManager";
|
||||||
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
||||||
import InputTreeItem from "./input";
|
import InputTreeItem from "./input";
|
||||||
@@ -16,7 +17,7 @@ export default class InputsTreeItem extends TreeItem implements GithubLocalActio
|
|||||||
async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
|
async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
|
||||||
const items: GithubLocalActionsTreeItem[] = [];
|
const items: GithubLocalActionsTreeItem[] = [];
|
||||||
|
|
||||||
const inputs = await act.settingsManager.getSetting(this.workspaceFolder, /\${{\s*(?:inputs|github\.event\.inputs)\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g, StorageKey.Inputs);
|
const inputs = await act.settingsManager.getSetting(this.workspaceFolder, SettingsManager.inputsRegExp, StorageKey.Inputs);
|
||||||
for (const input of inputs) {
|
for (const input of inputs) {
|
||||||
items.push(new InputTreeItem(this.workspaceFolder, input));
|
items.push(new InputTreeItem(this.workspaceFolder, input));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
|
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
|
||||||
import { act } from "../../extension";
|
import { act } from "../../extension";
|
||||||
|
import { SettingsManager } from "../../settingsManager";
|
||||||
import { StorageKey } from "../../storageManager";
|
import { StorageKey } from "../../storageManager";
|
||||||
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
||||||
import SecretTreeItem from "./secret";
|
import SecretTreeItem from "./secret";
|
||||||
@@ -16,7 +17,7 @@ export default class SecretsTreeItem extends TreeItem implements GithubLocalActi
|
|||||||
async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
|
async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
|
||||||
const items: GithubLocalActionsTreeItem[] = [];
|
const items: GithubLocalActionsTreeItem[] = [];
|
||||||
|
|
||||||
const secrets = await act.settingsManager.getSetting(this.workspaceFolder, /\${{\s*secrets\.(.*?)\s*}}/g, StorageKey.Secrets);
|
const secrets = await act.settingsManager.getSetting(this.workspaceFolder, SettingsManager.secretsRegExp, StorageKey.Secrets);
|
||||||
for (const secret of secrets) {
|
for (const secret of secrets) {
|
||||||
items.push(new SecretTreeItem(this.workspaceFolder, secret));
|
items.push(new SecretTreeItem(this.workspaceFolder, secret));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { CancellationToken, commands, EventEmitter, ExtensionContext, TreeDataProvider, TreeItem, window, workspace } from "vscode";
|
import { CancellationToken, commands, EventEmitter, ExtensionContext, TreeCheckboxChangeEvent, TreeDataProvider, TreeItem, TreeItemCheckboxState, window, workspace } from "vscode";
|
||||||
import { act } from "../../extension";
|
import { act } from "../../extension";
|
||||||
import { StorageKey } from "../../storageManager";
|
import { StorageKey } from "../../storageManager";
|
||||||
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
||||||
@@ -26,8 +26,8 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
|
|||||||
password: true
|
password: true
|
||||||
});
|
});
|
||||||
|
|
||||||
if (newValue) {
|
if (newValue !== undefined) {
|
||||||
act.settingsManager.editSetting(secretTreeItem.workspaceFolder, { key: secretTreeItem.secret.key, value: newValue, selected: secretTreeItem.secret.selected }, StorageKey.Secrets);
|
await act.settingsManager.editSetting(secretTreeItem.workspaceFolder, { key: secretTreeItem.secret.key, value: newValue, selected: secretTreeItem.secret.selected }, StorageKey.Secrets);
|
||||||
this.refresh();
|
this.refresh();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
@@ -38,8 +38,8 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
|
|||||||
value: variableTreeItem.variable.value
|
value: variableTreeItem.variable.value
|
||||||
});
|
});
|
||||||
|
|
||||||
if (newValue) {
|
if (newValue !== undefined) {
|
||||||
act.settingsManager.editSetting(variableTreeItem.workspaceFolder, { key: variableTreeItem.variable.key, value: newValue, selected: variableTreeItem.variable.selected }, StorageKey.Variables);
|
await act.settingsManager.editSetting(variableTreeItem.workspaceFolder, { key: variableTreeItem.variable.key, value: newValue, selected: variableTreeItem.variable.selected }, StorageKey.Variables);
|
||||||
this.refresh();
|
this.refresh();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
@@ -50,8 +50,8 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
|
|||||||
value: inputTreeItem.input.value
|
value: inputTreeItem.input.value
|
||||||
});
|
});
|
||||||
|
|
||||||
if (newValue) {
|
if (newValue !== undefined) {
|
||||||
act.settingsManager.editSetting(inputTreeItem.workspaceFolder, { key: inputTreeItem.input.key, value: newValue, selected: inputTreeItem.input.selected }, StorageKey.Inputs);
|
await act.settingsManager.editSetting(inputTreeItem.workspaceFolder, { key: inputTreeItem.input.key, value: newValue, selected: inputTreeItem.input.selected }, StorageKey.Inputs);
|
||||||
this.refresh();
|
this.refresh();
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
@@ -77,6 +77,18 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onDidChangeCheckboxState(event: TreeCheckboxChangeEvent<SecretTreeItem | VariableTreeItem | InputTreeItem>) {
|
||||||
|
for await (const [treeItem, state] of event.items) {
|
||||||
|
if (treeItem instanceof SecretTreeItem) {
|
||||||
|
await act.settingsManager.editSetting(treeItem.workspaceFolder, { key: treeItem.secret.key, value: treeItem.secret.value, selected: state === TreeItemCheckboxState.Checked }, StorageKey.Secrets);
|
||||||
|
} else if (treeItem instanceof VariableTreeItem) {
|
||||||
|
await act.settingsManager.editSetting(treeItem.workspaceFolder, { key: treeItem.variable.key, value: treeItem.variable.value, selected: state === TreeItemCheckboxState.Checked }, StorageKey.Variables);
|
||||||
|
} else {
|
||||||
|
await act.settingsManager.editSetting(treeItem.workspaceFolder, { key: treeItem.input.key, value: treeItem.input.value, selected: state === TreeItemCheckboxState.Checked }, StorageKey.Inputs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async getChildren(element?: GithubLocalActionsTreeItem): Promise<GithubLocalActionsTreeItem[]> {
|
async getChildren(element?: GithubLocalActionsTreeItem): Promise<GithubLocalActionsTreeItem[]> {
|
||||||
if (element) {
|
if (element) {
|
||||||
return element.getChildren();
|
return element.getChildren();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
|
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
|
||||||
import { act } from "../../extension";
|
import { act } from "../../extension";
|
||||||
|
import { SettingsManager } from "../../settingsManager";
|
||||||
import { StorageKey } from "../../storageManager";
|
import { StorageKey } from "../../storageManager";
|
||||||
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
|
||||||
import VariableTreeItem from "./variable";
|
import VariableTreeItem from "./variable";
|
||||||
@@ -16,7 +17,7 @@ export default class VariablesTreeItem extends TreeItem implements GithubLocalAc
|
|||||||
async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
|
async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
|
||||||
const items: GithubLocalActionsTreeItem[] = [];
|
const items: GithubLocalActionsTreeItem[] = [];
|
||||||
|
|
||||||
const variables = await act.settingsManager.getSetting(this.workspaceFolder, /\${{\s*vars\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g, StorageKey.Variables);
|
const variables = await act.settingsManager.getSetting(this.workspaceFolder, SettingsManager.variablesRegExp, StorageKey.Variables);
|
||||||
for (const variable of variables) {
|
for (const variable of variables) {
|
||||||
items.push(new VariableTreeItem(this.workspaceFolder, variable));
|
items.push(new VariableTreeItem(this.workspaceFolder, variable));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user