From 8b61a3a0f23faa6c0d8a68f07a8a3e2fe9b6db16 Mon Sep 17 00:00:00 2001 From: Laurent Arnoud Date: Sun, 26 Feb 2017 12:18:46 +0100 Subject: [PATCH] Exit with a non-zero status on error With `ls` from Debian coreutils 8.26-2 ``` ls /bad/path echo $? # => 2 ``` Reproduced same behaviour with exa Fix https://github.com/ogham/exa/issues/135 --- src/bin/main.rs | 19 ++++++++++++------- src/exa.rs | 15 ++++++++++----- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/bin/main.rs b/src/bin/main.rs index 914253e..49fbfca 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -10,13 +10,18 @@ fn main() { let mut stdout = stdout(); match Exa::new(&args, &mut stdout) { - Ok(mut exa) => if let Err(e) = exa.run() { - match e.kind() { - ErrorKind::BrokenPipe => exit(0), - _ => { - writeln!(stderr(), "{}", e).unwrap(); - exit(1); - }, + Ok(mut exa) => { + match exa.run() { + Ok(exit_status) => exit(exit_status), + Err(e) => { + match e.kind() { + ErrorKind::BrokenPipe => exit(0), + _ => { + writeln!(stderr(), "{}", e).unwrap(); + exit(1); + }, + }; + } }; }, Err(e) => { diff --git a/src/exa.rs b/src/exa.rs index 8f0147b..5738841 100644 --- a/src/exa.rs +++ b/src/exa.rs @@ -60,9 +60,10 @@ impl<'w, W: Write + 'w> Exa<'w, W> { }) } - pub fn run(&mut self) -> IOResult<()> { + pub fn run(&mut self) -> IOResult { let mut files = Vec::new(); let mut dirs = Vec::new(); + let mut exit_status = 0; // List the current directory by default, like ls. if self.args.is_empty() { @@ -72,6 +73,7 @@ impl<'w, W: Write + 'w> Exa<'w, W> { for file_name in self.args.iter() { match File::from_path(Path::new(&file_name), None) { Err(e) => { + exit_status = 2; writeln!(stderr(), "{}: {}", file_name, e)?; }, Ok(f) => { @@ -98,10 +100,10 @@ impl<'w, W: Write + 'w> Exa<'w, W> { self.options.filter.filter_argument_files(&mut files); self.print_files(None, files)?; - self.print_dirs(dirs, no_files, is_only_dir) + self.print_dirs(dirs, no_files, is_only_dir, exit_status) } - fn print_dirs(&mut self, dir_files: Vec, mut first: bool, is_only_dir: bool) -> IOResult<()> { + fn print_dirs(&mut self, dir_files: Vec, mut first: bool, is_only_dir: bool, exit_status: i32) -> IOResult { for dir in dir_files { // Put a gap between directories, or between the list of files and @@ -141,7 +143,10 @@ impl<'w, W: Write + 'w> Exa<'w, W> { } self.print_files(Some(&dir), children)?; - self.print_dirs(child_dirs, false, false)?; + match self.print_dirs(child_dirs, false, false, exit_status) { + Ok(_) => (), + Err(e) => return Err(e), + } continue; } } @@ -149,7 +154,7 @@ impl<'w, W: Write + 'w> Exa<'w, W> { self.print_files(Some(&dir), children)?; } - Ok(()) + Ok(exit_status) } /// Prints the list of files using whichever view is selected.