mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-05 02:55:31 +00:00
feat: add flag to check when use specify --dir
This commit is contained in:
parent
82c551ddef
commit
4f9a786e57
@ -31,6 +31,7 @@ pub struct DecompressOptions<'a> {
|
|||||||
pub formats: Vec<Extension>,
|
pub formats: Vec<Extension>,
|
||||||
pub output_dir: &'a Path,
|
pub output_dir: &'a Path,
|
||||||
pub output_file_path: PathBuf,
|
pub output_file_path: PathBuf,
|
||||||
|
pub is_output_dir_explicit: bool,
|
||||||
pub question_policy: QuestionPolicy,
|
pub question_policy: QuestionPolicy,
|
||||||
pub quiet: bool,
|
pub quiet: bool,
|
||||||
pub password: Option<&'a [u8]>,
|
pub password: Option<&'a [u8]>,
|
||||||
@ -73,6 +74,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> {
|
|||||||
options.output_dir,
|
options.output_dir,
|
||||||
&options.output_file_path,
|
&options.output_file_path,
|
||||||
options.question_policy,
|
options.question_policy,
|
||||||
|
options.is_output_dir_explicit,
|
||||||
)? {
|
)? {
|
||||||
files
|
files
|
||||||
} else {
|
} else {
|
||||||
@ -150,6 +152,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> {
|
|||||||
options.output_dir,
|
options.output_dir,
|
||||||
&options.output_file_path,
|
&options.output_file_path,
|
||||||
options.question_policy,
|
options.question_policy,
|
||||||
|
options.is_output_dir_explicit,
|
||||||
)? {
|
)? {
|
||||||
files
|
files
|
||||||
} else {
|
} else {
|
||||||
@ -183,6 +186,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> {
|
|||||||
options.output_dir,
|
options.output_dir,
|
||||||
&options.output_file_path,
|
&options.output_file_path,
|
||||||
options.question_policy,
|
options.question_policy,
|
||||||
|
options.is_output_dir_explicit,
|
||||||
)? {
|
)? {
|
||||||
files
|
files
|
||||||
} else {
|
} else {
|
||||||
@ -214,6 +218,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> {
|
|||||||
options.output_dir,
|
options.output_dir,
|
||||||
&options.output_file_path,
|
&options.output_file_path,
|
||||||
options.question_policy,
|
options.question_policy,
|
||||||
|
options.is_output_dir_explicit,
|
||||||
)? {
|
)? {
|
||||||
files
|
files
|
||||||
} else {
|
} else {
|
||||||
@ -255,6 +260,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> {
|
|||||||
options.output_dir,
|
options.output_dir,
|
||||||
&options.output_file_path,
|
&options.output_file_path,
|
||||||
options.question_policy,
|
options.question_policy,
|
||||||
|
options.is_output_dir_explicit,
|
||||||
)? {
|
)? {
|
||||||
files
|
files
|
||||||
} else {
|
} else {
|
||||||
@ -284,6 +290,48 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn execute_decompression(
|
||||||
|
unpack_fn: impl FnOnce(&Path) -> crate::Result<usize>,
|
||||||
|
output_dir: &Path,
|
||||||
|
output_file_path: &Path,
|
||||||
|
question_policy: QuestionPolicy,
|
||||||
|
is_output_dir_explicit: bool,
|
||||||
|
) -> crate::Result<ControlFlow<(), usize>> {
|
||||||
|
if is_output_dir_explicit {
|
||||||
|
return unpack(unpack_fn, output_dir, question_policy);
|
||||||
|
} else {
|
||||||
|
return smart_unpack(
|
||||||
|
unpack_fn,
|
||||||
|
output_dir,
|
||||||
|
output_file_path,
|
||||||
|
question_policy,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unpack(
|
||||||
|
unpack_fn: impl FnOnce(&Path) -> crate::Result<usize>,
|
||||||
|
output_dir: &Path,
|
||||||
|
question_policy: QuestionPolicy,
|
||||||
|
) -> crate::Result<ControlFlow<(), usize>> {
|
||||||
|
let has_files = output_dir.exists() && output_dir.read_dir().map(|dir| dir.count() > 0).unwrap_or(false);
|
||||||
|
|
||||||
|
let output_dir_cleaned = if has_files {
|
||||||
|
let output_file_path = utils::resolve_path_conflict(&output_dir, question_policy)?.unwrap();
|
||||||
|
output_file_path
|
||||||
|
} else {
|
||||||
|
output_dir.to_owned()
|
||||||
|
};
|
||||||
|
|
||||||
|
if !output_dir_cleaned.exists() {
|
||||||
|
fs::create_dir(&output_dir_cleaned)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let files = unpack_fn(&output_dir_cleaned)?;
|
||||||
|
|
||||||
|
Ok(ControlFlow::Continue(files))
|
||||||
|
}
|
||||||
|
|
||||||
/// Unpacks an archive with some heuristics
|
/// Unpacks an archive with some heuristics
|
||||||
/// - If the archive contains only one file, it will be extracted to the `output_dir`
|
/// - If the archive contains only one file, it will be extracted to the `output_dir`
|
||||||
/// - If the archive contains multiple files, it will be extracted to a subdirectory of the
|
/// - If the archive contains multiple files, it will be extracted to a subdirectory of the
|
||||||
@ -295,6 +343,7 @@ fn smart_unpack(
|
|||||||
output_dir: &Path,
|
output_dir: &Path,
|
||||||
output_file_path: &Path,
|
output_file_path: &Path,
|
||||||
question_policy: QuestionPolicy,
|
question_policy: QuestionPolicy,
|
||||||
|
is_output_dir_explicit: bool,
|
||||||
) -> crate::Result<ControlFlow<(), usize>> {
|
) -> crate::Result<ControlFlow<(), usize>> {
|
||||||
assert!(output_dir.exists());
|
assert!(output_dir.exists());
|
||||||
let temp_dir = tempfile::Builder::new().prefix(".tmp-ouch-").tempdir_in(output_dir)?;
|
let temp_dir = tempfile::Builder::new().prefix(".tmp-ouch-").tempdir_in(output_dir)?;
|
||||||
|
@ -176,6 +176,7 @@ pub fn run(
|
|||||||
|
|
||||||
// The directory that will contain the output files
|
// The directory that will contain the output files
|
||||||
// We default to the current directory if the user didn't specify an output directory with --dir
|
// We default to the current directory if the user didn't specify an output directory with --dir
|
||||||
|
let is_output_dir_explicit = output_dir.is_some();
|
||||||
let output_dir = if let Some(dir) = output_dir {
|
let output_dir = if let Some(dir) = output_dir {
|
||||||
utils::create_dir_if_non_existent(&dir)?;
|
utils::create_dir_if_non_existent(&dir)?;
|
||||||
dir
|
dir
|
||||||
@ -199,6 +200,7 @@ pub fn run(
|
|||||||
formats,
|
formats,
|
||||||
output_dir: &output_dir,
|
output_dir: &output_dir,
|
||||||
output_file_path,
|
output_file_path,
|
||||||
|
is_output_dir_explicit,
|
||||||
question_policy,
|
question_policy,
|
||||||
quiet: args.quiet,
|
quiet: args.quiet,
|
||||||
password: args.password.as_deref().map(|str| {
|
password: args.password.as_deref().map(|str| {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user