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
This commit is contained in:
Laurent Arnoud 2017-02-26 12:18:46 +01:00
parent 3bce55f569
commit 8b61a3a0f2
No known key found for this signature in database
GPG Key ID: A79DAB2374F95DD5
2 changed files with 22 additions and 12 deletions

View File

@ -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) => {

View File

@ -60,9 +60,10 @@ impl<'w, W: Write + 'w> Exa<'w, W> {
})
}
pub fn run(&mut self) -> IOResult<()> {
pub fn run(&mut self) -> IOResult<i32> {
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<Dir>, mut first: bool, is_only_dir: bool) -> IOResult<()> {
fn print_dirs(&mut self, dir_files: Vec<Dir>, mut first: bool, is_only_dir: bool, exit_status: i32) -> IOResult<i32> {
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.