Skip to content

Commit 8f311d4

Browse files
authored
Merge pull request #10233 from Byron/next
V3 apply/unapply: workspace checkout
2 parents a8cbf10 + 194eaa9 commit 8f311d4

File tree

28 files changed

+1154
-146
lines changed

28 files changed

+1154
-146
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ gitbutler-git = { path = "crates/gitbutler-git" }
3939
gitbutler-watcher = { path = "crates/gitbutler-watcher" }
4040
gitbutler-filemonitor = { path = "crates/gitbutler-filemonitor" }
4141
gitbutler-testsupport = { path = "crates/gitbutler-testsupport" }
42-
gitbutler-cli = { path = "crates/gitbutler-cli" }
4342
gitbutler-branch-actions = { path = "crates/gitbutler-branch-actions" }
4443
gitbutler-sync = { path = "crates/gitbutler-sync" }
4544
gitbutler-oplog = { path = "crates/gitbutler-oplog" }
@@ -71,7 +70,6 @@ gitbutler-hunk-dependency = { path = "crates/gitbutler-hunk-dependency" }
7170
but-settings = { path = "crates/but-settings" }
7271
gitbutler-workspace = { path = "crates/gitbutler-workspace" }
7372
but = { path = "crates/but" }
74-
but-server = { path = "crates/but-server" }
7573
but-testsupport = { path = "crates/but-testsupport" }
7674
but-rebase = { path = "crates/but-rebase" }
7775
but-core = { path = "crates/but-core" }
@@ -112,3 +110,18 @@ incremental = false
112110

113111
[profile.test]
114112
incremental = false
113+
114+
# Assure that `gix` is always fast so debug builds aren't unnecessarily slow.
115+
[profile.dev.package]
116+
gix-object = { opt-level = 3 }
117+
gix-ref = { opt-level = 3 }
118+
gix-pack = { opt-level = 3 }
119+
gix-hash = { opt-level = 3 }
120+
gix-actor = { opt-level = 3 }
121+
gix-config = { opt-level = 3 }
122+
sha1-checked = { opt-level = 3 }
123+
zlib-rs = { opt-level = 3 }
124+
# This one is special as we can run into debug assertions otherwise.
125+
# They have a time, but let's chose the time instead of always being hit by it.
126+
gix-merge = { opt-level = 3, debug-assertions = false }
127+

