Skip to main content

refs/refs/
backend.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Backend-agnostic refs trait for shared semantics.
3
4use objects::object::ChangeId;
5
6use super::{Head, RefExpectation, RefUpdate, resolve_refspec};
7
8/// Shared refs backend operations usable by both local and hosted backends.
9pub trait CoreRefBackend: Send + Sync {
10    type Error;
11
12    fn read_head(&self) -> Result<Head, Self::Error>;
13    fn write_head(&self, head: &Head) -> Result<(), Self::Error>;
14    fn write_head_cas(
15        &self,
16        expected: RefExpectation<Head>,
17        head: &Head,
18    ) -> Result<(), Self::Error>;
19
20    fn get_thread(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
21    fn set_thread(&self, name: &str, state: &ChangeId) -> Result<(), Self::Error>;
22    fn set_thread_cas(
23        &self,
24        name: &str,
25        expected: RefExpectation<ChangeId>,
26        state: &ChangeId,
27    ) -> Result<(), Self::Error>;
28    fn delete_thread(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
29    fn delete_thread_cas(
30        &self,
31        name: &str,
32        expected: RefExpectation<ChangeId>,
33    ) -> Result<(), Self::Error>;
34    fn list_threads(&self) -> Result<Vec<String>, Self::Error>;
35
36    fn get_marker(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
37    fn create_marker(&self, name: &str, state: &ChangeId) -> Result<(), Self::Error>;
38    fn set_marker_cas(
39        &self,
40        name: &str,
41        expected: RefExpectation<ChangeId>,
42        state: &ChangeId,
43    ) -> Result<(), Self::Error>;
44    fn delete_marker(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
45    fn delete_marker_cas(
46        &self,
47        name: &str,
48        expected: RefExpectation<ChangeId>,
49    ) -> Result<(), Self::Error>;
50    fn list_markers(&self) -> Result<Vec<String>, Self::Error>;
51
52    fn update_refs(&self, updates: &[RefUpdate]) -> Result<(), Self::Error>;
53
54    fn resolve(&self, refspec: &str) -> Result<Option<ChangeId>, Self::Error> {
55        resolve_refspec(
56            refspec,
57            || self.read_head(),
58            |name| self.get_thread(name),
59            |name| self.get_marker(name),
60        )
61    }
62}