-
Notifications
You must be signed in to change notification settings - Fork 175
Expand file tree
/
Copy pathworkflows.ts
More file actions
123 lines (104 loc) · 4.21 KB
/
workflows.ts
File metadata and controls
123 lines (104 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import * as vscode from "vscode";
import {canReachGitHubAPI} from "../api/canReachGitHubAPI";
import {getGitHubContext} from "../git/repository";
import {log, logDebug, logError} from "../log";
import {RunStore} from "../store/store";
import {AttemptNode} from "./shared/attemptNode";
import {AuthenticationNode} from "./shared/authenticationNode";
import {ErrorNode} from "./shared/errorNode";
import {GitHubAPIUnreachableNode} from "./shared/gitHubApiUnreachableNode";
import {NoGitHubRepositoryNode} from "./shared/noGitHubRepositoryNode";
import {NoWorkflowJobsNode} from "./shared/noWorkflowJobsNode";
import {PreviousAttemptsNode} from "./shared/previousAttemptsNode";
import {WorkflowJobNode} from "./shared/workflowJobNode";
import {WorkflowRunNode} from "./shared/workflowRunNode";
import {WorkflowRunTreeDataProvider} from "./workflowRunTreeDataProvider";
import {WorkflowNode} from "./workflows/workflowNode";
import {getWorkflowNodes, WorkflowsRepoNode} from "./workflows/workflowsRepoNode";
import {WorkflowStepNode} from "./workflows/workflowStepNode";
export type WorkflowsTreeNode =
| AuthenticationNode
| NoGitHubRepositoryNode
| WorkflowsRepoNode
| WorkflowNode
| WorkflowRunNode
| PreviousAttemptsNode
| AttemptNode
| WorkflowJobNode
| NoWorkflowJobsNode
| WorkflowStepNode
| GitHubAPIUnreachableNode;
export class WorkflowsTreeProvider
extends WorkflowRunTreeDataProvider
implements vscode.TreeDataProvider<WorkflowsTreeNode>
{
private _onDidChangeTreeData = new vscode.EventEmitter<WorkflowsTreeNode | null>();
readonly onDidChangeTreeData = this._onDidChangeTreeData.event;
constructor(store: RunStore) {
super(store);
}
protected _updateNode(node: WorkflowRunNode): void {
this._onDidChangeTreeData.fire(node);
}
async refresh(): Promise<void> {
// Don't delete all the nodes if we can't reach GitHub API
if (await canReachGitHubAPI()) {
this._onDidChangeTreeData.fire(null);
} else {
await vscode.window.showWarningMessage("Unable to refresh, could not reach GitHub API");
}
}
getTreeItem(element: WorkflowsTreeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
return element;
}
async getChildren(element?: WorkflowsTreeNode | undefined): Promise<WorkflowsTreeNode[]> {
if (!element) {
logDebug("Getting root children");
try {
const gitHubContext = await getGitHubContext();
if (!gitHubContext) {
logDebug("could not get github context for workflows");
return [new GitHubAPIUnreachableNode()];
}
if (gitHubContext.repos.length > 0) {
// Special case, if there is only one repo, return workflow nodes directly
if (gitHubContext.repos.length == 1) {
return getWorkflowNodes(gitHubContext.repos[0]);
}
return gitHubContext.repos.map(r => new WorkflowsRepoNode(r));
}
log("No GitHub repositories found");
return [];
} catch (e) {
logError(e as Error, "Failed to get GitHub context");
if (`${(e as Error).message}`.startsWith("Could not get token from the GitHub authentication provider.")) {
return [new AuthenticationNode()];
}
return [new ErrorNode(`An error has occurred: ${(e as Error).message}`)];
}
}
if (element instanceof WorkflowsRepoNode) {
return element.getWorkflows();
} else if (element instanceof WorkflowNode) {
return this.getRuns(element);
} else if (element instanceof WorkflowRunNode) {
return element.getJobs();
} else if (element instanceof PreviousAttemptsNode) {
return element.getAttempts();
} else if (element instanceof AttemptNode) {
return element.getJobs();
} else if (element instanceof WorkflowJobNode) {
return element.getSteps();
}
return [];
}
private async getRuns(wfNode: WorkflowNode): Promise<WorkflowRunNode[]> {
logDebug("Getting workflow runs for workflow");
const result = await wfNode.gitHubRepoContext.client.actions.listWorkflowRuns({
owner: wfNode.gitHubRepoContext.owner,
repo: wfNode.gitHubRepoContext.name,
workflow_id: wfNode.wf.id
});
return this.runNodes(wfNode.gitHubRepoContext, result.data.workflow_runs);
}
}