show untracked files' contents

[?]
Mar 20, 2025, 7:51 PM
4WO3ZJM2RNYZCBPS7FGYAEBELYD57OSS7LEUYCWGZBCAY272SNQQC

Dependencies

  • [2] 6YZAVBWU Initial commit
  • [3] IQDCHWCP load a pijul repo
  • [4] SWWE2R6M display basic repo stuff
  • [5] WT3GA27P add cursor with selection
  • [6] UB2ITZJS refresh changed files on FS changes
  • [7] EC3TVL4X add untracked files
  • [8] KT5UYXGK fix selection after adding file, add changed file diffs
  • [9] S2NVIFXR allow to enter record msg
  • [10] W7IUT3ZV start recording impl
  • [11] YBJRDOTC make all repo actions async
  • [12] 2VUX5BTD load identity
  • [13] A5YBC77V record!
  • [14] Z2CJPWZE focus record message text_editor on spawn
  • [15] D7A7MSIH allow to defer or abandon record, add buttons
  • [16] UCBNZULE make changed files paths optional (no path for root)
  • [17] KM5PSZ4A watch repo once loaded
  • [18] ELG3UDT6 allow to rm added files

Change contents

  • edit in crates/libflowers_client/src/repo.rs at line 3
    [13.75]
    [13.75]
    use pijul::changestore::filesystem::FileSystem;
  • replacement in crates/libflowers_client/src/repo.rs at line 14
    [4.148][7.115:194]()
    use pijul::change::{Author, BaseHunk, ChangeHeader, Hunk, Local, LocalChange};
    [4.120]
    [10.7]
    use pijul::change::{
    self, get_change_contents, Author, BaseHunk, ChangeHeader, Hunk, Local,
    LocalChange,
    };
  • replacement in crates/libflowers_client/src/repo.rs at line 56
    [8.449][8.449:459]()
    Edit,
    [8.449]
    [8.459]
    Edit {
    line: usize,
    deleted: bool,
    contents: Vec<u8>,
    },
  • replacement in crates/libflowers_client/src/repo.rs at line 178
    [10.295][4.797:843](),[7.333][4.797:843](),[4.797][4.797:843]()
    let changed_files = changed_files(&diff);
    [10.295]
    [11.3102]
    let changed_files = changed_files(&diff, &repo.changes);
  • replacement in crates/libflowers_client/src/repo.rs at line 190
    [6.74][7.495:543]()
    state.changed_files = changed_files(&diff);
    [6.74]
    [4.899]
    state.changed_files = changed_files(&diff, &state.repo.changes);
  • replacement in crates/libflowers_client/src/repo.rs at line 438
    [8.1700][8.1700:1757]()
    fn changed_files(diff: &Diff) -> BTreeSet<ChangedFile> {
    [8.1700]
    [4.2949]
    fn changed_files(
    diff: &Diff,
    repo_changes: &FileSystem,
    ) -> BTreeSet<ChangedFile> {
  • replacement in crates/libflowers_client/src/repo.rs at line 444
    [4.2982][4.2982:3019]()
    .map(|change| match change {
    [4.2982]
    [8.1758]
    .map(|change| match dbg!(change) {
  • replacement in crates/libflowers_client/src/repo.rs at line 491
    [4.3788][8.3029:3056]()
    change: _,
    [4.3788]
    [8.3056]
    change,
  • replacement in crates/libflowers_client/src/repo.rs at line 493
    [8.3085][8.3085:3116](),[8.3116][16.298:346](),[16.346][8.3158:3218](),[8.3158][8.3158:3218]()
    } => ChangedFile {
    path: Some(local.path.clone()),
    diff: ChangedFileDiff::Edit,
    },
    [8.3085]
    [4.3851]
    } => {
    let path = Some(local.path.clone());
    let line = local.line;
    let deleted = if let change::Atom::EdgeMap(map) = change {
    map.edges
    .first()
    .map(|edge| edge.flag.is_deleted())
    .unwrap_or_default()
    } else {
    false
    };
    // TODO: This fn isn't public in upstream pijul, contrib
    let contents =
    get_change_contents(repo_changes, change, &diff.contents)
    .unwrap();
    ChangedFile {
    path,
    diff: ChangedFileDiff::Edit {
    line,
    deleted,
    contents,
    },
    }
    }
  • edit in crates/flowers_ui/src/main.rs at line 4
    [12.496]
    [3.1024]
    use tokio_stream::StreamExt;
  • edit in crates/flowers_ui/src/main.rs at line 6
    [3.1025]
    [14.23]
    use core::str;
  • replacement in crates/flowers_ui/src/main.rs at line 8
    [14.43][14.43:110]()
    self, button, column, horizontal_rule, row, text, text_editor,
    [14.43]
    [14.110]
    self, button, column, horizontal_rule, row, scrollable, text, text_editor,
  • replacement in crates/flowers_ui/src/main.rs at line 64
    [12.678][12.678:753]()
    let tasks = Task::batch([repo_task, repo_msg_out_task, load_id_task]);
    [12.678]
    [6.1438]
    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 repo_path_clone = repo_path.clone();
    let untracked_file_load_task = Task::run(
    untracked_file_load_rx
    .map(move |path| (repo_path_clone.clone(), path))
    .then(|(repo_path, path)| async {
    load_untracked_file(repo_path, path).await
    }),
    |msg| msg,
    );
    let tasks = Task::batch([
    repo_task,
    repo_msg_out_task,
    load_id_task,
    untracked_file_load_task,
    ]);
  • edit in crates/flowers_ui/src/main.rs at line 93
    [9.130]
    [6.1520]
    untracked_file_contents: None,
    untracked_file_load_tx,
  • edit in crates/flowers_ui/src/main.rs at line 109
    [15.58]
    [15.58]
    untracked_file_contents: Option<UntrackedFileContents>,
    untracked_file_load_tx: watch::Sender<String>,
  • edit in crates/flowers_ui/src/main.rs at line 114
    [15.78]
    [15.78]
    enum UntrackedFileContents {
    Loading {
    path: String,
    },
    Loaded {
    path: String,
    data: Vec<u8>,
    // TODO: use pijul pijul::text_changes::Encoding (not exposed yet)
    // encoding: Encoding,
    },
    }
    #[derive(Debug)]
  • edit in crates/flowers_ui/src/main.rs at line 138
    [5.668]
    [13.4573]
    NoOp,
  • edit in crates/flowers_ui/src/main.rs at line 153
    [15.216]
    [5.735]
    LoadedUntrackedFile { path: String, data: Vec<u8> },
  • replacement in crates/flowers_ui/src/main.rs at line 158
    [11.6347][11.6347:6410]()
    |repo: &repo::State, ix: usize| -> cursor::Selection {
    [11.6347]
    [11.6410]
    |repo: &repo::State,
    ix: usize,
    untracked_file_contents: &mut Option<UntrackedFileContents>,
    untracked_file_load_tx: &watch::Sender<String>|
    -> cursor::Selection {
  • edit in crates/flowers_ui/src/main.rs at line 164
    [11.6487]
    [11.6487]
    // Load the file
    untracked_file_load_tx.send(path.clone()).unwrap();
    *untracked_file_contents =
    Some(UntrackedFileContents::Loading { path: path.clone() });
  • edit in crates/flowers_ui/src/main.rs at line 180
    [11.6718]
    [15.217]
    Message::NoOp => Task::none(),
  • replacement in crates/flowers_ui/src/main.rs at line 207
    [11.7561][11.7561:7632]()
    untracked_file_selection(repo, ix)
    [11.7561]
    [11.7632]
    untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    )
  • replacement in crates/flowers_ui/src/main.rs at line 219
    [11.7910][11.7910:7977]()
    untracked_file_selection(repo, ix)
    [11.7910]
    [11.7977]
    untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    )
  • replacement in crates/flowers_ui/src/main.rs at line 240
    [7.4353][11.8462:8529]()
    untracked_file_selection(repo, ix)
    [7.4353]
    [7.4412]
    untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    )
  • replacement in crates/flowers_ui/src/main.rs at line 263
    [7.5492][11.8922:8991]()
    Some(untracked_file_selection(repo, ix))
    [7.5492]
    [5.1547]
    Some(untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    ))
  • replacement in crates/flowers_ui/src/main.rs at line 282
    [11.9435][11.9435:9502]()
    untracked_file_selection(repo, ix)
    [11.9435]
    [11.9502]
    untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    )
  • replacement in crates/flowers_ui/src/main.rs at line 294
    [11.9751][11.9751:9814]()
    untracked_file_selection(repo, ix)
    [11.9751]
    [11.9814]
    untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    )
  • replacement in crates/flowers_ui/src/main.rs at line 310
    [11.10354][11.10354:10421]()
    untracked_file_selection(repo, ix)
    [11.10354]
    [11.10421]
    untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    )
  • replacement in crates/flowers_ui/src/main.rs at line 329
    [11.10952][11.10952:11025]()
    Some(untracked_file_selection(repo, ix))
    [11.10952]
    [11.11025]
    Some(untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    ))
  • edit in crates/flowers_ui/src/main.rs at line 346
    [5.2594]
    [10.1381]
    match &selection {
    cursor::Selection::UntrackedFile { path, .. } => {
    // Load the file
    state.untracked_file_load_tx.send(path.clone()).unwrap();
    state.untracked_file_contents =
    Some(UntrackedFileContents::Loading {
    path: path.clone(),
    });
    }
    cursor::Selection::ChangedFile { .. } => {}
    }
  • replacement in crates/flowers_ui/src/main.rs at line 389
    [11.12334][11.12334:12399]()
    Some(untracked_file_selection(repo, ix))
    [11.12334]
    [8.7490]
    Some(untracked_file_selection(
    repo,
    ix,
    &mut state.untracked_file_contents,
    &state.untracked_file_load_tx,
    ))
  • edit in crates/flowers_ui/src/main.rs at line 525
    [12.1055]
    [11.14755]
    Message::LoadedUntrackedFile { path, data } => {
    match &state.untracked_file_contents {
    Some(UntrackedFileContents::Loading { path: loading_path }) => {
    if &path == loading_path {
    state.untracked_file_contents =
    Some(UntrackedFileContents::Loaded { path, data });
    }
    }
    // Reloaded file
    Some(UntrackedFileContents::Loaded {
    path: loaded_path,
    ..
    }) => {
    if &path == loaded_path {
    state.untracked_file_contents =
    Some(UntrackedFileContents::Loaded { path, data });
    }
    }
    None => {}
    }
    Task::none()
    }
  • replacement in crates/flowers_ui/src/main.rs at line 601
    [11.15531][11.15531:15972]()
    cursor::Selection::UntrackedFile { ix: _, path } => repo
    .untracked_files
    .iter()
    .enumerate()
    .find(|(_ix, file_path)| *file_path == path)
    .map(|(ix, path)| cursor::Selection::UntrackedFile {
    ix,
    path: path.clone(),
    }),
    [11.15531]
    [11.15972]
    cursor::Selection::UntrackedFile { ix: _, path } => {
    state
    .untracked_file_load_tx
    .send(path.clone())
    .unwrap();
    repo.untracked_files
    .iter()
    .enumerate()
    .find(|(_ix, file_path)| *file_path == path)
    .map(|(ix, path)| {
    cursor::Selection::UntrackedFile {
    ix,
    path: path.clone(),
    }
    })
    }
  • edit in crates/flowers_ui/src/main.rs at line 667
    [5.3183]
    [2.3221]
    }
    async fn load_untracked_file(repo_path: PathBuf, file_path: String) -> Message {
    let mut path = repo_path;
    path.push(&file_path);
    if let Ok(data) = tokio::fs::read(&path).await {
    Message::LoadedUntrackedFile {
    path: file_path,
    data,
    }
    } else {
    Message::NoOp
    }
  • edit in crates/flowers_ui/src/main.rs at line 748
    [15.3500]
    [15.3500]
    };
    let selection_details = match state.cursor.selection.as_ref() {
    Some(cursor::Selection::UntrackedFile { path, .. }) => {
    debug_assert!(repo.untracked_files.contains(path));
    let diff = match &state.untracked_file_contents {
    Some(UntrackedFileContents::Loaded {
    path: loaded_path,
    data,
    }) if loaded_path == path =>
    // TODO: use encoding
    {
    el(scrollable(text(
    str::from_utf8(data).unwrap_or("Not UTF-8"),
    ))
    .width(Length::Fill))
    }
    _ => el(text("Loading...")),
    };
    el(column([el(text("Diff:")), diff]))
    }
    Some(cursor::Selection::ChangedFile { path, .. }) => {
    if let Some(path) = path {
    debug_assert!(repo
    .changed_files
    .iter()
    .any(|file| file.path.as_ref() == Some(path)));
    }
    el(row([]))
    }
    None => el(row([])),
  • replacement in crates/flowers_ui/src/main.rs at line 794
    [15.3923][15.3923:3998]()
    el(column([record_msg_editor]).width(Length::FillPortion(1))),
    [15.3923]
    [11.18274]
    el(column([record_msg_editor, selection_details])
    .width(Length::FillPortion(1))),