]> git.lizzy.rs Git - rust.git/blobdiff - src/bootstrap/install.rs
Rollup merge of #97627 - lcnr:comment-tick, r=Dylan-DPC
[rust.git] / src / bootstrap / install.rs
index 08e37a16279903a8a7f080cf7f6bcdcdab1826f4..6e49f39ffb6aa5924aa1d6a00b86725c85951c9e 100644 (file)
@@ -5,12 +5,12 @@
 
 use std::env;
 use std::fs;
-use std::path::{Component, PathBuf};
+use std::path::{Component, Path, PathBuf};
 use std::process::Command;
 
 use crate::util::t;
 
-use crate::dist::{self, sanitize_sh};
+use crate::dist;
 use crate::tarball::GeneratedTarball;
 use crate::Compiler;
 
 #[cfg(not(target_os = "illumos"))]
 const SHELL: &str = "sh";
 
+// We have to run a few shell scripts, which choke quite a bit on both `\`
+// characters and on `C:\` paths, so normalize both of them away.
+fn sanitize_sh(path: &Path) -> String {
+    let path = path.to_str().unwrap().replace("\\", "/");
+    return change_drive(unc_to_lfs(&path)).unwrap_or(path);
+
+    fn unc_to_lfs(s: &str) -> &str {
+        s.strip_prefix("//?/").unwrap_or(s)
+    }
+
+    fn change_drive(s: &str) -> Option<String> {
+        let mut ch = s.chars();
+        let drive = ch.next().unwrap_or('C');
+        if ch.next() != Some(':') {
+            return None;
+        }
+        if ch.next() != Some('/') {
+            return None;
+        }
+        Some(format!("/{}/{}", drive, &s[drive.len_utf8() + 2..]))
+    }
+}
+
 fn install_sh(
     builder: &Builder<'_>,
     package: &str,