Skip to content

Commit 1b9a1f6

Browse files
committed
Replace js-yaml and re-enable workflow and repo dispatch
1 parent 959d135 commit 1b9a1f6

7 files changed

Lines changed: 178 additions & 212 deletions

File tree

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,11 +399,10 @@
399399
},
400400
"dependencies": {
401401
"@github/actions-languageserver": "*",
402+
"@github/actions-workflow-parser": "*",
402403
"@octokit/rest": "^19.0.5",
403404
"abab": "^2.0.5",
404405
"crypto-browserify": "^3.12.0",
405-
"github-actions-parser": "0.27.0",
406-
"js-yaml": "^3.14.0",
407406
"libsodium-wrappers": "^0.7.10",
408407
"ssh-config": "^3.0.0",
409408
"stream-browserify": "^3.0.0",

src/commands/triggerWorkflowRun.ts

Lines changed: 103 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from "vscode";
22

3-
import {getGitHubContextForWorkspaceUri, GitHubRepoContext} from "../git/repository";
4-
import {getWorkflowUri} from "../workflow/workflow";
3+
import {getGitHead, getGitHubContextForWorkspaceUri, GitHubRepoContext} from "../git/repository";
4+
import {getWorkflowUri, parseWorkflowFile} from "../workflow/workflow";
55

66
import {Workflow} from "../model";
77

@@ -38,108 +38,107 @@ export function registerTriggerWorkflowRun(context: vscode.ExtensionContext) {
3838
return;
3939
}
4040

41-
return;
42-
43-
// TODO: Parse workflow here
44-
// const workflow = await parseWorkflow(workflowUri, gitHubRepoContext);
45-
// if (!workflow) {
46-
// return;
47-
// }
48-
49-
// let selectedEvent: string | undefined;
50-
// if (workflow.on.workflow_dispatch !== undefined && workflow.on.repository_dispatch !== undefined) {
51-
// selectedEvent = await vscode.window.showQuickPick(["repository_dispatch", "workflow_dispatch"], {
52-
// placeHolder: "Which event to trigger?",
53-
// });
54-
// if (!selectedEvent) {
55-
// return;
56-
// }
57-
// }
58-
59-
// if ((!selectedEvent || selectedEvent === "workflow_dispatch") && workflow.on.workflow_dispatch !== undefined) {
60-
// const ref = await vscode.window.showInputBox({
61-
// prompt: "Enter ref to trigger workflow on",
62-
// value: (await getGitHead()) || gitHubRepoContext.defaultBranch,
63-
// });
64-
65-
// if (ref) {
66-
// // Inputs
67-
// let inputs: { [key: string]: string } | undefined;
68-
// const definedInputs = workflow.on.workflow_dispatch?.inputs;
69-
// if (definedInputs) {
70-
// inputs = {};
71-
72-
// for (const definedInput of Object.keys(definedInputs)) {
73-
// const value = await vscode.window.showInputBox({
74-
// prompt: `Value for input ${definedInput} ${definedInputs[definedInput].required ? "[required]" : ""}`,
75-
// value: definedInputs[definedInput].default,
76-
// });
77-
// if (!value && definedInputs[definedInput].required) {
78-
// vscode.window.showErrorMessage(`Input ${definedInput} is required`);
79-
// return;
80-
// }
81-
82-
// if (value) {
83-
// inputs[definedInput] = value;
84-
// }
85-
// }
86-
// }
87-
88-
// try {
89-
// const relativeWorkflowPath = vscode.workspace.asRelativePath(workflowUri, false);
90-
91-
// await gitHubRepoContext.client.actions.createWorkflowDispatch({
92-
// owner: gitHubRepoContext.owner,
93-
// repo: gitHubRepoContext.name,
94-
// workflow_id: relativeWorkflowPath,
95-
// ref,
96-
// inputs,
97-
// });
98-
99-
// vscode.window.setStatusBarMessage(`GitHub Actions: Workflow event dispatched`, 2000);
100-
// } catch (error: any) {
101-
// vscode.window.showErrorMessage(`Could not create workflow dispatch: ${error?.message}`);
102-
// }
103-
// }
104-
// } else if (
105-
// (!selectedEvent || selectedEvent === "repository_dispatch") &&
106-
// workflow.on.repository_dispatch !== undefined
107-
// ) {
108-
// let event_type: string | undefined;
109-
// const event_types = workflow.on.repository_dispatch.types;
110-
// if (Array.isArray(event_types) && event_types?.length > 0) {
111-
// const custom_type = "✐ Enter custom type";
112-
// const selection = await vscode.window.showQuickPick([custom_type, ...event_types], {
113-
// placeHolder: "Select an event_type to dispatch",
114-
// });
115-
116-
// if (selection === undefined) {
117-
// return;
118-
// } else if (selection != custom_type) {
119-
// event_type = selection;
120-
// }
121-
// }
122-
123-
// if (event_type === undefined) {
124-
// event_type = await vscode.window.showInputBox({
125-
// prompt: "Enter `event_type` to dispatch to the repository",
126-
// value: "default",
127-
// });
128-
// }
129-
130-
// if (event_type) {
131-
// await gitHubRepoContext.client.repos.createDispatchEvent({
132-
// owner: gitHubRepoContext.owner,
133-
// repo: gitHubRepoContext.name,
134-
// event_type,
135-
// client_payload: {},
136-
// });
137-
138-
// vscode.window.setStatusBarMessage(`GitHub Actions: Repository event '${event_type}' dispatched`, 2000);
139-
// }
140-
// }
141-
142-
// vscode.commands.executeCommand("github-actions.explorer.refresh");
41+
const workflow = await parseWorkflowFile(workflowUri, gitHubRepoContext);
42+
if (!workflow) {
43+
return;
44+
}
45+
46+
let selectedEvent: string | undefined;
47+
if (workflow.events.workflow_dispatch !== undefined && workflow.events.repository_dispatch !== undefined) {
48+
selectedEvent = await vscode.window.showQuickPick(["repository_dispatch", "workflow_dispatch"], {
49+
placeHolder: "Which event to trigger?"
50+
});
51+
if (!selectedEvent) {
52+
return;
53+
}
54+
}
55+
56+
if (
57+
(!selectedEvent || selectedEvent === "workflow_dispatch") &&
58+
workflow.events.workflow_dispatch !== undefined
59+
) {
60+
const ref = await vscode.window.showInputBox({
61+
prompt: "Enter ref to trigger workflow on",
62+
value: (await getGitHead()) || gitHubRepoContext.defaultBranch
63+
});
64+
65+
if (ref) {
66+
// Inputs
67+
let inputs: {[key: string]: string} | undefined;
68+
const definedInputs = workflow.events.workflow_dispatch?.inputs;
69+
if (definedInputs) {
70+
inputs = {};
71+
72+
for (const definedInput of Object.keys(definedInputs)) {
73+
const value = await vscode.window.showInputBox({
74+
prompt: `Value for input ${definedInput} ${definedInputs[definedInput].required ? "[required]" : ""}`,
75+
value: definedInputs[definedInput].default.toString()
76+
});
77+
if (!value && definedInputs[definedInput].required) {
78+
return vscode.window.showErrorMessage(`Input ${definedInput} is required`);
79+
}
80+
81+
if (value) {
82+
inputs[definedInput] = value;
83+
}
84+
}
85+
}
86+
87+
try {
88+
const relativeWorkflowPath = vscode.workspace.asRelativePath(workflowUri, false);
89+
90+
await gitHubRepoContext.client.actions.createWorkflowDispatch({
91+
owner: gitHubRepoContext.owner,
92+
repo: gitHubRepoContext.name,
93+
workflow_id: relativeWorkflowPath,
94+
ref,
95+
inputs
96+
});
97+
98+
vscode.window.setStatusBarMessage(`GitHub Actions: Workflow event dispatched`, 2000);
99+
} catch (error) {
100+
return vscode.window.showErrorMessage(`Could not create workflow dispatch: ${(error as Error)?.message}`);
101+
}
102+
}
103+
} else if (
104+
(!selectedEvent || selectedEvent === "repository_dispatch") &&
105+
workflow.events.repository_dispatch !== undefined
106+
) {
107+
let event_type: string | undefined;
108+
const event_types = workflow.events.repository_dispatch.types;
109+
if (Array.isArray(event_types) && event_types?.length > 0) {
110+
const custom_type = "✐ Enter custom type";
111+
const selection = await vscode.window.showQuickPick([custom_type, ...event_types], {
112+
placeHolder: "Select an event_type to dispatch"
113+
});
114+
115+
if (selection === undefined) {
116+
return;
117+
} else if (selection != custom_type) {
118+
event_type = selection;
119+
}
120+
}
121+
122+
if (event_type === undefined) {
123+
event_type = await vscode.window.showInputBox({
124+
prompt: "Enter `event_type` to dispatch to the repository",
125+
value: "default"
126+
});
127+
}
128+
129+
if (event_type) {
130+
await gitHubRepoContext.client.repos.createDispatchEvent({
131+
owner: gitHubRepoContext.owner,
132+
repo: gitHubRepoContext.name,
133+
event_type,
134+
client_payload: {}
135+
});
136+
137+
vscode.window.setStatusBarMessage(`GitHub Actions: Repository event '${event_type}' dispatched`, 2000);
138+
}
139+
}
140+
141+
return vscode.commands.executeCommand("github-actions.explorer.refresh");
143142
}
144143
)
145144
);

