Skip to content

Commit fdf4785

Browse files
CopilotCopilotalexdima
authored andcommitted
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 036872d commit fdf4785

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
@@ -27,7 +27,7 @@ describe('GitHubIssueOrPullRequestExternalUriOpener', () => {
2727
sandbox.restore();
2828
});
2929

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

5151
try {
5252
await configuration.update(OPEN_PULL_LINKS, true, vscode.ConfigurationTarget.Global);
@@ -62,6 +62,51 @@ describe('GitHubIssueOrPullRequestExternalUriOpener', () => {
6262

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

0 commit comments

Comments
 (0)