Skip to content

Commit e68cd72

Browse files
codexByron
andcommitted
cherry-pick: drop git2 real-tree adapter
Co-authored-by: Sebastian Thiel <sebastian.thiel@icloud.com>
1 parent 19a5b6d commit e68cd72

5 files changed

Lines changed: 49 additions & 64 deletions

File tree

Cargo.lock

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/gitbutler-cherry-pick/Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,8 @@ rust-version.workspace = true
1010
doctest = false
1111

1212
[dependencies]
13-
but-oxidize.workspace = true
14-
1513
gitbutler-commit.workspace = true
1614

17-
git2.workspace = true
1815
gix.workspace = true
1916
anyhow.workspace = true
2017

crates/gitbutler-cherry-pick/src/lib.rs

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::ops::Deref;
22

33
use anyhow::{Context as _, Result};
4-
use but_oxidize::{ObjectIdExt as _, OidExt, RepoExt};
54
use gitbutler_commit::commit_ext::CommitExt;
65

76
#[derive(Default)]
@@ -33,19 +32,6 @@ impl Deref for ConflictedTreeKey {
3332
}
3433
}
3534

36-
pub trait RepositoryExt {
37-
/// Find the real tree of a commit, which is the tree of the commit if it's not in a conflicted state
38-
/// or the tree according to `side` if it is conflicted.
39-
///
40-
/// Unless you want to find a particular side, you likely want to pass Default::default()
41-
/// as the [`side`](ConflictedTreeKey) which will give the automatically resolved resolution
42-
fn find_real_tree(
43-
&self,
44-
commit: &git2::Commit,
45-
side: ConflictedTreeKey,
46-
) -> Result<git2::Tree<'_>>;
47-
}
48-
4935
pub trait GixRepositoryExt {
5036
/// Find the real tree of a commit, which is the tree of the commit if it's not in a conflicted state
5137
/// or the tree according to `side` if it is conflicted.
@@ -59,19 +45,6 @@ pub trait GixRepositoryExt {
5945
) -> Result<gix::Id<'repo>>;
6046
}
6147

62-
impl RepositoryExt for git2::Repository {
63-
fn find_real_tree(
64-
&self,
65-
commit: &git2::Commit,
66-
side: ConflictedTreeKey,
67-
) -> Result<git2::Tree<'_>> {
68-
let gix_repo = self.to_isolated_gix_repo()?;
69-
let gix_commit = gix_repo.find_commit(commit.id().to_gix())?;
70-
let tree_id = gix_repo.find_real_tree(&gix_commit, side)?.to_git2();
71-
Ok(self.find_tree(tree_id)?)
72-
}
73-
}
74-
7548
impl GixRepositoryExt for gix::Repository {
7649
fn find_real_tree<'repo>(
7750
&'repo self,

crates/gitbutler-edit-mode/src/lib.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ use but_ctx::{
1010
Context,
1111
access::{RepoExclusive, RepoShared},
1212
};
13-
use but_oxidize::{ObjectIdExt as _, OidExt, gix_to_git2_index};
13+
use but_oxidize::{ObjectIdExt as _, gix_to_git2_index};
1414
use but_rebase::graph_rebase::{Editor, Pick, Step};
1515
use git2::build::CheckoutBuilder;
16-
use gitbutler_cherry_pick::{ConflictedTreeKey, GixRepositoryExt as _, RepositoryExt as _};
16+
use gitbutler_cherry_pick::{ConflictedTreeKey, GixRepositoryExt as _};
1717
use gitbutler_commit::commit_ext::CommitExt;
1818
use gitbutler_operating_modes::{
1919
EDIT_BRANCH_REF, EditModeMetadata, INTEGRATION_BRANCH_REF, OperatingMode, WORKSPACE_BRANCH_REF,
@@ -364,16 +364,20 @@ pub(crate) fn starting_index_state(
364364
bail!("Starting index state can only be fetched while in edit mode")
365365
};
366366

367-
#[expect(deprecated, reason = "conflicted tree lookup boundary")]
368-
let git2_repo = &*ctx.git2_repo.get()?;
369367
let repo = &*ctx.repo.get()?;
370-
371-
let commit = git2_repo.find_commit(metadata.commit_oid.to_git2())?;
372-
let gix_commit = repo.find_commit(commit.id().to_gix())?;
368+
let gix_commit = repo.find_commit(metadata.commit_oid)?;
373369
let commit_parent_tree = if gix_commit.is_conflicted() {
374-
git2_repo.find_real_tree(&commit, ConflictedTreeKey::Base)?
370+
repo.find_real_tree(&gix_commit, ConflictedTreeKey::Base)?
371+
.detach()
375372
} else {
376-
commit.parent(0)?.tree()?
373+
gix_commit
374+
.parent_ids()
375+
.next()
376+
.context("edited commit had no parent")?
377+
.object()?
378+
.try_into_commit()?
379+
.tree_id()?
380+
.detach()
377381
};
378382

379383
let index = get_commit_index(ctx, metadata.commit_oid)?;
@@ -407,11 +411,9 @@ pub(crate) fn starting_index_state(
407411

408412
let tree_changes = but_core::diff::tree_changes(
409413
&repo,
410-
Some(commit_parent_tree.id().to_gix()),
411-
git2_repo
412-
.find_real_tree(&commit, ConflictedTreeKey::Theirs)?
413-
.id()
414-
.to_gix(),
414+
Some(commit_parent_tree),
415+
repo.find_real_tree(&gix_commit, ConflictedTreeKey::Theirs)?
416+
.detach(),
415417
)?;
416418

417419
let outcome = tree_changes

crates/gitbutler-repo/src/rebase.rs

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use but_core::{
66
commit::{ConflictEntries, Headers},
77
};
88
use but_oxidize::{ObjectIdExt as _, OidExt as _};
9-
use gitbutler_cherry_pick::{ConflictedTreeKey, RepositoryExt as _};
9+
use gitbutler_cherry_pick::{ConflictedTreeKey, GixRepositoryExt as _};
1010

1111
use 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

Comments
 (0)