fix partial overall toggle

tzemanovic
Feb 10, 2026, 2:57 PM
L6GEOWHOOOQE7HKUAFHGSGTQFG6U4S52G46DBIRMBW7M6XFTJCCQC

Dependencies

  • [2] LFEMJYYD start of to_record selection
  • [3] UPWS6J3B filter to-record changes from selection
  • [4] FU6P5QLG indicate when a file is a dir with appended '/'
  • [5] LJEWZVNP fix to-record, add more tests
  • [6] MORKDJUE use allowed actions binding for key subs
  • [7] YRGDFHAB project dir picker
  • [*] 5O4FWCFP add tests to_record selection and improve it

Change contents

  • replacement in libflorescence/src/to_record.rs at line 88
    [3.2074][4.802:867]()
    } else if file_has_any_partial_change(file, state) {
    [3.2074]
    [3.2154]
    } else if file_has_any_partial_change(file, &state.changes) {
  • replacement in libflorescence/src/to_record.rs at line 122
    [3.2980][4.892:971]()
    pub fn file_has_any_partial_change(file: &file::Path, state: &State) -> bool {
    [3.2980]
    [3.3156]
    pub fn file_has_any_partial_change(
    file: &file::Path,
    changes: &HashMap<file::Path, PartialFile>,
    ) -> bool {
  • replacement in libflorescence/src/to_record.rs at line 127
    [3.3217][3.3217:3244]()
    state
    .changes
    [3.3217]
    [3.3244]
    changes
  • edit in inflorescence_model/src/to_record.rs at line 32
    [2.4576]
    [2.4576]
    if let PickSet::Partial = state.overall {
    state.files.iter_mut().for_each(|(file, pick)| {
    if file_has_any_partial_change(file, &state.changes) {
    *pick = PickSet::Partial;
    }
    });
    }
  • replacement in inflorescence_model/src/to_record.rs at line 145
    [2.7026][4.8431:8484]()
    && !file_has_any_partial_change(file, state)
    [2.7026]
    [2.7094]
    && !file_has_any_partial_change(file, &state.changes)
  • replacement in inflorescence_model/src/to_record.rs at line 228
    [2.8862][4.8509:8569]()
    || file_has_any_partial_change(file, state)
    [2.8862]
    [2.8937]
    || file_has_any_partial_change(file, &state.changes)
  • replacement in inflorescence_model/src/to_record.rs at line 233
    [2.9073][4.8570:8630]()
    || file_has_any_partial_change(file, state)
    [2.9073]
    [2.9148]
    || file_has_any_partial_change(file, &state.changes)
  • edit in inflorescence_model/src/to_record/test.rs at line 470
    [5.6331]
    #[test]
    fn toggle_overall_partial_with_partial_file() {
    let mut state = State::default();
    assert_eq!(state.overall, PickSet::Include);
    let file_a = "A";
    let file_b = "B";
    let to_path = |raw: &str| file::Path {
    raw: raw.to_string(),
    is_dir: false,
    };
    let change_a_1 = repo::ChangedFileDiff::SolveNameConflict;
    let change_a_2 = repo::ChangedFileDiff::Undel;
    let change_b_1 = repo::ChangedFileDiff::SolveNameConflict;
    let change_b_2 = repo::ChangedFileDiff::Add;
    let changed_files = repo::ChangedFiles::from_iter([
    (
    to_path(file_a),
    repo::ChangedFile::from_iter([
    change_a_1.clone(),
    change_a_2.clone(),
    ]),
    ),
    (
    to_path(file_b),
    repo::ChangedFile::from_iter([
    change_b_1.clone(),
    change_b_2.clone(),
    ]),
    ),
    ]);
    let toggle_file = |state: &mut State, file: &str| {
    update(
    state,
    Msg::ToggleFile {
    path: to_path(file),
    },
    &changed_files,
    )
    };
    let toggle_change =
    |state: &mut State, file: &str, change: &repo::ChangedFileDiff| {
    update(
    state,
    Msg::ToggleChange {
    path: to_path(file),
    diff_id: diff::id_parts_hash(change),
    },
    &changed_files,
    )
    };
    let file =
    |state: &State, file: &str| *state.files.get(&to_path(file)).unwrap();
    let change = |state: &State, file: &str, change: &repo::ChangedFileDiff| {
    let diff_id = diff::id_parts_hash(change);
    *state
    .changes
    .get(&to_path(file))
    .unwrap()
    .changes
    .get(&diff_id)
    .unwrap()
    };
    // Exclude A.1
    toggle_change(&mut state, file_a, &change_a_1);
    assert_eq!(change(&state, file_a, &change_a_1), Pick::Exclude);
    assert_eq!(file(&state, file_a), PickSet::Partial);
    assert_eq!(state.overall, PickSet::Partial);
    // Exclude A
    toggle_file(&mut state, file_a);
    assert_eq!(file(&state, file_a), PickSet::Exclude);
    assert_eq!(state.overall, PickSet::Partial);
    // Include A
    toggle_file(&mut state, file_a);
    assert_eq!(file(&state, file_a), PickSet::Include);
    assert_eq!(state.overall, PickSet::Include);
    // Switching to partial should set the file A's to partial too
    update(&mut state, Msg::ToggleOverall, &changed_files);
    assert_eq!(state.overall, PickSet::Partial);
    assert_eq!(file(&state, file_a), PickSet::Partial);
    assert_eq!(change(&state, file_a, &change_a_1), Pick::Exclude);
    }