]> source.dussan.org Git - jgit.git/commitdiff
reset command should support the -- <paths> parameters 60/59060/2
authorKaloyan Raev <kaloyan.r@zend.com>
Fri, 25 Sep 2015 11:39:52 +0000 (14:39 +0300)
committerKaloyan Raev <kaloyan.r@zend.com>
Thu, 29 Oct 2015 09:58:08 +0000 (11:58 +0200)
Bug: 480750
Change-Id: Ia85b1aead03dcf2fcb50ce0391b656f7c60a08d4
Signed-off-by: Kaloyan Raev <kaloyan.r@zend.com>
org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java
org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/CheckoutTest.java
org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ResetTest.java [new file with mode: 0644]
org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Reset.java

index 50ddfe04d8c1439470be37dd2603b71692bbce2b..559a6d5d4082cda09c850e1a7d56210f907287f6 100644 (file)
@@ -164,6 +164,14 @@ public class CLIRepositoryTestCase extends LocalDiskRepositoryTestCase {
                                .replaceAll("\t", "\\\\t");
        }
 
+       protected void assertStringArrayEquals(String expected, String[] actual) {
+               // if there is more than one line, ignore last one if empty
+               assertEquals(1,
+                               actual.length > 1 && actual[actual.length - 1].equals("")
+                                               ? actual.length - 1 : actual.length);
+               assertEquals(expected, actual[0]);
+       }
+
        protected void assertArrayOfLinesEquals(String[] expected, String[] actual) {
                assertEquals(toText(expected), toText(actual));
        }
index 387eb2bbb467e99b4456262e948cf1706cb01881..7bf4c26c3806c94319aa85d162693cca322d927b 100644 (file)
@@ -556,15 +556,6 @@ public class CheckoutTest extends CLIRepositoryTestCase {
                // assertEquals("a/c", exception.getConflictingPaths().get(1));
        }
 
-       static private void assertStringArrayEquals(String expected, String[] actual) {
-               // if there is more than one line, ignore last one if empty
-               assertEquals(
-                               1,
-                               actual.length > 1 && actual[actual.length - 1].equals("") ? actual.length - 1
-                                               : actual.length);
-               assertEquals(expected, actual[0]);
-       }
-
        @Test
        public void testCheckoutPath() throws Exception {
                Git git = new Git(db);
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ResetTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ResetTest.java
new file mode 100644 (file)
index 0000000..0785c5c
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015, Kaloyan Raev <kaloyan.r@zend.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.pgm;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.CLIRepositoryTestCase;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ResetTest extends CLIRepositoryTestCase {
+
+       private Git git;
+
+       @Override
+       @Before
+       public void setUp() throws Exception {
+               super.setUp();
+               git = new Git(db);
+       }
+
+       @Test
+       public void testResetSelf() throws Exception {
+               RevCommit commit = git.commit().setMessage("initial commit").call();
+               assertStringArrayEquals("",
+                               execute("git reset --hard " + commit.getId().name()));
+               assertEquals(commit.getId(),
+                               git.getRepository().getRef("HEAD").getObjectId());
+       }
+
+       @Test
+       public void testResetPrevious() throws Exception {
+               RevCommit commit = git.commit().setMessage("initial commit").call();
+               git.commit().setMessage("second commit").call();
+               assertStringArrayEquals("",
+                               execute("git reset --hard " + commit.getId().name()));
+               assertEquals(commit.getId(),
+                               git.getRepository().getRef("HEAD").getObjectId());
+       }
+
+       @Test
+       public void testResetEmptyPath() throws Exception {
+               RevCommit commit = git.commit().setMessage("initial commit").call();
+               assertStringArrayEquals("",
+                               execute("git reset --hard " + commit.getId().name() + " --"));
+               assertEquals(commit.getId(),
+                               git.getRepository().getRef("HEAD").getObjectId());
+       }
+
+       @Test
+       public void testResetPathDoubleDash() throws Exception {
+               resetPath(true);
+       }
+
+       @Test
+       public void testResetPathNoDoubleDash() throws Exception {
+               resetPath(false);
+       }
+
+       private void resetPath(boolean useDoubleDash) throws Exception {
+               // create files a and b
+               writeTrashFile("a", "Hello world a");
+               writeTrashFile("b", "Hello world b");
+               // stage the files
+               git.add().addFilepattern(".").call();
+               // commit the files
+               RevCommit commit = git.commit().setMessage("files a & b").call();
+
+               // change both files a and b
+               writeTrashFile("a", "New Hello world a");
+               writeTrashFile("b", "New Hello world b");
+               // stage the files
+               git.add().addFilepattern(".").call();
+
+               // reset only file a
+               String cmd = String.format("git reset %s%s a", commit.getId().name(),
+                               (useDoubleDash) ? " --" : "");
+               assertStringArrayEquals("", execute(cmd));
+               assertEquals(commit.getId(),
+                               git.getRepository().getRef("HEAD").getObjectId());
+
+               org.eclipse.jgit.api.Status status = git.status().call();
+               // assert that file a is unstaged
+               assertArrayEquals(new String[] { "a" },
+                               status.getModified().toArray());
+               // assert that file b is still staged
+               assertArrayEquals(new String[] { "b" },
+                               status.getChanged().toArray());
+       }
+
+}
index 6d1b1c5481ab24da1974669abcb9bd275baf114c..6ba076290e710ed188cd3760e66897e915095e49 100644 (file)
 
 package org.eclipse.jgit.pgm;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.ResetCommand;
 import org.eclipse.jgit.api.ResetCommand.ResetType;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.spi.StopOptionHandler;
 
 @Command(common = true, usage = "usage_reset")
 class Reset extends TextBuiltin {
@@ -61,24 +65,33 @@ class Reset extends TextBuiltin {
        @Option(name = "--hard", usage = "usage_resetHard")
        private boolean hard = false;
 
-       @Argument(required = true, metaVar = "metaVar_name", usage = "usage_reset")
+       @Argument(required = true, index = 0, metaVar = "metaVar_name", usage = "usage_reset")
        private String commit;
 
+       @Argument(index = 1)
+       @Option(name = "--", metaVar = "metaVar_paths", multiValued = true, handler = StopOptionHandler.class)
+       private List<String> paths = new ArrayList<String>();
+
        @Override
        protected void run() throws Exception {
                try (Git git = new Git(db)) {
                        ResetCommand command = git.reset();
                        command.setRef(commit);
-                       ResetType mode = null;
-                       if (soft)
-                               mode = selectMode(mode, ResetType.SOFT);
-                       if (mixed)
-                               mode = selectMode(mode, ResetType.MIXED);
-                       if (hard)
-                               mode = selectMode(mode, ResetType.HARD);
-                       if (mode == null)
-                               throw die("no reset mode set");
-                       command.setMode(mode);
+                       if (paths.size() > 0) {
+                               for (String path : paths)
+                                       command.addPath(path);
+                       } else {
+                               ResetType mode = null;
+                               if (soft)
+                                       mode = selectMode(mode, ResetType.SOFT);
+                               if (mixed)
+                                       mode = selectMode(mode, ResetType.MIXED);
+                               if (hard)
+                                       mode = selectMode(mode, ResetType.HARD);
+                               if (mode == null)
+                                       throw die("no reset mode set");
+                               command.setMode(mode);
+                       }
                        command.call();
                }
        }