update nightly

[?]
Jul 15, 2025, 7:44 PM
WXQBBQ2ACNPKCTDF7OTBLP342324ZIOJK42PUO2KT2IYVJ2ETCMAC

Dependencies

  • [2] 6YZAVBWU Initial commit
  • [3] WT3GA27P add cursor with selection
  • [4] YBJRDOTC make all repo actions async
  • [5] A5YBC77V record!
  • [6] D7A7MSIH allow to defer or abandon record, add buttons
  • [7] AMPZ2BXK show changed files diffs (only Edit atm)
  • [8] Y6LXBCJB update toolchain and rust edition
  • [9] FR52XEMW add action for log change file diff
  • [10] 23SFYK4Q big view refactor into a new crate
  • [11] MYGIBRRH wip custom theme
  • [12] ACDXXAX2 refactor main's updates into smaller fns
  • [13] ESMM3FEL test selection reindexing
  • [14] SASAN2XC use nav-scrollable
  • [15] YKHE3XMW refactor diffs handling
  • [16] KWTBNTO3 diffs selection and scrolling
  • [17] SWWE2R6M display basic repo stuff
  • [18] KLR5FRIB add fs state read/write of repos
  • [19] KM5PSZ4A watch repo once loaded
  • [20] W4LFX7IH group diffs by file name
  • [21] AXSXZQDG fix updating changed file contents, styling
  • [22] I2AG42PA new cols layout
  • [23] ONRCENKT rm unnecessary state from repo's internal state
  • [24] S2NVIFXR allow to enter record msg
  • [25] 5MUEECMJ smooth scrolling nav
  • [26] 2VUX5BTD load identity
  • [27] Y5ATDI2H convert changed file diffs and load src only if any needs it
  • [28] GOLHUD6R nav-scrollable: set skip-able sections
  • [29] NRCUG4R2 load changed files src when selected
  • [30] ZVI4AWER woot contents_diff
  • [31] KEPKF3WO unify diffs handling, simplify view
  • [32] JE44NYHM display log files diffs

