Skip to content

Commit bb19052

Browse files
authored
Merge pull request #94 from github/thyeggman/internet-connectivity
Do validation and add internet connectivity indictator to the extension
2 parents 3f364c7 + 6400f94 commit bb19052

9 files changed

Lines changed: 83 additions & 26 deletions

File tree

src/extension.ts

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

3-
import {init as initLogger, log, revealLog} from "./log";
4-
53
import {registerCancelWorkflowRun} from "./commands/cancelWorkflowRun";
64
import {registerOpenWorkflowFile} from "./commands/openWorkflowFile";
75
import {registerOpenWorkflowJobLogs} from "./commands/openWorkflowJobLogs";
@@ -20,6 +18,7 @@ import {registerDeleteVariable} from "./commands/variables/deleteVariable";
2018
import {registerUpdateVariable} from "./commands/variables/updateVariable";
2119
import {initConfiguration} from "./configuration/configuration";
2220
import {getGitHubContext} from "./git/repository";
21+
import {init as initLogger, log, revealLog} from "./log";
2322
import {LogScheme} from "./logs/constants";
2423
import {WorkflowStepLogProvider} from "./logs/fileProvider";
2524
import {WorkflowStepLogFoldingProvider} from "./logs/foldingProvider";

src/git/repository.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {getRemoteName} from "../configuration/configuration";
66
import {Protocol} from "../external/protocol";
77
import {logDebug, logError} from "../log";
88
import {API, GitExtension, RefType, RepositoryState} from "../typings/git";
9+
import {canReachGitHubAPI} from "../util";
910

