use bstr::BStr; use crate::{parse::Operation, Instruction}; impl Instruction<'_> { /// Derive the mode of operation from this instruction. pub fn operation(&self) -> Operation { match self { Instruction::Push(_) => Operation::Push, Instruction::Fetch(_) => Operation::Fetch, } }} /// Note that all sources can either be a ref-name, partial or full, or a rev-spec, unless specified otherwise, on the local side./// Destinations can only be a partial or full ref names on the remote side.#[derive(PartialOrd, Ord, PartialEq, Eq, Copy, Clone, Hash, Debug)]pub enum Push<'a> { /// Push all local branches to the matching destination on the remote, which has to exist to be updated. AllMatchingBranches { /// If true, allow non-fast-forward updates of the matched destination branch. allow_non_fast_forward: bool, }, /// Delete the destination ref or glob pattern, with only a single `*` allowed. Delete { /// The reference or pattern to delete on the remote. ref_or_pattern: &'a BStr, }, /// Push a single ref or refspec to a known destination ref. Matching { /// The source ref or refspec to push. If pattern, it contains a single `*`. /// Examples are refnames like `HEAD` or `refs/heads/main`, or patterns like `refs/heads/*`. src: &'a BStr, /// The ref to update with the object from `src`. If `src` is a pattern, this is a pattern too. /// Examples are refnames like `HEAD` or `refs/heads/main`, or patterns like `refs/heads/*`. dst: &'a BStr, /// If true, allow non-fast-forward updates of `dest`. allow_non_fast_forward: bool, },} /// Any source can either be a ref name (full or partial) or a fully spelled out hex-sha for an object, on the remote side.////// Destinations can only be a partial or full ref-names on the local side.#[derive(PartialOrd, Ord, PartialEq, Eq, Copy, Clone, Hash, Debug)]pub enum Fetch<'a> { /// Fetch a ref or refs, without updating local branches. Only { /// The partial or full ref name to fetch on the remote side or the full object hex-name, without updating the local side. /// Note that this may not be a glob pattern, as those need to be matched by a destination which isn't present here. src: &'a BStr, }, /// Exclude a single ref. Exclude { /// A single partial or full ref name to exclude on the remote, or a pattern with a single `*`. It cannot be a spelled out object hash. src: &'a BStr, }, /// Fetch from `src` and update the corresponding destination branches in `dst` accordingly. AndUpdate { /// The ref name to fetch on the remote side, or a pattern with a single `*` to match against. src: &'a BStr, /// The local destination to update with what was fetched, or a pattern whose single `*` will be replaced with the matching portion /// of the `*` from `src`. dst: &'a BStr, /// If true, allow non-fast-forward updates of `dest`. allow_non_fast_forward: bool, },}
use bstr::BStr;
use crate::{parse::Operation, Instruction};
impl Instruction<'_> {
/// Derive the mode of operation from this instruction.
pub fn operation(&self) -> Operation {
match self {
Instruction::Push(_) => Operation::Push,
Instruction::Fetch(_) => Operation::Fetch,
}
}
}
/// Note that all sources can either be a ref-name, partial or full, or a rev-spec, unless specified otherwise, on the local side.
/// Destinations can only be a partial or full ref names on the remote side.
#[derive(PartialOrd, Ord, PartialEq, Eq, Copy, Clone, Hash, Debug)]
pub enum Push<'a> {
/// Push all local branches to the matching destination on the remote, which has to exist to be updated.
AllMatchingBranches {
/// If true, allow non-fast-forward updates of the matched destination branch.
allow_non_fast_forward: bool,
},
/// Delete the destination ref or glob pattern, with only a single `*` allowed.
Delete {
/// The reference or pattern to delete on the remote.
ref_or_pattern: &'a BStr,
},
/// Push a single ref or refspec to a known destination ref.
Matching {
/// The source ref or refspec to push. If pattern, it contains a single `*`.
/// Examples are refnames like `HEAD` or `refs/heads/main`, or patterns like `refs/heads/*`.
src: &'a BStr,
/// The ref to update with the object from `src`. If `src` is a pattern, this is a pattern too.
/// Examples are refnames like `HEAD` or `refs/heads/main`, or patterns like `refs/heads/*`.
dst: &'a BStr,
/// If true, allow non-fast-forward updates of `dest`.
allow_non_fast_forward: bool,
},
}
/// Any source can either be a ref name (full or partial) or a fully spelled out hex-sha for an object, on the remote side.
///
/// Destinations can only be a partial or full ref-names on the local side.
#[derive(PartialOrd, Ord, PartialEq, Eq, Copy, Clone, Hash, Debug)]
pub enum Fetch<'a> {
/// Fetch a ref or refs, without updating local branches.
Only {
/// The partial or full ref name to fetch on the remote side or the full object hex-name, without updating the local side.
/// Note that this may not be a glob pattern, as those need to be matched by a destination which isn't present here.
src: &'a BStr,
},
/// Exclude a single ref.
Exclude {
/// A single partial or full ref name to exclude on the remote, or a pattern with a single `*`. It cannot be a spelled out object hash.
src: &'a BStr,
},
/// Fetch from `src` and update the corresponding destination branches in `dst` accordingly.
AndUpdate {
/// The ref name to fetch on the remote side, or a pattern with a single `*` to match against.
src: &'a BStr,
/// The local destination to update with what was fetched, or a pattern whose single `*` will be replaced with the matching portion
/// of the `*` from `src`.
dst: &'a BStr,
/// If true, allow non-fast-forward updates of `dest`.
allow_non_fast_forward: bool,
},
}