use git_object::bstr::BString;
use crate::{FullName, Target};
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub struct LogChange {
pub mode: RefLog,
pub force_create_reflog: bool,
pub message: BString,
}
impl Default for LogChange {
fn default() -> Self {
LogChange {
mode: RefLog::AndReference,
force_create_reflog: false,
message: Default::default(),
}
}
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub enum PreviousValue {
Any,
MustExist,
MustNotExist,
MustExistAndMatch(Target),
ExistingMustMatch(Target),
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub enum Change {
Update {
log: LogChange,
expected: PreviousValue,
new: Target,
},
Delete {
expected: PreviousValue,
log: RefLog,
},
}
impl Change {
pub fn new_value(&self) -> Option<crate::TargetRef<'_>> {
match self {
Change::Update { new, .. } => new.to_ref().into(),
Change::Delete { .. } => None,
}
}
pub fn previous_value(&self) -> Option<crate::TargetRef<'_>> {
match self {
Change::Update {
expected: PreviousValue::MustExistAndMatch(previous),
..
}
| Change::Update {
expected: PreviousValue::ExistingMustMatch(previous),
..
}
| Change::Delete {
expected: PreviousValue::MustExistAndMatch(previous),
..
}
| Change::Delete {
expected: PreviousValue::ExistingMustMatch(previous),
..
} => previous,
_ => return None,
}
.to_ref()
.into()
}
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]
pub struct RefEdit {
pub change: Change,
pub name: FullName,
pub deref: bool,
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum RefLog {
AndReference,
Only,
}
mod ext;
pub use ext::RefEditsExt;