Always set the mode.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 19 Jun 2013 19:17:15 +0000 (19:17 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 19 Jun 2013 19:17:15 +0000 (19:17 +0000)
This matches GNU ar behavior. Also remove the now unused getFileStatus method.
Not sure how to add a test, it would have to run ls -l or something like that.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184337 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-ar/Archive.h
tools/llvm-ar/llvm-ar.cpp

index 79933ef1b897ebdf5b7d32431eed7cdf4e2ef914..2357b13d6300c1ad187eda19943f765e6b48198e 100644 (file)
@@ -137,15 +137,6 @@ class ArchiveMember : public ilist_node<ArchiveMember> {
     /// @brief Determine if the member has a long file name
     bool hasLongFilename() const { return flags&HasLongFilenameFlag; }
 
-    /// This method returns the status info (like Unix stat(2)) for the archive
-    /// member. The status info provides the file's size, permissions, and
-    /// modification time. The contents of the Path::StatusInfo structure, other
-    /// than the size and modification time, may not have utility on non-Unix
-    /// systems.
-    /// @returns the status info for the archive member
-    /// @brief Obtain the status info for the archive member
-    const sys::FileStatus &getFileStatus() const { return info; }
-
     /// This method causes the archive member to be replaced with the contents
     /// of the file specified by \p File. The contents of \p this will be
     /// updated to reflect the new data from \p File. The \p File must exist and
index 40615514114ab5abcbcc41c84f1e2d273099a766..03bb36b116ef4397cd92d728cf5576817c99eb97 100644 (file)
@@ -440,12 +440,18 @@ doExtract(std::string* ErrMsg) {
       file.write(data,len);
       file.close();
 
+      sys::PathWithStatus PWS(I->getPath());
+      sys::FileStatus Status = *PWS.getFileStatus();
+
+      // Retain the original mode.
+      Status.mode = I->getMode();
+
       // If we're supposed to retain the original modification times, etc. do so
       // now.
-      if (OriginalDates) {
-        sys::PathWithStatus PWS(I->getPath());
-        PWS.setStatusInfoOnDisk(I->getFileStatus());
-      }
+      if (OriginalDates)
+        Status.modTime = I->getModTime();
+
+      PWS.setStatusInfoOnDisk(Status);
     }
   }
   return false;