| use crate::Spec; |
| |
| /// How to interpret a revision specification, or `revspec`. |
| #[derive(Default, Debug, Copy, Clone, PartialOrd, PartialEq, Ord, Eq, Hash)] |
| #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] |
| pub enum Kind { |
| /// Include commits reachable from this revision, the default when parsing revision `a` for example, i.e. `a` and its ancestors. |
| /// Example: `a`. |
| #[default] |
| IncludeReachable, |
| /// Exclude commits reachable from this revision, i.e. `a` and its ancestors. Example: `^a`. |
| ExcludeReachable, |
| /// Every commit that is reachable from `b` but not from `a`. Example: `a..b`. |
| RangeBetween, |
| /// Every commit reachable through either `a` or `b` but no commit that is reachable by both. Example: `a...b`. |
| ReachableToMergeBase, |
| /// Include every commit of all parents of `a`, but not `a` itself. Example: `a^@`. |
| IncludeReachableFromParents, |
| /// Exclude every commit of all parents of `a`, but not `a` itself. Example: `a^!`. |
| ExcludeReachableFromParents, |
| } |
| |
| impl Spec { |
| /// Return the kind of this specification. |
| pub fn kind(&self) -> Kind { |
| match self { |
| Spec::Include(_) => Kind::IncludeReachable, |
| Spec::Exclude(_) => Kind::ExcludeReachable, |
| Spec::Range { .. } => Kind::RangeBetween, |
| Spec::Merge { .. } => Kind::ReachableToMergeBase, |
| Spec::IncludeOnlyParents { .. } => Kind::IncludeReachableFromParents, |
| Spec::ExcludeParents { .. } => Kind::ExcludeReachableFromParents, |
| } |
| } |
| } |
| |
| mod _impls { |
| use std::fmt::{Display, Formatter}; |
| |
| use crate::Spec; |
| |
| impl Display for Spec { |
| fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { |
| match self { |
| Spec::Include(oid) => Display::fmt(oid, f), |
| Spec::Exclude(oid) => write!(f, "^{oid}"), |
| Spec::Range { from, to } => write!(f, "{from}..{to}"), |
| Spec::Merge { theirs, ours } => write!(f, "{theirs}...{ours}"), |
| Spec::IncludeOnlyParents(from_exclusive) => write!(f, "{from_exclusive}^@"), |
| Spec::ExcludeParents(oid) => write!(f, "{oid}^!"), |
| } |
| } |
| } |
| } |
| |
| pub(crate) mod types { |
| /// A revision specification without any bindings to a repository, useful for serialization or movement over thread boundaries. |
| /// |
| /// Note that all [object ids][gix_hash::ObjectId] should be a committish, but don't have to be. |
| /// Unless the field name contains `_exclusive`, the respective objects are included in the set. |
| #[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] |
| #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] |
| pub enum Spec { |
| /// Include commits reachable from this revision, i.e. `a` and its ancestors. |
| /// |
| /// The equivalent to [crate::spec::Kind::IncludeReachable], but with data. |
| Include(gix_hash::ObjectId), |
| /// Exclude commits reachable from this revision, i.e. `a` and its ancestors. Example: `^a`. |
| /// |
| /// The equivalent to [crate::spec::Kind::ExcludeReachable], but with data. |
| Exclude(gix_hash::ObjectId), |
| /// Every commit that is reachable from `from` to `to`, but not any ancestors of `from`. Example: `from..to`. |
| /// |
| /// The equivalent to [crate::spec::Kind::RangeBetween], but with data. |
| Range { |
| /// The starting point of the range, which is included in the set. |
| from: gix_hash::ObjectId, |
| /// The end point of the range, which is included in the set. |
| to: gix_hash::ObjectId, |
| }, |
| /// Every commit reachable through either `theirs` or `ours`, but no commit that is reachable by both. Example: `theirs...ours`. |
| /// |
| /// The equivalent to [crate::spec::Kind::ReachableToMergeBase], but with data. |
| Merge { |
| /// Their side of the merge, which is included in the set. |
| theirs: gix_hash::ObjectId, |
| /// Our side of the merge, which is included in the set. |
| ours: gix_hash::ObjectId, |
| }, |
| /// Include every commit of all parents of `a`, but not `a` itself. Example: `a^@`. |
| /// |
| /// The equivalent to [crate::spec::Kind::IncludeReachableFromParents], but with data. |
| IncludeOnlyParents( |
| /// Include only the parents of this object, but not the object itself. |
| gix_hash::ObjectId, |
| ), |
| /// Exclude every commit of all parents of `a`, but not `a` itself. Example: `a^!`. |
| /// |
| /// The equivalent to [crate::spec::Kind::ExcludeReachableFromParents], but with data. |
| ExcludeParents( |
| /// Exclude the parents of this object, but not the object itself. |
| gix_hash::ObjectId, |
| ), |
| } |
| } |
| |
| /// |
| pub mod parse; |
| pub use parse::function::parse; |