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 4ad423486..d81e686c1 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 @@ -175,4 +175,19 @@ public void testMkdirs() throws IOException { assertTrue(f.delete()); } + public void testCreateNewFile() throws IOException { + File f = new File(trash, "x"); + FileUtils.createNewFile(f); + assertTrue(f.exists()); + + try { + FileUtils.createNewFile(f); + fail("creation of already existing file must fail"); + } catch (IOException e) { + // expected + } + + FileUtils.delete(f); + } + } diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties index c8f592097..3049ae7d0 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties @@ -130,6 +130,7 @@ couldNotWriteFile=Could not write file {0} countingObjects=Counting objects createBranchFailedUnknownReason=Create branch failed for unknown reason createBranchUnexpectedResult=Create branch returned unexpected result {0} +createNewFileFailed=Could not create new file {0} credentialPassword=Password credentialUsername=Username daemonAlreadyRunning=Daemon already running diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java index 083abe5f0..9718e6294 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java @@ -190,6 +190,7 @@ public static JGitText get() { /***/ public String countingObjects; /***/ public String createBranchFailedUnknownReason; /***/ public String createBranchUnexpectedResult; + /***/ public String createNewFileFailed; /***/ public String credentialPassword; /***/ public String credentialUsername; /***/ public String daemonAlreadyRunning; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java index 568f2882b..56d20d4ff 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java @@ -47,6 +47,7 @@ import java.io.File; import java.io.IOException; +import java.nio.channels.FileLock; import java.text.MessageFormat; import org.eclipse.jgit.JGitText; @@ -219,4 +220,26 @@ public static void mkdirs(final File d, boolean skipExisting) JGitText.get().mkDirsFailed, d.getAbsolutePath())); } } + + /** + * Atomically creates a new, empty file named by this abstract pathname if + * and only if a file with this name does not yet exist. The check for the + * existence of the file and the creation of the file if it does not exist + * are a single operation that is atomic with respect to all other + * filesystem activities that might affect the file. + *

+ * Note: this method should not be used for file-locking, as the resulting + * protocol cannot be made to work reliably. The {@link FileLock} facility + * should be used instead. + * + * @param f + * the file to be created + * @throws IOException + * if the named file already exists or if an I/O error occurred + */ + public static void createNewFile(File f) throws IOException { + if (!f.createNewFile()) + throw new IOException(MessageFormat.format( + JGitText.get().createNewFileFailed, f)); + } }