| // Copyright (C) 2020 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.server.edit; |
| |
| import com.google.gerrit.entities.PatchSet; |
| import com.google.gerrit.server.notedb.ChangeNotes; |
| |
| /** |
| * Intended modification target. |
| * |
| * <p>See also {@link ModificationTarget}. Some modifications may have a fixed target (e.g. |
| * suggested fixes of robot comments). For other modifications, the presence of a change edit |
| * influences their target. The latter comes from the REST endpoints of change edits which work no |
| * matter whether a change edit is present or not. If it's not present, a new change edit is created |
| * based on the current patchset. As we don't want to create an "empty" commit for the new change |
| * edit first, we need this class/interface for the flexible handling. |
| */ |
| interface ModificationIntention { |
| |
| ModificationTarget getTargetWhenEditExists(ChangeEdit changeEdit); |
| |
| ModificationTarget getTargetWhenNoEdit(ChangeNotes notes); |
| |
| /** A specific patchset is the modification target. */ |
| class PatchsetCommit implements ModificationIntention { |
| |
| private final PatchSet patchSet; |
| |
| PatchsetCommit(PatchSet patchSet) { |
| this.patchSet = patchSet; |
| } |
| |
| @Override |
| public ModificationTarget getTargetWhenEditExists(ChangeEdit changeEdit) { |
| return new ModificationTarget.PatchsetCommit(patchSet); |
| } |
| |
| @Override |
| public ModificationTarget getTargetWhenNoEdit(ChangeNotes notes) { |
| return new ModificationTarget.PatchsetCommit(patchSet); |
| } |
| } |
| |
| /** |
| * The latest commit should be the modification target. If a change edit exists, it's considered |
| * to be the latest commit. Otherwise, defer to the latest patchset commit. |
| */ |
| class LatestCommit implements ModificationIntention { |
| |
| @Override |
| public ModificationTarget getTargetWhenEditExists(ChangeEdit changeEdit) { |
| return new ModificationTarget.EditCommit(changeEdit); |
| } |
| |
| @Override |
| public ModificationTarget getTargetWhenNoEdit(ChangeNotes notes) { |
| return new ModificationTarget.PatchsetCommit(notes.getCurrentPatchSet()); |
| } |
| } |
| } |