Skip to content

Commit 1031de1

Browse files
committed
Update to gix with the latest improvements for nicer merge-related APIs
1 parent 0b32618 commit 1031de1

File tree

12 files changed

+69
-97
lines changed

12 files changed

+69
-97
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ resolver = "2"
4242
[workspace.dependencies]
4343
bstr = "1.10.0"
4444
# Add the `tracing` or `tracing-detail` features to see more of gitoxide in the logs. Useful to see which programs it invokes.
45-
gix = { git = "https://github.com/Byron/gitoxide", rev = "3fb989be21c739bbfeac93953c1685e7c6cd2106", default-features = false, features = [
45+
gix = { git = "https://github.com/Byron/gitoxide", rev = "a8765330fc16997dee275866b18a128dec1c5d55", default-features = false, features = [
4646
] }
4747
git2 = { version = "0.19.0", features = [
4848
"vendored-openssl",

crates/gitbutler-branch-actions/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ publish = false
99
tracing.workspace = true
1010
anyhow = "1.0.92"
1111
git2.workspace = true
12-
gix = { workspace = true, features = ["blob-diff", "revision", "blob-merge"] }
12+
gix = { workspace = true, features = ["blob-diff", "revision", "merge"] }
1313
tokio.workspace = true
1414
gitbutler-oplog.workspace = true
1515
gitbutler-repo.workspace = true

crates/gitbutler-branch-actions/src/base.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use gitbutler_reference::{Refname, RemoteRefname};
1717
use gitbutler_repo::{GixRepositoryExt, LogUntil, RepositoryExt};
1818
use gitbutler_repo_actions::RepoActionsExt;
1919
use gitbutler_stack::{BranchOwnershipClaims, Stack, Target, VirtualBranchesHandle};
20-
use gix::prelude::Write;
2120
use serde::Serialize;
2221

2322
#[derive(Debug, Serialize, PartialEq, Clone)]
@@ -93,10 +92,7 @@ fn go_back_to_integration(ctx: &CommandContext, default_target: &Target) -> Resu
9392
if merge.has_unresolved_conflicts(conflict_kind) {
9493
bail!("Merge failed with conflicts");
9594
}
96-
final_tree_id = merge
97-
.tree
98-
.write(|tree| gix_repo.write(tree))
99-
.map_err(|err| anyhow!("failed to write tree: {err}"))?;
95+
final_tree_id = merge.tree.write()?.detach();
10096
}
10197

10298
let final_tree = repo.find_tree(gix_to_git2_oid(final_tree_id))?;

crates/gitbutler-branch-actions/src/branch_manager/branch_removal.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use gitbutler_repo::RepositoryExt;
1414
use gitbutler_repo::SignaturePurpose;
1515
use gitbutler_repo_actions::RepoActionsExt;
1616
use gitbutler_stack::{Stack, StackId};
17-
use gix::objs::Write;
1817
use tracing::instrument;
1918

2019
use super::BranchManager;
@@ -128,10 +127,7 @@ impl BranchManager<'_> {
128127
gix_repo.default_merge_labels(),
129128
merge_options.clone(),
130129
)?;
131-
let final_tree_id = merge
132-
.tree
133-
.write(|tree| gix_repo.write(tree))
134-
.map_err(|err| anyhow::anyhow!("Could not write merged tree: {err}"))?;
130+
let final_tree_id = merge.tree.write()?.detach();
135131
Ok(final_tree_id)
136132
},
137133
)?;

crates/gitbutler-branch-actions/src/branch_trees.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::VirtualBranchesExt as _;
2-
use anyhow::{anyhow, bail, Result};
2+
use anyhow::{bail, Result};
33
use gitbutler_cherry_pick::RepositoryExt;
44
use gitbutler_command_context::CommandContext;
55
use gitbutler_commit::commit_ext::CommitExt as _;
@@ -8,7 +8,6 @@ use gitbutler_project::access::WorktreeWritePermission;
88
use gitbutler_repo::rebase::cherry_rebase_group;
99
use gitbutler_repo::{GixRepositoryExt, RepositoryExt as _};
1010
use gitbutler_stack::Stack;
11-
use gix::prelude::Write;
1211
use tracing::instrument;
1312

1413
/// Checks out the combined trees of all branches in the workspace.
@@ -61,10 +60,7 @@ pub fn checkout_branch_trees<'a>(
6160
bail!("There appears to be conflicts between the virtual branches");
6261
};
6362

64-
final_tree_id = merge
65-
.tree
66-
.write(|tree| gix_repo.write(tree))
67-
.map_err(|err| anyhow!("{err}"))?;
63+
final_tree_id = merge.tree.write()?.detach();
6864
}
6965

7066
let final_tree = repository.find_tree(gix_to_git2_oid(final_tree_id))?;

crates/gitbutler-branch-actions/src/integration.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use gitbutler_project::access::WorktreeWritePermission;
1414
use gitbutler_repo::{GixRepositoryExt, SignaturePurpose};
1515
use gitbutler_repo::{LogUntil, RepositoryExt};
1616
use gitbutler_stack::{Stack, VirtualBranchesHandle};
17-
use gix::objs::Write;
1817
use tracing::instrument;
1918

