aboutsummaryrefslogtreecommitdiff
path: root/deps.rs
diff options
context:
space:
mode:
Diffstat (limited to 'deps.rs')
-rw-r--r--deps.rs49
1 files changed, 45 insertions, 4 deletions
diff --git a/deps.rs b/deps.rs
index 987225b..be31f92 100644
--- a/deps.rs
+++ b/deps.rs
@@ -8,13 +8,54 @@ pub(crate) struct DepfileSpec {
}
impl DepfileSpec {
- pub fn write(&self, deps: &BTreeSet<String>) -> std::io::Result<()> {
- let mut buf = format!("{}:", self.output_module);
+ pub fn write(&self, deps: &BTreeSet<Box<str>>) -> std::io::Result<()> {
+ std::fs::write(&self.depfile_path, self.to_string(deps))
+ }
+
+ fn to_string(&self, deps: &BTreeSet<Box<str>>) -> String {
+ // Transforms a string by escaping spaces and backslashes.
+ let escape = |s: &str| s.replace('\\', "\\\\").replace(' ', "\\ ");
+ let mut buf = format!("{}:", escape(&self.output_module));
for file in deps {
- buf = format!("{} {}", buf, file);
+ buf = format!("{} {}", buf, escape(file));
}
+ buf
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn escaping_depfile() {
+ let spec = DepfileSpec {
+ output_module: "Mod Name".to_owned(),
+ depfile_path: PathBuf::new(),
+ };
- std::fs::write(&self.depfile_path, &buf)
+ let deps: BTreeSet<_> = vec![
+ r"/absolute/path".into(),
+ r"C:\win\absolute\path".into(),
+ r"../relative/path".into(),
+ r"..\win\relative\path".into(),
+ r"../path/with spaces/in/it".into(),
+ r"..\win\path\with spaces\in\it".into(),
+ r"path\with/mixed\separators".into(),
+ ]
+ .into_iter()
+ .collect();
+ assert_eq!(
+ spec.to_string(&deps),
+ "Mod\\ Name: \
+ ../path/with\\ spaces/in/it \
+ ../relative/path \
+ ..\\\\win\\\\path\\\\with\\ spaces\\\\in\\\\it \
+ ..\\\\win\\\\relative\\\\path \
+ /absolute/path \
+ C:\\\\win\\\\absolute\\\\path \
+ path\\\\with/mixed\\\\separators"
+ );
}
}