@@ -562,37 +562,26 @@ public virtual HistoryDivergence CalculateHistoryDivergence(Commit one, Commit a
562
562
public virtual MergeTreeResult CherryPickCommit ( Commit cherryPickCommit , Commit cherryPickOnto , int mainline , MergeTreeOptions options )
563
563
{
564
564
Ensure . ArgumentNotNull ( cherryPickCommit , "cherryPickCommit" ) ;
565
- Ensure . ArgumentNotNull ( cherryPickOnto , "ours " ) ;
565
+ Ensure . ArgumentNotNull ( cherryPickOnto , "cherryPickOnto " ) ;
566
566
567
- options = options ?? new MergeTreeOptions ( ) ;
567
+ var modifiedOptions = new MergeTreeOptions ( ) ;
568
568
569
569
// We throw away the index after looking at the conflicts, so we'll never need the REUC
570
570
// entries to be there
571
- GitMergeFlag mergeFlags = GitMergeFlag . GIT_MERGE_NORMAL | GitMergeFlag . GIT_MERGE_SKIP_REUC ;
572
- if ( options . FindRenames )
573
- {
574
- mergeFlags |= GitMergeFlag . GIT_MERGE_FIND_RENAMES ;
575
- }
576
- if ( options . FailOnConflict )
577
- {
578
- mergeFlags |= GitMergeFlag . GIT_MERGE_FAIL_ON_CONFLICT ;
579
- }
580
-
571
+ modifiedOptions . SkipReuc = true ;
581
572
582
- var opts = new GitMergeOpts
573
+ if ( options != null )
583
574
{
584
- Version = 1 ,
585
- MergeFileFavorFlags = options . MergeFileFavor ,
586
- MergeTreeFlags = mergeFlags ,
587
- RenameThreshold = ( uint ) options . RenameThreshold ,
588
- TargetLimit = ( uint ) options . TargetLimit
589
- } ;
575
+ modifiedOptions . FailOnConflict = options . FailOnConflict ;
576
+ modifiedOptions . FindRenames = options . FindRenames ;
577
+ modifiedOptions . MergeFileFavor = options . MergeFileFavor ;
578
+ modifiedOptions . RenameThreshold = options . RenameThreshold ;
579
+ modifiedOptions . TargetLimit = options . TargetLimit ;
580
+ }
590
581
591
582
bool earlyStop ;
592
583
593
- using ( var cherryPickOntoHandle = Proxy . git_object_lookup ( repo . Handle , cherryPickOnto . Id , GitObjectType . Commit ) )
594
- using ( var cherryPickCommitHandle = Proxy . git_object_lookup ( repo . Handle , cherryPickCommit . Id , GitObjectType . Commit ) )
595
- using ( var indexHandle = Proxy . git_cherrypick_commit ( repo . Handle , cherryPickCommitHandle , cherryPickOntoHandle , ( uint ) mainline , opts , out earlyStop ) )
584
+ using ( var indexHandle = CherryPickCommit ( cherryPickCommit , cherryPickOnto , mainline , modifiedOptions , out earlyStop ) )
596
585
{
597
586
MergeTreeResult cherryPickResult ;
598
587
@@ -879,6 +868,36 @@ public virtual TransientIndex MergeCommitsIntoIndex(Commit ours, Commit theirs,
879
868
return result ;
880
869
}
881
870
871
+ /// <summary>
872
+ /// Performs a cherry-pick of <paramref name="cherryPickCommit"/> onto <paramref name="cherryPickOnto"/> commit.
873
+ /// </summary>
874
+ /// <param name="cherryPickCommit">The commit to cherry-pick.</param>
875
+ /// <param name="cherryPickOnto">The commit to cherry-pick onto.</param>
876
+ /// <param name="mainline">Which commit to consider the parent for the diff when cherry-picking a merge commit.</param>
877
+ /// <param name="options">The options for the merging in the cherry-pick operation.</param>
878
+ /// <returns>The <see cref="TransientIndex"/> containing the cherry-pick result tree and any conflicts, or null if the merge stopped early due to conflicts.
879
+ /// The index must be disposed by the caller. </returns>
880
+ public virtual TransientIndex CherryPickCommitIntoIndex ( Commit cherryPickCommit , Commit cherryPickOnto , int mainline , MergeTreeOptions options )
881
+ {
882
+ Ensure . ArgumentNotNull ( cherryPickCommit , "cherryPickCommit" ) ;
883
+ Ensure . ArgumentNotNull ( cherryPickOnto , "cherryPickOnto" ) ;
884
+
885
+ options = options ?? new MergeTreeOptions ( ) ;
886
+
887
+ bool earlyStop ;
888
+ var indexHandle = CherryPickCommit ( cherryPickCommit , cherryPickOnto , mainline , options , out earlyStop ) ;
889
+ if ( earlyStop )
890
+ {
891
+ if ( indexHandle != null )
892
+ {
893
+ indexHandle . Dispose ( ) ;
894
+ }
895
+ return null ;
896
+ }
897
+ var result = new TransientIndex ( indexHandle , repo ) ;
898
+ return result ;
899
+ }
900
+
882
901
/// <summary>
883
902
/// Perform a three-way merge of two commits, looking up their
884
903
/// commit ancestor. The returned index will contain the results
@@ -921,6 +940,48 @@ private IndexHandle MergeCommits(Commit ours, Commit theirs, MergeTreeOptions op
921
940
}
922
941
}
923
942
943
+ /// <summary>
944
+ /// Performs a cherry-pick of <paramref name="cherryPickCommit"/> onto <paramref name="cherryPickOnto"/> commit.
945
+ /// </summary>
946
+ /// <param name="cherryPickCommit">The commit to cherry-pick.</param>
947
+ /// <param name="cherryPickOnto">The commit to cherry-pick onto.</param>
948
+ /// <param name="mainline">Which commit to consider the parent for the diff when cherry-picking a merge commit.</param>
949
+ /// <param name="options">The options for the merging in the cherry-pick operation.</param>
950
+ /// <param name="earlyStop">True if the cherry-pick stopped early due to conflicts</param>
951
+ /// <returns>The <see cref="IndexHandle"/> containing the cherry-pick result tree and any conflicts</returns>
952
+ private IndexHandle CherryPickCommit ( Commit cherryPickCommit , Commit cherryPickOnto , int mainline , MergeTreeOptions options , out bool earlyStop )
953
+ {
954
+ GitMergeFlag mergeFlags = GitMergeFlag . GIT_MERGE_NORMAL ;
955
+ if ( options . SkipReuc )
956
+ {
957
+ mergeFlags |= GitMergeFlag . GIT_MERGE_SKIP_REUC ;
958
+ }
959
+ if ( options . FindRenames )
960
+ {
961
+ mergeFlags |= GitMergeFlag . GIT_MERGE_FIND_RENAMES ;
962
+ }
963
+ if ( options . FailOnConflict )
964
+ {
965
+ mergeFlags |= GitMergeFlag . GIT_MERGE_FAIL_ON_CONFLICT ;
966
+ }
967
+
968
+ var mergeOptions = new GitMergeOpts
969
+ {
970
+ Version = 1 ,
971
+ MergeFileFavorFlags = options . MergeFileFavor ,
972
+ MergeTreeFlags = mergeFlags ,
973
+ RenameThreshold = ( uint ) options . RenameThreshold ,
974
+ TargetLimit = ( uint ) options . TargetLimit ,
975
+ } ;
976
+
977
+ using ( var cherryPickOntoHandle = Proxy . git_object_lookup ( repo . Handle , cherryPickOnto . Id , GitObjectType . Commit ) )
978
+ using ( var cherryPickCommitHandle = Proxy . git_object_lookup ( repo . Handle , cherryPickCommit . Id , GitObjectType . Commit ) )
979
+ {
980
+ var indexHandle = Proxy . git_cherrypick_commit ( repo . Handle , cherryPickCommitHandle , cherryPickOntoHandle , ( uint ) mainline , mergeOptions , out earlyStop ) ;
981
+ return indexHandle ;
982
+ }
983
+ }
984
+
924
985
925
986
/// <summary>
926
987
/// Packs objects in the <see cref="ObjectDatabase"/> and write a pack (.pack) and index (.idx) files for them.
0 commit comments