Proper escaping of UTF-8 filenames in the patch text format
Dependencies
- [2]
NE4A4WUKParsing of file addition metadata - [3]
FXEDPLRIResurrecting tests, and type cleanup (no need for Arc<RwLock<…>> anymore) - [4]
ZSF3YFZTencoded file deletion - [5]
RRCSHAYZFormatting - [6]
KWAGWB73Adding extra dependencies from the config file - [7]
CIEUBH46Fixing an index-out-of-bounds error when serialising bad changes - [8]
L4JXJHWXpijul/*: reorganize imports and remove extern crate - [9]
5BB266P6Optional colours in the global config file - [10]
Q4SVMHAERemoving --channel from the changes command - [11]
I24UEJQLVarious post-fire fixes - [12]
XSEODPNEFixing conflicts - [13]
VYHHOEYHVersions and formatting - [14]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [15]
YN63NUZOSanakirja 1.0 - [16]
XR7MNOMUfile encoding in updates - [17]
3S6LU2U5abstract out FileMetadata (de)serialistion - [18]
RUBSM5DRFixing a bug when outputting changes in text format - [19]
CCLLB7OIUpgrading to Sanakirja 0.15 + version bump - [20]
VO5OQW4WRemoving anyhow in libpijul - [21]
NYOF5766track file encoding in the record, including change text for file adds - [22]
CCFJ7VO3Renaming "Record" to "Hunk" in the changes - [23]
ZRUPLBBTColours in diff and change: separating concerns and dependencies - [24]
X243Z3Y5Recording only the required metadata (can even be changed later!)
Change contents
- edit in ""pijul/src/commands/record.rs"" at line 363
let file_name = |local: &Local, _| -> String { format!("{}:{}", local.path, local.line) }; - replacement in ""pijul/src/commands/record.rs"" at line 371
change.write(changes, None, file_name, true, &mut o)?;change.write(changes, None, true, &mut o)?; - edit in ""pijul/src/commands/diff.rs"" at line 231
|local: &libpijul::change::Local, _| -> String {format!("{}:{}", local.path, local.line)}, - edit in ""pijul/src/commands/change.rs"" at line 4
use libpijul::change::Local; - edit in ""pijul/src/commands/change.rs"" at line 42
let file_name = |l: &Local, _| format!("{}:{}", l.path, l.line); - edit in ""pijul/src/commands/change.rs"" at line 46
file_name, - edit in ""libpijul/src/change/text_changes.rs"" at line 91
F: FnMut(&Local, Position<Option<Hash>>) -> String, - edit in ""libpijul/src/change/text_changes.rs"" at line 95
mut file_name: F, - replacement in ""libpijul/src/change/text_changes.rs"" at line 153
rec.write(changes, &mut file_name, &hashes, &self.contents, &mut w)?rec.write(changes, &hashes, &self.contents, &mut w)? - edit in ""libpijul/src/change/text_changes.rs"" at line 309
struct Escaped<'a>(&'a str);impl<'a> std::fmt::Display for Escaped<'a> {fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {write!(fmt, "\"")?;for c in self.0.chars() {if c == '"' {write!(fmt, "\\{}", c)?} else if c == '\\' {write!(fmt, "\\\\")?} else {write!(fmt, "{}", c)?}}write!(fmt, "\"")?;Ok(())}}fn unescape(s: &str) -> std::borrow::Cow<str> {let mut b = 0;let mut result = String::new();let mut ch = s.chars();while let Some(c) = ch.next() {if c == '\\' {if result.is_empty() {result = s.split_at(b).0.to_string();}if let Some(c) = ch.next() {result.push(c)}} else if !result.is_empty() {result.push(c)}b += c.len_utf8()}if result.is_empty() {s.into()} else {result.into()}} - edit in ""libpijul/src/change/text_changes.rs"" at line 357
F: FnMut(&Local, Position<Option<Hash>>) -> String, - edit in ""libpijul/src/change/text_changes.rs"" at line 360
mut file_name: F, - edit in ""libpijul/src/change/text_changes.rs"" at line 364
// let file_name = |local: &Local, _| -> String { format!("{}:{}", local.path, local.line) }; - replacement in ""libpijul/src/change/text_changes.rs"" at line 378
"Moved: {:?} {:?} {}",path,name,"Moved: {} {} {}",Escaped(&path),Escaped(&name), - replacement in ""libpijul/src/change/text_changes.rs"" at line 420
write!(w, "File deletion: {:?} ", path,)?;write!(w, "File deletion: {} ", Escaped(path))?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 440
write!(w, "File un-deletion: {:?} ", path,)?;write!(w, "File un-deletion: {} ", Escaped(path))?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 476
"File addition: {:?} in {:?}{} {:?}\n up",name,parent,"File addition: {} in {}{} \"{}\"\n up",Escaped(name),Escaped(parent), - replacement in ""libpijul/src/change/text_changes.rs"" at line 509
write!(w, "Edit in {} ", file_name(&local, change.inode()))?;write!(w, "Edit in \"{}\":{} ", Escaped(&local.path), local.line)?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 523
write!(w, "Replacement in {} ", file_name(&local, change.inode()))?;write!(w, "Replacement in \"{}\":{} ", Escaped(&local.path), local.line)?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 533
write!(w, "Solving a name conflict in {:?} ", path)?;write!(w, "Solving a name conflict in {} ", Escaped(path))?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 541
write!(w, "Un-solving a name conflict in {:?} ", path)?;write!(w, "Un-solving a name conflict in {} ", Escaped(path))?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 552
"Solving an order conflict in {} ",file_name(&local, change.inode())"Solving an order conflict in \"{}\":{} ",Escaped(&local.path),local.line, - replacement in ""libpijul/src/change/text_changes.rs"" at line 565
"Un-solving an order conflict in {} ",file_name(&local, change.inode())"Un-solving an order conflict in \"{}\":{} ",Escaped(&local.path),local.line, - replacement in ""libpijul/src/change/text_changes.rs"" at line 582
"Resurrecting zombie lines in {:?}:{} ",local.path, local.line"Resurrecting zombie lines in {}:{} ",Escaped(&local.path), local.line - replacement in ""libpijul/src/change/text_changes.rs"" at line 586
write!(w, " {:?}", encoding_label(encoding))?;write!(w, " \"{}\"", encoding_label(encoding))?; - replacement in ""libpijul/src/change/text_changes.rs"" at line 651
let name = &cap.name("name").unwrap().as_str();let name = unescape(&cap.name("name").unwrap().as_str()); - replacement in ""libpijul/src/change/text_changes.rs"" at line 657
parent.to_string() + "/"}) + nameunescape(&parent).to_string() + "/"}) + &name - replacement in ""libpijul/src/change/text_changes.rs"" at line 676
basename: name,basename: &name, - replacement in ""libpijul/src/change/text_changes.rs"" at line 806
let name = cap.name("new").unwrap().as_str();let name = unescape(cap.name("new").unwrap().as_str()); - replacement in ""libpijul/src/change/text_changes.rs"" at line 821
basename: name,basename: &name,