blob: ea85184527f718b7b0cc9d44047d28167308c68f [file] [log] [blame]
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Licensed to the Apache Software Foundation (ASF) under one
~ or more contributor license agreements. See the NOTICE file
~ distributed with this work for additional information
~ regarding copyright ownership. The ASF licenses this file
~ to you 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 org.apache.sling.cli.impl.release;
import java.util.List;
import java.util.Set;
import org.apache.sling.cli.impl.Command;
import org.apache.sling.cli.impl.ExecutionMode;
import org.apache.sling.cli.impl.InputOption;
import org.apache.sling.cli.impl.UserInput;
import org.apache.sling.cli.impl.jira.Issue;
import org.apache.sling.cli.impl.jira.VersionClient;
import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.cli.impl.nexus.StagingRepository;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import picocli.CommandLine;
@Component(service = Command.class,
property = {
Command.PROPERTY_NAME_COMMAND_GROUP + "=" + ReleaseJiraVersionCommand.GROUP,
Command.PROPERTY_NAME_COMMAND_NAME + "=" + ReleaseJiraVersionCommand.NAME
}
)
@CommandLine.Command(
name = ReleaseJiraVersionCommand.NAME,
description = "The found Jira versions will be marked as released with the current date. All fixed issues will be closed. Before " +
"running this command make sure to execute " + CreateJiraVersionCommand.NAME + " in order to move any unresolved issues " +
"to the next version.",
subcommands = CommandLine.HelpCommand.class
)
public class ReleaseJiraVersionCommand implements Command {
private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseJiraVersionCommand.class);
static final String GROUP = "release";
static final String NAME = "release-jira-version";
@CommandLine.Option(names = {"-r", "--repository"}, description = "Nexus repository id", required = true)
private Integer repositoryId;
@Reference
private RepositoryService repositoryService;
@Reference
private VersionClient versionClient;
@CommandLine.Mixin
private ReusableCLIOptions reusableCLIOptions;
@Override
public Integer call() {
try {
StagingRepository repo = repositoryService.find(repositoryId);
Set<Release> releases = repositoryService.getReleases(repo);
ExecutionMode executionMode = reusableCLIOptions.executionMode;
LOGGER.info("The following Jira versions {} be released:{}", executionMode == ExecutionMode.DRY_RUN ? "would" : "will",
System.lineSeparator());
for (Release release : releases) {
List<Issue> fixedIssues = versionClient.findFixedIssues(release);
LOGGER.info("{}:", release.getFullName());
fixedIssues.forEach(issue -> LOGGER.info("- {} - {}, Status: {}, Resolution: {}", issue.getKey(), issue.getSummary(),
issue.getStatus(), issue.getResolution()));
LOGGER.info("");
boolean shouldRelease = false;
if (executionMode == ExecutionMode.INTERACTIVE) {
InputOption answer = UserInput.yesNo(String.format("Should version %s be released?", release.getFullName()),
InputOption.YES);
shouldRelease = (answer == InputOption.YES);
} else if (executionMode == ExecutionMode.AUTO) {
shouldRelease = true;
}
if (shouldRelease) {
versionClient.release(release);
LOGGER.info("{} was released:", release.getFullName());
fixedIssues = versionClient.findFixedIssues(release);
fixedIssues.forEach(issue -> LOGGER.info("- {} - {}, Status: {}, Resolution: {}", issue.getKey(), issue.getSummary(),
issue.getStatus(), issue.getResolution()));
}
}
} catch (Exception e) {
LOGGER.warn("Failed executing command.", e);
return CommandLine.ExitCode.SOFTWARE;
}
return CommandLine.ExitCode.OK;
}
}