1011
interface GitHubUrls {
1112
workspaceUri: vscode.Uri;
@@ -142,6 +143,11 @@ export async function getGitHubContext(): Promise<GitHubContext | undefined> {
142143
return gitHubContext;
143144
}
144145

146+
if (!(await canReachGitHubAPI())) {
147+
logError(new Error("Cannot fetch github context"));
148+
return undefined;
149+
}
150+
145151
try {
146152
const git = await getGitExtension();
147153

src/treeViews/currentBranch.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ import * as vscode from "vscode";
33
import {getCurrentBranch, getGitHubContext, GitHubRepoContext} from "../git/repository";
44
import {CurrentBranchRepoNode} from "./current-branch/currentBranchRepoNode";
55

6+
import {NoRunForBranchNode} from "./current-branch/noRunForBranchNode";
67
import {log, logDebug} from "../log";
78
import {RunStore} from "../store/store";
8-
import {NoRunForBranchNode} from "./current-branch/noRunForBranchNode";
99
import {AttemptNode} from "./shared/attemptNode";
10+
import {GitHubAPIUnreachableNode} from "./shared/gitHubApiUnreachableNode";
1011
import {NoWorkflowJobsNode} from "./shared/noWorkflowJobsNode";
1112
import {PreviousAttemptsNode} from "./shared/previousAttemptsNode";
1213
import {WorkflowJobNode} from "./shared/workflowJobNode";
1314
import {WorkflowRunNode} from "./shared/workflowRunNode";
1415
import {WorkflowRunTreeDataProvider} from "./workflowRunTreeDataProvider";
1516
import {WorkflowStepNode} from "./workflows/workflowStepNode";
17+
import {canReachGitHubAPI} from "../util";
1618

1719
type CurrentBranchTreeNode =
1820
| CurrentBranchRepoNode
@@ -22,7 +24,8 @@ type CurrentBranchTreeNode =
2224
| WorkflowJobNode
2325
| NoWorkflowJobsNode
2426
| WorkflowStepNode
25-
| NoRunForBranchNode;
27+
| NoRunForBranchNode
28+
| GitHubAPIUnreachableNode;
2629

2730
export class CurrentBranchTreeProvider
2831
extends WorkflowRunTreeDataProvider
@@ -39,8 +42,13 @@ export class CurrentBranchTreeProvider
3942
this._onDidChangeTreeData.fire(node);
4043
}
4144

42-
refresh(): void {
43-
this._onDidChangeTreeData.fire(null);
45+
async refresh(): Promise<void> {
46+
// Don't delete all the nodes if we can't reach GitHub API
47+
if (await canReachGitHubAPI()) {
48+
this._onDidChangeTreeData.fire(null);
49+
} else {
50+
await vscode.window.showWarningMessage("Unable to refresh, could not reach GitHub API");
51+
}
4452
}
4553

4654
getTreeItem(element: CurrentBranchTreeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
@@ -51,7 +59,7 @@ export class CurrentBranchTreeProvider
5159
if (!element) {
5260
const gitHubContext = await getGitHubContext();
5361
if (!gitHubContext) {
54-
return [];
62+
return [new GitHubAPIUnreachableNode()];
5563
}
5664

5765
if (gitHubContext.repos.length === 1) {

src/treeViews/settings.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,20 @@ import {EnvironmentSecretsNode} from "./settings/environmentSecretsNode";
1414
import {EnvironmentVariablesNode} from "./settings/environmentVariablesNode";
1515
import {OrgVariablesNode} from "./settings/orgVariablesNode";
1616
import {OrgSecretsNode} from "./settings/orgSecretsNode";
17+
import {GitHubAPIUnreachableNode} from "./shared/gitHubApiUnreachableNode";
18+
import {canReachGitHubAPI} from "../util";
1719

1820
export class SettingsTreeProvider implements vscode.TreeDataProvider<SettingsExplorerNode> {
1921
private _onDidChangeTreeData = new vscode.EventEmitter<SettingsExplorerNode | null>();
2022
readonly onDidChangeTreeData = this._onDidChangeTreeData.event;
2123

22-
refresh(): void {
23-
this._onDidChangeTreeData.fire(null);
24+
async refresh(): Promise<void> {
25+
// Don't delete all the nodes if we can't reach GitHub API
26+
if (await canReachGitHubAPI()) {
27+
this._onDidChangeTreeData.fire(null);
28+
} else {
29+
await vscode.window.showWarningMessage("Unable to refresh, could not reach GitHub API");
30+
}
2431
}
2532

2633
getTreeItem(element: SettingsExplorerNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
@@ -30,7 +37,7 @@ export class SettingsTreeProvider implements vscode.TreeDataProvider<SettingsExp
3037
async getChildren(element?: SettingsExplorerNode | undefined): Promise<SettingsExplorerNode[]> {
3138
const gitHubContext = await getGitHubContext();
3239
if (!gitHubContext) {
33-
return [];
40+
return [new GitHubAPIUnreachableNode()];
3441
}
3542

3643
if (!element) {

src/treeViews/settings/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {RepoVariablesNode} from "./repoVariablesNode";
1111
import {OrgVariablesNode} from "./orgVariablesNode";
1212
import {OrgSecretsNode} from "./orgSecretsNode";
1313
import {RepoSecretsNode} from "./repoSecretsNode";
14+
import {GitHubAPIUnreachableNode} from "../shared/gitHubApiUnreachableNode";
1415

1516
export type SettingsExplorerNode =
1617
| SecretsNode
@@ -25,4 +26,5 @@ export type SettingsExplorerNode =
2526
| RepoVariablesNode
2627
| VariableNode
2728
| VariablesNode
28-
| EmptyNode;
29+
| EmptyNode
30+
| GitHubAPIUnreachableNode;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import * as vscode from "vscode";
2+
3+
/**
4+
* Shown when no calls to the github API can be made.
5+
*/
6+
export class GitHubAPIUnreachableNode extends vscode.TreeItem {
7+
constructor() {
8+
super("Cannot reach GitHub API");
9+
this.iconPath = new vscode.ThemeIcon("notebook-state-error");
10+
}
11+
}

src/treeViews/treeViews.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ export async function initTreeViews(context: vscode.ExtensionContext, store: Run
2121

2222
context.subscriptions.push(
2323
vscode.commands.registerCommand("github-actions.explorer.refresh", async () => {
24-
workflowTreeProvider.refresh();
25-
settingsTreeProvider.refresh();
24+
await workflowTreeProvider.refresh();
25+
await settingsTreeProvider.refresh();
2626
await executeCacheClearCommand();
2727
})
2828
);
2929

3030
context.subscriptions.push(
31-
vscode.commands.registerCommand("github-actions.explorer.current-branch.refresh", () => {
32-
currentBranchTreeProvider.refresh();
31+
vscode.commands.registerCommand("github-actions.explorer.current-branch.refresh", async () => {
32+
await currentBranchTreeProvider.refresh();
3333
})
3434
);
3535

@@ -46,7 +46,7 @@ export async function initTreeViews(context: vscode.ExtensionContext, store: Run
4646

4747
let currentAhead = repo.repositoryState.HEAD?.ahead;
4848
let currentHeadName = repo.repositoryState.HEAD?.name;
49-
repo.repositoryState.onDidChange(() => {
49+
repo.repositoryState.onDidChange(async () => {
5050
// When the current head/branch changes, or the number of commits ahead changes (which indicates
5151
// a push), refresh the current-branch view
5252
if (
@@ -55,7 +55,7 @@ export async function initTreeViews(context: vscode.ExtensionContext, store: Run
5555
) {
5656
currentHeadName = repo.repositoryState?.HEAD?.name;
5757
currentAhead = repo.repositoryState?.HEAD?.ahead;
58-
currentBranchTreeProvider.refresh();
58+
await currentBranchTreeProvider.refresh();
5959
}
6060
});
6161
}

src/treeViews/workflows.ts

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

3-
import {log, logDebug, logError} from "../log";
4-
import {getWorkflowNodes, WorkflowsRepoNode} from "./workflows/workflowsRepoNode";
5-
63
import {getGitHubContext} from "../git/repository";
4+
import {log, logDebug, logError} from "../log";
75
import {RunStore} from "../store/store";
86
import {AttemptNode} from "./shared/attemptNode";
97
import {AuthenticationNode} from "./shared/authenticationNode";
108
import {ErrorNode} from "./shared/errorNode";
9+
import {GitHubAPIUnreachableNode} from "./shared/gitHubApiUnreachableNode";
1110
import {NoGitHubRepositoryNode} from "./shared/noGitHubRepositoryNode";
1211
import {NoWorkflowJobsNode} from "./shared/noWorkflowJobsNode";
1312
import {PreviousAttemptsNode} from "./shared/previousAttemptsNode";
1413
import {WorkflowJobNode} from "./shared/workflowJobNode";
1514
import {WorkflowRunNode} from "./shared/workflowRunNode";
1615
import {WorkflowRunTreeDataProvider} from "./workflowRunTreeDataProvider";
1716
import {WorkflowNode} from "./workflows/workflowNode";
17+
import {getWorkflowNodes, WorkflowsRepoNode} from "./workflows/workflowsRepoNode";
1818
import {WorkflowStepNode} from "./workflows/workflowStepNode";
19+
import {canReachGitHubAPI} from "../util";
1920

2021
type WorkflowsTreeNode =
2122
| AuthenticationNode
@@ -26,7 +27,8 @@ type WorkflowsTreeNode =
2627
| AttemptNode
2728
| WorkflowJobNode
2829
| NoWorkflowJobsNode
29-
| WorkflowStepNode;
30+
| WorkflowStepNode
31+
| GitHubAPIUnreachableNode;
3032

3133
export class WorkflowsTreeProvider
3234
extends WorkflowRunTreeDataProvider
@@ -43,9 +45,13 @@ export class WorkflowsTreeProvider
4345
this._onDidChangeTreeData.fire(node);
4446
}
4547

46-
refresh(): void {
47-
logDebug("Refreshing workflow tree");
48-
this._onDidChangeTreeData.fire(null);
48+
async refresh(): Promise<void> {
49+
// Don't delete all the nodes if we can't reach GitHub API
50+
if (await canReachGitHubAPI()) {
51+
this._onDidChangeTreeData.fire(null);
52+
} else {
53+
await vscode.window.showWarningMessage("Unable to refresh, could not reach GitHub API");
54+
}
4955
}
5056

5157
getTreeItem(element: WorkflowsTreeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
@@ -59,8 +65,8 @@ export class WorkflowsTreeProvider
5965
try {
6066
const gitHubContext = await getGitHubContext();
6167
if (!gitHubContext) {
62-
logDebug("could not get github context");
63-
return [];
68+
logDebug("could not get github context for workflows");
69+
return [new GitHubAPIUnreachableNode()];
6470
}
6571

6672
if (gitHubContext.repos.length > 0) {

src/util.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {Octokit} from "@octokit/rest";
2+
3+
import {logError} from "./log";
4+
5+
export async function canReachGitHubAPI() {
6+
try {
7+
const octokit = new Octokit();
8+
await octokit.request("GET /", {
9+
headers: {
10+
"X-GitHub-Api-Version": "2022-11-28"
11+
}
12+
});
13+
} catch {
14+
logError(new Error("Unable to connect to GitHub API"));
15+
return false;
16+
}
17+
return true;
18+
}

0 commit comments

Comments
 (0)