]> source.dussan.org Git - jgit.git/commitdiff
ReceivePack: support quiet capability 41/48241/2
authorShawn Pearce <spearce@spearce.org>
Wed, 20 May 2015 07:34:00 +0000 (00:34 -0700)
committerShawn Pearce <spearce@spearce.org>
Wed, 20 May 2015 15:23:47 +0000 (08:23 -0700)
git-core has supported this for a long time; allowing clients to
avoid progress messages from the server if they are dumping to a
pipe instead of a tty.

Avoid the two progress monitors going on side-band and expose
isQuiet() method to allow hooks to also reduce their output if
this is sensible for them.

Change-Id: I1df7e38d16765446b441366500b017a90b8ff958

org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java

index a18df0dd0ab3debfec3a7c292f53a2606cc306c0..eb770125c18fc9a6000b4776d0b69300c652ca16 100644 (file)
@@ -46,6 +46,7 @@ package org.eclipse.jgit.transport;
 import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_ATOMIC;
 import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_DELETE_REFS;
 import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_OFS_DELTA;
+import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_QUIET;
 import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_REPORT_STATUS;
 import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_SIDE_BAND_64K;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_AGENT;
@@ -176,6 +177,7 @@ public abstract class BaseReceivePack {
        private boolean allowNonFastForwards;
 
        private boolean allowOfsDelta;
+       private boolean allowQuiet = true;
 
        /** Identity to record action as within the reflog. */
        private PersonIdent refLogIdent;
@@ -234,6 +236,8 @@ public abstract class BaseReceivePack {
        /** If {@link BasePackPushConnection#CAPABILITY_SIDE_BAND_64K} is enabled. */
        private boolean sideBand;
 
+       private boolean quiet;
+
        /** Lock around the received pack file, while updating refs. */
        private PackLock packLock;
 
@@ -740,6 +744,45 @@ public abstract class BaseReceivePack {
                return enabledCapabilities.contains(CAPABILITY_SIDE_BAND_64K);
        }
 
+       /**
+        * @return true if clients may request avoiding noisy progress messages.
+        * @since 4.0
+        */
+       public boolean isAllowQuiet() {
+               return allowQuiet;
+       }
+
+       /**
+        * Configure if clients may request the server skip noisy messages.
+        *
+        * @param allow
+        *            true to allow clients to request quiet behavior; false to
+        *            refuse quiet behavior and send messages anyway. This may be
+        *            necessary if processing is slow and the client-server network
+        *            connection can timeout.
+        * @since 4.0
+        */
+       public void setAllowQuiet(boolean allow) {
+               allowQuiet = allow;
+       }
+
+       /**
+        * True if the client wants less verbose output.
+        *
+        * @return true if the client has requested the server to be less verbose.
+        * @throws RequestNotYetReadException
+        *             if the client's request has not yet been read from the wire,
+        *             so we do not know if they expect side-band. Note that the
+        *             client may have already written the request, it just has not
+        *             been read.
+        * @since 4.0
+        */
+       public boolean isQuiet() throws RequestNotYetReadException {
+               if (enabledCapabilities == null)
+                       throw new RequestNotYetReadException();
+               return quiet;
+       }
+
        /**
         * Get the user agent of the client.
         * <p>
@@ -969,6 +1012,8 @@ public abstract class BaseReceivePack {
                adv.advertiseCapability(CAPABILITY_SIDE_BAND_64K);
                adv.advertiseCapability(CAPABILITY_DELETE_REFS);
                adv.advertiseCapability(CAPABILITY_REPORT_STATUS);
+               if (allowQuiet)
+                       adv.advertiseCapability(CAPABILITY_QUIET);
                if (pushCertificateParser.enabled())
                        adv.advertiseCapability(
                                pushCertificateParser.getAdvertiseNonce());
@@ -1046,6 +1091,7 @@ public abstract class BaseReceivePack {
        /** Enable capabilities based on a previously read capabilities line. */
        protected void enableCapabilities() {
                sideBand = isCapabilityEnabled(CAPABILITY_SIDE_BAND_64K);
+               quiet = allowQuiet && isCapabilityEnabled(CAPABILITY_QUIET);
                if (sideBand) {
                        OutputStream out = rawOut;
 
@@ -1093,7 +1139,7 @@ public abstract class BaseReceivePack {
 
                ProgressMonitor receiving = NullProgressMonitor.INSTANCE;
                ProgressMonitor resolving = NullProgressMonitor.INSTANCE;
-               if (sideBand)
+               if (sideBand && !quiet)
                        resolving = new SideBandProgressMonitor(msgOut);
 
                try (ObjectInserter ins = db.newObjectInserter()) {
@@ -1130,7 +1176,7 @@ public abstract class BaseReceivePack {
                ObjectIdSubclassMap<ObjectId> baseObjects = null;
                ObjectIdSubclassMap<ObjectId> providedObjects = null;
                ProgressMonitor checking = NullProgressMonitor.INSTANCE;
-               if (sideBand) {
+               if (sideBand && !quiet) {
                        SideBandProgressMonitor m = new SideBandProgressMonitor(msgOut);
                        m.setDelayStart(750, TimeUnit.MILLISECONDS);
                        checking = m;
index 8d9d2b718d4de6d310a6093ebfb859613a5d73bc..8d2d554b91a616dd315d0908d02029458dda63ba 100644 (file)
@@ -151,6 +151,13 @@ public class GitProtocolConstants {
         */
        public static final String CAPABILITY_ATOMIC = "atomic"; //$NON-NLS-1$
 
+       /**
+        * The client expects less noise, e.g. no progress.
+        *
+        * @since 4.0
+        */
+       public static final String CAPABILITY_QUIET = "quiet"; //$NON-NLS-1$
+
        /**
         * The client expects a status report after the server processes the pack.
         *