aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-vcs/src/downloader/svn.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-vcs/src/downloader/svn.rs')
-rw-r--r--crates/mozart-vcs/src/downloader/svn.rs19
1 files changed, 15 insertions, 4 deletions
diff --git a/crates/mozart-vcs/src/downloader/svn.rs b/crates/mozart-vcs/src/downloader/svn.rs
index 5222b06..533e15a 100644
--- a/crates/mozart-vcs/src/downloader/svn.rs
+++ b/crates/mozart-vcs/src/downloader/svn.rs
@@ -1,11 +1,17 @@
use std::path::Path;
+use std::sync::LazyLock;
use anyhow::Result;
+use regex::Regex;
use crate::util::svn::SvnUtil;
use super::VcsDownloader;
+/// Match any non-`X` status line (mirror of Composer's
+/// `{^ *[^X ] +}m`). Ignores externals (`X` prefix).
+static SVN_STATUS_RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"(?m)^ *[^X ] +").unwrap());
+
/// SVN downloader using checkout/switch.
pub struct SvnDownloader {
svn_util: SvnUtil,
@@ -46,11 +52,16 @@ impl VcsDownloader for SvnDownloader {
}
fn local_changes(&self, target: &Path) -> Result<Option<String>> {
- let output = self.svn_util.execute(&["status"], Some(target))?;
- if output.stdout.trim().is_empty() {
- Ok(None)
- } else {
+ if !target.join(".svn").is_dir() {
+ return Ok(None);
+ }
+ let output = self
+ .svn_util
+ .execute(&["status", "--ignore-externals"], Some(target))?;
+ if SVN_STATUS_RE.is_match(&output.stdout) {
Ok(Some(output.stdout))
+ } else {
+ Ok(None)
}
}