diff options
Diffstat (limited to 'org.eclipse.jgit.pgm.test/src')
-rw-r--r-- | org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java | 82 | ||||
-rw-r--r-- | org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/pgm/CLIGitCommand.java | 159 |
2 files changed, 241 insertions, 0 deletions
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 new file mode 100644 index 0000000000..7d0acd76c4 --- /dev/null +++ b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2012, IBM Corporation and others. + * 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.lib; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jgit.junit.JGitTestUtil; +import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; +import org.eclipse.jgit.pgm.CLIGitCommand; +import org.eclipse.jgit.storage.file.FileRepository; +import org.junit.Before; + +public class CLIRepositoryTestCase extends LocalDiskRepositoryTestCase { + /** Test repository, initialized for this test case. */ + protected FileRepository db; + + /** Working directory of {@link #db}. */ + protected File trash; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + db = createWorkRepository(); + trash = db.getWorkTree(); + } + + protected String[] execute(String... cmds) throws Exception { + List<String> result = new ArrayList<String>(cmds.length); + for (String cmd : cmds) + result.addAll(CLIGitCommand.execute(cmd, db)); + return result.toArray(new String[0]); + } + + protected File writeTrashFile(final String name, final String data) + throws IOException { + return JGitTestUtil.writeTrashFile(db, name, data); + } +} diff --git a/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/pgm/CLIGitCommand.java b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/pgm/CLIGitCommand.java new file mode 100644 index 0000000000..18abc82618 --- /dev/null +++ b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/pgm/CLIGitCommand.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2011-2012, IBM Corporation and others. + * 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 java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.pgm.opt.CmdLineParser; +import org.eclipse.jgit.pgm.opt.SubcommandHandler; +import org.eclipse.jgit.util.IO; +import org.kohsuke.args4j.Argument; + +public class CLIGitCommand { + @Argument(index = 0, metaVar = "metaVar_command", required = true, handler = SubcommandHandler.class) + private TextBuiltin subcommand; + + @Argument(index = 1, metaVar = "metaVar_arg") + private List<String> arguments = new ArrayList<String>(); + + public TextBuiltin getSubcommand() { + return subcommand; + } + + public List<String> getArguments() { + return arguments; + } + + public static List<String> execute(String str, Repository db) + throws Exception { + String[] args = split(str); + if (!args[0].equalsIgnoreCase("git") || args.length < 2) + throw new IllegalArgumentException( + "Expected 'git <command> [<args>]', was:" + str); + String[] argv = new String[args.length - 1]; + System.arraycopy(args, 1, argv, 0, args.length - 1); + + CLIGitCommand bean = new CLIGitCommand(); + final CmdLineParser clp = new CmdLineParser(bean); + clp.parseArgument(argv); + + final TextBuiltin cmd = bean.getSubcommand(); + if (cmd.requiresRepository()) + cmd.init(db, null); + else + cmd.init(null, null); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + cmd.out = new PrintWriter(new BufferedWriter(new OutputStreamWriter( + baos))); + try { + cmd.execute(bean.getArguments().toArray( + new String[bean.getArguments().size()])); + } finally { + if (cmd.out != null) + cmd.out.flush(); + } + return IO.readLines(baos.toString()); + } + + /** + * Split a command line into a string array. + * + * A copy of Gerrit's + * com.google.gerrit.sshd.CommandFactoryProvider#split(String) + * + * @param commandLine + * a command line + * @return the array + */ + static String[] split(String commandLine) { + final List<String> list = new ArrayList<String>(); + boolean inquote = false; + boolean inDblQuote = false; + StringBuilder r = new StringBuilder(); + for (int ip = 0; ip < commandLine.length();) { + final char b = commandLine.charAt(ip++); + switch (b) { + case '\t': + case ' ': + if (inquote || inDblQuote) + r.append(b); + else if (r.length() > 0) { + list.add(r.toString()); + r = new StringBuilder(); + } + continue; + case '\"': + if (inquote) + r.append(b); + else + inDblQuote = !inDblQuote; + continue; + case '\'': + if (inDblQuote) + r.append(b); + else + inquote = !inquote; + continue; + case '\\': + if (inquote || ip == commandLine.length()) + r.append(b); // literal within a quote + else + r.append(commandLine.charAt(ip++)); + continue; + default: + r.append(b); + continue; + } + } + if (r.length() > 0) + list.add(r.toString()); + return list.toArray(new String[list.size()]); + } + +} |