Explorar el Código

Show files on the end of symlinks

Ben S hace 11 años
padre
commit
5c0d2d07d0
Se han modificado 1 ficheros con 24 adiciones y 7 borrados
  1. 24 7
      file.rs

+ 24 - 7
file.rs

@@ -17,11 +17,11 @@ use filetype::HasType;
 // the actual path.
 
 pub struct File<'a> {
-    pub name: &'a str,
-    pub dir:  &'a Dir<'a>,
-    pub ext:  Option<&'a str>,
-    pub path: &'a Path,
-    pub stat: io::FileStat,
+    pub name:  &'a str,
+    pub dir:   &'a Dir<'a>,
+    pub ext:   Option<&'a str>,
+    pub path:  &'a Path,
+    pub stat:  io::FileStat,
     pub parts: Vec<SortPart>,
 }
 
@@ -88,10 +88,11 @@ impl<'a> File<'a> {
             _ => vec![],
         }
     }
+    
     pub fn display(&self, column: &Column) -> String {
         match *column {
             Permissions => self.permissions_string(),
-            FileName => self.file_colour().paint(self.name),
+            FileName => self.file_name(),
             FileSize(use_iec) => self.file_size(use_iec),
 
             // Display the ID if the user/group doesn't exist, which
@@ -104,7 +105,23 @@ impl<'a> File<'a> {
             Group => get_group_name(self.stat.unstable.gid as u32).unwrap_or(self.stat.unstable.gid.to_str()),
         }
     }
-
+    
+    fn file_name(&self) -> String {
+        let displayed_name = self.file_colour().paint(self.name);
+        if self.stat.kind == io::TypeSymlink {
+            match fs::readlink(self.path) {
+                Ok(path) => format!("{} => {}", displayed_name, path.display()),
+                Err(e) => {
+                    println!("{}", e);
+                    displayed_name
+                },
+            }
+        }
+        else {
+            displayed_name
+        }
+    }
+        
     fn file_size(&self, use_iec_prefixes: bool) -> String {
         // Don't report file sizes for directories. I've never looked
         // at one of those numbers and gained any information from it.