pub struct GitVersion {
major: u64,
minor: u64,
patch: u64,
commits_ahead: u64,
hash: Option<String>,
dirty: bool,
}Expand description
A parsed git describe version string.
Fields§
§major: u64§minor: u64§patch: u64§commits_ahead: u64§hash: Option<String>§dirty: boolImplementations§
Source§impl GitVersion
impl GitVersion
Sourcepub fn parse(version: &str) -> Result<Self, VersionError>
pub fn parse(version: &str) -> Result<Self, VersionError>
Parses a version string in git describe format.
Supported formats:
v0.9.46- Tagged releasev0.9.46-5-gabc123- Development build with commits aheadv0.9.46-5-gabc123-dirty- Dirty working tree
§Errors
Returns VersionError::InvalidFormat if the version string cannot be parsed.
§Examples
use cadmus_core::version::GitVersion;
let v = GitVersion::parse("v0.9.46").unwrap();
assert_eq!(v.major(), 0);
assert_eq!(v.minor(), 9);
assert_eq!(v.patch(), 46);Sourcepub fn commits_ahead(&self) -> u64
pub fn commits_ahead(&self) -> u64
Returns the number of commits ahead of the tag.
Sourcepub fn is_tagged_release(&self) -> bool
pub fn is_tagged_release(&self) -> bool
Returns true if this is a tagged release (no commits ahead).
Sourcepub fn compare(
&self,
other: &GitVersion,
) -> Result<VersionComparison, VersionError>
pub fn compare( &self, other: &GitVersion, ) -> Result<VersionComparison, VersionError>
Compares this version with another.
If both versions contain different git hashes, this method will use the GitHub API to check ancestry relationships.
For local-only comparison without network access, use the Ord
implementation which compares semantic version numbers and commit count.
§Examples
use cadmus_core::version::{GitVersion, VersionComparison};
// Local is newer than remote (higher semver)
let local: GitVersion = "v0.9.46".parse().unwrap();
let remote: GitVersion = "v0.9.45".parse().unwrap();
let result = local.compare(&remote).unwrap();
assert_eq!(result, VersionComparison::Newer);
// Local is older than remote (lower semver)
let local: GitVersion = "v0.9.44".parse().unwrap();
let remote: GitVersion = "v0.9.45".parse().unwrap();
let result = local.compare(&remote).unwrap();
assert_eq!(result, VersionComparison::Older);
// Local equals remote (same version)
let local: GitVersion = "v0.9.46".parse().unwrap();
let remote: GitVersion = "v0.9.46".parse().unwrap();
let result = local.compare(&remote).unwrap();
assert_eq!(result, VersionComparison::Equal);Trait Implementations§
Source§impl Clone for GitVersion
impl Clone for GitVersion
Source§fn clone(&self) -> GitVersion
fn clone(&self) -> GitVersion
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for GitVersion
impl Debug for GitVersion
Source§impl<'r> Decode<'r, Sqlite> for GitVersion
impl<'r> Decode<'r, Sqlite> for GitVersion
Source§impl<'de> Deserialize<'de> for GitVersion
impl<'de> Deserialize<'de> for GitVersion
Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Source§impl Display for GitVersion
impl Display for GitVersion
Source§impl Encode<'_, Sqlite> for GitVersion
impl Encode<'_, Sqlite> for GitVersion
Source§fn encode_by_ref(
&self,
buf: &mut SqliteArgumentsBuffer,
) -> Result<IsNull, BoxDynError>
fn encode_by_ref( &self, buf: &mut SqliteArgumentsBuffer, ) -> Result<IsNull, BoxDynError>
§fn encode(
self,
buf: &mut <DB as Database>::ArgumentBuffer,
) -> Result<IsNull, Box<dyn Error + Send + Sync>>where
Self: Sized,
fn encode(
self,
buf: &mut <DB as Database>::ArgumentBuffer,
) -> Result<IsNull, Box<dyn Error + Send + Sync>>where
Self: Sized,
self into buf in the expected format for the database.fn produces(&self) -> Option<<DB as Database>::TypeInfo>
fn size_hint(&self) -> usize
Source§impl FromStr for GitVersion
impl FromStr for GitVersion
Source§impl Ord for GitVersion
impl Ord for GitVersion
Source§impl PartialEq for GitVersion
impl PartialEq for GitVersion
Source§impl PartialOrd for GitVersion
Ordering is based on semver components (major, minor, patch) followed by
the number of commits ahead of the tag. This is a purely local comparison
that does not require network access.
impl PartialOrd for GitVersion
Ordering is based on semver components (major, minor, patch) followed by the number of commits ahead of the tag. This is a purely local comparison that does not require network access.
When two versions share the same semver and commit count but have different
git hashes (divergent branches), this ordering treats them as equal. Use
GitVersion::compare instead if you need GitHub-based ancestry checks to
distinguish divergent development builds.
§Dirty-flag ordering
A dirty build (v0.10.0-dirty) is treated as strictly newer than its clean
counterpart (v0.10.0). This means that switching from a dirty dev build
back to the clean release of the same version will be detected as a
downgrade by the version gate, triggering a backup restore. This is
intentional for production use but can be surprising during local
development.
§Examples
use cadmus_core::version::GitVersion;
let v1: GitVersion = "v0.9.46".parse().unwrap();
let v2: GitVersion = "v0.10.0".parse().unwrap();
let v3: GitVersion = "v0.10.0-5-gabc123".parse().unwrap();
let v3_dirty: GitVersion = "v0.10.0-5-gabc123-dirty".parse().unwrap();
assert!(v1 < v2);
assert!(v2 < v3);
assert!(v1 < v3);
assert!(v3 < v3_dirty);
assert_eq!(v2, v2);Source§impl Serialize for GitVersion
impl Serialize for GitVersion
Source§impl Type<Sqlite> for GitVersion
impl Type<Sqlite> for GitVersion
impl Eq for GitVersion
impl StructuralPartialEq for GitVersion
Auto Trait Implementations§
impl Freeze for GitVersion
impl RefUnwindSafe for GitVersion
impl Send for GitVersion
impl Sync for GitVersion
impl Unpin for GitVersion
impl UnsafeUnpin for GitVersion
impl UnwindSafe for GitVersion
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.