Skip to content

Commit aae226d

Browse files
authored
Smarter checkout PR by number (#8341)
1 parent 26a5204 commit aae226d

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

src/commands.ts

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,38 +1672,51 @@ ${contents}
16721672
quickPick.busy = false;
16731673

16741674
// Handle selection
1675-
const selected = await new Promise<(vscode.QuickPickItem & { prNumber?: number }) | string | undefined>((resolve) => {
1675+
1676+
const selected = await new Promise<{ selectedItem: (vscode.QuickPickItem & { prNumber?: number }) | undefined, selectedString: string | undefined }>((resolve) => {
16761677
acceptDisposable = quickPick.onDidAccept(() => {
1678+
let selectedString: string | undefined;
1679+
let selectedItem: (vscode.QuickPickItem & { prNumber?: number }) | undefined;
1680+
1681+
if (quickPick.value) {
1682+
selectedString = quickPick.value;
1683+
}
1684+
16771685
if (quickPick.selectedItems.length > 0) {
1678-
resolve(quickPick.selectedItems[0]);
1679-
} else if (quickPick.value) {
1680-
// User typed something but didn't select from list
1681-
resolve(quickPick.value);
1682-
} else {
1683-
// User pressed Enter with no selection and no input
1684-
resolve(undefined);
1686+
selectedItem = quickPick.selectedItems[0];
16851687
}
1688+
1689+
resolve({ selectedItem, selectedString });
16861690
});
1687-
hideDisposable = quickPick.onDidHide(() => resolve(undefined));
1691+
hideDisposable = quickPick.onDidHide(() => resolve({ selectedItem: undefined, selectedString: undefined }));
16881692
});
16891693

1690-
if (!selected) {
1694+
if (!selected.selectedItem && !selected.selectedString) {
16911695
return;
16921696
}
16931697
quickPick.busy = true;
16941698
let prModel: PullRequestModel | undefined;
16951699

16961700
// Check if user selected from the list or typed a custom value
1697-
if (typeof selected === 'string') {
1701+
if (selected.selectedString) {
16981702
// User typed a PR number or URL
1699-
const parseResult = validateAndParseInput(selected, githubRepo.repo.remote.owner, githubRepo.repo.remote.repositoryName);
1703+
const parseResult = validateAndParseInput(selected.selectedString, githubRepo.repo.remote.owner, githubRepo.repo.remote.repositoryName);
17001704
if (!parseResult.isValid) {
17011705
return vscode.window.showErrorMessage(parseResult.errorMessage || vscode.l10n.t('Invalid pull request number or URL'));
17021706
}
1707+
// The user may have just entered part of a number and meant to select it from the list
1708+
const selectedItemNumber = selected.selectedItem?.prNumber;
1709+
if (selectedItemNumber !== undefined) {
1710+
const parsedDigits = parseResult.prNumber.toString();
1711+
const selectedDigits = selectedItemNumber.toString();
1712+
if (selectedDigits.length > parsedDigits.length && selectedDigits.startsWith(parsedDigits)) {
1713+
parseResult.prNumber = selectedItemNumber;
1714+
}
1715+
}
17031716
prModel = await githubRepo.manager.fetchById(githubRepo.repo, parseResult.prNumber);
1704-
} else if (selected.prNumber) {
1717+
} else if (selected.selectedItem?.prNumber) {
17051718
// User selected from the list
1706-
prModel = await githubRepo.manager.fetchById(githubRepo.repo, selected.prNumber);
1719+
prModel = await githubRepo.manager.fetchById(githubRepo.repo, selected.selectedItem.prNumber);
17071720
}
17081721

17091722
if (prModel) {

0 commit comments

Comments
 (0)