Skip to content

Commit a9ec889

Browse files
committed
Don't use the old refs/gitbutler/xxx for edit mode
1 parent 99f2f1f commit a9ec889

File tree

9 files changed

+25
-61
lines changed

9 files changed

+25
-61
lines changed

Cargo.lock

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

crates/but-api/src/commands/modes.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use gitbutler_command_context::CommandContext;
66
use gitbutler_edit_mode::ConflictEntryPresence;
77
use gitbutler_operating_modes::{EditModeMetadata, OperatingMode};
88
use gitbutler_project::ProjectId;
9-
use gitbutler_stack::VirtualBranchesHandle;
109
use serde::Deserialize;
1110

1211
use crate::{App, error::Error};
@@ -34,17 +33,10 @@ pub struct EnterEditModeParams {
3433
pub fn enter_edit_mode(app: &App, params: EnterEditModeParams) -> Result<EditModeMetadata, Error> {
3534
let project = gitbutler_project::get(params.project_id)?;
3635
let ctx = CommandContext::open(&project, app.app_settings.get()?.clone())?;
37-
let handle = VirtualBranchesHandle::new(project.gb_dir());
38-
let stack = handle.get_stack(params.stack_id)?;
39-
4036
let commit = git2::Oid::from_str(&params.commit_id).context("Failed to parse commit oid")?;
4137

42-
gitbutler_edit_mode::commands::enter_edit_mode(
43-
&ctx,
44-
commit,
45-
stack.refname()?.to_string().into(),
46-
)
47-
.map_err(Into::into)
38+
gitbutler_edit_mode::commands::enter_edit_mode(&ctx, commit, params.stack_id)
39+
.map_err(Into::into)
4840
}
4941

5042
#[derive(Deserialize)]

crates/gitbutler-edit-mode/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ but-rebase.workspace = true
2929
but-core.workspace = true
3030
serde.workspace = true
3131
tracing.workspace = true
32+
uuid.workspace = true
3233

3334
[dev-dependencies]
3435
gitbutler-testsupport.workspace = true

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
use anyhow::{Context, Result};
22
use but_core::ui::TreeChange;
3+
use but_workspace::StackId;
34
use gitbutler_command_context::CommandContext;
45
use gitbutler_operating_modes::{ensure_edit_mode, ensure_open_workspace_mode, EditModeMetadata};
56
use gitbutler_oplog::{
67
entry::{OperationKind, SnapshotDetails},
78
OplogExt,
89
};
9-
use gitbutler_reference::ReferenceName;
1010

1111
use crate::ConflictEntryPresence;
1212

1313
pub fn enter_edit_mode(
1414
ctx: &CommandContext,
1515
commit_oid: git2::Oid,
16-
branch_reference_name: ReferenceName,
16+
stack_id: StackId,
1717
) -> Result<EditModeMetadata> {
1818
let mut guard = ctx.project().exclusive_worktree_access();
1919

@@ -25,17 +25,12 @@ pub fn enter_edit_mode(
2525
.find_commit(commit_oid)
2626
.context("Failed to find commit")?;
2727

28-
let branch = ctx
29-
.repo()
30-
.find_reference(&branch_reference_name)
31-
.context("Failed to find branch reference")?;
32-
3328
let snapshot = ctx
3429
.prepare_snapshot(guard.read_permission())
3530
.context("Failed to prepare snapshot")?;
3631

3732
let edit_mode_metadata =
38-
crate::enter_edit_mode(ctx, commit, &branch, guard.write_permission())?;
33+
crate::enter_edit_mode(ctx, commit, stack_id, guard.write_permission())?;
3934

4035
let _ = ctx.commit_snapshot(
4136
snapshot,

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

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use std::collections::HashMap;
2-
use std::str::FromStr;
32

43
use anyhow::{bail, Context, Result};
54
use bstr::{BString, ByteSlice};
65
use but_core::TreeChange;
7-
use but_workspace::stack_ext::StackExt;
6+
use but_workspace::{stack_ext::StackExt, StackId};
87
use git2::build::CheckoutBuilder;
98
use gitbutler_branch_actions::update_workspace_commit;
109
use gitbutler_cherry_pick::{ConflictedTreeKey, RepositoryExt as _};
@@ -21,10 +20,9 @@ use gitbutler_oxidize::{
2120
git2_to_gix_object_id, gix_to_git2_index, GixRepositoryExt, ObjectIdExt, OidExt, RepoExt,
2221
};
2322
use gitbutler_project::access::{WorktreeReadPermission, WorktreeWritePermission};
24-
use gitbutler_reference::{ReferenceName, Refname};
2523
use gitbutler_repo::RepositoryExt;
2624
use gitbutler_repo::{signature, SignaturePurpose};
27-
use gitbutler_stack::{Stack, VirtualBranchesHandle};
25+
use gitbutler_stack::VirtualBranchesHandle;
2826
use gitbutler_workspace::branch_trees::{update_uncommited_changes_with_tree, WorkspaceState};
2927
#[allow(deprecated)]
3028
use serde::Serialize;
@@ -169,46 +167,20 @@ fn checkout_edit_branch(ctx: &CommandContext, commit: git2::Commit) -> Result<()
169167
Ok(())
170168
}
171169

172-
fn find_stack_by_reference(
173-
ctx: &CommandContext,
174-
reference: &ReferenceName,
175-
) -> Result<Option<Stack>> {
176-
let vb_state = VirtualBranchesHandle::new(ctx.project().gb_dir());
177-
let all_stacks = vb_state
178-
.list_stacks_in_workspace()
179-
.context("Failed to read virtual branches")?;
180-
181-
Ok(all_stacks.into_iter().find(|branch| {
182-
let Ok(refname) = branch.refname() else {
183-
return false;
184-
};
185-
186-
let Ok(checked_out_refname) = Refname::from_str(reference) else {
187-
return false;
188-
};
189-
190-
checked_out_refname == refname.into()
191-
}))
192-
}
193-
194170
pub(crate) fn enter_edit_mode(
195171
ctx: &CommandContext,
196172
commit: git2::Commit,
197-
branch: &git2::Reference,
173+
stack_id: StackId,
198174
_perm: &mut WorktreeWritePermission,
199175
) -> Result<EditModeMetadata> {
200-
let Some(branch_reference) = branch.name() else {
201-
bail!("Failed to get branch reference name");
202-
};
203-
204176
let edit_mode_metadata = EditModeMetadata {
205177
commit_oid: commit.id(),
206-
branch_reference: branch_reference.to_string().into(),
178+
stack_id,
207179
};
208180

209-
if find_stack_by_reference(ctx, &edit_mode_metadata.branch_reference)?.is_none() {
210-
bail!("Can not enter edit mode for a reference which does not have a cooresponding virtual branch")
211-
}
181+
let vb_state = VirtualBranchesHandle::new(ctx.project().gb_dir());
182+
// Validate the stack_id
183+
vb_state.get_stack_in_workspace(stack_id)?;
212184

213185
commit_uncommited_changes(ctx)?;
214186
write_edit_mode_metadata(ctx, &edit_mode_metadata).context("Failed to persist metadata")?;
@@ -254,10 +226,7 @@ pub(crate) fn save_and_return_to_workspace(
254226
.find_commit(edit_mode_metadata.commit_oid)
255227
.context("Failed to find commit")?;
256228

257-
let Some(mut stack) = find_stack_by_reference(ctx, &edit_mode_metadata.branch_reference)?
258-
else {
259-
bail!("Failed to find virtual branch for this reference. Entering and leaving edit mode for non-virtual branches is unsupported")
260-
};
229+
let mut stack = vb_state.get_stack_in_workspace(edit_mode_metadata.stack_id)?;
261230

262231
let parents = commit.parents().collect::<Vec<_>>();
263232

crates/gitbutler-edit-mode/tests/edit_mode.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use anyhow::Result;
22
use git2::build::CheckoutBuilder;
33
use gitbutler_command_context::CommandContext;
44
use gitbutler_edit_mode::commands::{enter_edit_mode, save_and_return_to_workspace};
5+
use gitbutler_stack::VirtualBranchesHandle;
56
use tempfile::TempDir;
67

78
fn command_ctx(folder: &str) -> Result<(CommandContext, TempDir)> {
@@ -24,7 +25,10 @@ fn conficted_entries_get_written_when_leaving_edit_mode() -> Result<()> {
2425

2526
let foobar = repository.head()?.peel_to_commit()?.parent(0)?;
2627

27-
enter_edit_mode(&ctx, foobar.id(), "refs/gitbutler/branchy".into())?;
28+
let vb_state = VirtualBranchesHandle::new(ctx.project().gb_dir());
29+
let stacks = vb_state.list_stacks_in_workspace()?;
30+
let stack = stacks.first().unwrap();
31+
enter_edit_mode(&ctx, foobar.id(), stack.id)?;
2832

2933
let init = repository
3034
.find_reference("refs/heads/main")?

crates/gitbutler-operating-modes/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ gitbutler-repo.workspace = true
2323
gitbutler-stack.workspace = true
2424
but-settings.workspace = true
2525
gitbutler-project.workspace = true
26+
uuid.workspace = true
2627

2728
[dev-dependencies]
2829
gitbutler-testsupport.workspace = true

crates/gitbutler-operating-modes/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::{fs, path::PathBuf};
22

33
use anyhow::{bail, Context, Result};
44
use bstr::BString;
5+
use but_workspace::StackId;
56
use gitbutler_command_context::CommandContext;
6-
use gitbutler_reference::ReferenceName;
77
use gitbutler_serde::BStringForFrontend;
88
use gitbutler_stack::VirtualBranchesHandle;
99
use serde::{Deserialize, Serialize};
@@ -60,7 +60,7 @@ pub struct EditModeMetadata {
6060
#[serde(with = "gitbutler_serde::oid")]
6161
pub commit_oid: git2::Oid,
6262
/// The ref of the vbranch which owns this commit.
63-
pub branch_reference: ReferenceName,
63+
pub stack_id: StackId,
6464
}
6565

6666
#[derive(Debug, Default, Serialize, PartialEq, Clone)]

crates/gitbutler-operating-modes/tests/operating_modes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ fn create_edit_mode_metadata(ctx: &CommandContext) {
2121
write_edit_mode_metadata(
2222
ctx,
2323
&EditModeMetadata {
24-
branch_reference: "asdf".into(),
2524
commit_oid: git2::Oid::zero(),
25+
stack_id: uuid::Uuid::new_v4().into(),
2626
},
2727
)
2828
.unwrap();

0 commit comments

Comments
 (0)