diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 8237e2c626..0f0d794784 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -30,6 +30,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/797[#797]: Fix VSCode install on macOS * https://github.com/devonfw/IDEasy/issues/1956[#1956]: Merging MAVEN_ARGS buggy * https://github.com/devonfw/IDEasy/issues/1978[#1978]: Enhanced the quality status documentation +* https://github.com/devonfw/IDEasy/issues/1594[#1594]: Add release commandlet * https://github.com/devonfw/IDEasy/issues/1946[#1946]: Add Spyder Python IDE * https://github.com/devonfw/IDEasy/issues/1846[#1846]: Fixed macOS Gatekeeper workaround * https://github.com/devonfw/IDEasy/issues/1906[#1906]: Fixed `ide uninstall` failing on macOS diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index 580534f0f7..e79b9216bb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -120,6 +120,7 @@ public CommandletManagerImpl(IdeContext context) { add(new UpgradeSettingsCommandlet(context)); add(new CreateCommandlet(context)); add(new BuildCommandlet(context)); + add(new ReleaseCommandlet(context)); add(new InstallPluginCommandlet(context)); add(new UninstallPluginCommandlet(context)); add(new UpgradeCommandlet(context)); diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/ReleaseCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/ReleaseCommandlet.java new file mode 100644 index 0000000000..2112962fb7 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/ReleaseCommandlet.java @@ -0,0 +1,184 @@ +package com.devonfw.tools.ide.commandlet; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.devonfw.tools.ide.cli.CliException; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.git.GitContext; +import com.devonfw.tools.ide.process.ProcessErrorHandling; +import com.devonfw.tools.ide.process.ProcessMode; +import com.devonfw.tools.ide.process.ProcessResult; +import com.devonfw.tools.ide.property.StringProperty; +import com.devonfw.tools.ide.tool.mvn.Mvn; + +/** + * {@link Commandlet} to build and deploy a release of the current project. + */ +public class ReleaseCommandlet extends Commandlet { + + private static final Logger LOG = LoggerFactory.getLogger(ReleaseCommandlet.class); + + private static final String REVISION_FLAG = "-Drevision="; + + private static final String DEFAULT_MVN_RELEASE_OPTS = "clean deploy -Dchangelist= -Pdeploy"; + + public final StringProperty arguments; + + public ReleaseCommandlet(IdeContext context) { + + super(context); + addKeyword(getName()); + this.arguments = add(new StringProperty("", false, true, "args")); + } + + @Override + public String getName() { + + return "release"; + } + + @Override + protected void doRun() { + + Path projectPath = this.context.getCwd(); + GitContext git = this.context.getGitContext(); + + if (git.hasUntrackedFiles(projectPath)) { + throw new CliException("Your local git repository has uncommitted changes. Please use 'git stash' and rerun on clean repo."); + } + if (warnIfFork(git, projectPath)) { + confirmWarning("You seem to work on a fork. Releases should be done on the original repository!\nWe strongly recommend to abort and rerun on original repository."); + } + if (!this.context.isForceMode() && !isTopLevelProject(projectPath)) { + throw new CliException("Release has to be performed from the top-level project or using force option."); + } + + String currentVersion = getProjectVersion(projectPath); + String releaseVersion = currentVersion.replace("-SNAPSHOT", ""); + String nextVersion = getNextVersion(releaseVersion) + "-SNAPSHOT"; + + LOG.info("Current version: {}", currentVersion); + LOG.info("Release version: {}", releaseVersion); + LOG.info("Next version: {}", nextVersion); + + while (true) { + if (this.context.question("Is the next version '" + nextVersion + "' correct?")) { + break; + } + nextVersion = this.context.askForInput("Please enter the next version:"); + } + + setProjectVersion(projectPath, releaseVersion); + git.commit(projectPath, "set release version to " + releaseVersion); + git.tag(projectPath, "release/" + releaseVersion, "tagged version " + releaseVersion); + + buildAndDeploy(); + + setProjectVersion(projectPath, nextVersion); + git.commit(projectPath, "set next version to " + nextVersion); + LOG.info("Local commits and tag need to be pushed now.\nYou now have the chance to review these changes manually before they are pushed."); + this.context.askToContinue("Do you want to continue?"); + git.push(projectPath); + + LOG.info("Successfully released version {}.", releaseVersion); + } + + private boolean warnIfFork(GitContext git, Path projectPath) { + + String user = System.getProperty("user.name"); + for (String remote : git.retrieveGitRemotes(projectPath)) { + if (remote.contains("upstream") || ((user != null) && remote.contains("github.com/" + user))) { + return true; + } + } + return false; + } + + private boolean isTopLevelProject(Path projectPath) { + + // returns false in case there's no pom.xml present or if parent directory has a pom.xml + return Files.exists(projectPath.resolve("pom.xml")) + && !Files.exists(projectPath.getParent().resolve("pom.xml")); + } + + private Path getMavenConfig(Path projectPath) { + + Path mavenConfig = projectPath.resolve(".mvn").resolve("maven.config"); + if (!Files.exists(mavenConfig)) { + throw new CliException("Could not find the maven configuration at " + mavenConfig); + } + return mavenConfig; + } + + private String getProjectVersion(Path projectPath) { + + Path mavenConfig = getMavenConfig(projectPath); + String content = this.context.getFileAccess().readFileContent(mavenConfig); + for (String token : content.split("\\s+")) { + if (token.startsWith(REVISION_FLAG)) { + return token.substring(REVISION_FLAG.length()); + } + } + throw new CliException("Could not find '" + REVISION_FLAG + "' in " + mavenConfig); + } + + private String getNextVersion(String version) { + + int lastDot = version.lastIndexOf('.'); + String prefix = version.substring(0, lastDot + 1); + String lastSegment = version.substring(lastDot + 1); + String incrementedSegment = String.valueOf(Long.parseLong(lastSegment) + 1); + incrementedSegment = "0".repeat(lastSegment.length() - incrementedSegment.length()) + incrementedSegment; + return prefix + incrementedSegment; + } + + private void setProjectVersion(Path projectPath, String version) { + + Path mavenConfig = getMavenConfig(projectPath); + String content = this.context.getFileAccess().readFileContent(mavenConfig); + if (!content.contains(REVISION_FLAG)) { + throw new CliException("Could not find '" + REVISION_FLAG + "' in " + mavenConfig); + } + content = content.replaceAll(REVISION_FLAG + "\\S+", REVISION_FLAG + version); + this.context.getFileAccess().writeFileContent(content, mavenConfig); + } + + private void buildAndDeploy() { + + Mvn mvn = this.context.getCommandletManager().getCommandlet(Mvn.class); + List args = new ArrayList<>(getReleaseOptions()); + args.addAll(this.arguments.asList()); + while (true) { + ProcessResult result = mvn.runTool(ProcessMode.DEFAULT, null, ProcessErrorHandling.NONE, args); + if (result.isSuccessful()) { + return; + } + LOG.error("Release build failed!"); + if (!this.context.question("Do you want to retry the build (e.g. in case of a temporary network error)?")) { + throw new CliException("Release build failed and process aborted!\nYou should reset your local commits via 'git reset HEAD^'."); + } + } + } + + private List getReleaseOptions() { + + String options = this.context.getVariables().get("MVN_RELEASE_OPTS"); + if ((options == null) || options.isBlank()) { + options = DEFAULT_MVN_RELEASE_OPTS; + } + return List.of(options.split("\\s+")); + } + + private void confirmWarning(String message) { + + LOG.warn(message); + this.context.askToContinue("Do you want to continue anyway?"); + } + +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/git/GitContext.java b/cli/src/main/java/com/devonfw/tools/ide/git/GitContext.java index 00f0bb469b..b6a3a7aa94 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/git/GitContext.java +++ b/cli/src/main/java/com/devonfw/tools/ide/git/GitContext.java @@ -2,6 +2,7 @@ import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import com.devonfw.tools.ide.cli.CliException; import com.devonfw.tools.ide.cli.CliOfflineException; @@ -212,6 +213,12 @@ default void reset(Path repository, String branch) { */ String retrieveGitUrl(Path repository); + /** + * @param repository the {@link Path} to the git repository. + * @return the {@link List} of configured git remotes (output of {@code git remote -v}). + */ + List retrieveGitRemotes(Path repository); + /** * Finds the {@link Path} to the git installation and throws an exception if there is none. * @@ -245,4 +252,28 @@ default void reset(Path repository, String branch) { * @param trackedCommitIdPath the path to the file where the commit Id will be written. */ void saveCurrentCommitId(Path repository, Path trackedCommitIdPath); + + /** + * Commits all currently changed files (tracked) in the given repository. + * + * @param repository the {@link Path} to the git repository. + * @param message the commit message. + */ + void commit(Path repository, String message); + + /** + * Creates an annotated git tag in the given repository. + * + * @param repository the {@link Path} to the git repository. + * @param tagName the name of the tag to create (e.g. "release/1.5.0"). + * @param message the annotation message of the tag. + */ + void tag(Path repository, String tagName, String message); + + /** + * Pushes the local commits and tags of the given repository to the remote repository. + * + * @param repository the {@link Path} to the git repository. + */ + void push(Path repository); } diff --git a/cli/src/main/java/com/devonfw/tools/ide/git/GitContextImpl.java b/cli/src/main/java/com/devonfw/tools/ide/git/GitContextImpl.java index f950241845..0c365aca50 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/git/GitContextImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/git/GitContextImpl.java @@ -320,6 +320,12 @@ public String retrieveGitUrl(Path repository) { return runGitCommandAndGetSingleOutput("Failed to retrieve git URL for repository", repository, "config", "--get", "remote.origin.url"); } + @Override + public List retrieveGitRemotes(Path repository) { + + return runGitCommand(repository, ProcessMode.DEFAULT_CAPTURE, "--no-pager", "remote", "-v").getOut(); + } + IdeContext getContext() { return this.context; @@ -526,6 +532,24 @@ public void saveCurrentCommitId(Path repository, Path trackedCommitIdPath) { protected String determineCurrentCommitId(Path repository) { return runGitCommandAndGetSingleOutput("Failed to get current commit id.", repository, "rev-parse", FILE_HEAD); } + + @Override + public void commit(Path repository, String message) { + + runGitCommand(repository, "commit", "-a", "-m", message); + } + + @Override + public void tag(Path repository, String tagName, String message) { + + runGitCommand(repository, "tag", "-a", tagName, "-m", message); + } + + @Override + public void push(Path repository) { + + runGitCommand(repository, "push", "--follow-tags"); + } } diff --git a/cli/src/main/resources/nls/Help.properties b/cli/src/main/resources/nls/Help.properties index 1e52f11056..992de9083b 100644 --- a/cli/src/main/resources/nls/Help.properties +++ b/cli/src/main/resources/nls/Help.properties @@ -115,6 +115,9 @@ cmd.python=Tool commandlet for Python. cmd.python.detail=Python is an object-oriented programming language, comparable to Perl, Ruby, Scheme, or Java. Detailed documentation can be found at https://www.python.org/doc/ cmd.quarkus=Tool commandlet for Quarkus (framework for cloud-native apps). cmd.quarkus.detail=Quarkus is a Kubernetes-native Java framework for building cloud-native applications. Detailed documentation can be found at https://quarkus.io/ +cmd.release=Performs a release of the project in your current working directory. +cmd.release.detail=The `release` commandlet automates a release of the project in your current working directory. It ensures there are no uncommitted changes, warns if you work on a fork, determines the current version of your project and derives the release version and the next development (SNAPSHOT) version for you to confirm. It then sets the release version, commits and tags it via git (as `release/«version»`), builds and deploys the project, sets the next development version, commits, and (after your confirmation) pushes the changes and the tag. Build and deploy options can be configured via the variable `MVN_RELEASE_OPTS` (default `clean deploy -Dchangelist= -Pdeploy`). You may also supply additional arguments as `ide release «args»` that will be passed to the maven build command. +cmd.release.val.args=Additional arguments to pass to the build and deploy command. cmd.repository=Set up pre-configured git repositories using 'ide repository setup ' cmd.repository.detail=Without further arguments this will set up all pre-configured git repositories.\nAlso, you can provide an explicit git repo as `` argument and IDEasy will automatically clone, build and set up your project based on the existing property file.\nRepositories are configured in 'settings/repository/.properties' and can therefore be shared with your project team for automatic or optional setup. cmd.repository.val.repository=The name of the properties file of the pre-configured git repository to set up, omit to set up all active repositories. diff --git a/cli/src/main/resources/nls/Help_de.properties b/cli/src/main/resources/nls/Help_de.properties index 3c4f9787cf..aec2597a74 100644 --- a/cli/src/main/resources/nls/Help_de.properties +++ b/cli/src/main/resources/nls/Help_de.properties @@ -115,6 +115,9 @@ cmd.python=Werkzeug Kommando für Python. cmd.python.detail=Python ist eine objektorientierte Programmiersprache, vergleichbar mit Perl, Ruby, Scheme oder Java. Detaillierte Dokumentation ist zu finden unter https://www.python.org/doc/ cmd.quarkus=Werkzeug Kommando für Quarkus (Framework für Cloud-native Anwendungen). cmd.quarkus.detail=Quarkus ist ein Kubernetes-native Java-Framework zur Entwicklung von Cloud-native Anwendungen. Detaillierte Dokumentation ist zu finden unter https://quarkus.io/ +cmd.release=Führt ein Release des Projekts in Ihrem aktuellen Arbeitsverzeichnis durch. +cmd.release.detail=Der `release`-Befehl automatisiert ein Release des Projekts in Ihrem aktuellen Arbeitsverzeichnis. Er stellt sicher, dass keine uncommitteten Änderungen vorliegen, warnt wenn Sie auf einem Fork arbeiten, ermittelt die aktuelle Version Ihres Projekts und leitet daraus die Release-Version sowie die nächste Entwicklungsversion (SNAPSHOT) zur Bestätigung ab. Anschließend setzt er die Release-Version, committet und taggt sie via git (als `release/«version»`), baut und veröffentlicht das Projekt, setzt die nächste Entwicklungsversion, committet und pusht nach Ihrer Bestätigung die Änderungen und den Tag. Build- und Deploy-Optionen können über die Variable `MVN_RELEASE_OPTS` (Standard `clean deploy -Dchangelist= -Pdeploy`) konfiguriert werden. Sie können auch zusätzliche Argumente wie `ide release «args»` angeben, die an den Maven-Build-Befehl weitergeleitet werden. +cmd.release.val.args=Zusätzliche Argumente, die an den Build- und Deploy-Befehl übergeben werden. cmd.repository=Richtet das vorkonfigurierte Git Repository ein mittels 'ide repository setup '. cmd.repository.detail=Dies wird alle vorkonfigurierten Repositories einrichten. Rufen Sie einfach 'ide repository setup ' auf, ersetzen Sie durch den Namen Ihrer Projektkonfigurationsdatei, die sich in 'settings/repository/your_project_name' befindet und IDEasy wird Ihr Projekt basierend auf der vorhandenen Eigenschaftsdatei automatisch klonen, bauen und einrichten.\nWenn Sie den Projektnamen weglassen, werden alle im Repository-Verzeichnis gefundenen Projekte vorkonfiguriert. cmd.repository.val.repository=Der Name der Properties-Datei des vorkonfigurierten Git Repositories zum Einrichten. Falls nicht angegeben, werden alle aktiven Projekte eingerichtet. diff --git a/cli/src/test/java/com/devonfw/tools/ide/commandlet/ReleaseCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/commandlet/ReleaseCommandletTest.java new file mode 100644 index 0000000000..a17e2db7e0 --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/commandlet/ReleaseCommandletTest.java @@ -0,0 +1,96 @@ +package com.devonfw.tools.ide.commandlet; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.cli.CliAbortException; +import com.devonfw.tools.ide.cli.CliException; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.devonfw.tools.ide.git.GitContextImplMock; +import com.devonfw.tools.ide.log.IdeLogEntry; + +/** + * Test of {@link ReleaseCommandlet}. The test fixture's {@code .mvn/maven.config} declares {@code -Drevision=1.0.0-SNAPSHOT}, so the release version is + * {@code 1.0.0} and the next version is {@code 1.0.1-SNAPSHOT}. + */ +class ReleaseCommandletTest extends AbstractIdeContextTest { + + private static final String PROJECT_RELEASE = "release"; + + private IdeTestContext newReleaseContext(boolean untrackedFiles) { + + IdeTestContext context = newContext(PROJECT_RELEASE); + GitContextImplMock gitContext = new GitContextImplMock(context, context.getWorkspacePath().resolve("mvn")); + gitContext.setSimulateUntrackedFiles(untrackedFiles); + context.setGitContext(gitContext); + context.setCwd(context.getWorkspacePath().resolve("mvn"), context.getWorkspacePath().toString(), context.getIdeHome()); + return context; + } + + @Test + void testReleaseWithUntrackedFilesThrowsException() { + + IdeTestContext context = newReleaseContext(true); + ReleaseCommandlet releaseCommandlet = context.getCommandletManager().getCommandlet(ReleaseCommandlet.class); + + assertThrows(CliException.class, releaseCommandlet::run); + } + + @Test + void testRelease() { + + IdeTestContext context = newReleaseContext(false); + // answer 1: "Is the next version correct?", answer 2: "Do you want to push...?" + context.setAnswers("yes", "yes"); + ReleaseCommandlet releaseCommandlet = context.getCommandletManager().getCommandlet(ReleaseCommandlet.class); + + releaseCommandlet.run(); + + assertThat(context).log().hasEntries( + IdeLogEntry.ofInfo("mvn clean deploy"), + IdeLogEntry.ofInfo("Successfully released version 1.0.0.")); + // the maven.config must be left at the next development version + Path mavenConfig = context.getWorkspacePath().resolve("mvn").resolve(".mvn").resolve("maven.config"); + assertThat(context.getFileAccess().readFileContent(mavenConfig)).contains("-Drevision=1.0.1-SNAPSHOT"); + } + + @Test + void testReleaseWithAdditionalArguments() { + + IdeTestContext context = newReleaseContext(false); + context.setAnswers("yes", "yes"); + ReleaseCommandlet releaseCommandlet = context.getCommandletManager().getCommandlet(ReleaseCommandlet.class); + releaseCommandlet.arguments.addValue("-DskipTests"); + + releaseCommandlet.run(); + + assertThat(context).log().hasEntries( + IdeLogEntry.ofInfo("mvn clean deploy -DskipTests")); + } + + @Test + void testReleaseAbortedByUser() { + + IdeTestContext context = newReleaseContext(false); + // answer 1: next version correct -> yes, answer 2: push -> no (aborts) + context.setAnswers("yes", "no"); + ReleaseCommandlet releaseCommandlet = context.getCommandletManager().getCommandlet(ReleaseCommandlet.class); + + assertThrows(CliAbortException.class, releaseCommandlet::run); + } + + @Test + void testReleaseWithoutBuildDescriptor() { + + IdeTestContext context = newReleaseContext(false); + context.setAnswers("yes", "yes"); + context.setCwd(context.getWorkspacePath().resolve("empty"), context.getWorkspacePath().toString(), context.getIdeHome()); + ReleaseCommandlet releaseCommandlet = context.getCommandletManager().getCommandlet(ReleaseCommandlet.class); + + assertThrows(CliException.class, releaseCommandlet::run); + } +} diff --git a/cli/src/test/java/com/devonfw/tools/ide/git/GitContextImplMock.java b/cli/src/test/java/com/devonfw/tools/ide/git/GitContextImplMock.java index 64e5c614b3..4f527c86e7 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/git/GitContextImplMock.java +++ b/cli/src/test/java/com/devonfw/tools/ide/git/GitContextImplMock.java @@ -216,4 +216,24 @@ private String findStashRefByMessageInList(String needle) { } return null; } + + @Override + public void commit(Path repository, String message) { + LOG.debug("Mock commit with message: {}", message); + } + + @Override + public void tag(Path repository, String tagName, String message) { + LOG.debug("Mock tag: {}", tagName); + } + + @Override + public void push(Path repository) { + LOG.debug("Mock push"); + } + + @Override + public List retrieveGitRemotes(Path repository) { + return List.of(); + } } diff --git a/cli/src/test/java/com/devonfw/tools/ide/git/GitContextMock.java b/cli/src/test/java/com/devonfw/tools/ide/git/GitContextMock.java index 9c4892976d..0e90d95a3a 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/git/GitContextMock.java +++ b/cli/src/test/java/com/devonfw/tools/ide/git/GitContextMock.java @@ -65,6 +65,12 @@ public String retrieveGitUrl(Path repository) { return MOCKED_URL_VALUE; } + @Override + public java.util.List retrieveGitRemotes(Path repository) { + + return java.util.Collections.emptyList(); + } + @Override public Path findGitRequired() { return Path.of("git"); @@ -116,4 +122,19 @@ public String determineRemote(Path repository) { public void saveCurrentCommitId(Path repository, Path trackedCommitIdPath) { } + + @Override + public void commit(Path repository, String message) { + + } + + @Override + public void tag(Path repository, String tagName, String message) { + + } + + @Override + public void push(Path repository) { + + } } diff --git a/cli/src/test/resources/ide-projects/release/_ide/urls/java/java/17.0.10_7/urls b/cli/src/test/resources/ide-projects/release/_ide/urls/java/java/17.0.10_7/urls new file mode 100644 index 0000000000..62e6853f29 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/_ide/urls/java/java/17.0.10_7/urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10_7/java-17.0.10_7.tgz diff --git a/cli/src/test/resources/ide-projects/release/_ide/urls/mvn/mvn/3.9.6/urls b/cli/src/test/resources/ide-projects/release/_ide/urls/mvn/mvn/3.9.6/urls new file mode 100644 index 0000000000..69685961cf --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/_ide/urls/mvn/mvn/3.9.6/urls @@ -0,0 +1 @@ +${testbaseurl}/download/mvn/mvn/3.9.6/mvn-3.9.6.tgz diff --git a/cli/src/test/resources/ide-projects/release/_ide/urls/mvn/mvn/dependencies.json b/cli/src/test/resources/ide-projects/release/_ide/urls/mvn/mvn/dependencies.json new file mode 100644 index 0000000000..cc895cfb18 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/_ide/urls/mvn/mvn/dependencies.json @@ -0,0 +1,14 @@ +{ + "[4.0,)": [ + { + "tool": "java", + "versionRange": "[17,)" + } + ], + "[3.0,4.0)": [ + { + "tool": "java", + "versionRange": "[8,)" + } + ] +} \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/release/project/settings/ide.properties b/cli/src/test/resources/ide-projects/release/project/settings/ide.properties new file mode 100644 index 0000000000..d817a07839 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/project/settings/ide.properties @@ -0,0 +1,4 @@ +JAVA_VERSION=17.0.10_7 +MAVEN_VERSION=3.9.6 +MVN_RELEASE_OPTS=clean deploy +CVE_MIN_SEVERITY=11 diff --git a/cli/src/test/resources/ide-projects/release/project/settings/readme b/cli/src/test/resources/ide-projects/release/project/settings/readme new file mode 100644 index 0000000000..e937d913f0 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/project/settings/readme @@ -0,0 +1 @@ +This folder represents the IDE settings (see https://github.com/devonfw/ide-settings) diff --git a/cli/src/test/resources/ide-projects/release/project/workspaces/main/empty/.gitkeep b/cli/src/test/resources/ide-projects/release/project/workspaces/main/empty/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/release/project/workspaces/main/mvn/.mvn/maven.config b/cli/src/test/resources/ide-projects/release/project/workspaces/main/mvn/.mvn/maven.config new file mode 100644 index 0000000000..009da89161 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/project/workspaces/main/mvn/.mvn/maven.config @@ -0,0 +1 @@ +-Drevision=1.0.0-SNAPSHOT diff --git a/cli/src/test/resources/ide-projects/release/project/workspaces/main/mvn/pom.xml b/cli/src/test/resources/ide-projects/release/project/workspaces/main/mvn/pom.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/release/repository/java/java/default/bin/java b/cli/src/test/resources/ide-projects/release/repository/java/java/default/bin/java new file mode 100755 index 0000000000..bb96ab46f2 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/repository/java/java/default/bin/java @@ -0,0 +1,2 @@ +#!/bin/bash +echo java $* diff --git a/cli/src/test/resources/ide-projects/release/repository/java/java/default/bin/java.cmd b/cli/src/test/resources/ide-projects/release/repository/java/java/default/bin/java.cmd new file mode 100644 index 0000000000..bb96ab46f2 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/repository/java/java/default/bin/java.cmd @@ -0,0 +1,2 @@ +#!/bin/bash +echo java $* diff --git a/cli/src/test/resources/ide-projects/release/repository/mvn/mvn/default/bin/mvn b/cli/src/test/resources/ide-projects/release/repository/mvn/mvn/default/bin/mvn new file mode 100755 index 0000000000..1b4a9986e2 --- /dev/null +++ b/cli/src/test/resources/ide-projects/release/repository/mvn/mvn/default/bin/mvn @@ -0,0 +1,2 @@ +#!/bin/bash +echo "mvn $*"