Просмотр исходного кода

Make nanoseconds available to times

The information was always in the Metadata struct; exa just never used it.
Benjamin Sago 8 лет назад
Родитель
Сommit
aa5b1867dd
4 измененных файлов с 33 добавлено и 18 удалено
  1. 5 1
      src/fs/fields.rs
  2. 20 8
      src/fs/file.rs
  3. 3 4
      src/output/render/times.rs
  4. 5 5
      src/output/time.rs

+ 5 - 1
src/fs/fields.rs

@@ -166,7 +166,11 @@ pub struct DeviceIDs {
 
 
 /// One of a file’s timestamps (created, accessed, or modified).
-pub struct Time(pub time_t);
+#[derive(Copy, Clone)]
+pub struct Time {
+    pub seconds: time_t,
+    pub nanoseconds: time_t,
+}
 
 
 /// A file’s status in a Git repository. Whether a file is in a repository or

+ 20 - 8
src/fs/file.rs

@@ -273,23 +273,35 @@ impl<'dir> File<'dir> {
         }
     }
 
+    /// This file’s last modified timestamp.
     pub fn modified_time(&self) -> f::Time {
-        f::Time(self.metadata.mtime())
+        f::Time {
+            seconds:     self.metadata.mtime(),
+            nanoseconds: self.metadata.mtime_nsec()
+        }
     }
 
+    /// This file’s created timestamp.
     pub fn created_time(&self) -> f::Time {
-        f::Time(self.metadata.ctime())
+        f::Time {
+            seconds:     self.metadata.ctime(),
+            nanoseconds: self.metadata.ctime_nsec()
+        }
     }
 
+    /// This file’s last accessed timestamp.
     pub fn accessed_time(&self) -> f::Time {
-        f::Time(self.metadata.atime())
+        f::Time {
+            seconds:     self.metadata.atime(),
+            nanoseconds: self.metadata.atime_nsec()
+        }
     }
 
-    /// This file's 'type'.
+    /// This file’s ‘type’.
     ///
-    /// This is used in the leftmost column of the permissions column.
-    /// Although the file type can usually be guessed from the colour of the
-    /// file, `ls` puts this character there, so people will expect it.
+    /// This is used a the leftmost character of the permissions column.
+    /// The file type can usually be guessed from the colour of the file, but
+    /// ls puts this character there.
     pub fn type_char(&self) -> f::Type {
         if self.is_file() {
             f::Type::File
@@ -341,7 +353,7 @@ impl<'dir> File<'dir> {
         }
     }
 
-    /// Whether this file's extension is any of the strings that get passed in.
+    /// Whether this files extension is any of the strings that get passed in.
     ///
     /// This will always return `false` if the file has no extension.
     pub fn extension_is_one_of(&self, choices: &[&str]) -> bool {

+ 3 - 4
src/output/render/times.rs

@@ -6,18 +6,17 @@ use output::colours::Colours;
 use output::time::TimeFormat;
 
 
-#[allow(trivial_numeric_casts)]
 impl f::Time {
-    pub fn render(&self, colours: &Colours,
+    pub fn render(self, colours: &Colours,
                          tz: &Option<TimeZone>,
                          style: &TimeFormat) -> TextCell {
 
         if let Some(ref tz) = *tz {
-            let datestamp = style.format_zoned(self.0 as i64, tz);
+            let datestamp = style.format_zoned(self, tz);
             TextCell::paint(colours.date, datestamp)
         }
         else {
-            let datestamp = style.format_local(self.0 as i64);
+            let datestamp = style.format_local(self);
             TextCell::paint(colours.date, datestamp)
         }
     }

+ 5 - 5
src/output/time.rs

@@ -2,7 +2,7 @@ use datetime::{LocalDateTime, TimeZone, DatePiece};
 use datetime::fmt::DateFormat;
 use locale;
 
-use fs::fields::time_t;
+use fs::fields::Time;
 
 
 #[derive(Debug, Clone)]
@@ -28,8 +28,8 @@ impl TimeFormat {
     }
 
     #[allow(trivial_numeric_casts)]
-    pub fn format_local(&self, time: time_t) -> String {
-        let date = LocalDateTime::at(time as i64);
+    pub fn format_local(&self, time: Time) -> String {
+        let date = LocalDateTime::at(time.seconds as i64);
 
         if self.is_recent(date) {
             self.date_and_time.format(&date, &self.locale)
@@ -40,8 +40,8 @@ impl TimeFormat {
     }
 
     #[allow(trivial_numeric_casts)]
-    pub fn format_zoned(&self, time: time_t, zone: &TimeZone) -> String {
-        let date = zone.to_zoned(LocalDateTime::at(time as i64));
+    pub fn format_zoned(&self, time: Time, zone: &TimeZone) -> String {
+        let date = zone.to_zoned(LocalDateTime::at(time.seconds as i64));
 
         if self.is_recent(date) {
             self.date_and_time.format(&date, &self.locale)