diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java index b9923b95e..4bd3af2f8 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java @@ -69,6 +69,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.errors.InvalidObjectIdException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.PackProtocolException; @@ -845,9 +846,11 @@ public abstract class BaseReceivePack { } /** - * Gets the list of string options associated with this push. + * Gets an unmodifiable view of the option strings associated with the push. * - * @return pushOptions + * @return an unmodifiable view of pushOptions, or null (if pushOptions is). + * @throws IllegalStateException + * if allowPushOptions has not been set to true. * @throws RequestNotYetReadException * if the client's request has not yet been read from the wire, * so we do not know if they expect push options. Note that the @@ -855,10 +858,23 @@ public abstract class BaseReceivePack { * been read. * @since 4.5 */ - public List getPushOptions() throws RequestNotYetReadException { + @Nullable + public List getPushOptions() { + if (!allowPushOptions) { + // Reading push options without a prior setAllowPushOptions(true) + // call doesn't make sense. + throw new IllegalStateException(); + } if (enabledCapabilities == null) { + // Push options are not available until receive() has been called. throw new RequestNotYetReadException(); } + if (pushOptions == null) { + // The client doesn't support push options. Return null to + // distinguish this from the case where the client declared support + // for push options and sent an empty list of them. + return null; + } return Collections.unmodifiableList(pushOptions); }