From fca8a1d1510e8a526981eadd3c3fd221b501e6d6 Mon Sep 17 00:00:00 2001
From: Jonas Hietala <tradet.h@gmail.com>
Date: Wed, 3 Sep 2014 23:57:02 +0200
Subject: [PATCH 1/2] Print file permissions in octal form.

Closes #16943.
---
 src/libstd/io/fs.rs  |  2 +-
 src/libstd/io/mod.rs | 23 ++++++++++++++++++++++-
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/libstd/io/fs.rs b/src/libstd/io/fs.rs
index 725d3b10def85..1313bf5c1054f 100644
--- a/src/libstd/io/fs.rs
+++ b/src/libstd/io/fs.rs
@@ -1274,7 +1274,7 @@ mod test {
 
         error!(result, "couldn't recursively mkdir");
         error!(result, "couldn't create directory");
-        error!(result, "mode=FilePermission { bits: 448 }");
+        error!(result, "mode=700");
         error!(result, format!("path={}", file.display()));
     })
 
diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs
index 905012b7bf33a..cc51ac8e3baf3 100644
--- a/src/libstd/io/mod.rs
+++ b/src/libstd/io/mod.rs
@@ -1797,7 +1797,6 @@ pub struct UnstableFileStat {
 bitflags!(
     #[doc="A set of permissions for a file or directory is represented
 by a set of flags which are or'd together."]
-    #[deriving(Show)]
     flags FilePermission: u32 {
         static UserRead     = 0o400,
         static UserWrite    = 0o200,
@@ -1836,6 +1835,14 @@ impl Default for FilePermission {
     fn default() -> FilePermission { FilePermission::empty() }
 }
 
+impl fmt::Show for FilePermission {
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        formatter.fill = '0';
+        formatter.width = Some(3);
+        (&self.bits as &fmt::Octal).fmt(formatter)
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::{IoResult, Reader, MemReader, NoProgress, InvalidInput};
@@ -1937,4 +1944,18 @@ mod tests {
         let mut r = MemReader::new(Vec::from_slice(b"hello, world!"));
         assert_eq!(r.push_at_least(5, 1, &mut buf).unwrap_err().kind, InvalidInput);
     }
+
+    #[test]
+    fn test_show() {
+        use super::*;
+
+        assert_eq!(format!("{}", UserRead), "400".to_string());
+        assert_eq!(format!("{}", UserFile), "644".to_string());
+        assert_eq!(format!("{}", UserExec), "755".to_string());
+        assert_eq!(format!("{}", UserRWX),  "700".to_string());
+        assert_eq!(format!("{}", GroupRWX), "070".to_string());
+        assert_eq!(format!("{}", OtherRWX), "007".to_string());
+        assert_eq!(format!("{}", AllPermissions), "777".to_string());
+        assert_eq!(format!("{}", UserRead | UserWrite | OtherWrite), "602".to_string());
+    }
 }

From 38bf999f4a5337022211c9b990fcb7dfe0bccf32 Mon Sep 17 00:00:00 2001
From: Jonas Hietala <tradet.h@gmail.com>
Date: Thu, 4 Sep 2014 09:01:51 +0200
Subject: [PATCH 2/2] Print file permissions with 4 digits.

---
 src/libstd/io/fs.rs  |  2 +-
 src/libstd/io/mod.rs | 18 +++++++++---------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/libstd/io/fs.rs b/src/libstd/io/fs.rs
index 1313bf5c1054f..3d6bb96063ee1 100644
--- a/src/libstd/io/fs.rs
+++ b/src/libstd/io/fs.rs
@@ -1274,7 +1274,7 @@ mod test {
 
         error!(result, "couldn't recursively mkdir");
         error!(result, "couldn't create directory");
-        error!(result, "mode=700");
+        error!(result, "mode=0700");
         error!(result, format!("path={}", file.display()));
     })
 
diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs
index cc51ac8e3baf3..c7996c549f474 100644
--- a/src/libstd/io/mod.rs
+++ b/src/libstd/io/mod.rs
@@ -1838,7 +1838,7 @@ impl Default for FilePermission {
 impl fmt::Show for FilePermission {
     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
         formatter.fill = '0';
-        formatter.width = Some(3);
+        formatter.width = Some(4);
         (&self.bits as &fmt::Octal).fmt(formatter)
     }
 }
@@ -1949,13 +1949,13 @@ mod tests {
     fn test_show() {
         use super::*;
 
-        assert_eq!(format!("{}", UserRead), "400".to_string());
-        assert_eq!(format!("{}", UserFile), "644".to_string());
-        assert_eq!(format!("{}", UserExec), "755".to_string());
-        assert_eq!(format!("{}", UserRWX),  "700".to_string());
-        assert_eq!(format!("{}", GroupRWX), "070".to_string());
-        assert_eq!(format!("{}", OtherRWX), "007".to_string());
-        assert_eq!(format!("{}", AllPermissions), "777".to_string());
-        assert_eq!(format!("{}", UserRead | UserWrite | OtherWrite), "602".to_string());
+        assert_eq!(format!("{}", UserRead), "0400".to_string());
+        assert_eq!(format!("{}", UserFile), "0644".to_string());
+        assert_eq!(format!("{}", UserExec), "0755".to_string());
+        assert_eq!(format!("{}", UserRWX),  "0700".to_string());
+        assert_eq!(format!("{}", GroupRWX), "0070".to_string());
+        assert_eq!(format!("{}", OtherRWX), "0007".to_string());
+        assert_eq!(format!("{}", AllPermissions), "0777".to_string());
+        assert_eq!(format!("{}", UserRead | UserWrite | OtherWrite), "0602".to_string());
     }
 }