Skip to content

Commit 329abda

Browse files
CopilotCopilotalexdima
authored
Fall back to browser for inaccessible GitHub links (#8958)
* Fall back for inaccessible GitHub links Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Attestation commit * Prepare 0.166.1 release Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Alex Dima <alexdima@microsoft.com>
1 parent 2f06150 commit 329abda

5 files changed

Lines changed: 58 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 0.166.1
4+
5+
### Fixes
6+
7+
- Fall back to the browser when a GitHub link cannot be resolved. https://github.com/microsoft/vscode-pull-request-github/issues/8959
8+
39
## 0.166.0
410

511
### Changes

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"treeItemMarkdownLabel",
4545
"treeViewMarkdownMessage"
4646
],
47-
"version": "0.166.0",
47+
"version": "0.166.1",
4848
"publisher": "GitHub",
4949
"engines": {
5050
"node": ">=20",

src/github/externalUriOpener.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class GitHubIssueOrPullRequestExternalUriOpener extends Disposable implements vs
4949
return;
5050
}
5151
if (!pullRequest) {
52-
await vscode.window.showErrorMessage(vscode.l10n.t('Unable to find pull request #{0} in {1}/{2}.', identity.number, identity.owner, identity.repo));
52+
await openWithDefaultExternalOpener(openContext.sourceUri);
5353
return;
5454
}
5555
await PullRequestOverviewPanel.createOrShow(
@@ -65,7 +65,7 @@ class GitHubIssueOrPullRequestExternalUriOpener extends Disposable implements vs
6565
return;
6666
}
6767
if (!issue) {
68-
await vscode.window.showErrorMessage(vscode.l10n.t('Unable to find issue #{0} in {1}/{2}.', identity.number, identity.owner, identity.repo));
68+
await openWithDefaultExternalOpener(openContext.sourceUri);
6969
return;
7070
}
7171
await IssueOverviewPanel.createOrShow(

src/test/github/externalUriOpener.test.ts

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('GitHubIssueOrPullRequestExternalUriOpener', () => {
2626
sandbox.restore();
2727
});
2828

29-
it('creates a remote-only folder manager when no local manager is available', async () => {
29+
it('opens an unresolved issue with the default external opener', async () => {
3030
const context = new MockExtensionContext();
3131
const telemetry = new MockTelemetry();
3232
const credentialStore = new CredentialStore(telemetry, context);
@@ -43,7 +43,7 @@ describe('GitHubIssueOrPullRequestExternalUriOpener', () => {
4343
assert.ok(this.repository instanceof RemoteOnlyRepository);
4444
return undefined;
4545
});
46-
sandbox.stub(vscode.window, 'showErrorMessage').resolves(undefined);
46+
const openExternal = sandbox.stub(vscode.env, 'openExternal').resolves(true);
4747

4848
try {
4949
registration = registerGitHubIssueOrPullRequestExternalUriOpener(
@@ -59,6 +59,51 @@ describe('GitHubIssueOrPullRequestExternalUriOpener', () => {
5959

6060
assert.strictEqual(repositoriesManager.folderManagers.length, 0);
6161
assert.strictEqual(resolveIssue.callCount, 1);
62+
assert.ok(openExternal.calledOnceWith(uri, { allowContributedOpeners: 'default' }));
63+
} finally {
64+
cancellation?.dispose();
65+
registration?.dispose();
66+
folderRepositoryManagerResolver.dispose();
67+
repositoriesManager.dispose();
68+
credentialStore.dispose();
69+
context.dispose();
70+
}
71+
});
72+
73+
it('opens an unresolved pull request with the default external opener', async () => {
74+
const context = new MockExtensionContext();
75+
const telemetry = new MockTelemetry();
76+
const credentialStore = new CredentialStore(telemetry, context);
77+
const repositoriesManager = new RepositoriesManager(credentialStore, telemetry);
78+
const folderRepositoryManagerResolver = new FolderRepositoryManagerResolver(context, repositoriesManager, telemetry);
79+
let opener: vscode.ExternalUriOpener | undefined;
80+
let registration: vscode.Disposable | undefined;
81+
let cancellation: vscode.CancellationTokenSource | undefined;
82+
sandbox.stub(vscode.window, 'registerExternalUriOpener').callsFake((_id, value) => {
83+
opener = value;
84+
return new vscode.Disposable(() => undefined);
85+
});
86+
const resolvePullRequest = sandbox.stub(FolderRepositoryManager.prototype, 'resolvePullRequest').callsFake(async function (this: FolderRepositoryManager) {
87+
assert.ok(this.repository instanceof RemoteOnlyRepository);
88+
return undefined;
89+
});
90+
const openExternal = sandbox.stub(vscode.env, 'openExternal').resolves(true);
91+
92+
try {
93+
registration = registerGitHubIssueOrPullRequestExternalUriOpener(
94+
context,
95+
folderRepositoryManagerResolver,
96+
telemetry,
97+
);
98+
const uri = vscode.Uri.parse('https://github.com/microsoft/vscode/pull/1');
99+
assert.ok(opener);
100+
sandbox.stub(opener as any, 'isOpenPullLinksEnabled').returns(true);
101+
cancellation = new vscode.CancellationTokenSource();
102+
await opener.openExternalUri(uri, { sourceUri: uri }, cancellation.token);
103+
104+
assert.strictEqual(repositoriesManager.folderManagers.length, 0);
105+
assert.strictEqual(resolvePullRequest.callCount, 1);
106+
assert.ok(openExternal.calledOnceWith(uri, { allowContributedOpeners: 'default' }));
62107
} finally {
63108
cancellation?.dispose();
64109
registration?.dispose();

0 commit comments

Comments
 (0)