]> source.dussan.org Git - jgit.git/commitdiff
Extract the capability parsing logic in {Upload,Receive}Pack 95/5295/1
authorDave Borowitz <dborowitz@google.com>
Wed, 7 Mar 2012 20:53:49 +0000 (12:53 -0800)
committerDave Borowitz <dborowitz@google.com>
Wed, 7 Mar 2012 20:53:49 +0000 (12:53 -0800)
Change-Id: I7ac4e0ae98872a74b01162b5ca936fb15e2f8cff

org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java

index f74e6661ba3786802bb6d424b538ee6c455b6343..0b43560912352c4803fe4148ea219dbe62875e29 100644 (file)
@@ -98,6 +98,39 @@ import org.eclipse.jgit.util.io.TimeoutOutputStream;
  * Implements the server side of a push connection, receiving objects.
  */
 public class ReceivePack {
+       /** Data in the first line of a request, the line itself plus capabilities. */
+       public static class FirstLine {
+               private final String line;
+               private final Set<String> capabilities;
+
+               /**
+                * Parse the first line of a receive-pack request.
+                *
+                * @param line
+                *            line from the client.
+                */
+               public FirstLine(String line) {
+                       final HashSet<String> caps = new HashSet<String>();
+                       final int nul = line.indexOf('\0');
+                       if (nul >= 0) {
+                               for (String c : line.substring(nul + 1).split(" "))
+                                       caps.add(c);
+                       }
+                       this.line = line.substring(0, nul);
+                       this.capabilities = Collections.unmodifiableSet(caps);
+               }
+
+               /** @return non-capabilities part of the line. */
+               public String getLine() {
+                       return line;
+               }
+
+               /** @return capabilities parsed from the line. */
+               public Set<String> getCapabilities() {
+                       return capabilities;
+               }
+       }
+
        /** Database we write the stored objects into. */
        private final Repository db;
 
@@ -713,7 +746,6 @@ public class ReceivePack {
                        pckOut = new PacketLineOut(rawOut);
                        pckOut.setFlushOnEnd(false);
 
-                       enabledCapabilities = new HashSet<String>();
                        commands = new ArrayList<ReceiveCommand>();
 
                        service();
@@ -891,12 +923,9 @@ public class ReceivePack {
                                break;
 
                        if (commands.isEmpty()) {
-                               final int nul = line.indexOf('\0');
-                               if (nul >= 0) {
-                                       for (String c : line.substring(nul + 1).split(" "))
-                                               enabledCapabilities.add(c);
-                                       line = line.substring(0, nul);
-                               }
+                               final FirstLine firstLine = new FirstLine(line);
+                               enabledCapabilities = firstLine.getCapabilities();
+                               line = firstLine.getLine();
                        }
 
                        if (line.length() < 83) {
index c61a23cabbb4b556461bd78e9c2645290c43fd5c..fd3df85db56c0cfa76776c2dc5cf218553622005 100644 (file)
@@ -118,6 +118,44 @@ public class UploadPack {
                ANY;
        }
 
+       /** Data in the first line of a request, the line itself plus options. */
+       public static class FirstLine {
+               private final String line;
+               private final Set<String> options;
+
+               /**
+                * Parse the first line of a receive-pack request.
+                *
+                * @param line
+                *            line from the client.
+                */
+               public FirstLine(String line) {
+                       if (line.length() > 45) {
+                               final HashSet<String> opts = new HashSet<String>();
+                               String opt = line.substring(45);
+                               if (opt.startsWith(" "))
+                                       opt = opt.substring(1);
+                               for (String c : opt.split(" "))
+                                       opts.add(c);
+                               this.line = line.substring(0, 45);
+                               this.options = Collections.unmodifiableSet(opts);
+                       } else {
+                               this.line = line;
+                               this.options = Collections.emptySet();
+                       }
+               }
+
+               /** @return non-capabilities part of the line. */
+               public String getLine() {
+                       return line;
+               }
+
+               /** @return options parsed from the line. */
+               public Set<String> getOptions() {
+                       return options;
+               }
+       }
+
        /** Database we read the objects from. */
        private final Repository db;
 
@@ -167,7 +205,7 @@ public class UploadPack {
        private PreUploadHook preUploadHook = PreUploadHook.NULL;
 
        /** Capabilities requested by the client. */
-       private final Set<String> options = new HashSet<String>();
+       private Set<String> options;
 
        /** Raw ObjectIds the client has asked for, before validating them. */
        private final Set<ObjectId> wantIds = new HashSet<ObjectId>();
@@ -664,12 +702,9 @@ public class UploadPack {
                                throw new PackProtocolException(MessageFormat.format(JGitText.get().expectedGot, "want", line));
 
                        if (isFirst && line.length() > 45) {
-                               String opt = line.substring(45);
-                               if (opt.startsWith(" "))
-                                       opt = opt.substring(1);
-                               for (String c : opt.split(" "))
-                                       options.add(c);
-                               line = line.substring(0, 45);
+                               final FirstLine firstLine = new FirstLine(line);
+                               options = firstLine.getOptions();
+                               line = firstLine.getLine();
                        }
 
                        wantIds.add(ObjectId.fromString(line.substring(5)));