]> source.dussan.org Git - jgit.git/commitdiff
Create parent dir if necessary on checkout 66/6666/1
authorRobin Stocker <robin@nibor.org>
Sun, 8 Jul 2012 12:48:39 +0000 (14:48 +0200)
committerRobin Stocker <robin@nibor.org>
Sun, 8 Jul 2012 13:15:38 +0000 (15:15 +0200)
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 <robin@nibor.org>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java

index 9060cd5307d4d22bd340bd166d4dc76b020c86e1..dc9303aecf7a7547ba7076e2bdd663797c407179 100644 (file)
@@ -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 {
index 03df65d8a79effaf7658172498fbdcd119bb6a97..479fbd047de9b23ffd8834e1fdd6e0aac4778e0c 100644 (file)
@@ -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<Ref> {
                                                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(