Browse Source

Create parent directories when renaming a file in ApplyCommand

Before this change, applying a patch will fail if the destination directory
doesn't exist; after, the necessary parent directories are created.

If renaming the file fails, the directories won't be deleted, so this change
isn't atomic. However, ApplyCommand is already not atomic - if one hunk fails
to apply, other hunks still get applied - so I don't think that is a blocker.

Change-Id: Iea36138b806d4e7012176615bcc673756a82f365
Signed-off-by: Jack Wickham <jwickham@palantir.com>
stable-5.8
Jack Wickham 5 years ago committed by Matthias Sohn
parent
commit
d69c0ef5bd
  1. 4
      org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/RenameNoHunks.patch
  2. 4
      org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/RenameNoHunks_PostImage
  3. 4
      org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/RenameNoHunks_PreImage
  4. 10
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java
  5. 1
      org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java

4
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/RenameNoHunks.patch

@ -0,0 +1,4 @@
diff --git a/RenameNoHunks b/nested/subdir/Renamed
similarity index 100%
rename from RenameNoHunks
rename to nested/subdir/Renamed

4
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/RenameNoHunks_PostImage

@ -0,0 +1,4 @@
line1
line2
line3
line4

4
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/RenameNoHunks_PreImage

@ -0,0 +1,4 @@
line1
line2
line3
line4

10
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java

@ -250,6 +250,16 @@ public class ApplyCommandTest extends RepositoryTestCase {
assertFalse(new File(db.getWorkTree(), "NonASCIIDel").exists()); assertFalse(new File(db.getWorkTree(), "NonASCIIDel").exists());
} }
@Test
public void testRenameNoHunks() throws Exception {
ApplyResult result = init("RenameNoHunks", true, true);
assertEquals(1, result.getUpdatedFiles().size());
assertEquals(new File(db.getWorkTree(), "RenameNoHunks"), result.getUpdatedFiles()
.get(0));
checkFile(new File(db.getWorkTree(), "nested/subdir/Renamed"),
b.getString(0, b.size(), false));
}
private static byte[] readFile(String patchFile) throws IOException { private static byte[] readFile(String patchFile) throws IOException {
final InputStream in = getTestResource(patchFile); final InputStream in = getTestResource(patchFile);
if (in == null) { if (in == null) {

1
org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java

@ -114,6 +114,7 @@ public class ApplyCommand extends GitCommand<ApplyResult> {
f = getFile(fh.getOldPath(), false); f = getFile(fh.getOldPath(), false);
File dest = getFile(fh.getNewPath(), false); File dest = getFile(fh.getNewPath(), false);
try { try {
FileUtils.mkdirs(dest.getParentFile(), true);
FileUtils.rename(f, dest, FileUtils.rename(f, dest,
StandardCopyOption.ATOMIC_MOVE); StandardCopyOption.ATOMIC_MOVE);
} catch (IOException e) { } catch (IOException e) {

Loading…
Cancel
Save