package pl.touk.sputnik.connector.gerrit;
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.common.FileInfo;
import com.google.gerrit.extensions.restapi.RestApiException;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import pl.touk.sputnik.configuration.Configuration;
import pl.touk.sputnik.configuration.GeneralOption;
import pl.touk.sputnik.configuration.GeneralOptionNotSupportedException;
import pl.touk.sputnik.connector.ConnectorFacade;
import pl.touk.sputnik.connector.Connectors;
import pl.touk.sputnik.connector.ReviewPublisher;
import pl.touk.sputnik.connector.ConnectorValidator;
import pl.touk.sputnik.review.Review;
import pl.touk.sputnik.review.ReviewFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
public class GerritFacade implements ConnectorFacade, ConnectorValidator, ReviewPublisher {
private static final String COMMIT_MSG = "/COMMIT_MSG";
private final GerritApi gerritApi;
private final GerritPatchset gerritPatchset;
public GerritFacade(GerritApi gerritApi, GerritPatchset gerritPatchset) {
this.gerritApi = gerritApi;
this.gerritPatchset = gerritPatchset;
}
@NotNull
@Override
public List<ReviewFile> listFiles() {
try {
List<ReviewFile> files = new ArrayList<ReviewFile>();
Map<String, FileInfo> changeFiles = gerritApi.changes()
.id(gerritPatchset.getChangeId()).revision(gerritPatchset.getRevisionId()).files();
for (Map.Entry<String, FileInfo> changeFileEntry : changeFiles.entrySet()) {
if (COMMIT_MSG.equals(changeFileEntry.getKey())) {
continue;
}
FileInfo fileInfo = changeFileEntry.getValue();
if (isDeleted(fileInfo)) {
continue;
}
files.add(new ReviewFile(changeFileEntry.getKey()));
}
return files;
} catch (RestApiException e) {
throw new GerritException("Error when listing files", e);
}
}
private boolean isDeleted(FileInfo fileInfo) {
return fileInfo.status != null && fileInfo.status == 'D';
}
@Override
public void publish(@NotNull Review review) {
try {
log.debug("Set review in Gerrit: {}", review);
ReviewInput reviewInput = new ReviewInputBuilder().toReviewInput(review);
gerritApi.changes().id(gerritPatchset.getChangeId()).revision(gerritPatchset.getRevisionId())
.review(reviewInput);
} catch (RestApiException e) {
throw new GerritException("Error when setting review", e);
}
}
@Override
public Connectors name() {
return Connectors.GERRIT;
}
@Override
public void validate(Configuration configuration) throws GeneralOptionNotSupportedException {
boolean commentOnlyChangedLines = Boolean.parseBoolean(configuration
.getProperty(GeneralOption.COMMENT_ONLY_CHANGED_LINES));
if (commentOnlyChangedLines) {
throw new GeneralOptionNotSupportedException("This connector does not support "
+ GeneralOption.COMMENT_ONLY_CHANGED_LINES.getKey());
}
}
@Override
public void setReview(@NotNull Review review) {
publish(review);
}
}