Author: niallp
Date: Wed Sep 29 18:13:37 2010
New Revision: 1002796

URL: http://svn.apache.org/viewvc?rev=1002796&view=rev
Log:
IO-190 FileUtils copyDirectory preserves destination subdirectories, rather 
than overwriting with the source subdirectories - thanks to Jukka for the pacth

Modified:
    commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
    
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java

Modified: commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java?rev=1002796&r1=1002795&r2=1002796&view=diff
==============================================================================
--- commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java 
(original)
+++ commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java Wed 
Sep 29 18:13:37 2010
@@ -1081,9 +1081,6 @@ public class FileUtils {
             if (destDir.mkdirs() == false) {
                 throw new IOException("Destination '" + destDir + "' directory 
cannot be created");
             }
-            if (preserveFileDate) {
-                destDir.setLastModified(srcDir.lastModified());
-            }
         }
         if (destDir.canWrite() == false) {
             throw new IOException("Destination '" + destDir + "' cannot be 
written to");
@@ -1098,6 +1095,11 @@ public class FileUtils {
                 }
             }
         }
+
+        // Do this last, as the above has probably affected directory metadata
+        if (preserveFileDate) {
+            destDir.setLastModified(srcDir.lastModified());
+        }
     }
 
     //-----------------------------------------------------------------------

Modified: 
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java?rev=1002796&r1=1002795&r2=1002796&view=diff
==============================================================================
--- 
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java 
(original)
+++ 
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java 
Wed Sep 29 18:13:37 2010
@@ -906,6 +906,57 @@ public class FileUtilsTestCase extends F
         assertEquals("file3.txt", files.get(2).getName());
    }
 
+    public void testCopyDirectoryPreserveDates() throws Exception {
+        File source = new File(getTestDirectory(), "source");
+        File sourceDirectory = new File(source, "directory");
+        File sourceFile = new File(sourceDirectory, "hello.txt");
+
+        // Prepare source data
+        source.mkdirs();
+        sourceDirectory.mkdir();
+        FileUtils.writeStringToFile(sourceFile, "HELLO WORLD", "UTF8");
+        // Set dates in reverse order to avoid overwriting previous values
+        // Also, use full seconds (arguments are in ms) close to today
+        // but still highly unlikely to occur in the real world
+        sourceFile.setLastModified(1000000002000L);
+        sourceDirectory.setLastModified(1000000001000L);
+        source.setLastModified(1000000000000L);
+
+        File target = new File(getTestDirectory(), "target");
+        File targetDirectory = new File(target, "directory");
+        File targetFile = new File(targetDirectory, "hello.txt");
+
+        // Test with preserveFileDate disabled
+        FileUtils.copyDirectory(source, target, false);
+        assertTrue(1000000000000L != target.lastModified());
+        assertTrue(1000000001000L != targetDirectory.lastModified());
+        assertTrue(1000000002000L != targetFile.lastModified());
+        FileUtils.deleteDirectory(target);
+
+        // Test with preserveFileDate enabled
+        FileUtils.copyDirectory(source, target, true);
+        assertEquals(1000000000000L, target.lastModified());
+        assertEquals(1000000001000L, targetDirectory.lastModified());
+        assertEquals(1000000002000L, targetFile.lastModified());
+        FileUtils.deleteDirectory(target);
+
+        // also if the target directory already exists (IO-190)
+        target.mkdirs();
+        FileUtils.copyDirectory(source, target, true);
+        assertEquals(1000000000000L, target.lastModified());
+        assertEquals(1000000001000L, targetDirectory.lastModified());
+        assertEquals(1000000002000L, targetFile.lastModified());
+        FileUtils.deleteDirectory(target);
+
+        // also if the target subdirectory already exists (IO-190)
+        targetDirectory.mkdirs();
+        FileUtils.copyDirectory(source, target, true);
+        assertEquals(1000000000000L, target.lastModified());
+        assertEquals(1000000001000L, targetDirectory.lastModified());
+        assertEquals(1000000002000L, targetFile.lastModified());
+        FileUtils.deleteDirectory(target);
+    }
+
     /** Test for IO-141 */
     public void testCopyDirectoryToChild() throws Exception {
         File grandParentDir = new File(getTestDirectory(), "grandparent");


Reply via email to