diff --git a/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java index a328baec2..50ddfe04d 100644 --- a/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java +++ b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java @@ -81,6 +81,10 @@ public class CLIRepositoryTestCase extends LocalDiskRepositoryTestCase { return JGitTestUtil.writeTrashFile(db, name, data); } + protected String read(final File file) throws IOException { + return JGitTestUtil.read(file); + } + protected void deleteTrashFile(final String name) throws IOException { JGitTestUtil.deleteTrashFile(db, name); } diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java index 8012893f9..2c1f59f25 100644 --- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java +++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java @@ -42,6 +42,8 @@ */ package org.eclipse.jgit.pgm; +import static org.junit.Assert.assertArrayEquals; + import java.io.File; import org.eclipse.jgit.api.Git; @@ -191,4 +193,26 @@ public class CheckoutTest extends CLIRepositoryTestCase { : actual.length); Assert.assertEquals(expected, actual[0]); } + + @Test + public void testCheckoutPath() throws Exception { + Git git = new Git(db); + writeTrashFile("a", "Hello world a"); + git.add().addFilepattern(".").call(); + git.commit().setMessage("commit file a").call(); + git.branchCreate().setName("branch_1").call(); + git.checkout().setName("branch_1").call(); + File b = writeTrashFile("b", "Hello world b"); + git.add().addFilepattern("b").call(); + git.commit().setMessage("commit file b").call(); + File a = writeTrashFile("a", "New Hello world a"); + git.add().addFilepattern(".").call(); + git.commit().setMessage("modified a").call(); + assertArrayEquals(new String[] { "" }, + execute("git checkout HEAD~2 -- a")); + assertEquals("Hello world a", read(a)); + assertArrayEquals(new String[] { "* branch_1", " master", "" }, + execute("git branch")); + assertEquals("Hello world b", read(b)); + } } diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java index 2f35ecbab..8f911fd92 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java @@ -45,6 +45,8 @@ package org.eclipse.jgit.pgm; import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.api.CheckoutCommand; import org.eclipse.jgit.api.Git; @@ -58,6 +60,7 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.pgm.internal.CLIText; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; +import org.kohsuke.args4j.spi.StopOptionHandler; @Command(common = true, usage = "usage_checkout") class Checkout extends TextBuiltin { @@ -68,9 +71,13 @@ class Checkout extends TextBuiltin { @Option(name = "--force", aliases = { "-f" }, usage = "usage_forceCheckout") private boolean force = false; - @Argument(required = true, metaVar = "metaVar_name", usage = "usage_checkout") + @Argument(required = true, index = 0, metaVar = "metaVar_name", usage = "usage_checkout") private String name; + @Argument(index = 1) + @Option(name = "--", metaVar = "metaVar_paths", multiValued = true, handler = StopOptionHandler.class) + private List paths = new ArrayList(); + @Override protected void run() throws Exception { if (createBranch) { @@ -80,9 +87,15 @@ class Checkout extends TextBuiltin { } CheckoutCommand command = new Git(db).checkout(); - command.setCreateBranch(createBranch); - command.setName(name); - command.setForce(force); + if (paths.size() > 0) { + command.setStartPoint(name); + for (String path : paths) + command.addPath(path); + } else { + command.setCreateBranch(createBranch); + command.setName(name); + command.setForce(force); + } try { String oldBranch = db.getBranch(); Ref ref = command.call();