3 use bstr
::{BString, ByteSlice}
;
7 tree
::{Entry, EntryRef}
,
11 /// The Error used in [`Tree::write_to()`][crate::WriteTo::write_to()].
12 #[derive(Debug, thiserror::Error)]
13 #[allow(missing_docs)]
15 #[error("Newlines are invalid in file paths: {name:?}")]
16 NewlineInFilename { name: BString }
,
19 impl From
<Error
> for io
::Error
{
20 fn from(err
: Error
) -> Self {
21 io
::Error
::new(io
::ErrorKind
::Other
, err
)
26 impl crate::WriteTo
for Tree
{
27 /// Serialize this tree to `out` in the git internal format.
28 fn write_to(&self, out
: &mut dyn io
::Write
) -> io
::Result
<()> {
31 let mut entries_sorted
= self.entries
.clone();
32 entries_sorted
.sort();
36 "entries for serialization must be sorted by filename"
38 for Entry { mode, filename, oid }
in &self.entries
{
39 out
.write_all(mode
.as_bytes())?
;
40 out
.write_all(SPACE
)?
;
42 if filename
.find_byte(b'
\n'
).is_some() {
43 return Err(Error
::NewlineInFilename
{
44 name
: (*filename
).to_owned(),
48 out
.write_all(filename
)?
;
49 out
.write_all(&[b'
\0'
])?
;
51 out
.write_all(oid
.as_bytes())?
;
56 fn kind(&self) -> Kind
{
60 fn size(&self) -> usize {
63 .map(|Entry { mode, filename, oid }
| mode
.as_bytes().len() + 1 + filename
.len() + 1 + oid
.as_bytes().len())
69 impl<'a
> crate::WriteTo
for TreeRef
<'a
> {
70 /// Serialize this tree to `out` in the git internal format.
71 fn write_to(&self, out
: &mut dyn io
::Write
) -> io
::Result
<()> {
74 let mut entries_sorted
= self.entries
.clone();
75 entries_sorted
.sort();
79 "entries for serialization must be sorted by filename"
81 for EntryRef { mode, filename, oid }
in &self.entries
{
82 out
.write_all(mode
.as_bytes())?
;
83 out
.write_all(SPACE
)?
;
85 if filename
.find_byte(b'
\n'
).is_some() {
86 return Err(Error
::NewlineInFilename
{
87 name
: (*filename
).to_owned(),
91 out
.write_all(filename
)?
;
92 out
.write_all(&[b'
\0'
])?
;
94 out
.write_all(oid
.as_bytes())?
;
99 fn kind(&self) -> Kind
{
103 fn size(&self) -> usize {
106 .map(|EntryRef { mode, filename, oid }
| {
107 mode
.as_bytes().len() + 1 + filename
.len() + 1 + oid
.as_bytes().len()