crates/but-graph/src/init/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ impl Graph {
158158
}
159159
gix::head::Kind::Symbolic(existing_reference) => {
160160
let mut existing_reference = existing_reference.attach(repo);
161-
let tip = existing_reference.peel_to_id_in_place()?;
161+
let tip = existing_reference.peel_to_id()?;
162162
(tip, Some(existing_reference.inner.name))
163163
}
164164
};
@@ -487,7 +487,7 @@ impl Graph {
487487
{
488488
let Some(segment_tip) = repo
489489
.try_find_reference(segment.ref_name.as_ref())?
490-
.map(|mut r| r.peel_to_id_in_place())
490+
.map(|mut r| r.peel_to_id())
491491
.transpose()?
492492
else {
493493
continue;

crates/but-graph/src/init/walk.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ pub fn try_refname_to_id(
667667
) -> anyhow::Result<Option<gix::ObjectId>> {
668668
Ok(repo
669669
.try_find_reference(refname)?
670-
.map(|mut r| r.peel_to_id_in_place())
670+
.map(|mut r| r.peel_to_id())
671671
.transpose()?
672672
.map(|id| id.detach()))
673673
}

crates/but-graph/src/projection/workspace.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::projection::workspace;
88
use crate::{
99
CommitFlags, CommitIndex, Graph, Segment, SegmentIndex,
1010
projection::{Stack, StackCommit, StackCommitFlags, StackSegment},
11+
segment,
1112
};
1213
use anyhow::Context;
1314
use bstr::{BStr, ByteSlice};
@@ -68,6 +69,17 @@ impl Workspace<'_> {
6869
.iter()
6970
.all(|s| s.segments.iter().all(|s| !s.is_entrypoint))
7071
}
72+
73+
/// Return the `commit` at the tip of the workspace itself, and do so by following empty segments along the
74+
/// first parent until the first commit is found.
75+
/// This importantly is different from the [`Graph::lookup_entrypoint()`] `commit`, as the entrypoint could be anywhere
76+
/// inside the workspace as well.
77+
///
78+
/// Note that this commit could also be the base of the workspace, particularly if there is no commits in the workspace.
79+
pub fn tip_commit(&self) -> Option<&segment::Commit> {
80+
self.graph.tip_skip_empty(self.id)
81+
}
82+
7183
/// Lookup a triple obtained by [`Self::find_owner_indexes_by_commit_id()`] or panic.
7284
pub fn lookup_commit(&self, (stack_idx, seg_idx, cidx): CommitOwnerIndexes) -> &StackCommit {
7385
&self.stacks[stack_idx].segments[seg_idx].commits[cidx]
@@ -161,23 +173,28 @@ impl Workspace<'_> {
161173
self.find_segment_and_stack_by_refname(name).is_some()
162174
}
163175

164-
/// Return `true` if the entrypoint.
176+
/// Return `true` if `name` is in the ancestry of the workspace entrypoint, and is IN the workspace as well.
165177
pub fn is_reachable_from_entrypoint(&self, name: &gix::refs::FullNameRef) -> bool {
178+
if self.ref_name().filter(|_| self.is_entrypoint()) == Some(name) {
179+
return true;
180+
}
166181
if self.is_entrypoint() {
167182
self.refname_is_segment(name)
168183
} else {
169-
let Some((stack, segment_idx)) = self.stacks.iter().find_map(|stack| {
170-
stack
171-
.segments
172-
.iter()
173-
.enumerate()
174-
.find_map(|(idx, segment)| segment.is_entrypoint.then_some((stack, idx)))
175-
}) else {
184+
let Some((entrypoint_stack, entrypoint_segment_idx)) =
185+
self.stacks.iter().find_map(|stack| {
186+
stack
187+
.segments
188+
.iter()
189+
.enumerate()
190+
.find_map(|(idx, segment)| segment.is_entrypoint.then_some((stack, idx)))
191+
})
192+
else {
176193
return false;
177194
};
178-
stack
195+
entrypoint_stack
179196
.segments
180-
.get(segment_idx..)
197+
.get(entrypoint_segment_idx..)
181198
.into_iter()
182199
.any(|segments| {
183200
segments

crates/but-graph/src/ref_metadata_legacy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ impl Snapshot {
7878
let Ok(mut r) = repo.find_reference(&segment.name) else {
7979
continue;
8080
};
81-
if let Ok(id) = r.peel_to_id_in_place() {
81+
if let Ok(id) = r.peel_to_id() {
8282
segment.head = CommitOrChangeId::CommitId(id.to_string());
8383
}
8484
}

crates/but-rebase/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! An API for an interactive rebases, suitable for interactive, UI driven, and programmatic use.
22
//!
33
//! It will only affect the commit-graph, and never the alter the worktree in any way.
4-
#![deny(rust_2018_idioms, missing_docs)]
4+
#![deny(missing_docs)]
55

66
use crate::commit::DateMode;
77
use anyhow::{Context, Ok, Result, anyhow, bail};

crates/but-testing/src/command/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ pub fn graph(
510510
None => but_graph::Graph::from_head(&repo, &*meta, opts),
511511
Some(ref_name) => {
512512
let mut reference = repo.find_reference(ref_name)?;
513-
let id = reference.peel_to_id_in_place()?;
513+
let id = reference.peel_to_id()?;
514514
but_graph::Graph::from_commit_traversal(id, reference.name().to_owned(), &*meta, opts)
515515
}
516516
}?;

crates/but-testsupport/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! Utilities for testing.
2-
#![deny(rust_2018_idioms, missing_docs)]
2+
#![deny(missing_docs)]
33

44
use gix::Repository;
55
use gix::bstr::{BStr, ByteSlice};
@@ -252,7 +252,7 @@ pub fn id_at<'repo>(repo: &'repo Repository, name: &str) -> (gix::Id<'repo>, gix
252252
let mut rn = repo
253253
.find_reference(name)
254254
.expect("statically known reference exists");
255-
let id = rn.peel_to_id_in_place().expect("must be valid reference");
255+
let id = rn.peel_to_id().expect("must be valid reference");
256256
(id, rn.inner.name)
257257
}
258258

crates/but-workspace/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ flume = "0.11.1"
3535

3636
[dev-dependencies]
3737
but-testsupport.workspace = true
38-
pretty_assertions = "1.4.1"
3938
insta = "1.43.1"
4039
but-core = { workspace = true, features = ["testing"] }
4140
# for stable hashes in `gitbuter-` crates while we use them.

0 commit comments

Comments
 (0)