@@ -8,38 +8,52 @@ import router from '@/router';
88import { adapterManager } from '@/adapters' ;
99import { Repository } from '@/repository' ;
1010
11+ const loadMorePickerItem : vscode . QuickPickItem = {
12+ label : '$(more) Load More' ,
13+ alwaysShow : true ,
14+ } ;
15+
16+ const checkoutToItem : vscode . QuickPickItem = {
17+ label : '$(debug-disconnect) Checkout detached' ,
18+ alwaysShow : true ,
19+ } ;
20+
1121// check out to branch/tag/commit
1222const commandCheckoutTo = async ( ) => {
1323 const routerParser = await router . resolveParser ( ) ;
1424 const routeState = await router . getState ( ) ;
15-
16- const scheme = adapterManager . getCurrentScheme ( ) ;
17- const repository = Repository . getInstance ( scheme , routeState . repo ) ;
18- const [ branchRefs , tagRefs ] = await Promise . all ( [ repository . getBranchList ( ) , repository . getTagList ( ) ] ) ;
19- const branchPickerItems : vscode . QuickPickItem [ ] = branchRefs . map ( ( branchRef ) => ( {
20- label : branchRef . name ,
21- description : ( branchRef . commitSha || '' ) . slice ( 0 , 8 ) ,
22- } ) ) ;
23- const tagPickerItems : vscode . QuickPickItem [ ] = tagRefs . map ( ( tagRef ) => ( {
24- label : tagRef . name ,
25- description : `Tag at ${ ( tagRef . commitSha || '' ) . slice ( 0 , 8 ) } ` ,
26- } ) ) ;
27-
2825 const quickPick = vscode . window . createQuickPick ( ) ;
29- quickPick . placeholder = routeState . ref ;
30- quickPick . items = [ ...branchPickerItems , ...tagPickerItems ] ;
3126
27+ const loadMoreRefPickerItems = async ( ) => {
28+ quickPick . busy = true ;
29+ const scheme = adapterManager . getCurrentScheme ( ) ;
30+ const repository = Repository . getInstance ( scheme , routeState . repo ) ;
31+ await Promise . all ( [ repository . loadMoreBranches ( ) , repository . loadMoreTags ( ) ] ) ;
32+ const [ branchRefs , tagRefs ] = await Promise . all ( [ repository . getBranchList ( ) , repository . getTagList ( ) ] ) ;
33+ const refPickerItems = [ ...branchRefs , ...tagRefs ] . map ( ( ref ) => ( {
34+ label : ref . name ,
35+ description : ref . description ,
36+ } ) ) ;
37+ const hasMore = ( await Promise . all ( [ repository . hasMoreBranches ( ) , repository . hasMoreTags ( ) ] ) ) . some ( Boolean ) ;
38+ quickPick . items = [ ...refPickerItems , hasMore ? loadMorePickerItem : null ! , checkoutToItem ] . filter ( Boolean ) ;
39+ quickPick . busy = false ;
40+ } ;
41+
42+ quickPick . placeholder = 'Input a ref to checkout' ;
43+ quickPick . items = [ checkoutToItem ] ;
44+ loadMoreRefPickerItems ( ) ;
3245 quickPick . show ( ) ;
33- const choice = await new Promise < vscode . QuickPickItem | undefined > ( ( resolve ) =>
34- quickPick . onDidAccept ( ( ) => resolve ( quickPick . activeItems [ 0 ] ) )
35- ) ;
36- quickPick . hide ( ) ;
3746
38- const selectedRef = choice ?. label || quickPick . value ;
39- if ( selectedRef ) {
47+ quickPick . onDidAccept ( async ( ) => {
48+ const choice = quickPick . activeItems [ 0 ] ;
49+ if ( choice === loadMorePickerItem ) {
50+ return loadMoreRefPickerItems ( ) ;
51+ }
52+ const selectedRef = choice === checkoutToItem ? quickPick . value : choice ?. label ;
4053 const targetRef = selectedRef . toUpperCase ( ) !== 'HEAD' ? selectedRef : undefined ;
4154 router . push ( await routerParser . buildTreePath ( routeState . repo , targetRef ) ) ;
42- }
55+ quickPick . hide ( ) ;
56+ } ) ;
4357} ;
4458
4559export const registerRefCommands = ( context : vscode . ExtensionContext ) => {
0 commit comments