@@ -381,21 +381,86 @@ func (self *MergeAndRebaseHelper) MergeRefIntoCheckedOutBranch(refName string) e
381381		return  errors .New (self .c .Tr .CantMergeBranchIntoItself )
382382	}
383383
384+ 	wantFastForward , wantNonFastForward  :=  self .fastForwardMergeUserPreference ()
385+ 	canFastForward  :=  self .c .Git ().Branch .CanDoFastForwardMerge (refName )
386+ 
387+ 	var  firstRegularMergeItem  * types.MenuItem 
388+ 	var  secondRegularMergeItem  * types.MenuItem 
389+ 	var  fastForwardMergeItem  * types.MenuItem 
390+ 
391+ 	if  ! wantNonFastForward  &&  (wantFastForward  ||  canFastForward ) {
392+ 		firstRegularMergeItem  =  & types.MenuItem {
393+ 			Label :   self .c .Tr .RegularMergeFastForward ,
394+ 			OnPress : self .RegularMerge (refName , git_commands .MERGE_VARIANT_REGULAR ),
395+ 			Key :     'm' ,
396+ 			Tooltip : utils .ResolvePlaceholderString (
397+ 				self .c .Tr .RegularMergeFastForwardTooltip ,
398+ 				map [string ]string {
399+ 					"checkedOutBranch" : checkedOutBranchName ,
400+ 					"selectedBranch" :   refName ,
401+ 				},
402+ 			),
403+ 		}
404+ 		fastForwardMergeItem  =  firstRegularMergeItem 
405+ 
406+ 		secondRegularMergeItem  =  & types.MenuItem {
407+ 			Label :   self .c .Tr .RegularMergeNonFastForward ,
408+ 			OnPress : self .RegularMerge (refName , git_commands .MERGE_VARIANT_NON_FAST_FORWARD ),
409+ 			Key :     'n' ,
410+ 			Tooltip : utils .ResolvePlaceholderString (
411+ 				self .c .Tr .RegularMergeNonFastForwardTooltip ,
412+ 				map [string ]string {
413+ 					"checkedOutBranch" : checkedOutBranchName ,
414+ 					"selectedBranch" :   refName ,
415+ 				},
416+ 			),
417+ 		}
418+ 	} else  {
419+ 		firstRegularMergeItem  =  & types.MenuItem {
420+ 			Label :   self .c .Tr .RegularMergeNonFastForward ,
421+ 			OnPress : self .RegularMerge (refName , git_commands .MERGE_VARIANT_REGULAR ),
422+ 			Key :     'm' ,
423+ 			Tooltip : utils .ResolvePlaceholderString (
424+ 				self .c .Tr .RegularMergeNonFastForwardTooltip ,
425+ 				map [string ]string {
426+ 					"checkedOutBranch" : checkedOutBranchName ,
427+ 					"selectedBranch" :   refName ,
428+ 				},
429+ 			),
430+ 		}
431+ 
432+ 		secondRegularMergeItem  =  & types.MenuItem {
433+ 			Label :   self .c .Tr .RegularMergeFastForward ,
434+ 			OnPress : self .RegularMerge (refName , git_commands .MERGE_VARIANT_FAST_FORWARD ),
435+ 			Key :     'f' ,
436+ 			Tooltip : utils .ResolvePlaceholderString (
437+ 				self .c .Tr .RegularMergeFastForwardTooltip ,
438+ 				map [string ]string {
439+ 					"checkedOutBranch" : checkedOutBranchName ,
440+ 					"selectedBranch" :   refName ,
441+ 				},
442+ 			),
443+ 		}
444+ 		fastForwardMergeItem  =  secondRegularMergeItem 
445+ 	}
446+ 
447+ 	if  ! canFastForward  {
448+ 		fastForwardMergeItem .DisabledReason  =  & types.DisabledReason {
449+ 			Text : utils .ResolvePlaceholderString (
450+ 				self .c .Tr .CannotFastForwardMerge ,
451+ 				map [string ]string {
452+ 					"checkedOutBranch" : checkedOutBranchName ,
453+ 					"selectedBranch" :   refName ,
454+ 				},
455+ 			),
456+ 		}
457+ 	}
458+ 
384459	return  self .c .Menu (types.CreateMenuOptions {
385460		Title : self .c .Tr .Merge ,
386461		Items : []* types.MenuItem {
387- 			{
388- 				Label :   self .c .Tr .RegularMerge ,
389- 				OnPress : self .RegularMerge (refName ),
390- 				Key :     'm' ,
391- 				Tooltip : utils .ResolvePlaceholderString (
392- 					self .c .Tr .RegularMergeTooltip ,
393- 					map [string ]string {
394- 						"checkedOutBranch" : checkedOutBranchName ,
395- 						"selectedBranch" :   refName ,
396- 					},
397- 				),
398- 			},
462+ 			firstRegularMergeItem ,
463+ 			secondRegularMergeItem ,
399464			{
400465				Label :   self .c .Tr .SquashMergeUncommitted ,
401466				OnPress : self .SquashMergeUncommitted (refName ),
@@ -423,10 +488,10 @@ func (self *MergeAndRebaseHelper) MergeRefIntoCheckedOutBranch(refName string) e
423488	})
424489}
425490
426- func  (self  * MergeAndRebaseHelper ) RegularMerge (refName  string ) func () error  {
491+ func  (self  * MergeAndRebaseHelper ) RegularMerge (refName  string ,  variant  git_commands. MergeVariant ) func () error  {
427492	return  func () error  {
428493		self .c .LogAction (self .c .Tr .Actions .Merge )
429- 		err  :=  self .c .Git ().Branch .Merge (refName , git_commands . MERGE_VARIANT_REGULAR )
494+ 		err  :=  self .c .Git ().Branch .Merge (refName , variant )
430495		return  self .CheckMergeOrRebase (err )
431496	}
432497}
@@ -459,6 +524,31 @@ func (self *MergeAndRebaseHelper) SquashMergeCommitted(refName, checkedOutBranch
459524	}
460525}
461526
527+ // Returns wantsFastForward, wantsNonFastForward. These will never both be true, but they can both be false. 
528+ func  (self  * MergeAndRebaseHelper ) fastForwardMergeUserPreference () (bool , bool ) {
529+ 	// Check user config first, because it takes precedence over git config 
530+ 	mergingArgs  :=  self .c .UserConfig ().Git .Merging .Args 
531+ 	if  strings .Contains (mergingArgs , "--ff" ) { // also covers "--ff-only" 
532+ 		return  true , false 
533+ 	}
534+ 
535+ 	if  strings .Contains (mergingArgs , "--no-ff" ) {
536+ 		return  false , true 
537+ 	}
538+ 
539+ 	// Then check git config 
540+ 	mergeFfConfig  :=  self .c .Git ().Config .GetMergeFF ()
541+ 	if  mergeFfConfig  ==  "true"  ||  mergeFfConfig  ==  "only"  {
542+ 		return  true , false 
543+ 	}
544+ 
545+ 	if  mergeFfConfig  ==  "false"  {
546+ 		return  false , true 
547+ 	}
548+ 
549+ 	return  false , false 
550+ }
551+ 
462552func  (self  * MergeAndRebaseHelper ) ResetMarkedBaseCommit () error  {
463553	self .c .Modes ().MarkedBaseCommit .Reset ()
464554	self .c .PostRefreshUpdate (self .c .Contexts ().LocalCommits )
0 commit comments