diff options
author | Robin Rosenberg <robin.rosenberg@dewire.com> | 2013-03-24 01:06:29 +0100 |
---|---|---|
committer | Christian Halstrick <christian.halstrick@sap.com> | 2013-03-26 00:48:00 +0100 |
commit | d0e92885e911c96be917574a5f804bf64d622cf9 (patch) | |
tree | 72a36fdd5d370e10b0585d9658b68d36dc3903e8 /org.eclipse.jgit.test | |
parent | 7aa54967a26cb027fe390ad1c624ebb30f9ac6d5 (diff) | |
download | jgit-d0e92885e911c96be917574a5f804bf64d622cf9.tar.gz jgit-d0e92885e911c96be917574a5f804bf64d622cf9.zip |
Extend FileUtils.rename to common git semantics
Unlike the OS or Java rename this method will (on *nix) try (on Windows)
replace the target with the source provided the target does not exist,
the target does exist and is a file, or if it is a directory which only
contains directories. In the latter case the directory hierarchy will be
deleted.
If the initial rename fails and the target is an existing file the the
target file will be deleted first and then the rename is retried.
Change-Id: Iae75c49c85445ada7795246a02ce02f7c248d956
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java index d0680cab74..f6f6753c75 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java @@ -45,6 +45,7 @@ package org.eclipse.jgit.util; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.endsWith; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -52,6 +53,7 @@ import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; +import org.eclipse.jgit.junit.JGitTestUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -321,4 +323,71 @@ public class FileUtilTest { assertTrue(f.exists()); assertFalse(e.exists()); } + + @Test + public void testRenameOverNonExistingFile() throws IOException { + File d = new File(trash, "d"); + FileUtils.mkdirs(d); + File f1 = new File(trash, "d/f"); + File f2 = new File(trash, "d/g"); + JGitTestUtil.write(f1, "f1"); + // test + FileUtils.rename(f1, f2); + assertFalse(f1.exists()); + assertTrue(f2.exists()); + assertEquals("f1", JGitTestUtil.read(f2)); + } + + @Test + public void testRenameOverExistingFile() throws IOException { + File d = new File(trash, "d"); + FileUtils.mkdirs(d); + File f1 = new File(trash, "d/f"); + File f2 = new File(trash, "d/g"); + JGitTestUtil.write(f1, "f1"); + JGitTestUtil.write(f2, "f2"); + // test + FileUtils.rename(f1, f2); + assertFalse(f1.exists()); + assertTrue(f2.exists()); + assertEquals("f1", JGitTestUtil.read(f2)); + } + + @Test + public void testRenameOverExistingNonEmptyDirectory() throws IOException { + File d = new File(trash, "d"); + FileUtils.mkdirs(d); + File f1 = new File(trash, "d/f"); + File f2 = new File(trash, "d/g"); + File d1 = new File(trash, "d/g/h/i"); + File f3 = new File(trash, "d/g/h/f"); + FileUtils.mkdirs(d1); + JGitTestUtil.write(f1, "f1"); + JGitTestUtil.write(f3, "f3"); + // test + try { + FileUtils.rename(f1, f2); + fail("rename to non-empty directory should fail"); + } catch (IOException e) { + assertEquals("f1", JGitTestUtil.read(f1)); // untouched source + assertEquals("f3", JGitTestUtil.read(f3)); // untouched + // empty directories within f2 may or may not have been deleted + } + } + + @Test + public void testRenameOverExistingEmptyDirectory() throws IOException { + File d = new File(trash, "d"); + FileUtils.mkdirs(d); + File f1 = new File(trash, "d/f"); + File f2 = new File(trash, "d/g"); + File d1 = new File(trash, "d/g/h/i"); + FileUtils.mkdirs(d1); + JGitTestUtil.write(f1, "f1"); + // test + FileUtils.rename(f1, f2); + assertFalse(f1.exists()); + assertTrue(f2.exists()); + assertEquals("f1", JGitTestUtil.read(f2)); + } } |