From 1a3bb390d34a0a8dd712f932a0d3ee5c8a70500b Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Mon, 19 Apr 2021 12:44:08 -0700 Subject: [PATCH] Handle man pages better on Windows. --- src/bin/cargo/commands/help.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/bin/cargo/commands/help.rs b/src/bin/cargo/commands/help.rs index 798dd515a42..597c2c5883b 100644 --- a/src/bin/cargo/commands/help.rs +++ b/src/bin/cargo/commands/help.rs @@ -56,16 +56,16 @@ fn try_help(config: &Config) -> CargoResult { Some(man) => man, None => return Ok(false), }; - write_and_spawn(&man, "man")?; + write_and_spawn(&subcommand, &man, "man")?; } else { let txt = match extract_man(&subcommand, "txt") { Some(txt) => txt, None => return Ok(false), }; if resolve_executable(Path::new("less")).is_ok() { - write_and_spawn(&txt, "less")?; + write_and_spawn(&subcommand, &txt, "less")?; } else if resolve_executable(Path::new("more")).is_ok() { - write_and_spawn(&txt, "more")?; + write_and_spawn(&subcommand, &txt, "more")?; } else { drop(std::io::stdout().write_all(&txt)); } @@ -117,13 +117,20 @@ fn extract_man(subcommand: &str, extension: &str) -> Option> { /// Write the contents of a man page to disk and spawn the given command to /// display it. -fn write_and_spawn(contents: &[u8], command: &str) -> CargoResult<()> { - let mut tmp = tempfile::Builder::new().prefix("cargo-man").tempfile()?; +fn write_and_spawn(name: &str, contents: &[u8], command: &str) -> CargoResult<()> { + let prefix = format!("cargo-{}.", name); + let mut tmp = tempfile::Builder::new().prefix(&prefix).tempfile()?; let f = tmp.as_file_mut(); f.write_all(contents)?; f.flush()?; + let path = tmp.path(); + // Use a path relative to the temp directory so that it can work on + // cygwin/msys systems which don't handle windows-style paths. + let mut relative_name = std::ffi::OsString::from("./"); + relative_name.push(path.file_name().unwrap()); let mut cmd = std::process::Command::new(command) - .arg(tmp.path()) + .arg(relative_name) + .current_dir(path.parent().unwrap()) .spawn()?; drop(cmd.wait()); Ok(())