src/tracker/workflowDocumentTracker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ async function onDidChangeActiveTextEditor(editor?: vscode.TextEditor) {
2828
await vscode.commands.executeCommand(
2929
"setContext",
3030
"githubActions:activeFile",
31-
await getContextStringForWorkflow(editor.document.fileName)
31+
await getContextStringForWorkflow(editor.document.uri)
3232
);
3333
}
3434

src/treeViews/workflows/workflowNode.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class WorkflowNode extends vscode.TreeItem {
1111
constructor(
1212
public readonly gitHubRepoContext: GitHubRepoContext,
1313
public readonly wf: Workflow,
14-
public readonly parsed?: any // ParsedWorkflow
14+
public readonly workflowContext?: string
1515
) {
1616
super(wf.name, vscode.TreeItemCollapsibleState.Collapsed);
1717

@@ -31,14 +31,8 @@ export class WorkflowNode extends vscode.TreeItem {
3131
}
3232
}
3333

34-
if (this.parsed) {
35-
if (this.parsed.on.repository_dispatch !== undefined) {
36-
this.contextValue += " rdispatch";
37-
}
38-
39-
if (this.parsed.on.workflow_dispatch !== undefined) {
40-
this.contextValue += " wdispatch";
41-
}
34+
if (this.workflowContext) {
35+
this.contextValue += this.workflowContext;
4236
}
4337
}
4438

src/treeViews/workflows/workflowsRepoNode.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as vscode from "vscode";
22

33
import {GitHubRepoContext} from "../../git/repository";
44
import {logDebug} from "../../log";
5+
import {getContextStringForWorkflow, getWorkflowUri} from "../../workflow/workflow";
56
import {WorkflowNode} from "./workflowNode";
67

78
export class WorkflowsRepoNode extends vscode.TreeItem {
@@ -31,15 +32,10 @@ export async function getWorkflowNodes(gitHubRepoContext: GitHubRepoContext) {
3132

3233
return await Promise.all(
3334
workflows.map(async wf => {
34-
// TODO: Parse workflow here
35-
// let parsedWorkflow: ParsedWorkflow | undefined;
35+
const workflowUri = getWorkflowUri(gitHubRepoContext, wf.path);
36+
const workflowContext = await getContextStringForWorkflow(workflowUri);
3637

37-
// const workflowUri = getWorkflowUri(gitHubRepoContext, wf.path);
38-
// if (workflowUri) {
39-
// parsedWorkflow = await parseWorkflow(workflowUri, gitHubRepoContext);
40-
// }
41-
42-
return new WorkflowNode(gitHubRepoContext, wf, /*parsedWorkflow*/ undefined);
38+
return new WorkflowNode(gitHubRepoContext, wf, workflowContext);
4339
})
4440
);
4541
}

0 commit comments

Comments
 (0)