@@ -49,14 +49,15 @@ import {
4949} from '../system/-webview/command' ;
5050import { configuration } from '../system/-webview/configuration' ;
5151import { setContext } from '../system/-webview/context' ;
52- import type { OpenWorkspaceLocation } from '../system/-webview/vscode' ;
53- import { openUrl , openWorkspace , revealInFileExplorer } from '../system/-webview/vscode' ;
52+ import type { MergeEditorInputs , OpenWorkspaceLocation } from '../system/-webview/vscode' ;
53+ import { openMergeEditor , openUrl , openWorkspace , revealInFileExplorer } from '../system/-webview/vscode' ;
5454import { filterMap } from '../system/array' ;
5555import { log } from '../system/decorators/log' ;
5656import { partial , runSequentially } from '../system/function' ;
5757import { join , map } from '../system/iterable' ;
5858import { lazy } from '../system/lazy' ;
5959import { basename } from '../system/path' ;
60+ import { getSettledValue } from '../system/promise' ;
6061import { DeepLinkActionType } from '../uris/deepLinks/deepLink' ;
6162import type { LaunchpadItemNode } from './launchpadView' ;
6263import type { RepositoryFolderNode } from './nodes/abstract/repositoryFolderNode' ;
@@ -281,6 +282,7 @@ export class ViewCommands implements Disposable {
281282 registerViewCommand ( 'gitlens.views.openChanges' , this . openChanges , this ) ,
282283 registerViewCommand ( 'gitlens.views.openChangesWithMergeBase' , this . openChangesWithMergeBase , this ) ,
283284 registerViewCommand ( 'gitlens.views.openChangesWithWorking' , this . openChangesWithWorking , this ) ,
285+ registerViewCommand ( 'gitlens.views.mergeChangesWithWorking' , this . mergeChangesWithWorking , this ) ,
284286 registerViewCommand (
285287 'gitlens.views.openPreviousChangesWithWorking' ,
286288 this . openPreviousChangesWithWorking ,
@@ -1538,6 +1540,48 @@ export class ViewCommands implements Disposable {
15381540 return CommitActions . openCommitChangesWithWorking ( this . container , node . commit , individually , options ) ;
15391541 }
15401542
1543+ private async mergeChangesWithWorking ( node : ViewRefFileNode ) {
1544+ if ( ! ( node instanceof ViewRefFileNode ) ) return Promise . resolve ( ) ;
1545+
1546+ const repo = this . container . git . getRepository ( node . repoPath ) ;
1547+ if ( repo == null ) return Promise . resolve ( ) ;
1548+
1549+ const nodeUri = await this . container . git . getBestRevisionUri ( node . repoPath , node . file . path , node . ref . ref ) ;
1550+ if ( nodeUri == null ) return Promise . resolve ( ) ;
1551+
1552+ const [ mergeBaseResult , workingUriResult ] = await Promise . allSettled ( [
1553+ repo . git . refs ( ) . getMergeBase ( node . ref . ref , 'HEAD' ) ,
1554+ this . container . git . getWorkingUri ( node . repoPath , node . uri ) ,
1555+ ] ) ;
1556+
1557+ const workingUri = getSettledValue ( workingUriResult ) ;
1558+ if ( workingUri == null ) {
1559+ void window . showWarningMessage ( 'Unable to open the merge editor, no working file found' ) ;
1560+ return Promise . resolve ( ) ;
1561+ }
1562+
1563+ const mergeBase = getSettledValue ( mergeBaseResult ) ;
1564+ const baseUri =
1565+ mergeBase != null
1566+ ? await this . container . git . getBestRevisionUri ( node . repoPath , node . file . path , mergeBase )
1567+ : undefined ;
1568+
1569+ const inputs : MergeEditorInputs = {
1570+ base : baseUri ?? nodeUri ,
1571+ input1 : {
1572+ uri : nodeUri ,
1573+ title : node . ref . name ,
1574+ } ,
1575+ input2 : {
1576+ uri : workingUri ,
1577+ title : 'Working Tree' ,
1578+ } ,
1579+ output : workingUri ,
1580+ } ;
1581+
1582+ return openMergeEditor ( inputs ) ;
1583+ }
1584+
15411585 @log ( )
15421586 private async openChangesWithMergeBase ( node : ResultsFileNode ) {
15431587 if ( ! node . is ( 'results-file' ) ) return Promise . resolve ( ) ;
0 commit comments