Adding an untracked change iterator
Dependencies
- [2]
VSTBTRYEFixing a compilation error - [3]
FXEDPLRIResurrecting tests, and type cleanup (no need for Arc<RwLock<…>> anymore) - [4]
L4JXJHWXpijul/*: reorganize imports and remove extern crate - [5]
CCFJ7VO3Renaming "Record" to "Hunk" in the changes - [6]
G7VOM2IMReturning an error when recording non-existent paths - [7]
ZRUPLBBTColours in diff and change: separating concerns and dependencies - [8]
2K7JLB4ZNo pager on Windows - [9]
I52XSRUHMassive cleanup, and simplification - [10]
VYHHOEYHVersions and formatting - [11]
5OGOE4VWStore the current channel in the pristine - [12]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [13]
5BB266P6Optional colours in the global config file - [14]
CCLLB7OIUpgrading to Sanakirja 0.15 + version bump - [15]
OJZWJUF2MUCH faster `pijul add -r` - [16]
V435QOJRUsing path-slash to fix path issues on Windows - [17]
BZSC7VMYaddress clippy lints - [18]
YDKNUL6BAdd `diff --short` that lists changes without showing them - [19]
I24UEJQLVarious post-fire fixes - [20]
4OCC6D42Recursive add - [21]
4VWXL6KQCorrect handling of ignore files - [22]
VIHXB7SGcommands: set up pager for diff, change, and credit - [23]
2RXOCWUWMaking libpijul deterministic (and getting rid of `rand`) - [24]
3J6IK4W2Explicitly adding .pijul is now forbidden - [25]
ZHABNS3SCanonicalize all paths - [26]
R3H7D42UDebugging `pijul git`: proper error reporting - [*]
KWAMD2KRA few fixes in the documentation comments - [*]
VO5OQW4WRemoving anyhow in libpijul
Change contents
- replacement in pijul/src/commands/file_operations.rs at line 144
txn.clone(),&txn, - replacement in pijul/src/commands/diff.rs at line 8
use libpijul::{MutTxnT, TxnT};use libpijul::{MutTxnT, TxnT, TxnTExt}; - edit in pijul/src/commands/diff.rs at line 30
/// Include the untracked files#[clap(long = "untracked")]pub untracked: bool, - replacement in pijul/src/commands/diff.rs at line 112[4.175800]→[4.175800:175893](∅→∅),[4.175893]→[4.628:817](∅→∅),[4.817]→[4.0:824](∅→∅),[4.824]→[4.1663:1755](∅→∅),[4.1663]→[4.1663:1755](∅→∅)
let mut changes = BTreeMap::new();for ch in change.changes.iter() {changes.entry(ch.path()).or_insert_with(Vec::new).push(Status {operation: match ch {Hunk::FileMove { .. } => "file move",Hunk::FileDel { .. } => "file del",Hunk::FileUndel { .. } => "file undel",Hunk::SolveNameConflict { .. } => "solve name conflict",Hunk::UnsolveNameConflict { .. } => "unsolve name conflict",Hunk::FileAdd { .. } => "file add",Hunk::Edit { .. } => "edit",Hunk::Replacement { .. } => "replacement",Hunk::SolveOrderConflict { .. } => "solve order conflict",Hunk::UnsolveOrderConflict { .. } => "unsolve order conflict",Hunk::ResurrectZombies { .. } => "resurrect zombies",},line: ch.line(),});if self.untracked {serde_json::to_writer_pretty(&mut std::io::stdout(),&untracked(&repo, &*txn)?.collect::<Vec<_>>(),)?;writeln!(stdout)?;} else {let mut changes = BTreeMap::new();for ch in change.changes.iter() {changes.entry(ch.path()).or_insert_with(Vec::new).push(Status {operation: match ch {Hunk::FileMove { .. } => "file move",Hunk::FileDel { .. } => "file del",Hunk::FileUndel { .. } => "file undel",Hunk::SolveNameConflict { .. } => "solve name conflict",Hunk::UnsolveNameConflict { .. } => "unsolve name conflict",Hunk::FileAdd { .. } => "file add",Hunk::Edit { .. } => "edit",Hunk::Replacement { .. } => "replacement",Hunk::SolveOrderConflict { .. } => "solve order conflict",Hunk::UnsolveOrderConflict { .. } => "unsolve order conflict",Hunk::ResurrectZombies { .. } => "resurrect zombies",},line: ch.line(),});}serde_json::to_writer_pretty(&mut std::io::stdout(), &changes)?;writeln!(stdout)?; - edit in pijul/src/commands/diff.rs at line 144
serde_json::to_writer_pretty(&mut std::io::stdout(), &changes)?;writeln!(stdout)?; - edit in pijul/src/commands/diff.rs at line 180
}for path in untracked(&repo, &*txn)? {writeln!(stdout, "U {}", path.to_str().unwrap())?; - edit in pijul/src/commands/diff.rs at line 184
} else if self.untracked {for path in untracked(&repo, &*txn)? {writeln!(stdout, "{}", path.to_str().unwrap())?;} - edit in pijul/src/commands/diff.rs at line 306
}fn untracked<'a, T: TxnTExt>(repo: &Repository,txn: &'a T,) -> Result<impl Iterator<Item = PathBuf> + 'a, anyhow::Error> {let repo_path = CanonicalPathBuf::canonicalize(&repo.path)?;let threads = num_cpus::get();Ok(repo.working_copy.iterate_prefix_rec(repo_path.clone(), repo_path.clone(), threads)?.filter_map(move |x| {let (path, _) = x.unwrap();let path_ = if let Ok(path) = path.as_path().strip_prefix(&repo_path.as_path()) {path} else {return None;};use path_slash::PathExt;let path_str = path_.to_slash_lossy();if !txn.is_tracked(&path_str).unwrap() {Some(path)} else {None}})) - edit in libpijul/src/working_copy/filesystem.rs at line 87[29.3771][29.3771]
#[error(transparent)]Txn(#[from] T),}pub struct Untracked {join: Option<std::thread::JoinHandle<Result<(), std::io::Error>>>,receiver: std::sync::mpsc::Receiver<(PathBuf, bool)>,}impl Iterator for Untracked {type Item = Result<(PathBuf, bool), std::io::Error>;fn next(&mut self) -> Option<Self::Item> {if let Ok(x) = self.receiver.recv() {return Some(Ok(x));} else if let Some(j) = self.join.take() {if let Ok(Err(e)) = j.join() {return Some(Err(e));}}None} - replacement in libpijul/src/working_copy/filesystem.rs at line 164
txn: ArcTxn<T>,txn: &ArcTxn<T>, - edit in libpijul/src/working_copy/filesystem.rs at line 170
let mut txn = txn.write();for p in self.iterate_prefix_rec(repo_path.clone(), full.clone(), threads)? {let (path, is_dir) = p?;info!("Adding {:?}", path);use path_slash::PathExt;let path_str = path.to_slash_lossy();match txn.add(&path_str, is_dir, salt) {Ok(()) => {}Err(crate::fs::FsError::AlreadyInRepo(_)) => {}Err(e) => return Err(e.into()),}}Ok(())}pub fn iterate_prefix_rec(&self,repo_path: CanonicalPathBuf,full: CanonicalPathBuf,threads: usize,) -> Result<Untracked, std::io::Error> { - replacement in libpijul/src/working_copy/filesystem.rs at line 202
return Ok(());return Ok(Untracked {join: None,receiver,}); - replacement in libpijul/src/working_copy/filesystem.rs at line 207
let t = std::thread::spawn(move || -> Result<(), AddError<T::GraphError>> {let t = std::thread::spawn(move || -> Result<(), std::io::Error> { - replacement in libpijul/src/working_copy/filesystem.rs at line 254[4.2857]→[4.2857:2858](∅→∅),[4.2858]→[3.783:818](∅→∅),[3.818]→[4.2858:2955](∅→∅),[4.28110]→[4.2858:2955](∅→∅),[4.2858]→[4.2858:2955](∅→∅),[4.2955]→[4.1036:1123](∅→∅),[4.1123]→[4.1895:1948](∅→∅),[4.1170]→[4.1988:2143](∅→∅),[4.1948]→[4.1988:2143](∅→∅),[4.1988]→[4.1988:2143](∅→∅),[4.2143]→[4.3045:3105](∅→∅),[4.3045]→[4.3045:3105](∅→∅),[4.1570]→[4.210920:210945](∅→∅),[4.3105]→[4.210920:210945](∅→∅),[4.3735]→[4.210920:210945](∅→∅),[4.210920]→[4.210920:210945](∅→∅)
let mut txn = txn.write();while let Ok((path, is_dir)) = receiver.recv() {info!("Adding {:?}", path);use path_slash::PathExt;let path_str = path.to_slash_lossy();match txn.add(&path_str, is_dir, salt) {Ok(()) => {}Err(crate::fs::FsError::AlreadyInRepo(_)) => {}Err(e) => return Err(e.into()),}}if let Ok(t) = t.join() {t?}Ok(())Ok(Untracked {join: Some(t),receiver,}) - replacement in libpijul/src/working_copy/filesystem.rs at line 278
self.add_prefix_rec(txn.clone(), repo_path, full, threads, salt)?;{let path = if let Ok(path) = full.as_path().strip_prefix(&repo_path.as_path()) {path} else {return Ok(());};use path_slash::PathExt;let path_str = path.to_slash_lossy();if !txn.read().is_tracked(&path_str)? {self.add_prefix_rec(&txn, repo_path, full, threads, salt)?;}} - file addition: .ignore[1.0]
target