add src file LRU cache
[?]
Apr 22, 2025, 9:02 AM
V55EAIWQXWER2HWKZHPJBV7DDJMSPSPWSO3FSSAYODJHVDBHUN6QCDependencies
- [2]
6YZAVBWUInitial commit - [3]
IQDCHWCPload a pijul repo - [4]
SWWE2R6Mdisplay basic repo stuff - [5]
UB2ITZJSrefresh changed files on FS changes - [6]
S2NVIFXRallow to enter record msg - [7]
YBJRDOTCmake all repo actions async - [8]
KM5PSZ4Awatch repo once loaded - [9]
2VUX5BTDload identity - [10]
A5YBC77Vrecord! - [11]
D7A7MSIHallow to defer or abandon record, add buttons - [12]
4WO3ZJM2show untracked files' contents - [13]
BJXUYQ2Yshow untracked file contents in read-only text editor - [14]
PTFDJ567add untracked files encoding - [15]
AMPZ2BXKshow changed files diffs (only Edit atm) - [16]
EC3TVL4Xadd untracked files - [17]
AXSXZQDGfix updating changed file contents, styling - [18]
WT3GA27Padd cursor with selection - [19]
KT5UYXGKfix selection after adding file, add changed file diffs - [20]
W7IUT3ZVstart recording impl
Change contents
- edit in crates/flowers_ui/src/main.rs at line 3
use clru::{CLruCache, WeightScale}; - edit in crates/flowers_ui/src/main.rs at line 21
use std::num::NonZero; - edit in crates/flowers_ui/src/main.rs at line 29
// Invariant: Must be non-zeroconst SRC_FILES_CACHE_CAPACITY: usize = 1024 * 1024 * 1024; - replacement in crates/flowers_ui/src/main.rs at line 74
let (untracked_file_load_tx, untracked_file_load_rx) =watch::channel("".to_string());let untracked_file_load_rx =WatchStream::from_changes(untracked_file_load_rx);let (src_file_load_tx, src_file_load_rx) = watch::channel("".to_string());let untracked_file_load_rx = WatchStream::from_changes(src_file_load_rx); - replacement in crates/flowers_ui/src/main.rs at line 79
.map(move |path| (repo_path_clone.clone(), path)).then(|(repo_path, path)| async {load_untracked_file(repo_path, path).await.map(move |file_path| (repo_path_clone.clone(), file_path)).then(|(repo_path, file_path)| async {load_src_file(repo_path, file_path).await - edit in crates/flowers_ui/src/main.rs at line 85
let src_files_cache_capacity =NonZero::new(SRC_FILES_CACHE_CAPACITY).unwrap(); - replacement in crates/flowers_ui/src/main.rs at line 103
untracked_file_contents: None,untracked_file_load_tx,src_files_cache: CLruCache::with_scale(src_files_cache_capacity,SrcFileCacheWeight,),src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 123
untracked_file_contents: Option<UntrackedFileContents>,untracked_file_load_tx: watch::Sender<String>,src_files_cache: SrcFilesCache,src_file_load_tx: watch::Sender<String>, - edit in crates/flowers_ui/src/main.rs at line 128
type SrcFilesCache =CLruCache<String, SrcFile, std::hash::RandomState, SrcFileCacheWeight>; - edit in crates/flowers_ui/src/main.rs at line 133
enum SrcFile {Loading,Loaded(FileEditorContent),}#[derive(Debug)]struct SrcFileCacheWeight;impl WeightScale<String, SrcFile> for SrcFileCacheWeight {fn weight(&self, key: &String, value: &SrcFile) -> usize {let key_weight = key.as_bytes().len();let value_weight = match value {SrcFile::Loading => 0,SrcFile::Loaded(file_editor_content) => match file_editor_content {FileEditorContent::Decoded(content) => {content.text().as_bytes().len()}FileEditorContent::ShortBase64(string) => {string.as_bytes().len()}FileEditorContent::UnknownEncoding => 0,},};key_weight + value_weight}}#[derive(Debug)] - edit in crates/flowers_ui/src/main.rs at line 181
#[derive(Debug)]enum ChangedFileDiffWithContents {Add,Edit {line: usize,deleted: bool,content: FileEditorContent,},Replacement {line: usize,/// Deleted linechange_contents: FileEditorContent,/// Added linesreplacement_contents: FileEditorContent,},}#[derive(Debug)]pub enum ChangedFileDiffWithoutContents {Move,Del,Undel,SolveNameConflict,UnsolveNameConflict,SolveOrderConflict,UnsolveOrderConflict,ResurrectZombines,AddRoot,DelRoot,} - replacement in crates/flowers_ui/src/main.rs at line 243
LoadedUntrackedFile {LoadedSrcFile { - replacement in crates/flowers_ui/src/main.rs at line 248
UntrackedFileContentsAction(text_editor::Action),UntrackedFileContentsAction {path: String,action: text_editor::Action,}, - replacement in crates/flowers_ui/src/main.rs at line 260[7.6312]→[7.6312:6347](∅→∅),[7.6347]→[12.2793:3001](∅→∅),[12.3001]→[7.6410:6487](∅→∅),[7.6410]→[7.6410:6487](∅→∅)
let untracked_file_selection =|repo: &repo::State,ix: usize,untracked_file_contents: &mut Option<UntrackedFileContents>,untracked_file_load_tx: &watch::Sender<String>|-> cursor::Selection {let path = repo.untracked_files.iter().nth(ix).unwrap().clone();let untracked_file_selection = |repo: &repo::State,ix: usize,src_files_cache: &mut SrcFilesCache,src_file_load_tx: &watch::Sender<String,>|-> cursor::Selection {let path = repo.untracked_files.iter().nth(ix).unwrap().clone(); - replacement in crates/flowers_ui/src/main.rs at line 269
// Load the fileuntracked_file_load_tx.send(path.clone()).unwrap();*untracked_file_contents =Some(UntrackedFileContents::Loading { path: path.clone() });// Load the fileload_src_file_if_not_cached(src_files_cache, src_file_load_tx, &path); - replacement in crates/flowers_ui/src/main.rs at line 272
cursor::Selection::UntrackedFile { ix, path }};cursor::Selection::UntrackedFile { ix, path }}; - replacement in crates/flowers_ui/src/main.rs at line 318
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 330
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 351
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 374
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 393
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 405
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 421
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 440
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 457
state.untracked_file_load_tx.send(path.clone()).unwrap();state.untracked_file_contents =Some(UntrackedFileContents::Loading {path: path.clone(),});load_src_file_if_not_cached(&mut state.src_files_cache,&state.src_file_load_tx,path,); - replacement in crates/flowers_ui/src/main.rs at line 501
&mut state.untracked_file_contents,&state.untracked_file_load_tx,&mut state.src_files_cache,&state.src_file_load_tx, - replacement in crates/flowers_ui/src/main.rs at line 635
Message::LoadedUntrackedFile {Message::LoadedSrcFile { - replacement in crates/flowers_ui/src/main.rs at line 657[13.298]→[12.6579:6814](∅→∅),[14.1466]→[12.6579:6814](∅→∅),[12.6579]→[12.6579:6814](∅→∅),[12.6814]→[13.299:402](∅→∅),[13.402]→[14.1467:1508](∅→∅),[14.1508]→[13.448:480](∅→∅),[13.448]→[13.448:480](∅→∅),[13.480]→[12.6894:7059](∅→∅),[12.6894]→[12.6894:7059](∅→∅),[12.7059]→[14.1509:1541](∅→∅),[14.1541]→[12.7082:7208](∅→∅),[12.7082]→[12.7082:7208](∅→∅),[12.7208]→[13.481:584](∅→∅),[13.584]→[14.1542:1583](∅→∅),[14.1583]→[13.630:662](∅→∅),[13.630]→[13.630:662](∅→∅),[13.662]→[12.7288:7310](∅→∅),[12.7288]→[12.7288:7310](∅→∅)
match &state.untracked_file_contents {Some(UntrackedFileContents::Loading { path: loading_path }) => {if &path == loading_path {state.untracked_file_contents =Some(UntrackedFileContents::Loaded {path,content,});}}// Reloaded fileSome(UntrackedFileContents::Loaded {path: loaded_path,content: _,}) => {if &path == loaded_path {state.untracked_file_contents =Some(UntrackedFileContents::Loaded {path,content,});}match state.src_files_cache.get(&path) {Some(SrcFile::Loading | SrcFile::Loaded(_)) => {src_files_cache_put(&mut state.src_files_cache,path,SrcFile::Loaded(content),); - replacement in crates/flowers_ui/src/main.rs at line 669
Message::UntrackedFileContentsAction(action) => {Message::UntrackedFileContentsAction { path, action } => { - replacement in crates/flowers_ui/src/main.rs at line 672[13.830]→[13.830:890](∅→∅),[13.890]→[14.1584:1650](∅→∅),[14.1650]→[13.924:1003](∅→∅),[13.924]→[13.924:1003](∅→∅)
if let Some(UntrackedFileContents::Loaded {content: FileEditorContent::Decoded(content),..}) = &mut state.untracked_file_contentsif let Some(SrcFile::Loaded(FileEditorContent::Decoded(mut content),..,)) = state.src_files_cache.pop(&path) - edit in crates/flowers_ui/src/main.rs at line 678
src_files_cache_put(&mut state.src_files_cache,path,SrcFile::Loaded(FileEditorContent::Decoded(content)),); - edit in crates/flowers_ui/src/main.rs at line 714
src_files_cache_clear(&mut state.src_files_cache); - edit in crates/flowers_ui/src/main.rs at line 758
src_files_cache_clear(&mut state.src_files_cache); - replacement in crates/flowers_ui/src/main.rs at line 766
state.untracked_file_load_tx.send(path.clone()).unwrap();load_src_file_if_not_cached(&mut state.src_files_cache,&state.src_file_load_tx,&path,); - replacement in crates/flowers_ui/src/main.rs at line 892
async fn load_untracked_file(repo_path: PathBuf, file_path: String) -> Message {async fn load_src_file(repo_path: PathBuf, file_path: String) -> Message { - replacement in crates/flowers_ui/src/main.rs at line 897
Message::LoadedUntrackedFile {Message::LoadedSrcFile { - edit in crates/flowers_ui/src/main.rs at line 907
fn load_src_file_if_not_cached(cache: &mut SrcFilesCache,load_tx: &watch::Sender<String>,path: &str,) {if !cache.contains(path) {src_files_cache_put(cache, path.to_string(), SrcFile::Loading);load_tx.send(path.to_string()).unwrap();}}fn src_files_cache_put(cache: &mut SrcFilesCache, key: String, value: SrcFile) {if let Err((key, value)) = cache.put_with_weight(key, value) {let kv_weight = SrcFileCacheWeight.weight(&key, &value);info!("Source file cache is too small to hold {key}. Resizing cache to to {kv_weight} fit it.");cache.resize(NonZero::new(kv_weight).unwrap());let res = cache.put_with_weight(key, value);assert!(res.is_ok());}}fn src_files_cache_clear(cache: &mut SrcFilesCache) {cache.clear();} - replacement in crates/flowers_ui/src/main.rs at line 1000
let diff = match &state.untracked_file_contents {Some(UntrackedFileContents::Loaded {path: loaded_path,content,}) if loaded_path == path => match content {let diff = match &state.src_files_cache.peek(path) {Some(SrcFile::Loaded(content)) => match content { - replacement in crates/flowers_ui/src/main.rs at line 1005
.on_action(Message::UntrackedFileContentsAction)),.on_action(|action| Message::UntrackedFileContentsAction{path: path.clone(),action})), - replacement in crates/flowers_ui/src/main.rs at line 1013
_ => el(text("Loading...")),Some(SrcFile::Loading) => el(text("Loading...")),None => panic!("Unexpectedly, the src file {path} is not even being loaded"), - edit in crates/flowers_ui/Cargo.toml at line 20
[dependencies.clru]workspace = true - edit in Cargo.toml at line 28
[workspace.dependencies.clru]version = "0.6" - edit in Cargo.lock at line 842
name = "clru"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59"[[package]] - edit in Cargo.lock at line 1601
"clru",