Change contents

  • replacement in justfile at line 11
    [2.181][8.23:55]()
    nightly := "nightly-2025-04-24"
    [2.181]
    [2.181]
    nightly := "nightly-2025-07-15"
  • replacement in justfile at line 31
    [2.363][14.19:100]()
    cargo +{{nightly}} clippy --lib --tests
    cargo +{{nightly}} clippy --bins
    [2.363]
    [2.380]
    cargo +{{nightly}} clippy
  • replacement in inflorescence/src/main.rs at line 359
    [12.1265][12.1265:1311](),[12.1311][16.12046:12101]()
    if let Some(repo) = state.repo.as_mut() {
    if let Some(cursor::Selection::UntrackedFile {
    [12.1265]
    [16.12101]
    if let Some(repo) = state.repo.as_mut()
    && let Some(cursor::Selection::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 365
    [16.12210][12.1424:1583](),[12.1424][12.1424:1583]()
    {
    state
    .repo_tx_in
    .send(repo::MsgIn::AddUntrackedFile { path: path.clone() })
    .unwrap();
    [16.12210]
    [5.5329]
    {
    state
    .repo_tx_in
    .send(repo::MsgIn::AddUntrackedFile { path: path.clone() })
    .unwrap();
  • replacement in inflorescence/src/main.rs at line 371
    [5.5330][12.1584:2295](),[12.2295][4.14745:14755](),[4.14745][4.14745:14755]()
    let removed = repo.untracked_files.remove(path);
    debug_assert!(removed, "{:?}, path: {path}", repo.untracked_files);
    repo.changed_files
    .entry(path.clone())
    .or_default()
    .insert(repo::ChangedFileDiff::Add);
    // Select the next untracked file, if any
    state.cursor.selection = if repo.untracked_files.is_empty() {
    None
    } else {
    let ix = cmp::min(*ix, repo.untracked_files.len() - 1);
    Some(cursor::untracked_file_selection(
    repo,
    ix,
    &mut state.files,
    ))
    };
    }
    [5.5330]
    [12.2296]
    let removed = repo.untracked_files.remove(path);
    debug_assert!(removed, "{:?}, path: {path}", repo.untracked_files);
    repo.changed_files
    .entry(path.clone())
    .or_default()
    .insert(repo::ChangedFileDiff::Add);
    // Select the next untracked file, if any
    state.cursor.selection = if repo.untracked_files.is_empty() {
    None
    } else {
    let ix = cmp::min(*ix, repo.untracked_files.len() - 1);
    Some(cursor::untracked_file_selection(repo, ix, &mut state.files))
    };
  • replacement in inflorescence/src/main.rs at line 389
    [12.2373][12.2373:2419](),[12.2419][16.12211:12264]()
    if let Some(repo) = state.repo.as_mut() {
    if let Some(cursor::Selection::ChangedFile {
    [12.2373]
    [16.12264]
    if let Some(repo) = state.repo.as_mut()
    && let Some(cursor::Selection::ChangedFile {
  • edit in inflorescence/src/main.rs at line 395
    [16.12373]
    [12.2530]
    {
    let diffs = repo.changed_files.get(path).unwrap();
    if diffs
    .iter()
    .any(|diff| matches!(diff, repo::ChangedFileDiff::Add))
  • replacement in inflorescence/src/main.rs at line 401
    [12.2540][12.2540:2720](),[12.2720][6.1517:1531](),[6.1517][6.1517:1531](),[6.1531][12.2721:2881]()
    let diffs = repo.changed_files.get(path).unwrap();
    if diffs
    .iter()
    .any(|diff| matches!(diff, repo::ChangedFileDiff::Add))
    {
    state
    .repo_tx_in
    .send(repo::MsgIn::RmAddedFile { path: path.clone() })
    .unwrap();
    [12.2540]
    [12.2881]
    state
    .repo_tx_in
    .send(repo::MsgIn::RmAddedFile { path: path.clone() })
    .unwrap();
  • replacement in inflorescence/src/main.rs at line 406
    [12.2882][12.2882:3423](),[12.3423][6.1730:1755](),[6.1730][6.1730:1755](),[6.1755][12.3424:3703](),[12.3703][6.1755:1788](),[6.1755][6.1755:1788]()
    // Remove from changed files
    let removed = repo.changed_files.remove(path);
    debug_assert!(
    removed.is_some(),
    "{:?} not found in {:?}",
    path,
    repo.changed_files
    );
    // Update untracked files
    repo.untracked_files.insert(path.clone());
    // Select the next changed file, if any
    state.cursor.selection = if repo.changed_files.is_empty() {
    None
    } else {
    let ix = cmp::min(*ix, repo.changed_files.len() - 1);
    Some(cursor::changed_file_selection(
    repo,
    ix,
    &mut state.files,
    ))
    };
    }
    [12.2882]
    [6.1813]
    // Remove from changed files
    let removed = repo.changed_files.remove(path);
    debug_assert!(
    removed.is_some(),
    "{:?} not found in {:?}",
    path,
    repo.changed_files
    );
    // Update untracked files
    repo.untracked_files.insert(path.clone());
    // Select the next changed file, if any
    state.cursor.selection = if repo.changed_files.is_empty() {
    None
    } else {
    let ix = cmp::min(*ix, repo.changed_files.len() - 1);
    Some(cursor::changed_file_selection(repo, ix, &mut state.files))
    };
  • edit in inflorescence/src/main.rs at line 567
    [12.7672]
    [12.7672]
    && *selected_hash == hash
    && *selected_path == file
  • replacement in inflorescence/src/main.rs at line 570
    [12.7678][12.7678:7740](),[12.7740][16.13519:13699](),[16.13699][15.4614:4628](),[15.4614][15.4614:4628](),[15.4628][16.13700:13822](),[16.13822][15.4882:4896](),[15.4882][15.4882:4896]()
    if *selected_hash == hash && *selected_path == file {
    let id_hash = file::log_id_parts_hash(hash, &file);
    if let Some(diff::FileAndState { file: _, state }) =
    state.logs.diffs.get_mut(&id_hash)
    {
    return diff::update(state, action)
    .map(move |msg| Msg::LogDiffNav { id_hash, msg });
    }
    [12.7678]
    [9.874]
    let id_hash = file::log_id_parts_hash(hash, &file);
    if let Some(diff::FileAndState { file: _, state }) =
    state.logs.diffs.get_mut(&id_hash)
    {
    return diff::update(state, action)
    .map(move |msg| Msg::LogDiffNav { id_hash, msg });
  • replacement in inflorescence/src/main.rs at line 699
    [13.9541][13.9541:10097]()
    if selection.is_some() {
    if let Some(diffs) = changed_files.get(&path) {
    if diff::any_diff_has_contents(diffs) {
    file::load_src_file_if_not_cached(
    files,
    file::Id {
    path: path.clone(),
    file_kind: file::Kind::Changed,
    },
    );
    }
    }
    [13.9541]
    [13.10097]
    if selection.is_some()
    && let Some(diffs) = changed_files.get(&path)
    && diff::any_diff_has_contents(diffs)
    {
    file::load_src_file_if_not_cached(
    files,
    file::Id {
    path: path.clone(),
    file_kind: file::Kind::Changed,
    },
    );
  • edit in inflorescence/src/main.rs at line 785
    [12.13098]
    [12.13098]
    && *selected_hash == hash
  • replacement in inflorescence/src/main.rs at line 787
    [12.13104][12.13104:13140](),[15.4958][15.4958:5129](),[15.5129][16.15179:15223](),[16.15223][15.5173:5282](),[15.5173][15.5173:5282](),[15.5282][16.15224:15577](),[16.15577][15.5601:5620](),[15.5601][15.5601:5620]()
    if *selected_hash == hash {
    diffs.into_iter().for_each(|(path, diffs)| {
    // NOTE: using unknown encoding as we don't yet have the file
    // for past changes
    let file = diff::init_file(
    diff::FileContent::UnknownEncoding,
    Some(&diffs),
    );
    let id_hash = file::log_id_parts_hash(hash, &path);
    let log_file_diff = diff::FileAndState {
    file,
    // The nav is initialized only once a file is selected,
    // because its tasks need it to be visible to complete
    state: diff::State::default(),
    };
    [12.13104]
    [15.5852]
    diffs.into_iter().for_each(|(path, diffs)| {
    // NOTE: using unknown encoding as we don't yet have the file
    // for past changes
    let file = diff::init_file(
    diff::FileContent::UnknownEncoding,
    Some(&diffs),
    );
    let id_hash = file::log_id_parts_hash(hash, &path);
    let log_file_diff = diff::FileAndState {
    file,
    // The nav is initialized only once a file is selected,
    // because its tasks need it to be visible to complete
    state: diff::State::default(),
    };
  • replacement in inflorescence/src/main.rs at line 802
    [15.5853][16.15578:15698](),[16.15698][15.6133:6149](),[15.6133][15.6133:6149](),[15.6188][7.2911:2921](),[12.13702][7.2911:2921](),[4.16466][7.2911:2921]()
    state.logs.change_hashes.insert(hash);
    state.logs.diffs.insert(id_hash, log_file_diff);
    });
    }
    [15.5853]
    [7.2921]
    state.logs.change_hashes.insert(hash);
    state.logs.diffs.insert(id_hash, log_file_diff);
    });
  • replacement in inflorescence/src/main.rs at line 1017
    [3.4175][11.8955:9026]()
    fn view(state: &State, window_id: window::Id) -> Element<Msg, Theme> {
    [3.4175]
    [10.28532]
    fn view(state: &State, window_id: window::Id) -> Element<'_, Msg, Theme> {