mirror of
https://github.com/martinvonz/jj.git
synced 2024-11-11 02:30:57 +03:00
merge_tools: ensure that temporary directory path is valid UTF-8
Otherwise, command substitution would fail.
This commit is contained in:
parent
d17ef14956
commit
673036a3aa
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Write;
|
use std::io::{self, Write};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -137,8 +137,8 @@ impl DiffWorkingCopies {
|
|||||||
let left_wc_dir = self.left_working_copy_path();
|
let left_wc_dir = self.left_working_copy_path();
|
||||||
let right_wc_dir = self.right_working_copy_path();
|
let right_wc_dir = self.right_working_copy_path();
|
||||||
maplit::hashmap! {
|
maplit::hashmap! {
|
||||||
"left" => left_wc_dir.to_str().expect("temp_dir would be valid utf-8"),
|
"left" => left_wc_dir.to_str().expect("temp_dir should be valid utf-8"),
|
||||||
"right" => right_wc_dir.to_str().expect("temp_dir would be valid utf-8"),
|
"right" => right_wc_dir.to_str().expect("temp_dir should be valid utf-8"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,10 +156,7 @@ fn check_out_trees(
|
|||||||
.map(|(path, _value)| path)
|
.map(|(path, _value)| path)
|
||||||
.collect_vec();
|
.collect_vec();
|
||||||
|
|
||||||
let temp_dir = tempfile::Builder::new()
|
let temp_dir = new_utf8_temp_dir("jj-diff-").map_err(DiffCheckoutError::SetUpDir)?;
|
||||||
.prefix("jj-diff-")
|
|
||||||
.tempdir()
|
|
||||||
.map_err(DiffCheckoutError::SetUpDir)?;
|
|
||||||
let left_wc_dir = temp_dir.path().join("left");
|
let left_wc_dir = temp_dir.path().join("left");
|
||||||
let left_state_dir = temp_dir.path().join("left_state");
|
let left_state_dir = temp_dir.path().join("left_state");
|
||||||
let right_wc_dir = temp_dir.path().join("right");
|
let right_wc_dir = temp_dir.path().join("right");
|
||||||
@ -200,6 +197,16 @@ fn check_out(
|
|||||||
Ok(tree_state)
|
Ok(tree_state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_utf8_temp_dir(prefix: &str) -> io::Result<TempDir> {
|
||||||
|
let temp_dir = tempfile::Builder::new().prefix(prefix).tempdir()?;
|
||||||
|
if temp_dir.path().to_str().is_none() {
|
||||||
|
// Not using .display() as we know the path contains unprintable character
|
||||||
|
let message = format!("path {:?} is not valid UTF-8", temp_dir.path());
|
||||||
|
return Err(io::Error::new(io::ErrorKind::InvalidData, message));
|
||||||
|
}
|
||||||
|
Ok(temp_dir)
|
||||||
|
}
|
||||||
|
|
||||||
fn set_readonly_recursively(path: &Path) -> Result<(), std::io::Error> {
|
fn set_readonly_recursively(path: &Path) -> Result<(), std::io::Error> {
|
||||||
// Directory permission is unchanged since files under readonly directory cannot
|
// Directory permission is unchanged since files under readonly directory cannot
|
||||||
// be removed.
|
// be removed.
|
||||||
@ -265,10 +272,7 @@ pub fn run_mergetool(
|
|||||||
"output" => initial_output_content.clone(),
|
"output" => initial_output_content.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let temp_dir = tempfile::Builder::new()
|
let temp_dir = new_utf8_temp_dir("jj-resolve-").map_err(ExternalToolError::SetUpDir)?;
|
||||||
.prefix("jj-resolve-")
|
|
||||||
.tempdir()
|
|
||||||
.map_err(ExternalToolError::SetUpDir)?;
|
|
||||||
let suffix = repo_path
|
let suffix = repo_path
|
||||||
.components()
|
.components()
|
||||||
.last()
|
.last()
|
||||||
@ -289,7 +293,7 @@ pub fn run_mergetool(
|
|||||||
*role,
|
*role,
|
||||||
path.into_os_string()
|
path.into_os_string()
|
||||||
.into_string()
|
.into_string()
|
||||||
.expect("temp_dir would be valid utf-8"),
|
.expect("temp_dir should be valid utf-8"),
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.try_collect()?;
|
.try_collect()?;
|
||||||
|
Loading…
Reference in New Issue
Block a user