Skip to content

Commit 037fbe9

Browse files
committed
Improve order integrity
1 parent a5ff607 commit 037fbe9

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

crates/gitbutler-core/src/virtual_branches/state.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::{
55

66
use crate::{error::Code, fs::read_toml_file_or_default};
77
use anyhow::{anyhow, Result};
8+
use itertools::Itertools;
89
use serde::{Deserialize, Serialize};
910

1011
use super::{target::Target, Branch};
@@ -126,6 +127,38 @@ impl VirtualBranchesHandle {
126127
fn write_file(&self, virtual_branches: &VirtualBranches) -> Result<()> {
127128
write(self.file_path.as_path(), virtual_branches)
128129
}
130+
131+
pub fn update_ordering(&self) -> Result<()> {
132+
let succeeded = self
133+
.list_branches()?
134+
.iter()
135+
.sorted_by_key(|branch| branch.order)
136+
.enumerate()
137+
.all(|(index, branch)| {
138+
let mut branch = branch.clone();
139+
branch.order = index;
140+
self.set_branch(branch).is_ok()
141+
});
142+
143+
if succeeded {
144+
Ok(())
145+
} else {
146+
Err(anyhow!("Failed to update virtual branches ordering"))
147+
}
148+
}
149+
150+
pub fn next_order_index(&self) -> Result<usize> {
151+
self.update_ordering()?;
152+
let order = self
153+
.list_branches()?
154+
.iter()
155+
.sorted_by_key(|branch| branch.order)
156+
.collect::<Vec<&Branch>>()
157+
.last()
158+
.map_or(0, |b| b.order + 1);
159+
160+
Ok(order)
161+
}
129162
}
130163

131164
fn write<P: AsRef<Path>>(file_path: P, virtual_branches: &VirtualBranches) -> Result<()> {

crates/gitbutler-core/src/virtual_branches/virtual.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ pub fn convert_to_real_branch(
476476
conflicts::clear(project_repository)?;
477477
}
478478

479+
vb_state.update_ordering()?;
480+
479481
// Ensure we still have a default target
480482
ensure_selected_for_changes(&vb_state).context("failed to ensure selected for changes")?;
481483

@@ -810,10 +812,7 @@ pub fn create_virtual_branch(
810812

811813
all_virtual_branches.sort_by_key(|branch| branch.order);
812814

813-
let order = create
814-
.order
815-
.unwrap_or(all_virtual_branches.len())
816-
.clamp(0, all_virtual_branches.len());
815+
let order = create.order.unwrap_or(vb_state.next_order_index()?);
817816

818817
let selected_for_changes = if let Some(selected_for_changes) = create.selected_for_changes {
819818
if selected_for_changes {
@@ -3581,7 +3580,7 @@ pub fn create_virtual_branch_from_branch(
35813580
.into_iter()
35823581
.collect::<Vec<branch::Branch>>();
35833582

3584-
let order = all_virtual_branches.len();
3583+
let order = vb_state.next_order_index()?;
35853584

35863585
let selected_for_changes = (!all_virtual_branches
35873586
.iter()

0 commit comments

Comments
 (0)