From 48f4d97a226a2c9be4577b916cc0b99ce870939a Mon Sep 17 00:00:00 2001 From: Andre Bossert Date: Sat, 23 Feb 2019 15:25:10 +0100 Subject: Add command line support for "git difftool" see: http://git-scm.com/docs/git-difftool * add command line support for "jgit difftool" * show supported commands with "jgit difftool --help" * added "git difftool --tool-help" to show the tools (empty now) * prepare for all other commands Bug: 356832 Change-Id: Ice0c13ef7953a20feaf25e7746d62b94ff4e89e5 Signed-off-by: Andre Bossert Signed-off-by: Simeon Andreev --- org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF | 1 + .../tst/org/eclipse/jgit/pgm/DiffToolTest.java | 195 +++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DiffToolTest.java (limited to 'org.eclipse.jgit.pgm.test') diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF index 2c53da8c8f..3e0a4eaf20 100644 --- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF @@ -15,6 +15,7 @@ Import-Package: org.eclipse.jgit.api;version="[6.1.0,6.2.0)", org.eclipse.jgit.internal.storage.file;version="6.1.0", org.eclipse.jgit.junit;version="[6.1.0,6.2.0)", org.eclipse.jgit.lib;version="[6.1.0,6.2.0)", + org.eclipse.jgit.lib.internal;version="[6.1.0,6.2.0)", org.eclipse.jgit.merge;version="[6.1.0,6.2.0)", org.eclipse.jgit.pgm;version="[6.1.0,6.2.0)", org.eclipse.jgit.pgm.internal;version="[6.1.0,6.2.0)", diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DiffToolTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DiffToolTest.java new file mode 100644 index 0000000000..2ce50c7827 --- /dev/null +++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DiffToolTest.java @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2021, Simeon Andreev and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.pgm; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.diff.DiffEntry; +import org.eclipse.jgit.lib.CLIRepositoryTestCase; +import org.eclipse.jgit.pgm.opt.CmdLineParser; +import org.eclipse.jgit.pgm.opt.SubcommandHandler; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.treewalk.FileTreeIterator; +import org.eclipse.jgit.treewalk.TreeWalk; +import org.junit.Before; +import org.junit.Test; +import org.kohsuke.args4j.Argument; + +/** + * Testing the {@code difftool} command. + */ +public class DiffToolTest extends CLIRepositoryTestCase { + public static class GitCliJGitWrapperParser { + @Argument(index = 0, metaVar = "metaVar_command", required = true, handler = SubcommandHandler.class) + TextBuiltin subcommand; + + @Argument(index = 1, metaVar = "metaVar_arg") + List arguments = new ArrayList<>(); + } + + private String[] runAndCaptureUsingInitRaw(String... args) + throws Exception { + CLIGitCommand.Result result = new CLIGitCommand.Result(); + + GitCliJGitWrapperParser bean = new GitCliJGitWrapperParser(); + CmdLineParser clp = new CmdLineParser(bean); + clp.parseArgument(args); + + TextBuiltin cmd = bean.subcommand; + cmd.initRaw(db, null, null, result.out, result.err); + cmd.execute(bean.arguments.toArray(new String[bean.arguments.size()])); + if (cmd.getOutputWriter() != null) { + cmd.getOutputWriter().flush(); + } + if (cmd.getErrorWriter() != null) { + cmd.getErrorWriter().flush(); + } + return result.outLines().toArray(new String[0]); + } + + private Git git; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + git = new Git(db); + git.commit().setMessage("initial commit").call(); + } + + @Test + public void testTool() throws Exception { + RevCommit commit = createUnstagedChanges(); + List changes = getRepositoryChanges(commit); + String[] expectedOutput = getExpectedDiffToolOutput(changes); + + String[] options = { + "--tool", + "-t", + }; + + for (String option : options) { + assertArrayOfLinesEquals("Incorrect output for option: " + option, + expectedOutput, + runAndCaptureUsingInitRaw("difftool", option, + "some_tool")); + } + } + + @Test + public void testToolTrustExitCode() throws Exception { + RevCommit commit = createUnstagedChanges(); + List changes = getRepositoryChanges(commit); + String[] expectedOutput = getExpectedDiffToolOutput(changes); + + String[] options = { "--tool", "-t", }; + + for (String option : options) { + assertArrayOfLinesEquals("Incorrect output for option: " + option, + expectedOutput, runAndCaptureUsingInitRaw("difftool", + "--trust-exit-code", option, "some_tool")); + } + } + + @Test + public void testToolNoGuiNoPromptNoTrustExitcode() throws Exception { + RevCommit commit = createUnstagedChanges(); + List changes = getRepositoryChanges(commit); + String[] expectedOutput = getExpectedDiffToolOutput(changes); + + String[] options = { "--tool", "-t", }; + + for (String option : options) { + assertArrayOfLinesEquals("Incorrect output for option: " + option, + expectedOutput, runAndCaptureUsingInitRaw("difftool", + "--no-gui", "--no-prompt", "--no-trust-exit-code", + option, "some_tool")); + } + } + + @Test + public void testToolCached() throws Exception { + RevCommit commit = createStagedChanges(); + List changes = getRepositoryChanges(commit); + String[] expectedOutput = getExpectedDiffToolOutput(changes); + + String[] options = { "--cached", "--staged", }; + + for (String option : options) { + assertArrayOfLinesEquals("Incorrect output for option: " + option, + expectedOutput, runAndCaptureUsingInitRaw("difftool", + option, "--tool", "some_tool")); + } + } + + @Test + public void testToolHelp() throws Exception { + String[] expectedOutput = { + "git difftool --tool= may be set to one of the following:", + "user-defined:", + "The following tools are valid, but not currently available:", + "Some of the tools listed above only work in a windowed", + "environment. If run in a terminal-only session, they will fail.", }; + + String option = "--tool-help"; + assertArrayOfLinesEquals("Incorrect output for option: " + option, + expectedOutput, runAndCaptureUsingInitRaw("difftool", option)); + } + + private RevCommit createUnstagedChanges() throws Exception { + writeTrashFile("a", "Hello world a"); + writeTrashFile("b", "Hello world b"); + git.add().addFilepattern(".").call(); + RevCommit commit = git.commit().setMessage("files a & b").call(); + writeTrashFile("a", "New Hello world a"); + writeTrashFile("b", "New Hello world b"); + return commit; + } + + private RevCommit createStagedChanges() throws Exception { + RevCommit commit = createUnstagedChanges(); + git.add().addFilepattern(".").call(); + return commit; + } + + private List getRepositoryChanges(RevCommit commit) + throws Exception { + TreeWalk tw = new TreeWalk(db); + tw.addTree(commit.getTree()); + FileTreeIterator modifiedTree = new FileTreeIterator(db); + tw.addTree(modifiedTree); + List changes = DiffEntry.scan(tw); + return changes; + } + + private String[] getExpectedDiffToolOutput(List changes) { + String[] expectedToolOutput = new String[changes.size()]; + for (int i = 0; i < changes.size(); ++i) { + DiffEntry change = changes.get(i); + String newPath = change.getNewPath(); + String oldPath = change.getOldPath(); + String newIdName = change.getNewId().name(); + String oldIdName = change.getOldId().name(); + String expectedLine = "M\t" + newPath + " (" + newIdName + ")" + + "\t" + oldPath + " (" + oldIdName + ")"; + expectedToolOutput[i] = expectedLine; + } + return expectedToolOutput; + } + + private static void assertArrayOfLinesEquals(String failMessage, + String[] expected, String[] actual) { + assertEquals(failMessage, toString(expected), toString(actual)); + } +} -- cgit v1.2.3