104 lines · 3.4 KB · Rust
RawDownload
use bstr::BStr; pub use super::loose::reflog::{create_or_update, Error}; /// A parsed ref log line.#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]#[non_exhaustive]pub struct Line<'a> {    /// The previous object id in hexadecimal. Use [`Line::previous_oid()`] to get a more usable form.    pub previous_oid: &'a BStr,    /// The new object id in hexadecimal. Use [`Line::new_oid()`] to get a more usable form.    pub new_oid: &'a BStr,    /// The signature of the currently configured committer.    #[cfg_attr(feature = "serde1", serde(borrow))]    pub signature: git_actor::immutable::Signature<'a>,    /// The message providing details about the operation performed in this log line.    pub message: &'a BStr,} ///pub mod mutable {    use bstr::BString;    use git_hash::ObjectId;     /// A parsed ref log line that can be changed    #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]    #[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]    pub struct Line {        /// The previous object id. Can be a null-sha to indicate this is a line for a new ref.        pub previous_oid: ObjectId,        /// The new object id. Can be a null-sha to indicate this ref is being deleted.        pub new_oid: ObjectId,        /// The signature of the currently configured committer.        pub signature: git_actor::Signature,        /// The message providing details about the operation performed in this log line.        pub message: BString,    }     impl<'a> From<super::Line<'a>> for Line {        fn from(v: super::Line<'a>) -> Self {            Line {                previous_oid: v.previous_oid(),                new_oid: v.new_oid(),                signature: v.signature.into(),                message: v.message.into(),            }        }    }     impl<'a> super::Line<'a> {        /// Convert this instance into its mutable counterpart        pub fn to_mutable(&self) -> Line {            self.clone().into()        }    }     mod write {        use std::io;         use bstr::{BStr, ByteSlice};        use quick_error::quick_error;         use super::Line;         quick_error! {            /// The Error produced by [`Line::write_to()`] (but wrapped in an io error).            #[derive(Debug)]            #[allow(missing_docs)]            enum Error {                IllegalCharacter {                    display("Messages must not contain newlines\\n")                }            }        }         impl From<Error> for io::Error {            fn from(err: Error) -> Self {                io::Error::new(io::ErrorKind::Other, err)            }        }         /// Output        impl Line {            /// Serialize this instance to `out` in the git serialization format for ref log lines.            pub fn write_to(&self, mut out: impl io::Write) -> io::Result<()> {                write!(out, "{} {} ", self.previous_oid, self.new_oid)?;                self.signature.write_to(&mut out)?;                writeln!(out, "\t{}", check_newlines(self.message.as_ref())?)            }        }         fn check_newlines(input: &BStr) -> Result<&BStr, Error> {            if input.find_byte(b'\n').is_some() {                return Err(Error::IllegalCharacter);            }            Ok(input)        }    }} ///pub mod iter;mod line;