Add protocol v2 support in "jgit daemon"
With this patch, a server spawned by "jgit daemon" can be accessed using protocol v2 from a Git client that supports it (for example, "git" with the appropriate patches). This is only activated if the repository's config has "protocol.version" be 2. This required a change to the package-private #execute methods in DaemonService to allow passing of extra parameters. This has been tested with a patched Git. Change-Id: Icf043efec7ce956d72b075fc6dc7a87d5a2da82a Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
This commit is contained in:
parent
526f5cf984
commit
2841bab938
|
@ -53,7 +53,9 @@
|
|||
import java.net.SocketAddress;
|
||||
import java.net.SocketException;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.eclipse.jgit.annotations.Nullable;
|
||||
import org.eclipse.jgit.errors.RepositoryNotFoundException;
|
||||
import org.eclipse.jgit.internal.JGitText;
|
||||
import org.eclipse.jgit.lib.PersonIdent;
|
||||
|
@ -153,12 +155,17 @@ public ReceivePack create(DaemonClient req, Repository db)
|
|||
|
||||
@Override
|
||||
protected void execute(final DaemonClient dc,
|
||||
final Repository db) throws IOException,
|
||||
final Repository db,
|
||||
@Nullable Collection<String> extraParameters)
|
||||
throws IOException,
|
||||
ServiceNotEnabledException,
|
||||
ServiceNotAuthorizedException {
|
||||
UploadPack up = uploadPackFactory.create(dc, db);
|
||||
InputStream in = dc.getInputStream();
|
||||
OutputStream out = dc.getOutputStream();
|
||||
if (extraParameters != null) {
|
||||
up.setExtraParameters(extraParameters);
|
||||
}
|
||||
up.upload(in, out, null);
|
||||
}
|
||||
}, new DaemonService("receive-pack", "receivepack") { //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
@ -168,7 +175,9 @@ protected void execute(final DaemonClient dc,
|
|||
|
||||
@Override
|
||||
protected void execute(final DaemonClient dc,
|
||||
final Repository db) throws IOException,
|
||||
final Repository db,
|
||||
@Nullable Collection<String> extraParameters)
|
||||
throws IOException,
|
||||
ServiceNotEnabledException,
|
||||
ServiceNotAuthorizedException {
|
||||
ReceivePack rp = receivePackFactory.create(dc, db);
|
||||
|
|
|
@ -50,6 +50,8 @@
|
|||
import java.io.OutputStream;
|
||||
import java.net.InetAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
|
||||
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
|
||||
|
@ -118,6 +120,14 @@ void execute(final Socket sock) throws IOException,
|
|||
if (0 < daemon.getTimeout())
|
||||
sock.setSoTimeout(daemon.getTimeout() * 1000);
|
||||
String cmd = new PacketLineIn(rawIn).readStringRaw();
|
||||
|
||||
Collection<String> extraParameters = null;
|
||||
|
||||
int nulnul = cmd.indexOf("\0\0"); //$NON-NLS-1$
|
||||
if (nulnul != -1) {
|
||||
extraParameters = Arrays.asList(cmd.substring(nulnul + 2).split("\0")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
final int nul = cmd.indexOf('\0');
|
||||
if (nul >= 0) {
|
||||
// Newer clients hide a "host" header behind this byte.
|
||||
|
@ -131,6 +141,6 @@ void execute(final Socket sock) throws IOException,
|
|||
if (srv == null)
|
||||
return;
|
||||
sock.setSoTimeout(0);
|
||||
srv.execute(this, cmd);
|
||||
srv.execute(this, cmd, extraParameters);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
package org.eclipse.jgit.transport;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.eclipse.jgit.annotations.Nullable;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
import org.eclipse.jgit.lib.Config.SectionParser;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
|
@ -146,13 +148,14 @@ public boolean handles(String commandLine) {
|
|||
&& commandLine.startsWith(command);
|
||||
}
|
||||
|
||||
void execute(final DaemonClient client, final String commandLine)
|
||||
void execute(DaemonClient client, String commandLine,
|
||||
@Nullable Collection<String> extraParameters)
|
||||
throws IOException, ServiceNotEnabledException,
|
||||
ServiceNotAuthorizedException {
|
||||
final String name = commandLine.substring(command.length() + 1);
|
||||
try (Repository db = client.getDaemon().openRepository(client, name)) {
|
||||
if (isEnabledFor(db)) {
|
||||
execute(client, db);
|
||||
execute(client, db, extraParameters);
|
||||
}
|
||||
} catch (ServiceMayNotContinueException e) {
|
||||
// An error when opening the repo means the client is expecting a ref
|
||||
|
@ -168,7 +171,8 @@ private boolean isEnabledFor(Repository db) {
|
|||
return isEnabled();
|
||||
}
|
||||
|
||||
abstract void execute(DaemonClient client, Repository db)
|
||||
abstract void execute(DaemonClient client, Repository db,
|
||||
@Nullable Collection<String> extraParameters)
|
||||
throws IOException, ServiceNotEnabledException,
|
||||
ServiceNotAuthorizedException;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue