use gix_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) | PreviousValue::ExistingMustMatch(previous),
..
}
| Change::Delete {
expected: PreviousValue::MustExistAndMatch(previous) | 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,
}
impl RefEdit {
pub fn new(name: FullName, change: Change) -> Self {
RefEdit {
change,
name,
deref: false,
}
}
pub fn update(
name: FullName,
new: impl Into<Target>,
expected: PreviousValue,
reflog_message: impl Into<BString>,
) -> Self {
RefEdit::update_with_log(
name,
new,
expected,
LogChange {
message: reflog_message.into(),
..Default::default()
},
)
}
pub fn update_with_log(name: FullName, new: impl Into<Target>, expected: PreviousValue, log: LogChange) -> Self {
RefEdit::new(
name,
Change::Update {
log,
expected,
new: new.into(),
},
)
}
pub fn delete(name: FullName, expected: PreviousValue) -> Self {
RefEdit::delete_with_log(name, expected, RefLog::AndReference)
}
pub fn delete_with_log(name: FullName, expected: PreviousValue, log: RefLog) -> Self {
RefEdit::new(name, Change::Delete { expected, log })
}
}
impl RefEdit {
pub fn with_deref(mut self, deref: bool) -> Self {
self.deref = deref;
self
}
}
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum RefLog {
AndReference,
Only,
}
mod ext;
pub use ext::RefEditsExt;