From 10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 14:41:41 +0200 Subject: Merging upstream version 1.70.0+dfsg2. Signed-off-by: Daniel Baumann --- vendor/gix/src/reference/edits.rs | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 vendor/gix/src/reference/edits.rs (limited to 'vendor/gix/src/reference/edits.rs') diff --git a/vendor/gix/src/reference/edits.rs b/vendor/gix/src/reference/edits.rs new file mode 100644 index 000000000..aadd087ba --- /dev/null +++ b/vendor/gix/src/reference/edits.rs @@ -0,0 +1,75 @@ +/// +pub mod set_target_id { + use gix_ref::{transaction::PreviousValue, Target}; + + use crate::{bstr::BString, Reference}; + + mod error { + use gix_ref::FullName; + + /// The error returned by [`Reference::set_target_id()`][super::Reference::set_target_id()]. + #[derive(Debug, thiserror::Error)] + #[allow(missing_docs)] + pub enum Error { + #[error("Cannot change symbolic reference {name:?} into a direct one by setting it to an id")] + SymbolicReference { name: FullName }, + #[error(transparent)] + ReferenceEdit(#[from] crate::reference::edit::Error), + } + } + pub use error::Error; + + impl<'repo> Reference<'repo> { + /// Set the id of this direct reference to `id` and use `reflog_message` for the reflog (if enabled in the repository). + /// + /// Note that the operation will fail on symbolic references, to change their type use the lower level reference database, + /// or if the reference was deleted or changed in the mean time. + /// Furthermore, refrain from using this method for more than a one-off change as it creates a transaction for each invocation. + /// If multiple reference should be changed, use [Repository::edit_references()][crate::Repository::edit_references()] + /// or the lower level reference database instead. + #[allow(clippy::result_large_err)] + pub fn set_target_id( + &mut self, + id: impl Into, + reflog_message: impl Into, + ) -> Result<(), Error> { + match &self.inner.target { + Target::Symbolic(name) => return Err(Error::SymbolicReference { name: name.clone() }), + Target::Peeled(current_id) => { + let changed = self.repo.reference( + self.name(), + id, + PreviousValue::MustExistAndMatch(Target::Peeled(current_id.to_owned())), + reflog_message, + )?; + *self = changed; + } + } + Ok(()) + } + } +} + +/// +pub mod delete { + use gix_ref::transaction::{Change, PreviousValue, RefEdit, RefLog}; + + use crate::Reference; + + impl<'repo> Reference<'repo> { + /// Delete this reference or fail if it was changed since last observed. + /// Note that this instance remains available in memory but probably shouldn't be used anymore. + pub fn delete(&self) -> Result<(), crate::reference::edit::Error> { + self.repo + .edit_reference(RefEdit { + change: Change::Delete { + expected: PreviousValue::MustExistAndMatch(self.inner.target.clone()), + log: RefLog::AndReference, + }, + name: self.inner.name.clone(), + deref: false, + }) + .map(|_| ()) + } + } +} -- cgit v1.2.3