#[cfg(feature = "read")]
use git_zero_core::{Repository, Result, io::Write};
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum WantPolicy {
#[default]
AdvertisedOnly,
AllVisibleReachable,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct WantOptions {
pub policy: WantPolicy,
pub max_want_lines: usize,
}
impl Default for WantOptions {
fn default() -> Self {
Self::STRICT
}
}
impl WantOptions {
pub const STRICT: Self = Self {
policy: WantPolicy::AdvertisedOnly,
max_want_lines: usize::MAX,
};
pub const fn all_visible_reachable(max_want_lines: usize) -> Self {
Self {
policy: WantPolicy::AllVisibleReachable,
max_want_lines,
}
}
}
#[cfg(feature = "read")]
pub(crate) const REACHABLE: &[u8] = b" allow-reachable-sha1-in-want";
#[cfg(feature = "read")]
pub(crate) struct Discard;
#[cfg(feature = "read")]
impl Write for Discard {
fn write_all(&mut self, _: &[u8]) -> Result<()> {
Ok(())
}
}
#[cfg(feature = "read")]
pub(crate) fn info_refs(
repository: &impl Repository,
route: &crate::route::Route<'_>,
output: &mut impl Write,
options: WantOptions,
) -> Result<crate::Response> {
if options.policy == WantPolicy::AdvertisedOnly
|| route.service != Some("git-upload-pack")
|| route.version == crate::route::Version::V2
{
return super::advertisement::serve_info_refs(repository, route, output, true);
}
let ordinary = git_zero_core::repository::UPLOAD_CAPABILITIES;
let mut capabilities =
[0; git_zero_core::repository::UPLOAD_CAPABILITIES.len() + REACHABLE.len()];
capabilities[..ordinary.len()].copy_from_slice(ordinary);
capabilities[ordinary.len()..].copy_from_slice(REACHABLE);
super::advertisement::serve_capability_refs(repository, route.version, output, &capabilities)
}