@@ -6,7 +6,7 @@ use but_core::{
66 commit:: { ConflictEntries , Headers } ,
77} ;
88use but_oxidize:: { ObjectIdExt as _, OidExt as _} ;
9- use gitbutler_cherry_pick:: { ConflictedTreeKey , RepositoryExt as _} ;
9+ use gitbutler_cherry_pick:: { ConflictedTreeKey , GixRepositoryExt as _} ;
1010
1111use crate :: RepositoryExt as _;
1212
@@ -87,25 +87,26 @@ pub fn merge_commits(
8787 incoming_commit : gix:: ObjectId ,
8888 resulting_name : & str ,
8989) -> Result < gix:: ObjectId > {
90- let repo = git2:: Repository :: open ( gix_repository. path ( ) ) ?;
91- let target_commit = repo. find_commit ( target_commit. to_git2 ( ) ) ?;
92- let incoming_commit = repo. find_commit ( incoming_commit. to_git2 ( ) ) ?;
93- let merge_base = repo. merge_base ( target_commit. id ( ) , incoming_commit. id ( ) ) ?;
94- let merge_base = repo. find_commit ( merge_base) ?;
90+ let target_commit = gix_repository. find_commit ( target_commit) ?;
91+ let incoming_commit = gix_repository. find_commit ( incoming_commit) ?;
92+ let merge_base = gix_repository. merge_base ( target_commit. id , incoming_commit. id ) ?;
93+ let merge_base = gix_repository. find_commit ( merge_base. detach ( ) ) ?;
9594
96- let base_tree = repo . find_real_tree ( & merge_base, Default :: default ( ) ) ?;
95+ let base_tree = gix_repository . find_real_tree ( & merge_base, Default :: default ( ) ) ?;
9796 // We want to use the auto-resolution when computing the merge, but for
9897 // reconstructing it later, we want the "theirsiest" and "oursiest" trees
99- let target_tree = repo . find_real_tree ( & target_commit, ConflictedTreeKey :: Theirs ) ?;
100- let incoming_tree = repo . find_real_tree ( & incoming_commit, ConflictedTreeKey :: Ours ) ?;
98+ let target_tree = gix_repository . find_real_tree ( & target_commit, ConflictedTreeKey :: Theirs ) ?;
99+ let incoming_tree = gix_repository . find_real_tree ( & incoming_commit, ConflictedTreeKey :: Ours ) ?;
101100
102- let target_merge_tree = repo. find_real_tree ( & target_commit, Default :: default ( ) ) ?;
103- let incoming_merge_tree = repo. find_real_tree ( & incoming_commit, Default :: default ( ) ) ?;
104- let gix_repo = but_core:: open_repo_for_merging ( repo. path ( ) ) ?;
101+ let target_merge_tree = gix_repository. find_real_tree ( & target_commit, Default :: default ( ) ) ?;
102+ let incoming_merge_tree =
103+ gix_repository. find_real_tree ( & incoming_commit, Default :: default ( ) ) ?;
104+ let repo = git2:: Repository :: open ( gix_repository. path ( ) ) ?;
105+ let gix_repo = gix_repository. clone ( ) . for_tree_diffing ( ) ?;
105106 let mut merge_result = gix_repo. merge_trees (
106- base_tree. id ( ) . to_gix ( ) ,
107- incoming_merge_tree. id ( ) . to_gix ( ) ,
108- target_merge_tree. id ( ) . to_gix ( ) ,
107+ base_tree. detach ( ) ,
108+ incoming_merge_tree. detach ( ) ,
109+ target_merge_tree. detach ( ) ,
109110 gix_repo. default_merge_labels ( ) ,
110111 gix_repo. merge_options_force_ours ( ) ?,
111112 ) ?;
@@ -126,9 +127,21 @@ pub fn merge_commits(
126127 let mut tree_writer = repo. treebuilder ( Some ( & auto_resolution_tree) ) ?;
127128
128129 // save the state of the conflict, so we can recreate it later
129- tree_writer. insert ( & * ConflictedTreeKey :: Ours , incoming_tree. id ( ) , 0o040000 ) ?;
130- tree_writer. insert ( & * ConflictedTreeKey :: Theirs , target_tree. id ( ) , 0o040000 ) ?;
131- tree_writer. insert ( & * ConflictedTreeKey :: Base , base_tree. id ( ) , 0o040000 ) ?;
130+ tree_writer. insert (
131+ & * ConflictedTreeKey :: Ours ,
132+ incoming_tree. detach ( ) . to_git2 ( ) ,
133+ 0o040000 ,
134+ ) ?;
135+ tree_writer. insert (
136+ & * ConflictedTreeKey :: Theirs ,
137+ target_tree. detach ( ) . to_git2 ( ) ,
138+ 0o040000 ,
139+ ) ?;
140+ tree_writer. insert (
141+ & * ConflictedTreeKey :: Base ,
142+ base_tree. detach ( ) . to_git2 ( ) ,
143+ 0o040000 ,
144+ ) ?;
132145 tree_writer. insert (
133146 & * ConflictedTreeKey :: AutoResolution ,
134147 merged_tree_id. to_git2 ( ) ,
@@ -154,6 +167,8 @@ pub fn merge_commits(
154167 } ;
155168
156169 let ( author, committer) = repo. signatures ( ) ?;
170+ let target_commit = repo. find_commit ( target_commit. id . to_git2 ( ) ) ?;
171+ let incoming_commit = repo. find_commit ( incoming_commit. id . to_git2 ( ) ) ?;
157172 let commit_oid = crate :: RepositoryExt :: commit_with_signature (
158173 & repo,
159174 None ,
0 commit comments