From: Robin Stocker Date: Sun, 8 Jul 2012 12:48:39 +0000 (+0200) Subject: Create parent dir if necessary on checkout X-Git-Tag: v2.1.0.201209190230-r~56 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fchanges%2F66%2F6666%2F1;p=jgit.git Create parent dir if necessary on checkout An example where this is necessary is when a whole directory was deleted and checkout is used to restore a file which was in that directory. Bug: 372133 Change-Id: I1d45e0a5d2525fe1fdfbf08c9c5c166dd909e9fd Signed-off-by: Robin Stocker --- diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java index 9060cd5307..dc9303aecf 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java @@ -219,6 +219,21 @@ public class CheckoutCommandTest extends RepositoryTestCase { indexState(db2, CONTENT)); } + @Test + public void testCheckoutOfFileWithInexistentParentDir() throws Exception { + File a = writeTrashFile("dir/a.txt", "A"); + writeTrashFile("dir/b.txt", "A"); + git.add().addFilepattern("dir/a.txt").addFilepattern("dir/b.txt") + .call(); + git.commit().setMessage("Added dir").call(); + + File dir = new File(db.getWorkTree(), "dir"); + FileUtils.delete(dir, FileUtils.RECURSIVE); + + git.checkout().addPath("dir/a.txt").call(); + assertTrue(a.exists()); + } + @Test public void testDetachedHeadOnCheckout() throws JGitInternalException, IOException, GitAPIException { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java index 03df65d8a7..479fbd047d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java @@ -78,6 +78,7 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.PathFilterGroup; +import org.eclipse.jgit.util.FileUtils; /** * Checkout a branch to the working tree @@ -297,9 +298,11 @@ public class CheckoutCommand extends GitCommand { public void apply(DirCacheEntry ent) { ent.setObjectId(blobId); ent.setFileMode(mode); + File file = new File(workTree, ent.getPathString()); + File parentDir = file.getParentFile(); try { - DirCacheCheckout.checkoutEntry(repo, new File( - workTree, ent.getPathString()), ent, r); + FileUtils.mkdirs(parentDir, true); + DirCacheCheckout.checkoutEntry(repo, file, ent, r); } catch (IOException e) { throw new JGitInternalException( MessageFormat.format(