Skip to main content

WantPolicy

Enum WantPolicy 

Source
pub enum WantPolicy {
    AdvertisedTips,
    ReachableFromRefs,
    Any,
}
Expand description

Which object ids a client is allowed to ask for.

git spells this as three separate uploadpack.allow*SHA1InWant settings, and the middle one is not optional for a server that advertises filter: a partial clone’s lazy fetch asks for bare blob ids that were never advertised, so WantPolicy::AdvertisedTips turns every git checkout in a blob:none clone into “the remote end hung up unexpectedly”.

Variants§

§

AdvertisedTips

Only ids that appeared in the advertisement.

The strictest setting, and the one that breaks partial clone.

§

ReachableFromRefs

Anything reachable from a reference. This is git’s uploadpack.allowReachableSHA1InWant, and the default here.

The cost is honest and real: proving reachability means walking the repository’s whole object closure once per request that names a non-tip id. The git package’s __gunnar_reach__ bitmaps are what make this cheap; until they exist, this walk is the price of partial clone.

§

Any

Anything present in the store, reachable or not.

Makes every object that was ever pushed fetchable by whoever can name it, including on branches that have since been deleted.

Implementations§

Source§

impl WantPolicy

Source

pub fn advertises(self, promise: WantPolicy) -> bool

Does this policy make good on a capability row that requires promise?

§Why the answer is a match and not a >=

The three variants happen to be orderable, and encoding that as an ordering would make adding a fourth silently inherit whichever neighbours it landed between. Written out, a new variant does not compile until someone decides what it promises — which is the property that was missing, not the ordering.

The mapping is git’s, bit for bit: ALLOW_TIP_SHA1 prints allow-tip-sha1-in-want, ALLOW_REACHABLE_SHA1 prints allow-reachable-sha1-in-want, and ALLOW_ANY_SHA1 is both bits set, so it prints both (upload-pack.c, send_ref).

WantPolicy::AdvertisedTips promises nothing, on purpose: gunnar hides no reference, so “only ids in the advertisement” is exactly what a v0 client assumes when neither capability is present.

Trait Implementations§

Source§

impl Clone for WantPolicy

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for WantPolicy

Source§

impl Debug for WantPolicy

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for WantPolicy

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Eq for WantPolicy

Source§

impl PartialEq for WantPolicy

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for WantPolicy

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more