abstract out FileMetadata (de)serialistion

[?]
Apr 11, 2021, 7:46 AM
3S6LU2U5TIU43WRE5RQS3IOLVJLVNCDL4W44FVK2HR3NAXZ7IDUAC

Dependencies

  • [2] IIV3EL2X Cleanup, formatting, and fixing the Git feature
  • [3] ADPAFSMY Proper old metadata when recording
  • [4] X243Z3Y5 Recording only the required metadata (can even be changed later!)
  • [5] Q3GU26WD merge with changes from sanakirja v1.1.2
  • [6] EAZ45JTF Fixing a bug in change printing
  • [7] 3AMEP2Y5 More convenient interface for channels
  • [8] LLT3GY6U When recording, do not consider deleted filenames as current
  • [9] KDF6FJRV bigger clippy refactors
  • [10] YN63NUZO Sanakirja 1.0
  • [11] UM5DLRPB store new non-UTF-8 files raw and decode to deplay the contents
  • [12] NF4O25IE Cleaning up useless operations in InodeMetadata
  • [13] NYOF5766 track file encoding in the record, including change text for file adds
  • [14] VO5OQW4W Removing anyhow in libpijul
  • [15] O4DNWMPD Cleaunp and proofreading of libpijul::record
  • [16] I52XSRUH Massive cleanup, and simplification
  • [17] LGEJSLTY Fixing output (including its uses in reset and pull)
  • [18] GHO6DWPI Refactoring iterators
  • [19] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [20] XL6Y64UP Fixing a panic when iterating over the basenames of a file
  • [21] CCLLB7OI Upgrading to Sanakirja 0.15 + version bump
  • [22] YTQS4ES3 Fixing a parsing problem (related to permissions), and the associated permissions
  • [23] CCFJ7VO3 Renaming "Record" to "Hunk" in the changes
  • [24] HDGRZISM Version updates
  • [25] VMOYG7MK text file decoding for new files
  • [26] QQZNSB26 Permission update (after #X243)

Change contents

  • replacement in libpijul/src/unrecord/working_copy.rs at line 104
    [6.229205][6.7078:7110](),[6.7110][2.2151:2175]()
    let (_, basename) = changes
    .get_file_name(
    [6.229205]
    [2.2175]
    let FileMetadata { basename, .. } = changes
    .get_file_meta(
  • edit in libpijul/src/record.rs at line 3
    [6.488965][6.488965:488987]()
    use crate::change::*;
  • edit in libpijul/src/record.rs at line 10
    [6.489199]
    [5.692]
    use crate::{change::*, changestore::FileMetadata};
  • replacement in libpijul/src/record.rs at line 266
    [6.49256][6.496047:496160](),[6.496047][6.496047:496160]()
    meta.write(&mut self.rec.contents).unwrap();
    self.rec.contents.extend(item.basename.as_bytes());
    [6.49256]
    [6.49257]
    let file_meta = FileMetadata {
    metadata: meta,
    basename: item.basename.as_str(),
    };
    file_meta.write(&mut self.rec.contents);
  • replacement in libpijul/src/record.rs at line 392
    [6.500570][6.11872:11892](),[6.11892][2.6543:6574]()
    changes
    .get_contents(
    [6.500570]
    [2.6574]
    let FileMetadata { basename, metadata } = changes
    .get_file_meta(
  • edit in libpijul/src/record.rs at line 399
    [6.12022][6.500652:500855](),[6.500652][6.500652:500855]()
    let (metadata, basename) = name.split_at(2);
    let metadata = InodeMetadata::from_basename(metadata);
    let basename = std::str::from_utf8(basename).unwrap().to_string();
  • replacement in libpijul/src/record.rs at line 408
    [6.204][6.204:238]()
    basename,
    [6.204]
    [6.238]
    basename: basename.to_string(),
  • replacement in libpijul/src/record.rs at line 680
    [3.48][6.51052:51125](),[6.508005][6.51052:51125](),[6.51125][6.12529:12591](),[6.508141][6.12529:12591](),[6.12591][6.508195:508255](),[6.508195][6.508195:508255](),[6.508255][6.51126:51197]()
    let name_start = ChangePosition(self.rec.contents.len().into());
    item.metadata.write(&mut self.rec.contents).unwrap();
    self.rec.contents.extend(item.basename.as_bytes());
    let name_end = ChangePosition(self.rec.contents.len().into());
    [3.48]
    [6.508326]
    let basename = item.basename.as_str();
    let meta_start = ChangePosition(self.rec.contents.len().into());
    FileMetadata {
    metadata: item.metadata,
    basename,
    }
    .write(&mut self.rec.contents);
    let meta_end = ChangePosition(self.rec.contents.len().into());
  • edit in libpijul/src/record.rs at line 689
    [6.508361][6.51198:51285]()
    let name = &self.rec.contents[name_start.0.as_usize()..name_end.0.as_usize()];
  • replacement in libpijul/src/record.rs at line 696
    [6.508702][6.508702:508720]()
    name,
    [6.508680]
    [6.508720]
    basename,
  • replacement in libpijul/src/record.rs at line 724
    [6.509711][6.509711:509793]()
    start: name_start,
    end: name_end,
    [6.509711]
    [6.509793]
    start: meta_start,
    end: meta_end,
  • replacement in libpijul/src/record.rs at line 739
    [6.510318][6.51286:51354]()
    self.rec.contents.truncate(name_start.0.as_usize())
    [6.510318]
    [6.510384]
    self.rec.contents.truncate(meta_start.0.as_usize())
  • replacement in libpijul/src/record.rs at line 742
    [6.510415][6.51355:51419]()
    self.rec.contents.truncate(name_start.0.as_usize())
    [6.510415]
    [6.510477]
    self.rec.contents.truncate(meta_start.0.as_usize())
  • replacement in libpijul/src/record.rs at line 763
    [6.511007][6.511007:511024]()
    name: &[u8],
    [6.510978]
    [6.36183]
    name: &str,
  • replacement in libpijul/src/record.rs at line 817
    [6.29505][6.36549:36592](),[6.52079][6.36549:36592](),[6.36549][6.36549:36592]()
    changes
    .get_contents(
    [6.52079]
    [6.52080]
    let FileMetadata {
    metadata: parent_meta,
    basename: parent_name,
    } = changes
    .get_file_meta(
  • replacement in libpijul/src/record.rs at line 829
    [3.91][6.513013:513038](),[6.513013][6.513013:513038](),[6.513038][3.92:125](),[3.125][6.513038:513091](),[6.513038][6.513038:513091]()
    parent_dest,
    &previous_name[..2],
    std::str::from_utf8(&previous_name[2..])
    [3.91]
    [6.513091]
    parent_dest, parent_meta, parent_name
  • edit in libpijul/src/record.rs at line 831
    [6.513102][3.126:263]()
    let (parent_meta, parent_name) = previous_name.split_at(2);
    let parent_meta = InodeMetadata::from_basename(parent_meta);
  • replacement in libpijul/src/record.rs at line 832
    [3.341][6.513174:513201](),[6.513174][6.513174:513201](),[6.513201][3.342:434]()
    let name_changed =
    (parent_name != &name[2..]) || (new_meta != parent_meta && cfg!(not(windows)));
    [3.341]
    [6.34801]
    let name_changed = (parent_name != name) || (new_meta != parent_meta && cfg!(not(windows)));
  • replacement in libpijul/src/pristine/inode_metadata.rs at line 3
    [6.641730][6.641730:641798]()
    #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd)]
    [6.641730]
    [6.641798]
    #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Serialize, Deserialize)]
  • edit in libpijul/src/pristine/inode_metadata.rs at line 8
    [6.641877][6.641877:641931]()
    use byteorder::{BigEndian, ByteOrder, WriteBytesExt};
  • edit in libpijul/src/pristine/inode_metadata.rs at line 9
    [6.641952][6.641952:642172]()
    /// Read the file metadata from the file name encoded in the
    /// repository.
    pub fn from_basename(p: &[u8]) -> Self {
    debug_assert!(p.len() == 2);
    InodeMetadata(BigEndian::read_u16(p))
    }
  • edit in libpijul/src/pristine/inode_metadata.rs at line 51
    [6.643488][6.643488:643614]()
    pub fn write<W: std::io::Write>(&self, mut w: W) -> std::io::Result<()> {
    w.write_u16::<BigEndian>(self.0)
    }
  • replacement in libpijul/src/output/mod.rs at line 1
    [6.686190][6.686191:686228]()
    use crate::changestore::ChangeStore;
    [6.686190]
    [6.686228]
    use crate::changestore::{ChangeStore, FileMetadata};
  • replacement in libpijul/src/output/mod.rs at line 123
    [6.687519][6.24840:24856](),[6.24856][2.17556:17583]()
    changes
    .get_contents(
    [6.687519]
    [2.17583]
    let FileMetadata {
    basename,
    metadata: perms,
    } = changes
    .get_file_meta(
  • edit in libpijul/src/output/mod.rs at line 133
    [6.24999][6.687603:687814](),[6.86600][6.687603:687814](),[6.687603][6.687603:687814]()
    let (perms, basename) = name_buf.as_slice().split_at(2);
    let (perms, basename) = (
    InodeMetadata::from_basename(perms),
    std::str::from_utf8(basename).unwrap(),
    );
  • replacement in libpijul/src/fs.rs at line 568
    [6.109758][6.109758:109779](),[6.109779][2.18451:18478]()
    self.changes
    .get_contents(
    [6.109758]
    [2.18478]
    let FileMetadata {
    basename,
    metadata: perms,
    } = self
    .changes
    .get_file_meta(
  • edit in libpijul/src/fs.rs at line 580
    [6.109907][6.109907:110081]()
    let (perms, basename) = self.buf.split_at(2);
    let perms = InodeMetadata::from_basename(perms);
    let basename = std::str::from_utf8(basename).unwrap();
  • replacement in libpijul/src/fs.rs at line 659
    [6.755303][6.755303:755328](),[6.755328][2.18755:18786]()
    self.changes
    .get_contents(
    [6.755303]
    [2.18786]
    let FileMetadata {
    basename,
    metadata: perms,
    } = self
    .changes
    .get_file_meta(
  • edit in libpijul/src/fs.rs at line 671
    [6.755459][6.755459:755657]()
    let (perms, basename) = self.buf.split_at(2);
    let perms = InodeMetadata::from_basename(perms);
    let basename = std::str::from_utf8(basename).unwrap().to_string();
  • replacement in libpijul/src/fs.rs at line 680
    [2.18987][2.18987:19066]()
    return Some(Ok((grandparent.dest(), perms, basename)))
    [2.18987]
    [2.19066]
    return Some(Ok((grandparent.dest(), perms, basename.to_owned())))
  • replacement in libpijul/src/changestore/mod.rs at line 78
    [6.34277][6.819697:819756](),[6.819697][6.819697:819756]()
    fn get_file_name<'a, F: Fn(ChangeId) -> Option<Hash>>(
    [6.34277]
    [6.819756]
    fn get_file_meta<'a, F: Fn(ChangeId) -> Option<Hash>>(
  • replacement in libpijul/src/changestore/mod.rs at line 83
    [6.819852][6.34278:34335]()
    ) -> Result<(InodeMetadata, &'a str), Self::Error> {
    [6.819852]
    [6.819911]
    ) -> Result<FileMetadata<'a>, Self::Error> {
  • replacement in libpijul/src/changestore/mod.rs at line 86
    [6.819979][6.819979:820132]()
    assert!(buf.len() >= 2);
    let (a, b) = buf.as_slice().split_at(2);
    Ok((InodeMetadata::from_basename(a), std::str::from_utf8(b)?))
    [6.819979]
    [6.820132]
    Ok(FileMetadata::read(buf))
    }
    }
    #[derive(Serialize, Deserialize)]
    pub struct FileMetadata<'a> {
    pub metadata: InodeMetadata,
    pub basename: &'a str,
    // pub encoding: Encoding,
    }
    impl<'a> FileMetadata<'a> {
    pub fn read(buf: &'a [u8]) -> FileMetadata<'a> {
    // FIXME use ? by adding the From trait somehow
    bincode::deserialize(buf).unwrap()
    }
    pub fn write(&self, w: &mut Vec<u8>) {
    // FIXME use ? by adding the From trait somehow
    bincode::serialize_into(w, self).unwrap()
  • file move: text_changes.rs (----------)text_changes.rs (---r------)
    [6.931000]
    [6.37976]
  • replacement in libpijul/src/change/text_changes.rs at line 329
    [6.48973][2.20938:21104](),[2.21104][6.49166:49245](),[6.49166][6.49166:49245](),[6.49245][6.140561:140639](),[6.140639][6.49335:49359](),[6.49335][6.49335:49359]()
    let name =
    std::str::from_utf8(&change_contents[add.start.us() + 2..add.end.us()])
    .unwrap();
    let perms = crate::pristine::InodeMetadata::from_basename(
    &change_contents[add.start.us()..add.start.us() + 2],
    );
    [6.48973]
    [4.1482]
    let FileMetadata {
    basename: name,
    metadata: perms,
    } = FileMetadata::read(&change_contents);
  • replacement in libpijul/src/change/text_changes.rs at line 425
    [6.51864][2.21105:21239](),[2.21239][6.52053:52132](),[6.52053][6.52053:52132](),[6.52132][6.140713:140787](),[6.140787][6.52218:52241](),[6.52218][6.52218:52241]()
    let name = std::str::from_utf8(&change_contents[n.start.us() + 2..n.end.us()])
    .unwrap();
    let perms = crate::pristine::InodeMetadata::from_basename(
    &change_contents[n.start.us()..n.start.us() + 2],
    );
    [6.51864]
    [6.52241]
    let FileMetadata {
    basename: name,
    metadata: perms,
    } = FileMetadata::read(&change_contents);
  • replacement in libpijul/src/change/text_changes.rs at line 633
    [4.2936][6.59607:59747](),[6.59607][6.59607:59747]()
    let meta = InodeMetadata(meta);
    meta.write(&mut contents_).unwrap();
    contents_.extend(name.as_bytes());
    [4.2936]
    [6.140931]
    let meta = FileMetadata {
    metadata: InodeMetadata(meta),
    basename: name,
    };
    meta.write(&mut contents_);
  • replacement in libpijul/src/change/text_changes.rs at line 776
    [4.3265][6.64546:64686](),[6.64546][6.64546:64686]()
    let meta = InodeMetadata(meta);
    meta.write(&mut contents_).unwrap();
    contents_.extend(name.as_bytes());
    [4.3265]
    [6.141265]
    let meta = FileMetadata {
    metadata: InodeMetadata(meta),
    basename: name,
    };
    meta.write(&mut contents_);
  • replacement in libpijul/src/change/text_changes.rs at line 1377
    [6.86774][6.86774:86850]()
    let name = std::str::from_utf8(buf.split_at(2).1).unwrap();
    [6.86774]
    [6.86850]
    let FileMetadata { basename: name, .. } = FileMetadata::read(&buf);