com.google.gerrit.extensions.api.changes.ChangeApi Maven / Gradle / Ivy
// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.extensions.api.changes;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.client.ReviewerState;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeInfoDifference;
import com.google.gerrit.extensions.common.ChangeMessageInfo;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.common.CommitMessageInfo;
import com.google.gerrit.extensions.common.CommitMessageInput;
import com.google.gerrit.extensions.common.MergePatchSetInput;
import com.google.gerrit.extensions.common.PureRevertInfo;
import com.google.gerrit.extensions.common.RebaseChainInfo;
import com.google.gerrit.extensions.common.RevertSubmissionInfo;
import com.google.gerrit.extensions.common.RobotCommentInfo;
import com.google.gerrit.extensions.common.SubmitRequirementInput;
import com.google.gerrit.extensions.common.SubmitRequirementResultInfo;
import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
import com.google.gerrit.extensions.common.ValidationOptionInfos;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface ChangeApi {
  String id();
  /**
   * Look up the current revision for the change.
   *
   * Note: This method eagerly reads the revision. Methods that mutate the
   * revision do not necessarily re-read the revision. Therefore, calling a getter method on an
   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
   * mutation. It is not recommended to store references to {@code RevisionApi} instances.
   *
   * @return API for accessing the revision.
   * @throws RestApiException if an error occurred.
   */
  default RevisionApi current() throws RestApiException {
    return revision("current");
  }
  /**
   * Look up a revision of a change by number.
   *
   * @see #current()
   */
  default RevisionApi revision(int id) throws RestApiException {
    return revision(Integer.toString(id));
  }
  /**
   * Look up a revision of a change by commit SHA-1 or other supported revision string.
   *
   * @see #current()
   */
  RevisionApi revision(String id) throws RestApiException;
  /**
   * Look up the reviewer of the change.
   *
   * 
   *
   * @param id ID of the account, can be a string of the format "Full Name
   *     <[email protected]>", just the email address, a full name if it is unique, an account
   *     ID, a user name or 'self' for the calling user.
   * @return API for accessing the reviewer.
   * @throws RestApiException if id is not account ID or is a user that isn't known to be a reviewer
   *     for this change.
   */
  ReviewerApi reviewer(String id) throws RestApiException;
  default void abandon() throws RestApiException {
    abandon(new AbandonInput());
  }
  void abandon(AbandonInput in) throws RestApiException;
  default void restore() throws RestApiException {
    restore(new RestoreInput());
  }
  void restore(RestoreInput in) throws RestApiException;
  default void move(String destination) throws RestApiException {
    MoveInput in = new MoveInput();
    in.destinationBranch = destination;
    move(in);
  }
  void move(MoveInput in) throws RestApiException;
  void setPrivate(boolean value, @Nullable String message) throws RestApiException;
  default void setPrivate(boolean value) throws RestApiException {
    setPrivate(value, null);
  }
  void setWorkInProgress(@Nullable String message) throws RestApiException;
  void setReadyForReview(@Nullable String message) throws RestApiException;
  default void setWorkInProgress() throws RestApiException {
    setWorkInProgress(null);
  }
  default void setReadyForReview() throws RestApiException {
    setReadyForReview(null);
  }
  /**
   * Create a new change that reverts this change.
   *
   * @see Changes#id(String, int)
   */
  @CanIgnoreReturnValue
  default ChangeApi revert() throws RestApiException {
    return revert(new RevertInput());
  }
  /**
   * Create a new change that reverts this change.
   *
   * @see Changes#id(String, int)
   */
  @CanIgnoreReturnValue
  ChangeApi revert(RevertInput in) throws RestApiException;
  @CanIgnoreReturnValue
  default RevertSubmissionInfo revertSubmission() throws RestApiException {
    return revertSubmission(new RevertInput());
  }
  @CanIgnoreReturnValue
  RevertSubmissionInfo revertSubmission(RevertInput in) throws RestApiException;
  /** Create a merge patch set for the change. */
  @CanIgnoreReturnValue
  ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException;
  @CanIgnoreReturnValue
  ChangeInfo applyPatch(ApplyPatchPatchSetInput in) throws RestApiException;
  default List submittedTogether() throws RestApiException {
    SubmittedTogetherInfo info =
        submittedTogether(
            EnumSet.noneOf(ListChangesOption.class), EnumSet.noneOf(SubmittedTogetherOption.class));
    return info.changes;
  }
  default SubmittedTogetherInfo submittedTogether(EnumSet options)
      throws RestApiException {
    return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options);
  }
  SubmittedTogetherInfo submittedTogether(
      EnumSet listOptions, EnumSet submitOptions)
      throws RestApiException;
  /** Rebase the current revision of a change using default options. */
  default void rebase() throws RestApiException {
    rebase(new RebaseInput());
  }
  /** Rebase the current revision of a change. */
  void rebase(RebaseInput in) throws RestApiException;
  /**
   * Rebase the current revisions of a change's chain using default options.
   *
   * @return a {@code RebaseChainInfo} contains the {@code ChangeInfo} data for the rebased the
   *     chain
   */
  @CanIgnoreReturnValue
  default Response rebaseChain() throws RestApiException {
    return rebaseChain(new RebaseInput());
  }
  /**
   * Rebase the current revisions of a change's chain.
   *
   * @return a {@code RebaseChainInfo} contains the {@code ChangeInfo} data for the rebased the
   *     chain
   */
  @CanIgnoreReturnValue
  Response rebaseChain(RebaseInput in) throws RestApiException;
  /** Deletes a change. */
  void delete() throws RestApiException;
  String topic() throws RestApiException;
  void topic(String topic) throws RestApiException;
  IncludedInInfo includedIn() throws RestApiException;
  @CanIgnoreReturnValue
  default ReviewerResult addReviewer(String reviewer) throws RestApiException {
    ReviewerInput in = new ReviewerInput();
    in.reviewer = reviewer;
    return addReviewer(in);
  }
  @CanIgnoreReturnValue
  ReviewerResult addReviewer(ReviewerInput in) throws RestApiException;
  SuggestedReviewersRequest suggestReviewers() throws RestApiException;
  default SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
    return suggestReviewers().withQuery(query);
  }
  default SuggestedReviewersRequest suggestCcs(String query) throws RestApiException {
    return suggestReviewers().forCc().withQuery(query);
  }
  /**
   * Retrieve reviewers ({@code ReviewerState.REVIEWER} and {@code ReviewerState.CC}) on the change.
   */
  List reviewers() throws RestApiException;
  ChangeInfo get(
      EnumSet options, ImmutableListMultimap pluginOptions)
      throws RestApiException;
  default ChangeInfo get(ImmutableListMultimap pluginOptions)
      throws RestApiException {
    return get(EnumSet.noneOf(ListChangesOption.class), pluginOptions);
  }
  default ChangeInfo get(EnumSet options) throws RestApiException {
    return get(options, ImmutableListMultimap.of());
  }
  default ChangeInfo get(Iterable options) throws RestApiException {
    return get(Sets.newEnumSet(options, ListChangesOption.class));
  }
  default ChangeInfo get(ListChangesOption... options) throws RestApiException {
    return get(Arrays.asList(options));
  }
  /**
   * {@link #get(ListChangesOption...)} with all options included, except for the following.
   *
   * 
   *   - {@code CHECK} is omitted, to skip consistency checks.
   *   
 - {@code SKIP_DIFFSTAT} is omitted to ensure diffstat calculations.
   * 
 
   */
  default ChangeInfo get() throws RestApiException {
    return get(
        EnumSet.complementOf(EnumSet.of(ListChangesOption.CHECK, ListChangesOption.SKIP_DIFFSTAT)));
  }
  default ChangeInfoDifference metaDiff(
      @Nullable String oldMetaRevId, @Nullable String newMetaRevId) throws RestApiException {
    return metaDiff(
        oldMetaRevId,
        newMetaRevId,
        EnumSet.noneOf(ListChangesOption.class),
        ImmutableListMultimap.of());
  }
  default ChangeInfoDifference metaDiff(
      @Nullable String oldMetaRevId, @Nullable String newMetaRevId, ListChangesOption... options)
      throws RestApiException {
    return metaDiff(oldMetaRevId, newMetaRevId, Arrays.asList(options));
  }
  default ChangeInfoDifference metaDiff(
      @Nullable String oldMetaRevId,
      @Nullable String newMetaRevId,
      Collection options)
      throws RestApiException {
    return metaDiff(
        oldMetaRevId,
        newMetaRevId,
        Sets.newEnumSet(options, ListChangesOption.class),
        ImmutableListMultimap.of());
  }
  /**
   * Gets the diff between a change's metadata with the two given refs.
   *
   * @param oldMetaRevId the SHA-1 of the 'before' metadata diffed against {@code newMetaRevId}
   * @param newMetaRevId the SHA-1 of the 'after' metadata diffed against {@code oldMetaRevId}
   */
  ChangeInfoDifference metaDiff(
      @Nullable String oldMetaRevId,
      @Nullable String newMetaRevId,
      EnumSet options,
      ImmutableListMultimap pluginOptions)
      throws RestApiException;
  /** {@link #get(ListChangesOption...)} with no options included. */
  default ChangeInfo info() throws RestApiException {
    return get(EnumSet.noneOf(ListChangesOption.class));
  }
  /**
   * Provides access to an API regarding the change edit of this change.
   *
   * @return a {@code ChangeEditApi} for the change edit of this change
   * @throws RestApiException if the API isn't accessible
   */
  ChangeEditApi edit() throws RestApiException;
  CommitMessageInfo getMessage() throws RestApiException;
  /** Create a new patch set with a new commit message. */
  default void setMessage(String message) throws RestApiException {
    CommitMessageInput in = new CommitMessageInput();
    in.message = message;
    setMessage(in);
  }
  /** Create a new patch set with a new commit message. */
  void setMessage(CommitMessageInput in) throws RestApiException;
  /** Set hashtags on a change */
  void setHashtags(HashtagsInput input) throws RestApiException;
  /**
   * Get hashtags on a change.
   *
   * @return hashtags
   */
  Set getHashtags() throws RestApiException;
  /** Set custom keyed values on a change */
  void setCustomKeyedValues(CustomKeyedValuesInput input) throws RestApiException;
  /**
   * Gets the custom keyed values on a change.
   *
   * @return customKeyedValues
   */
  ImmutableMap getCustomKeyedValues() throws RestApiException;
  /**
   * Gets the validation options on a change.
   *
   * @return validationOptions
   */
  ValidationOptionInfos getValidationOptions() throws RestApiException;
  /**
   * Manage the attention set.
   *
   * @param id The account identifier.
   */
  AttentionSetApi attention(String id) throws RestApiException;
  /** Adds a user to the attention set. */
  @CanIgnoreReturnValue
  AccountInfo addToAttentionSet(AttentionSetInput input) throws RestApiException;
  /**
   * Get all published comments on a change.
   *
   * @return comments in a map keyed by path; comments have the {@code revision} field set to
   *     indicate their patch set.
   * @deprecated Callers should use {@link #commentsRequest()} instead
   */
  @Deprecated
  default Map> comments() throws RestApiException {
    return commentsRequest().get();
  }
  /**
   * Get all published comments on a change as a list.
   *
   * @return comments as a list; comments have the {@code revision} field set to indicate their
   *     patch set.
   * @deprecated Callers should use {@link #commentsRequest()} instead
   */
  @Deprecated
  default List commentsAsList() throws RestApiException {
    return commentsRequest().getAsList();
  }
  /**
   * Get a {@link CommentsRequest} entity that can be used to retrieve published comments.
   *
   * @return A {@link CommentsRequest} entity that can be used to retrieve the comments using the
   *     {@link CommentsRequest#get()} or {@link CommentsRequest#getAsList()}.
   */
  CommentsRequest commentsRequest() throws RestApiException;
  /**
   * Get all robot comments on a change.
   *
   * @return robot comments in a map keyed by path; robot comments have the {@code revision} field
   *     set to indicate their patch set.
   */
  Map> robotComments() throws RestApiException;
  /**
   * Get all draft comments for the current user on a change.
   *
   * @return drafts in a map keyed by path; comments have the {@code revision} field set to indicate
   *     their patch set.
   */
  default Map> drafts() throws RestApiException {
    return draftsRequest().get();
  }
  /**
   * Get all draft comments for the current user on a change as a list.
   *
   * @return drafts as a list; comments have the {@code revision} field set to indicate their patch
   *     set.
   */
  default List draftsAsList() throws RestApiException {
    return draftsRequest().getAsList();
  }
  /**
   * Get a {@link DraftsRequest} entity that can be used to retrieve draft comments.
   *
   * @return A {@link DraftsRequest} entity that can be used to retrieve the draft comments using
   *     {@link DraftsRequest#get()} or {@link DraftsRequest#getAsList()}.
   */
  DraftsRequest draftsRequest() throws RestApiException;
  ChangeInfo check() throws RestApiException;
  ChangeInfo check(FixInput fix) throws RestApiException;
  abstract class CheckSubmitRequirementRequest {
    /** Submit requirement name. */
    private String name;
    /**
     * A change ID for a change in {@link com.google.gerrit.entities.RefNames#REFS_CONFIG} branch
     * from which the submit-requirement will be loaded.
     */
    private String refsConfigChangeId;
    public abstract SubmitRequirementResultInfo get() throws RestApiException;
    public CheckSubmitRequirementRequest srName(String srName) {
      this.name = srName;
      return this;
    }
    public CheckSubmitRequirementRequest refsConfigChangeId(String changeId) {
      this.refsConfigChangeId = changeId;
      return this;
    }
    protected String srName() {
      return name;
    }
    protected String getRefsConfigChangeId() {
      return refsConfigChangeId;
    }
  }
  CheckSubmitRequirementRequest checkSubmitRequirementRequest() throws RestApiException;
  /** Returns the result of evaluating the {@link SubmitRequirementInput} input on the change. */
  SubmitRequirementResultInfo checkSubmitRequirement(SubmitRequirementInput input)
      throws RestApiException;
  void index() throws RestApiException;
  /** Check if this change is a pure revert of the change stored in revertOf. */
  @CanIgnoreReturnValue
  PureRevertInfo pureRevert() throws RestApiException;
  /** Check if this change is a pure revert of claimedOriginal (SHA1 in 40 digit hex). */
  @CanIgnoreReturnValue
  PureRevertInfo pureRevert(String claimedOriginal) throws RestApiException;
  /**
   * Get all messages of a change with detailed account info.
   *
   * @return a list of messages sorted by their creation time.
   */
  List messages() throws RestApiException;
  /**
   * Look up a change message of a change by its id.
   *
   * @param id the id of the change message. In NoteDb, this id is the {@code ObjectId} of a commit
   *     on the change meta branch.
   * @return API for accessing a change message.
   * @throws RestApiException if the id is invalid.
   */
  ChangeMessageApi message(String id) throws RestApiException;
  abstract class CommentsRequest {
    private boolean enableContext;
    private int contextPadding;
    /**
     * Get all published comments on a change.
     *
     * @return comments in a map keyed by path; comments have the {@code revision} field set to
     *     indicate their patch set.
     */
    public abstract Map> get() throws RestApiException;
    /**
     * Get all published comments on a change as a list.
     *
     * @return comments as a list; comments have the {@code revision} field set to indicate their
     *     patch set.
     */
    public abstract List getAsList() throws RestApiException;
    public CommentsRequest withContext(boolean enableContext) {
      this.enableContext = enableContext;
      return this;
    }
    public CommentsRequest contextPadding(int contextPadding) {
      this.contextPadding = contextPadding;
      return this;
    }
    public CommentsRequest withContext() {
      this.enableContext = true;
      return this;
    }
    public boolean getContext() {
      return enableContext;
    }
    public int getContextPadding() {
      return contextPadding;
    }
  }
  abstract class DraftsRequest extends CommentsRequest {}
  abstract class SuggestedReviewersRequest {
    private String query;
    private int limit;
    private boolean excludeGroups;
    private ReviewerState reviewerState = ReviewerState.REVIEWER;
    public abstract List get() throws RestApiException;
    public SuggestedReviewersRequest withQuery(String query) {
      this.query = query;
      return this;
    }
    public SuggestedReviewersRequest withLimit(int limit) {
      this.limit = limit;
      return this;
    }
    public SuggestedReviewersRequest excludeGroups(boolean excludeGroups) {
      this.excludeGroups = excludeGroups;
      return this;
    }
    public SuggestedReviewersRequest forCc() {
      this.reviewerState = ReviewerState.CC;
      return this;
    }
    public String getQuery() {
      return query;
    }
    public int getLimit() {
      return limit;
    }
    public boolean getExcludeGroups() {
      return excludeGroups;
    }
    public ReviewerState getReviewerState() {
      return reviewerState;
    }
  }
}