fix selection after adding file, add changed file diffs

[?]
Feb 13, 2025, 7:51 PM
KT5UYXGKEEXUHURNOYFVIG7WQ3Y3SJZMM2TP4OSW6NXSXQ5XXRHAC

Dependencies

  • [2] 6YZAVBWU Initial commit
  • [3] KLR5FRIB add fs state read/write of repos
  • [4] IQDCHWCP load a pijul repo
  • [5] SWWE2R6M display basic repo stuff
  • [6] WT3GA27P add cursor with selection
  • [7] DVKSPF7R track selected file path together with an index
  • [8] UB2ITZJS refresh changed files on FS changes
  • [9] EC3TVL4X add untracked files

Change contents

  • replacement in crates/libflowers_client/src/repo.rs at line 10
    [9.194][9.194:237]()
    use pijul::{Hash, MutTxnT, TxnT, TxnTExt};
    [9.194]
    [5.265]
    use pijul::{working_copy, Hash, MutTxnT, MutTxnTExt, TxnT, TxnTExt};
  • replacement in crates/libflowers_client/src/repo.rs at line 18
    [9.281][5.425:466](),[5.425][5.425:466]()
    pub changed_files: BTreeSet<String>,
    [9.281]
    [5.466]
    pub changed_files: BTreeSet<ChangedFile>,
    }
    #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
    pub struct ChangedFile {
    pub path: String,
    pub diff: ChangedFileDiff,
    }
    #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, strum::Display)]
    pub enum ChangedFileDiff {
    Move,
    Del,
    Undel,
    Add,
    SolveNameConflict,
    UnsolveNameConflict,
    Edit,
    Replacement,
    SolveOrderConflict,
    UnsolveOrderConflict,
    ResurrectZombines,
    AddRoot,
    DelRoot,
  • replacement in crates/libflowers_client/src/repo.rs at line 147
    [5.2897][5.2897:2949]()
    fn changed_files(diff: &Diff) -> BTreeSet<String> {
    [5.2897]
    [5.2949]
    pub fn add(repo: &mut pijul::Repository, path_str: &str) {
    let txn = repo.pristine.arc_txn_begin().unwrap();
    let repo_path = CanonicalPathBuf::canonicalize(&repo.path).unwrap();
    let full_path = {
    let mut p = repo.path.clone();
    p.push(path_str);
    p
    };
    let path = CanonicalPathBuf::canonicalize(full_path).unwrap();
    let meta = std::fs::metadata(&path).unwrap();
    if !working_copy::filesystem::filter_ignore(
    repo_path.as_ref(),
    path.as_ref(),
    meta.is_dir(),
    ) {
    println!("Won't add ignored file {path_str}");
    return;
    }
    {
    let mut txn = txn.write();
    let path = if let Ok(path) =
    path.as_path().strip_prefix(&repo_path.as_path())
    {
    path
    } else {
    return;
    };
    let path_str = path_slash::PathExt::to_slash_lossy(path);
    if !txn.is_tracked(&path_str).unwrap() {
    if let Err(e) = txn.add(&path_str, meta.is_dir(), 0) {
    eprintln!("Failed to add {}", e);
    }
    }
    }
    txn.commit().unwrap();
    }
    fn changed_files(diff: &Diff) -> BTreeSet<ChangedFile> {
  • replacement in crates/libflowers_client/src/repo.rs at line 190
    [5.3019][5.3019:3081]()
    BaseHunk::FileMove { del, add, path } => todo!(),
    [5.3019]
    [5.3081]
    BaseHunk::FileMove {
    del: _,
    add: _,
    path,
    } => ChangedFile {
    path: path.clone(),
    diff: ChangedFileDiff::Move,
    },
  • replacement in crates/libflowers_client/src/repo.rs at line 199
    [5.3113][5.3113:3160]()
    del,
    contents,
    [5.3113]
    [5.3160]
    del: _,
    contents: _,
  • replacement in crates/libflowers_client/src/repo.rs at line 202
    [5.3182][5.3182:3234]()
    encoding,
    } => todo!(),
    [5.3182]
    [5.3234]
    encoding: _,
    } => ChangedFile {
    path: path.clone(),
    diff: ChangedFileDiff::Del,
    },
  • replacement in crates/libflowers_client/src/repo.rs at line 208
    [5.3268][5.3268:3317]()
    undel,
    contents,
    [5.3268]
    [5.3317]
    undel: _,
    contents: _,
  • replacement in crates/libflowers_client/src/repo.rs at line 211
    [5.3339][5.3339:3391]()
    encoding,
    } => todo!(),
    [5.3339]
    [5.3391]
    encoding: _,
    } => ChangedFile {
    path: path.clone(),
    diff: ChangedFileDiff::Undel,
    },
  • edit in crates/libflowers_client/src/repo.rs at line 217
    [5.3423][5.3423:3502]()
    add_name,
    add_inode,
    contents,
  • replacement in crates/libflowers_client/src/repo.rs at line 218
    [5.3524][5.3524:3712]()
    encoding,
    } => todo!(),
    BaseHunk::SolveNameConflict { name, path } => todo!(),
    BaseHunk::UnsolveNameConflict { name, path } => todo!(),
    [5.3524]
    [5.3712]
    add_name: _,
    add_inode: _,
    contents: _,
    encoding: _,
    } => ChangedFile {
    path: path.clone(),
    diff: ChangedFileDiff::Add,
    },
    BaseHunk::SolveNameConflict { name: _, path } => ChangedFile {
    path: path.clone(),
    diff: ChangedFileDiff::SolveNameConflict,
    },
    BaseHunk::UnsolveNameConflict { name: _, path } => ChangedFile {
    path: path.clone(),
    diff: ChangedFileDiff::UnsolveNameConflict,
    },
  • edit in crates/libflowers_client/src/repo.rs at line 235
    [5.3741][5.3741:3765]()
    change,
  • replacement in crates/libflowers_client/src/repo.rs at line 236
    [5.3788][5.3788:3851]()
    encoding,
    } => local.path.clone(),
    [5.3788]
    [5.3851]
    change: _,
    encoding: _,
    } => ChangedFile {
    path: local.path.clone(),
    diff: ChangedFileDiff::Edit,
    },
  • replacement in crates/libflowers_client/src/repo.rs at line 243
    [5.3887][5.3887:3940]()
    change,
    replacement,
    [5.3887]
    [5.3940]
    change: _,
    replacement: _,
  • replacement in crates/libflowers_client/src/repo.rs at line 246
    [5.3963][5.3963:4159]()
    encoding,
    } => todo!(),
    BaseHunk::SolveOrderConflict { change, local } => todo!(),
    BaseHunk::UnsolveOrderConflict { change, local } => todo!(),
    [5.3963]
    [5.4159]
    encoding: _,
    } => ChangedFile {
    path: local.path.clone(),
    diff: ChangedFileDiff::Replacement,
    },
    BaseHunk::SolveOrderConflict { change: _, local } => ChangedFile {
    path: local.path.clone(),
    diff: ChangedFileDiff::SolveOrderConflict,
    },
    BaseHunk::UnsolveOrderConflict { change: _, local } => {
    ChangedFile {
    path: local.path.clone(),
    diff: ChangedFileDiff::UnsolveOrderConflict,
    }
    }
  • replacement in crates/libflowers_client/src/repo.rs at line 262
    [5.4200][5.4200:4224]()
    change,
    [5.4200]
    [5.4224]
    change: _,
  • replacement in crates/libflowers_client/src/repo.rs at line 264
    [5.4247][5.4247:4415]()
    encoding,
    } => todo!(),
    BaseHunk::AddRoot { name, inode } => todo!(),
    BaseHunk::DelRoot { name, inode } => todo!(),
    [5.4247]
    [9.544]
    encoding: _,
    } => ChangedFile {
    path: local.path.clone(),
    diff: ChangedFileDiff::ResurrectZombines,
    },
    BaseHunk::AddRoot { name: _, inode: _ } => ChangedFile {
    // TODO: maybe they don't all have path?
    path: ".".to_string(),
    diff: ChangedFileDiff::AddRoot,
    },
    BaseHunk::DelRoot { name: _, inode: _ } => ChangedFile {
    // TODO: maybe they don't all have path?
    path: ".".to_string(),
    diff: ChangedFileDiff::DelRoot,
    },
  • edit in crates/libflowers_client/Cargo.toml at line 23
    [9.1784]
    [4.580]
    workspace = true
    [dependencies.strum]
  • edit in crates/flowers_ui/src/main.rs at line 10
    [8.351]
    [8.351]
    use std::cmp;
  • edit in crates/flowers_ui/src/main.rs at line 84
    [6.735]
    [6.735]
    AddUntrackedFile,
  • replacement in crates/flowers_ui/src/main.rs at line 88
    [4.1455][9.2097:2167]()
    let untracked_file_selection = |ix: usize| -> cursor::Selection {
    [4.1455]
    [9.2167]
    let untracked_file_selection = |state: &State,
    ix: usize|
    -> cursor::Selection {
  • edit in crates/flowers_ui/src/main.rs at line 93
    [9.2300][9.2300:2504]()
    };
    let changed_file_selection = |ix: usize| -> cursor::Selection {
    let path = state.repo.changed_files.iter().nth(ix).unwrap().clone();
    cursor::Selection::ChangedFile { ix, path }
  • edit in crates/flowers_ui/src/main.rs at line 94
    [9.2511]
    [9.2511]
    let changed_file_selection =
    |state: &State, ix: usize| -> cursor::Selection {
    let path = state
    .repo
    .changed_files
    .iter()
    .nth(ix)
    .unwrap()
    .path
    .clone();
    cursor::Selection::ChangedFile { ix, path }
    };
  • edit in crates/flowers_ui/src/main.rs at line 109
    [8.1670]
    [8.1670]
    dbg!("FilesChanged");
  • replacement in crates/flowers_ui/src/main.rs at line 131
    [9.3480][9.3480:3624]()
    .find(|(_ix, file_path)| *file_path == path)
    .map(|(ix, path)| cursor::Selection::ChangedFile {
    [9.3480]
    [9.3624]
    .find(|(_ix, file)| &file.path == path)
    .map(|(ix, file)| cursor::Selection::ChangedFile {
  • replacement in crates/flowers_ui/src/main.rs at line 134
    [9.3656][9.3656:3704]()
    path: path.clone(),
    [9.3656]
    [9.3704]
    path: file.path.clone(),
  • replacement in crates/flowers_ui/src/main.rs at line 148
    [9.4211][9.4211:4272]()
    untracked_file_selection(ix)
    [9.4211]
    [9.4272]
    untracked_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 151
    [9.4353][9.4353:4412]()
    changed_file_selection(ix)
    [9.4353]
    [9.4412]
    changed_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 155
    [9.4488][9.4488:4545]()
    untracked_file_selection(ix)
    [9.4488]
    [9.4545]
    untracked_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 166
    [9.4860][9.4860:4919]()
    changed_file_selection(ix)
    [9.4860]
    [9.4919]
    changed_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 169
    [9.5000][9.5000:5061]()
    untracked_file_selection(ix)
    [9.5000]
    [9.5061]
    untracked_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 173
    [7.446][9.5092:5147]()
    changed_file_selection(ix)
    [7.446]
    [9.5147]
    changed_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 183
    [9.5492][9.5492:5553]()
    Some(changed_file_selection(ix))
    [9.5492]
    [6.1547]
    Some(changed_file_selection(state, ix))
  • replacement in crates/flowers_ui/src/main.rs at line 187
    [9.5619][9.5619:5678]()
    Some(untracked_file_selection(ix))
    [9.5619]
    [6.1573]
    Some(untracked_file_selection(state, ix))
  • replacement in crates/flowers_ui/src/main.rs at line 198
    [9.5995][9.5995:6052]()
    untracked_file_selection(ix)
    [9.5995]
    [6.1994]
    untracked_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 201
    [7.647][9.6053:6108]()
    changed_file_selection(ix)
    [7.647]
    [6.2178]
    changed_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 205
    [9.6179][9.6179:6232]()
    untracked_file_selection(ix)
    [9.6179]
    [9.6232]
    untracked_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 213
    [9.6581][9.6581:6636]()
    changed_file_selection(ix)
    [9.6581]
    [6.2378]
    changed_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 216
    [9.6712][9.6712:6769]()
    untracked_file_selection(ix)
    [9.6712]
    [9.6769]
    untracked_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 220
    [9.6865][9.6865:6916]()
    changed_file_selection(ix)
    [9.6865]
    [9.6916]
    changed_file_selection(state, ix)
  • replacement in crates/flowers_ui/src/main.rs at line 230
    [9.7292][9.7292:7355]()
    Some(untracked_file_selection(ix))
    [9.7292]
    [6.2471]
    Some(untracked_file_selection(state, ix))
  • replacement in crates/flowers_ui/src/main.rs at line 234
    [9.7454][9.7454:7511]()
    Some(changed_file_selection(ix))
    [9.7454]
    [6.2497]
    Some(changed_file_selection(state, ix))
  • edit in crates/flowers_ui/src/main.rs at line 242
    [6.2657]
    [6.2657]
    Message::AddUntrackedFile => {
    if let Some(cursor::Selection::UntrackedFile { ix, path }) =
    state.cursor.selection.as_ref()
    {
    repo::add(&mut state.repo.state, path);
    let removed = state.repo.untracked_files.remove(path);
    debug_assert!(
    removed,
    "{:?}, path: {path}",
    state.repo.untracked_files
    );
    let file = repo::ChangedFile {
    path: path.clone(),
    diff: repo::ChangedFileDiff::Add,
    };
    state.repo.changed_files.insert(file);
    // Select the next untracked file, if any
    state.cursor.selection =
    if state.repo.untracked_files.is_empty() {
    None
    } else {
    let ix =
    cmp::min(*ix, state.repo.untracked_files.len() - 1);
    Some(untracked_file_selection(state, ix))
    };
    }
    }
  • edit in crates/flowers_ui/src/main.rs at line 281
    [6.3009]
    [6.3009]
    "a" => Some(Message::AddUntrackedFile),
  • replacement in crates/flowers_ui/src/main.rs at line 322
    [6.3633][6.3633:3660]()
    |(ix, path)| {
    [6.3633]
    [6.3660]
    |(ix, file)| {
  • replacement in crates/flowers_ui/src/main.rs at line 327
    [6.3872][6.3872:3911]()
    button(text(path))
    [6.3872]
    [6.3911]
    button(text(format!("{}: {}", file.diff, file.path)))
  • replacement in crates/flowers_ui/src/main.rs at line 329
    [6.3968][9.8447:8531]()
    cursor::Selection::ChangedFile{ix, path: path.clone()},
    [6.3968]
    [6.4025]
    cursor::Selection::ChangedFile{ix, path: file.path.clone()},
  • replacement in Cargo.toml at line 24
    [9.8760][9.8760:8776]()
    version = "2.0"
    [9.8760]
    [4.1644]
    version = "2"
  • replacement in Cargo.toml at line 26
    [4.1680][4.1680:1696]()
    version = "2.2"
    [4.1680]
    [2.4173]
    version = "2"
  • replacement in Cargo.toml at line 28
    [2.4210][8.1866:1882]()
    version = "6.0"
    [2.4210]
    [2.4227]
    version = "6"
  • replacement in Cargo.toml at line 33
    [2.4381][2.4381:4397]()
    version = "2.7"
    [2.4381]
    [2.4398]
    version = "2"
  • replacement in Cargo.toml at line 43
    [3.6026][3.6026:6042]()
    version = "1.0"
    [3.6026]
    [3.6043]
    version = "1"
    [workspace.dependencies.strum]
    version = "0.27"
    features = ["derive"]
  • replacement in Cargo.toml at line 50
    [3.6128][3.6128:6144]()
    version = "2.0"
    [3.6128]
    [3.6145]
    version = "2"
  • replacement in Cargo.toml at line 52
    [3.6176][8.1900:1917]()
    version = "1.43"
    [3.6176]
    [8.1917]
    version = "1"
  • edit in Cargo.lock at line 1753
    [2.38436]
    [2.38436]
    name = "heck"
    version = "0.5.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
    [[package]]
  • edit in Cargo.lock at line 2173
    [9.8872]
    [2.45044]
    "strum",
  • edit in Cargo.lock at line 3402
    [2.68445]
    [2.68445]
    [[package]]
    name = "rustversion"
    version = "1.0.19"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
  • edit in Cargo.lock at line 3780
    [2.75427]
    [4.19118]
    name = "strum"
    version = "0.27.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ce1475c515a4f03a8a7129bb5228b81a781a86cb0b3fbbc19e1c556d491a401f"
    dependencies = [
    "strum_macros",
    ]
    [[package]]
    name = "strum_macros"
    version = "0.27.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9688894b43459159c82bfa5a5fa0435c19cbe3c9b427fa1dd7b1ce0c279b18a7"
    dependencies = [
    "heck",
    "proc-macro2",
    "quote",
    "rustversion",
    "syn 2.0.95",
    ]
    [[package]]