Skip to content

Commit 6b55c60

Browse files
Byroncodex
andcommitted
review
- more structured `but-core` addition - idempotent `add_conflict_markers` - simplify marker removal Co-authored-by: GPT 5.4 <codex@openai.com>
1 parent 0d13d77 commit 6b55c60

9 files changed

Lines changed: 544 additions & 547 deletions

File tree

crates/but-core/src/commit/conflict.rs

Lines changed: 507 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 6 additions & 470 deletions
Large diffs are not rendered by default.

crates/but-rebase/src/cherry_pick.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -168,22 +168,16 @@ pub(crate) mod function {
168168
}
169169

170170
let headers = to_rebase.headers();
171-
let was_conflicted = to_rebase.is_conflicted();
172171
let mut new_commit = to_rebase.inner;
173172
new_commit.tree = resolved_tree_id.detach();
174173

175174
// Assure the commit isn't thinking it's conflicted.
176-
if was_conflicted {
177-
// Strip the legacy header if present
178-
if let Some(pos) = new_commit
179-
.extra_headers()
180-
.find_pos(HEADERS_CONFLICTED_FIELD)
181-
{
182-
new_commit.extra_headers.remove(pos);
183-
}
184-
// Strip conflict markers from the commit message
185-
new_commit.message =
186-
but_core::commit::strip_conflict_markers(new_commit.message.as_ref());
175+
new_commit.message = but_core::commit::strip_conflict_markers(new_commit.message.as_ref());
176+
if let Some(pos) = new_commit
177+
.extra_headers()
178+
.find_pos(HEADERS_CONFLICTED_FIELD)
179+
{
180+
new_commit.extra_headers.remove(pos);
187181
} else if headers.is_none() {
188182
let headers = Headers::from_config(&repo.config_snapshot());
189183
new_commit
@@ -251,10 +245,8 @@ pub(crate) mod function {
251245
set_parent(&mut to_rebase, head.id.detach())?;
252246

253247
// Add conflict markers to the commit message
254-
if !but_core::commit::message_is_conflicted(to_rebase.inner.message.as_ref()) {
255-
to_rebase.inner.message =
256-
but_core::commit::add_conflict_markers(to_rebase.inner.message.as_ref());
257-
}
248+
to_rebase.inner.message =
249+
but_core::commit::add_conflict_markers(to_rebase.inner.message.as_ref());
258250

259251
to_rebase.set_headers(&headers);
260252
Ok(crate::commit::create(

crates/but-rebase/src/graph_rebase/cherry_pick.rs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,16 @@ fn commit_from_unconflicted_tree<'repo>(
305305
let repo = to_rebase.id.repo;
306306

307307
let headers = to_rebase.headers();
308-
let was_conflicted = to_rebase.is_conflicted();
309308
let mut new_commit = to_rebase.inner;
310309
new_commit.tree = resolved_tree_id.detach();
311310

312311
// Ensure the commit isn't thinking it's conflicted.
313-
if was_conflicted {
314-
// Strip the legacy header if present
315-
if let Some(pos) = new_commit
316-
.extra_headers()
317-
.find_pos(HEADERS_CONFLICTED_FIELD)
318-
{
319-
new_commit.extra_headers.remove(pos);
320-
}
321-
// Strip conflict markers from the commit message
322-
new_commit.message = but_core::commit::strip_conflict_markers(new_commit.message.as_ref());
312+
new_commit.message = but_core::commit::strip_conflict_markers(new_commit.message.as_ref());
313+
if let Some(pos) = new_commit
314+
.extra_headers()
315+
.find_pos(HEADERS_CONFLICTED_FIELD)
316+
{
317+
new_commit.extra_headers.remove(pos);
323318
} else if headers.is_none() {
324319
let headers = Headers::from_config(&repo.config_snapshot());
325320
new_commit
@@ -390,10 +385,8 @@ fn commit_from_conflicted_tree<'repo>(
390385
to_rebase.parents = parents.into();
391386

392387
// Add conflict markers to the commit message
393-
if !but_core::commit::message_is_conflicted(to_rebase.inner.message.as_ref()) {
394-
to_rebase.inner.message =
395-
but_core::commit::add_conflict_markers(to_rebase.inner.message.as_ref());
396-
}
388+
to_rebase.inner.message =
389+
but_core::commit::add_conflict_markers(to_rebase.inner.message.as_ref());
397390

398391
to_rebase.set_headers(&headers);
399392
Ok(crate::commit::create(

crates/but-workspace/src/branch_details.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,7 @@ fn local_commits_gix(
227227
authors.insert(author.clone());
228228
authors.insert(committer);
229229
let is_conflicted = commit.is_conflicted();
230-
let message = if is_conflicted {
231-
but_core::commit::strip_conflict_markers(commit.message.as_ref())
232-
} else {
233-
commit.message.clone()
234-
};
230+
let message = but_core::commit::strip_conflict_markers(commit.message.as_ref());
235231
out.push(ui::Commit {
236232
id: info.id,
237233
parent_ids: commit.parents.iter().cloned().collect(),

crates/but-workspace/src/ref_info.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,7 @@ impl From<but_core::Commit<'_>> for Commit {
6969
let gix::objs::Commit {
7070
message, author, ..
7171
} = value.inner;
72-
let message = if has_conflicts {
73-
but_core::commit::strip_conflict_markers(message.as_ref())
74-
} else {
75-
message
76-
};
72+
let message = but_core::commit::strip_conflict_markers(message.as_ref());
7773
Commit {
7874
id,
7975
tree_id,
@@ -103,13 +99,8 @@ impl Commit {
10399
graph_commit: &but_graph::Commit,
104100
) -> Self {
105101
let hdr = but_core::commit::Headers::try_from_commit(&commit);
106-
let has_conflicts = but_core::commit::message_is_conflicted(commit.message.as_ref())
107-
|| hdr.as_ref().is_some_and(|hdr| hdr.is_conflicted());
108-
let message = if has_conflicts {
109-
but_core::commit::strip_conflict_markers(commit.message.as_ref())
110-
} else {
111-
commit.message
112-
};
102+
let has_conflicts = but_core::commit::is_conflicted(commit.message.as_ref(), hdr.as_ref());
103+
let message = but_core::commit::strip_conflict_markers(commit.message.as_ref());
113104
Commit {
114105
id: graph_commit.id,
115106
parent_ids: commit.parents.into_iter().collect(),

crates/but-workspace/src/ui/mod.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,14 @@ impl TryFrom<gix::Commit<'_>> for Commit {
118118
let commit_id = commit.id;
119119
let commit = commit.decode()?;
120120
let headers = but_core::commit::Headers::try_from_commit_headers(|| commit.extra_headers());
121-
let has_conflicts = but_core::commit::message_is_conflicted(commit.message)
122-
|| headers.as_ref().is_some_and(|hdr| hdr.is_conflicted());
121+
let has_conflicts = but_core::commit::is_conflicted(commit.message, headers.as_ref());
123122
let change_id = headers
124123
.unwrap_or_default()
125124
.ensure_change_id(commit_id)
126125
.change_id
127126
.expect("change-id is ensured")
128127
.to_string();
129-
let message = if has_conflicts {
130-
but_core::commit::strip_conflict_markers(commit.message)
131-
} else {
132-
commit.message.to_owned()
133-
};
128+
let message = but_core::commit::strip_conflict_markers(commit.message);
134129
Ok(Commit {
135130
id: commit_id,
136131
parent_ids: commit.parents().collect(),
@@ -148,8 +143,8 @@ impl TryFrom<gix::Commit<'_>> for Commit {
148143
impl From<but_core::CommitOwned> for Commit {
149144
fn from(CommitOwned { id, inner }: CommitOwned) -> Self {
150145
let headers = commit::Headers::try_from_commit(&inner);
151-
let has_conflicts = but_core::commit::message_is_conflicted(inner.message.as_ref())
152-
|| headers.as_ref().is_some_and(|hdr| hdr.is_conflicted());
146+
let has_conflicts =
147+
but_core::commit::is_conflicted(inner.message.as_ref(), headers.as_ref());
153148
let change_id = headers
154149
.unwrap_or_default()
155150
.ensure_change_id(id)
@@ -165,11 +160,7 @@ impl From<but_core::CommitOwned> for Commit {
165160
message,
166161
extra_headers: _,
167162
} = inner;
168-
let message = if has_conflicts {
169-
but_core::commit::strip_conflict_markers(message.as_ref())
170-
} else {
171-
message
172-
};
163+
let message = but_core::commit::strip_conflict_markers(message.as_ref());
173164
Commit {
174165
id,
175166
parent_ids: parents.into_iter().collect(),

crates/gitbutler-commit/src/commit_ext.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use bstr::BStr;
2-
use but_core::commit::message_is_conflicted;
32
use but_core::{ChangeId, commit::Headers};
43

54
/// Extension trait for `gix::Commit`.
@@ -28,16 +27,11 @@ impl CommitExt for gix::Commit<'_> {
2827
}
2928

3029
fn is_conflicted(&self) -> bool {
31-
// Check commit message first (new style), fall back to header (legacy).
32-
if let Ok(commit) = self.decode() {
33-
if message_is_conflicted(commit.message) {
34-
return true;
35-
}
36-
Headers::try_from_commit_headers(|| commit.extra_headers())
37-
.is_some_and(|hdr| hdr.is_conflicted())
38-
} else {
39-
false
40-
}
30+
let Ok(commit) = self.decode() else {
31+
return false;
32+
};
33+
let headers = Headers::try_from_commit_headers(|| commit.extra_headers());
34+
but_core::commit::is_conflicted(commit.message, headers.as_ref())
4135
}
4236
}
4337

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,7 @@ pub(crate) fn save_and_return_to_workspace(ctx: &Context, perm: &mut RepoExclusi
290290
(&headers).into()
291291
})
292292
.unwrap_or_default();
293-
// Strip conflict markers only for genuinely conflicted commit messages.
294-
if but_core::commit::message_is_conflicted(commit.message.as_ref()) {
295-
commit.message = but_core::commit::strip_conflict_markers(commit.message.as_ref());
296-
}
293+
commit.message = but_core::commit::strip_conflict_markers(commit.message.as_ref());
297294
but_rebase::commit::create(
298295
repo,
299296
gix::objs::Commit {

0 commit comments

Comments
 (0)