20260514 rsync默认限定发布点scope
This commit is contained in:
@@ -13,6 +13,30 @@ use crate::fetch::rsync::{
|
||||
RsyncFetchError, RsyncFetchResult, RsyncFetcher, normalize_rsync_base_uri,
|
||||
};
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum RsyncScopePolicy {
|
||||
PublicationPoint,
|
||||
ModuleRoot,
|
||||
}
|
||||
|
||||
impl Default for RsyncScopePolicy {
|
||||
fn default() -> Self {
|
||||
Self::PublicationPoint
|
||||
}
|
||||
}
|
||||
|
||||
impl RsyncScopePolicy {
|
||||
pub fn parse_cli_value(value: &str) -> Result<Self, String> {
|
||||
match value {
|
||||
"publication-point" => Ok(Self::PublicationPoint),
|
||||
"module-root" => Ok(Self::ModuleRoot),
|
||||
_ => Err(format!(
|
||||
"invalid --rsync-scope: {value}; expected publication-point or module-root"
|
||||
)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct SystemRsyncConfig {
|
||||
pub rsync_bin: PathBuf,
|
||||
@@ -27,6 +51,7 @@ pub struct SystemRsyncConfig {
|
||||
///
|
||||
/// Note: actual mirror behavior is implemented separately from config wiring.
|
||||
pub mirror_root: Option<PathBuf>,
|
||||
pub scope_policy: RsyncScopePolicy,
|
||||
}
|
||||
|
||||
impl Default for SystemRsyncConfig {
|
||||
@@ -37,6 +62,7 @@ impl Default for SystemRsyncConfig {
|
||||
timeout: Duration::from_secs(30),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -268,9 +294,12 @@ impl SystemRsyncFetcher {
|
||||
}
|
||||
}
|
||||
|
||||
fn module_fetch_uri(&self, rsync_base_uri: &str) -> String {
|
||||
rsync_module_root_uri(rsync_base_uri)
|
||||
.unwrap_or_else(|| normalize_rsync_base_uri(rsync_base_uri))
|
||||
fn scope_fetch_uri(&self, rsync_base_uri: &str) -> String {
|
||||
match self.config.scope_policy {
|
||||
RsyncScopePolicy::PublicationPoint => normalize_rsync_base_uri(rsync_base_uri),
|
||||
RsyncScopePolicy::ModuleRoot => rsync_module_root_uri(rsync_base_uri)
|
||||
.unwrap_or_else(|| normalize_rsync_base_uri(rsync_base_uri)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -289,7 +318,7 @@ impl RsyncFetcher for SystemRsyncFetcher {
|
||||
rsync_base_uri: &str,
|
||||
visitor: &mut dyn FnMut(String, Vec<u8>) -> Result<(), String>,
|
||||
) -> RsyncFetchResult<(usize, u64)> {
|
||||
let base = self.module_fetch_uri(rsync_base_uri);
|
||||
let base = self.scope_fetch_uri(rsync_base_uri);
|
||||
let mut count = 0usize;
|
||||
let mut bytes_total = 0u64;
|
||||
let mut wrapped = |uri: String, bytes: Vec<u8>| -> Result<(), String> {
|
||||
@@ -317,7 +346,7 @@ impl RsyncFetcher for SystemRsyncFetcher {
|
||||
}
|
||||
|
||||
fn dedup_key(&self, rsync_base_uri: &str) -> String {
|
||||
self.module_fetch_uri(rsync_base_uri)
|
||||
self.scope_fetch_uri(rsync_base_uri)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -506,8 +535,20 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn system_rsync_dedup_key_uses_module_root() {
|
||||
fn system_rsync_dedup_key_uses_publication_point_scope_by_default() {
|
||||
let fetcher = SystemRsyncFetcher::new(SystemRsyncConfig::default());
|
||||
assert_eq!(
|
||||
fetcher.dedup_key("rsync://example.net/repo/ta/ca/publication-point/"),
|
||||
"rsync://example.net/repo/ta/ca/publication-point/"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn system_rsync_dedup_key_uses_module_root_when_configured() {
|
||||
let fetcher = SystemRsyncFetcher::new(SystemRsyncConfig {
|
||||
scope_policy: RsyncScopePolicy::ModuleRoot,
|
||||
..SystemRsyncConfig::default()
|
||||
});
|
||||
assert_eq!(
|
||||
fetcher.dedup_key("rsync://example.net/repo/ta/ca/publication-point/"),
|
||||
"rsync://example.net/repo/"
|
||||
@@ -525,6 +566,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(1),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
let e = f
|
||||
.run_rsync("rsync://example.net/repo/", dst.path())
|
||||
@@ -538,6 +580,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(1),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
let e = f
|
||||
.run_rsync("rsync://example.net/repo/", dst.path())
|
||||
@@ -558,6 +601,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(1),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: Some(root_file.clone()),
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
|
||||
let err = fetcher
|
||||
@@ -585,6 +629,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(1),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: Some(root.clone()),
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
|
||||
let err = fetcher
|
||||
@@ -645,6 +690,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(60),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
|
||||
fetcher
|
||||
@@ -683,6 +729,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(60),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
|
||||
let err = fetcher
|
||||
@@ -726,6 +773,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(60),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
|
||||
let err = fetcher
|
||||
@@ -771,6 +819,7 @@ mod tests {
|
||||
timeout: Duration::from_secs(30),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: None,
|
||||
scope_policy: RsyncScopePolicy::default(),
|
||||
});
|
||||
|
||||
fetcher
|
||||
|
||||
Reference in New Issue
Block a user