2019
use crate::{branch_manager::BranchManagerExt, conflicts, VirtualBranchesExt};
@@ -69,10 +68,7 @@ pub(crate) fn get_workspace_head(ctx: &CommandContext) -> Result<git2::Oid> {
6968
)?;
7069

7170
if !merge.has_unresolved_conflicts(conflict_kind) {
72-
workspace_tree_id = merge
73-
.tree
74-
.write(|tree| gix_repo.write(tree))
75-
.map_err(|err| anyhow!("{err}"))?;
71+
workspace_tree_id = merge.tree.write()?.detach();
7672
} else {
7773
// This branch should have already been unapplied during the "update" command but for some reason that failed
7874
tracing::warn!("Merge conflict between base and {:?}", branch.name);

crates/gitbutler-branch-actions/src/upstream_integration.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use gitbutler_repo::{
1313
};
1414
use gitbutler_repo_actions::RepoActionsExt as _;
1515
use gitbutler_stack::{Stack, StackId, Target, VirtualBranchesHandle};
16-
use gix::prelude::Write;
1716
use serde::{Deserialize, Serialize};
1817

1918
#[derive(Serialize, PartialEq, Debug)]
@@ -229,15 +228,13 @@ pub fn upstream_integration_statuses(
229228
{
230229
if tree_merge.has_unresolved_conflicts(conflict_kind) {
231230
bail!(
232-
"Merge result unexpectedly has conflicts between base, ours, theirs: {old_target_tree_id}, {new_target_tree_id}, {tree_id}"
231+
"Merge result unexpectedly has conflicts between base, \
232+
ours, theirs: {old_target_tree_id}, {new_target_tree_id}, {tree_id}"
233233
)
234234
}
235235
// We're safe to write the tree as we've ensured it's
236236
// unconflicted in the previous test.
237-
let tree_merge_index_tree_id = tree_merge
238-
.tree
239-
.write(|tree| gix_repo.write(tree))
240-
.map_err(|err| anyhow!("{err}"))?;
237+
let tree_merge_index_tree_id = tree_merge.tree.write()?.detach();
241238

242239
// Identical trees will have the same Oid so we can compare the two
243240
if tree_merge_index_tree_id == new_target_tree_id {

crates/gitbutler-branch-actions/src/virtual.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ use gitbutler_stack::{
3333
VirtualBranchesHandle,
3434
};
3535
use gitbutler_time::time::now_since_unix_epoch_ms;
36-
use gix::objs::Write;
3736
use serde::Serialize;
3837
use std::collections::HashSet;
3938
use std::{collections::HashMap, path::PathBuf, vec};
@@ -203,10 +202,7 @@ pub fn unapply_ownership(
203202
if merge.has_unresolved_conflicts(conflict_kind) {
204203
bail!("Tree has conflicts after merge")
205204
}
206-
merge
207-
.tree
208-
.write(|tree| gix_repo.write(tree))
209-
.map_err(|err| anyhow!("Could not write merged tree: {err}"))
205+
Ok(merge.tree.write()?.detach())
210206
},
211207
)?;
212208

@@ -1063,10 +1059,7 @@ impl IsCommitIntegrated<'_, '_, '_> {
10631059
return Ok(false);
10641060
}
10651061

1066-
let merge_tree_id = merge_output
1067-
.tree
1068-
.write(|tree| self.gix_repo.write(tree))
1069-
.map_err(|err| anyhow!("failed to write tree: {err}"))?;
1062+
let merge_tree_id = merge_output.tree.write()?.detach();
10701063

10711064
// if the merge_tree is the same as the new_target_tree and there are no files (uncommitted changes)
10721065
// then the vbranch is fully merged

crates/gitbutler-oplog/src/oplog.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use gitbutler_repo::{GixRepositoryExt, RepositoryExt};
2525
use gitbutler_stack::{Stack, VirtualBranchesHandle, VirtualBranchesState};
2626
use gix::bstr::ByteSlice;
2727
use gix::object::tree::diff::Change;
28-
use gix::prelude::{ObjectIdExt, Write};
28+
use gix::prelude::ObjectIdExt;
2929
use tracing::instrument;
3030

3131
const SNAPSHOT_FILE_LIMIT_BYTES: u64 = 32 * 1024 * 1024;
@@ -860,10 +860,7 @@ fn tree_from_applied_vbranches(
860860
if merge.has_unresolved_conflicts(conflict_kind) {
861861
tracing::warn!("Failed to merge tree {branch_id} - this branch is probably applied at a time when it should not be");
862862
} else {
863-
let id = merge
864-
.tree
865-
.write(|tree| repo.write(tree))
866-
.map_err(|err| anyhow!("{err}"))?;
863+
let id = merge.tree.write()?.detach();
867864
workdir_tree_id = id;
868865
current_ours_id = id;
869866
}

0 commit comments

Comments
 (0)