]> source.dussan.org Git - jgit.git/commitdiff
Add protocol v2 support in "jgit daemon" 54/119454/14
authorJonathan Tan <jonathantanmy@google.com>
Sat, 24 Feb 2018 00:55:03 +0000 (16:55 -0800)
committerJonathan Nieder <jrn@google.com>
Thu, 17 May 2018 00:58:31 +0000 (20:58 -0400)
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>
org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonClient.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java

index 2b2f25782225d0e06e4419fe805f0083d4f7b5a2..6563905282711eb3abe8cff647e5fc76090161df 100644 (file)
@@ -53,7 +53,9 @@ import java.net.Socket;
 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 class Daemon {
 
                                        @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 @@ public class Daemon {
 
                                        @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);
index a9731ac3a46be28cbabe22cd5fca537d240f1f94..65b2dc61e743ed5bba38e713d7fd3211ec894dd3 100644 (file)
@@ -50,6 +50,8 @@ import java.io.InputStream;
 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 @@ public class DaemonClient {
                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 @@ public class DaemonClient {
                if (srv == null)
                        return;
                sock.setSoTimeout(0);
-               srv.execute(this, cmd);
+               srv.execute(this, cmd, extraParameters);
        }
 }
index 1dc55beb153da0213d3a6939e83819b439d15934..1b24f404d26f23c2d045694f46e2026913ec9f31 100644 (file)
@@ -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 abstract class DaemonService {
                                && 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 @@ public abstract class DaemonService {
                return isEnabled();
        }
 
-       abstract void execute(DaemonClient client, Repository db)
+       abstract void execute(DaemonClient client, Repository db,
+                       @Nullable Collection<String> extraParameters)
                        throws IOException, ServiceNotEnabledException,
                        ServiceNotAuthorizedException;
 }