Преглед на файлове

Merge branch 'master' into update-deps

Benjamin Sago преди 8 години
родител
ревизия
22b593d159
променени са 4 файла, в които са добавени 28 реда и са изтрити 13 реда
  1. 5 0
      Cargo.lock
  2. 1 1
      Vagrantfile
  3. 12 7
      src/bin/main.rs
  4. 10 5
      src/exa.rs

+ 5 - 0
Cargo.lock

@@ -30,6 +30,11 @@ name = "bitflags"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "bitflags"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "byteorder"
 version = "0.4.2"

+ 1 - 1
Vagrantfile

@@ -9,7 +9,7 @@ Vagrant.configure("2") do |config|
 
     # Install the dependencies needed for exa to build.
     config.vm.provision :shell, privileged: true, inline:
-        %[apt-get install -y git cmake libgit2-dev libssh2-1-dev curl attr]
+        %[apt-get install -y git cmake libgit2-dev libssh2-1-dev curl attr pkg-config]
 
     # Guarantee that the timezone is UTC -- some of the tests
     # depend on this (for now).

+ 12 - 7
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) => {

+ 10 - 5
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<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.