Browse Source

Fix JGit --upload-pack, --receive-pack options

JGit did not use sh -c to run the receive-pack or upload-pack programs
locally, which caused errors if these strings contained spaces and
needed the local shell to evaluate them.

Win32 support using cmd.exe /c is completely untested, but seems like
it should work based on the limited information I could get through
Google search results.

Bug: 336301
Change-Id: I22e5e3492fdebbae092d1ce6b47ad411e57cc1ba
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
stable-0.11
Shawn O. Pearce 14 years ago
parent
commit
c6423932bf
  1. 33
      org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java
  2. 14
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
  3. 16
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
  4. 15
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java
  5. 16
      org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java

33
org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportLocal.java

@ -55,6 +55,7 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.PipedInputStream; import java.io.PipedInputStream;
import java.io.PipedOutputStream; import java.io.PipedOutputStream;
import java.util.Map;
import org.eclipse.jgit.JGitText; import org.eclipse.jgit.JGitText;
import org.eclipse.jgit.errors.NotSupportedException; import org.eclipse.jgit.errors.NotSupportedException;
@ -146,22 +147,22 @@ class TransportLocal extends Transport implements PackTransport {
protected Process spawn(final String cmd) protected Process spawn(final String cmd)
throws TransportException { throws TransportException {
try { try {
final String[] args; String[] args = { "." };
ProcessBuilder proc = local.getFS().runInShell(cmd, args);
if (cmd.startsWith("git-")) { proc.directory(remoteGitDir);
args = new String[] { "git", cmd.substring(4), PWD };
} else { // Remove the same variables CGit does.
final int gitspace = cmd.indexOf("git "); Map<String, String> env = proc.environment();
if (gitspace >= 0) { env.remove("GIT_ALTERNATE_OBJECT_DIRECTORIES");
final String git = cmd.substring(0, gitspace + 3); env.remove("GIT_CONFIG");
final String subcmd = cmd.substring(gitspace + 4); env.remove("GIT_CONFIG_PARAMETERS");
args = new String[] { git, subcmd, PWD }; env.remove("GIT_DIR");
} else { env.remove("GIT_WORK_TREE");
args = new String[] { cmd, PWD }; env.remove("GIT_GRAFT_FILE");
} env.remove("GIT_INDEX_FILE");
} env.remove("GIT_NO_REPLACE_OBJECTS");
return Runtime.getRuntime().exec(args, null, remoteGitDir); return proc.start();
} catch (IOException err) { } catch (IOException err) {
throw new TransportException(uri, err.getMessage(), err); throw new TransportException(uri, err.getMessage(), err);
} }

14
org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java

@ -255,4 +255,18 @@ public abstract class FS {
/** @return the $prefix directory C Git would use. */ /** @return the $prefix directory C Git would use. */
public abstract File gitPrefix(); public abstract File gitPrefix();
/**
* Initialize a ProcesssBuilder to run a command using the system shell.
*
* @param cmd
* command to execute. This string should originate from the
* end-user, and thus is platform specific.
* @param args
* arguments to pass to command. These should be protected from
* shell evaluation.
* @return a partially completed process builder. Caller should finish
* populating directory, environment, and then start the process.
*/
public abstract ProcessBuilder runInShell(String cmd, String[] args);
} }

16
org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java

@ -46,6 +46,9 @@ import java.io.File;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
abstract class FS_POSIX extends FS { abstract class FS_POSIX extends FS {
@Override @Override
@ -69,6 +72,19 @@ abstract class FS_POSIX extends FS {
return null; return null;
} }
@Override
public ProcessBuilder runInShell(String cmd, String[] args) {
List<String> argv = new ArrayList<String>(4 + args.length);
argv.add("sh");
argv.add("-c");
argv.add(cmd + " \"$@\"");
argv.add(cmd);
argv.addAll(Arrays.asList(args));
ProcessBuilder proc = new ProcessBuilder();
proc.command(argv);
return proc;
}
private static boolean isMacOS() { private static boolean isMacOS() {
final String osDotName = AccessController final String osDotName = AccessController
.doPrivileged(new PrivilegedAction<String>() { .doPrivileged(new PrivilegedAction<String>() {

15
org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32.java

@ -48,6 +48,9 @@ import java.io.File;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class FS_Win32 extends FS { class FS_Win32 extends FS {
static boolean detect() { static boolean detect() {
@ -114,4 +117,16 @@ class FS_Win32 extends FS {
return super.userHomeImpl(); return super.userHomeImpl();
} }
@Override
public ProcessBuilder runInShell(String cmd, String[] args) {
List<String> argv = new ArrayList<String>(3 + args.length);
argv.add("cmd.exe");
argv.add("/c");
argv.add(cmd);
argv.addAll(Arrays.asList(args));
ProcessBuilder proc = new ProcessBuilder();
proc.command(argv);
return proc;
}
} }

16
org.eclipse.jgit/src/org/eclipse/jgit/util/FS_Win32_Cygwin.java

@ -46,6 +46,9 @@ package org.eclipse.jgit.util;
import java.io.File; import java.io.File;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class FS_Win32_Cygwin extends FS_Win32 { class FS_Win32_Cygwin extends FS_Win32 {
private static String cygpath; private static String cygpath;
@ -86,4 +89,17 @@ class FS_Win32_Cygwin extends FS_Win32 {
return super.userHomeImpl(); return super.userHomeImpl();
return resolve(new File("."), home); return resolve(new File("."), home);
} }
@Override
public ProcessBuilder runInShell(String cmd, String[] args) {
List<String> argv = new ArrayList<String>(4 + args.length);
argv.add("sh.exe");
argv.add("-c");
argv.add(cmd + " \"$@\"");
argv.add(cmd);
argv.addAll(Arrays.asList(args));
ProcessBuilder proc = new ProcessBuilder();
proc.command(argv);
return proc;
}
} }

Loading…
Cancel
Save