1   /*
2    * Copyright 2021 LINE Corporation
3    *
4    * LINE Corporation licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package com.linecorp.centraldogma.client;
17  
18  import static java.util.Objects.requireNonNull;
19  
20  import java.util.List;
21  import java.util.concurrent.CompletableFuture;
22  
23  import com.linecorp.centraldogma.common.Change;
24  import com.linecorp.centraldogma.common.Revision;
25  
26  /**
27   * Prepares to send a {@link CentralDogma#getPreviewDiffs(String, String, Revision, Iterable)} request to the
28   * Central Dogma repository.
29   */
30  public final class PreviewDiffRequest {
31  
32      private final CentralDogmaRepository centralDogmaRepo;
33      private final Iterable<? extends Change<?>> changes;
34  
35      PreviewDiffRequest(CentralDogmaRepository centralDogmaRepo,
36                         Iterable<? extends Change<?>> changes) {
37          this.centralDogmaRepo = centralDogmaRepo;
38          this.changes = changes;
39      }
40  
41      /**
42       * Retrieves the <em>preview diffs</em>, which are hypothetical diffs generated from the
43       * {@link Revision#HEAD} and the latest {@link Revision} if the {@link Change}s were
44       * successfully pushed to the specified repository. This operation is useful for
45       * pre-checking if the {@link Change}s will be applied as expected without any conflicts.
46       *
47       * @return the diffs which would be committed if the {@link Change}s were pushed successfully
48       */
49      public CompletableFuture<List<Change<?>>> get() {
50          return get(Revision.HEAD);
51      }
52  
53      /**
54       * Retrieves the <em>preview diffs</em>, which are hypothetical diffs generated from the specified
55       * {@link Revision} and the latest {@link Revision} if the {@link Change}s were
56       * successfully pushed to the specified repository. This operation is useful for
57       * pre-checking if the {@link Change}s will be applied as expected without any conflicts.
58       *
59       * @return the diffs which would be committed if the {@link Change}s were pushed successfully
60       */
61      public CompletableFuture<List<Change<?>>> get(Revision baseRevision) {
62          requireNonNull(baseRevision, "baseRevision");
63          return centralDogmaRepo.centralDogma().getPreviewDiffs(centralDogmaRepo.projectName(),
64                                                                 centralDogmaRepo.repositoryName(),
65                                                                 baseRevision, changes);
66      }
67  }