track file encoding in the record, including change text for file adds
[?]
Dec 15, 2020, 9:16 AM
NYOF5766GLBTWQV2KTVRAJMGVJNJ37Z5BLJMFPZA3HG7X2Q2RXPACDependencies
- [2]
KJDQ2WOMFixing the parsing of section headers in the text change format - [3]
246V5TYIdecode existing files - [4]
6HNRL5RTdetect non-utf8 text files - [5]
VMOYG7MKtext file decoding for new files - [6]
7FFFKQZUadd 'Default' implementations - [7]
VO5OQW4WRemoving anyhow in libpijul - [8]
O4DNWMPDCleaunp and proofreading of libpijul::record - [9]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting).
Change contents
- replacement in libpijul/src/working_copy/mod.rs at line 1
// org id jgSEtEI/xIjz/bF+vtGtYbEA9bNIeFWLqnZT+M51S64=use std::fmt; - replacement in libpijul/src/working_copy/mod.rs at line 4
// use encoding_rs::Encoding;use serde::{de::Visitor, Deserialize, Serialize}; - replacement in libpijul/src/working_copy/mod.rs at line 39
fn decode_file(&mut self, file: &str, buffer: &mut Vec<u8>) -> Result<(), Self::Error> {/// Read the file into the buffer, decoding to UTF-8 for text files////// Returns the encoding used or None if it was a binary filefn decode_file(&mut self,file: &str,buffer: &mut Vec<u8>,) -> Result<Option<Encoding>, Self::Error> { - replacement in libpijul/src/working_copy/mod.rs at line 49
let (mut decoded, encoding) = if tree_magic_mini::from_u8(&uncoded).starts_with("text/") {let mime = tree_magic_mini::from_u8(&uncoded);debug!("mime = {:?}", mime);let (mut decoded, encoding) = if mime.starts_with("text/") { - replacement in libpijul/src/working_copy/mod.rs at line 59
(decoded.as_bytes().to_vec(), Some(encoding))(decoded.as_bytes().to_vec(), Some(Encoding(encoding))) - edit in libpijul/src/working_copy/mod.rs at line 68
Ok(encoding)}} - replacement in libpijul/src/working_copy/mod.rs at line 73
Ok(())#[derive(Debug, PartialEq, Eq)]pub struct Encoding(&'static encoding_rs::Encoding);impl Encoding {pub(crate) fn for_label(label: &str) -> Encoding {Encoding(encoding_rs::Encoding::for_label_no_replacement(label.as_bytes()).unwrap())}pub(crate) fn label(&self) -> &str {self.0.name()}}impl Clone for Encoding {fn clone(&self) -> Self {Encoding(self.0)}}impl Serialize for Encoding {fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>whereS: serde::Serializer,{serializer.serialize_str(self.label())}}struct EncodingVisitor;impl<'de> Deserialize<'de> for Encoding {fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>whereD: serde::Deserializer<'de>,{impl<'de> Visitor<'de> for EncodingVisitor {type Value = Encoding;fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {formatter.write_str("a string label meeting the encoding standard https://encoding.spec.whatwg.org/#concept-encoding-get")}fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>whereE: serde::de::Error,{Ok(Encoding::for_label(v))}}deserializer.deserialize_str(EncodingVisitor) - file move: text.rs → text.rs
- edit in libpijul/src/record.rs at line 136
const CHECK_UTF8: usize = 1000; - replacement in libpijul/src/record.rs at line 236
let contents = if meta.is_file() {let (contents, encoding) = if meta.is_file() { - replacement in libpijul/src/record.rs at line 238
working_copy.decode_file(&item.full_path, &mut self.rec.contents)?;let encoding = working_copy.decode_file(&item.full_path, &mut self.rec.contents)?; - replacement in libpijul/src/record.rs at line 241[4.496780]→[4.496780:496931](∅→∅),[4.496931]→[4.4780:4947](∅→∅),[4.4947]→[4.497193:497208](∅→∅),[4.497193]→[4.497193:497208](∅→∅)
self.rec.has_binary_files |= {let s = start.0 as usize;let e = (end.0 as usize).min(s + CHECK_UTF8 + 4);let mime = tree_magic_mini::from_u8(&self.rec.contents[s..e]);debug!("mime = {:?}", mime);!mime.starts_with("text/")};self.rec.has_binary_files |= encoding.is_none(); - replacement in libpijul/src/record.rs at line 244
Some(Atom::NewVertex(NewVertex {up_context: vec![Position {change: None,pos: inode_pos,}],down_context: vec![],start,end,flag: EdgeFlags::empty(),inode: Position {change: None,pos: inode_pos,},}))(Some(Atom::NewVertex(NewVertex {up_context: vec![Position {change: None,pos: inode_pos,}],down_context: vec![],start,end,flag: EdgeFlags::empty(),inode: Position {change: None,pos: inode_pos,},})),encoding,) - replacement in libpijul/src/record.rs at line 262
None(None, encoding) - replacement in libpijul/src/record.rs at line 265
None(None, None) - edit in libpijul/src/record.rs at line 289
encoding, - file move: mod.rs → mod.rs
- edit in libpijul/src/change.rs at line 1
use crate::pristine::*;use chrono::{DateTime, Utc}; - edit in libpijul/src/change.rs at line 2
use chrono::{DateTime, Utc};use crate::{pristine::*, working_copy::Encoding}; - edit in libpijul/src/change.rs at line 561
.. - edit in libpijul/src/change.rs at line 659
encoding: Option<Encoding>, - edit in libpijul/src/change.rs at line 1066
encoding, - edit in libpijul/src/change.rs at line 1072
encoding, - edit in libpijul/src/change/text_changes.rs at line 295
const BINARY_LABEL: &str = "binary"; - edit in libpijul/src/change/text_changes.rs at line 385
encoding, - edit in libpijul/src/change/text_changes.rs at line 404
};let encoding_label = match encoding {Some(encoding) => encoding.label(),_ => BINARY_LABEL, - replacement in libpijul/src/change/text_changes.rs at line 411
"File addition: {:?} in {:?} {:o}\n up",name, parent, perms.0"File addition: {:?} in {:?} {:o} {:?}\n up",name, parent, perms.0, encoding_label - replacement in libpijul/src/change/text_changes.rs at line 516
Regex::new(r#"^(?P<n>\d+)\. File addition: "(?P<name>[^"]*)" in "(?P<parent>[^"]*)" (?P<perm>\d+)"#).unwrap();Regex::new(r#"^(?P<n>\d+)\. File addition: "(?P<name>[^"]*)" in "(?P<parent>[^"]*)" (?P<perm>\d+) "(?P<encoding>[^"]*)""#).unwrap(); - edit in libpijul/src/change/text_changes.rs at line 588
let encoding_label = cap.name("encoding").unwrap().as_str();let encoding = if encoding_label != BINARY_LABEL {Some(Encoding::for_label(encoding_label))} else {None}; - edit in libpijul/src/change/text_changes.rs at line 601
encoding,