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 15c5cdbe0..aee7a389f 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 @@ -23,6 +23,7 @@ import com.devonfw.tools.ide.tool.kotlinc.KotlincNative; import com.devonfw.tools.ide.tool.mvn.Mvn; import com.devonfw.tools.ide.tool.node.Node; +import com.devonfw.tools.ide.tool.npm.Npm; import com.devonfw.tools.ide.tool.oc.Oc; import com.devonfw.tools.ide.tool.quarkus.Quarkus; import com.devonfw.tools.ide.tool.terraform.Terraform; @@ -69,6 +70,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Helm(context)); add(new Java(context)); add(new Node(context)); + add(new Npm(context)); add(new Mvn(context)); add(new GcViewer(context)); add(new Gradle(context)); diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/CommandletFileExtractor.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/CommandletFileExtractor.java new file mode 100644 index 000000000..cc87f1374 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/CommandletFileExtractor.java @@ -0,0 +1,31 @@ +package com.devonfw.tools.ide.commandlet.FileExtractor; + +import java.nio.file.Path; + +import com.devonfw.tools.ide.tool.ToolCommandlet; + +/** + * {@link CommandletFileExtractor} class which handles the extraction of downloaded installations of a + * {@link ToolCommandlet}. + */ +public interface CommandletFileExtractor { + + /** + * + * @param file file the {@link Path} to the file to extract. + * @param targetDir targetDir the {@link Path} to the directory where to extract (or copy) the file. + * @param isExtract {@code true} if the tool is truly extracted, {@code false} the tool will be moved to the targetDir + * (e.g. when an installer exists). + */ + void extract(Path file, Path targetDir, boolean isExtract); + + /** + * Moves the extracted content to the final destination {@link Path}. May be overridden to customize the extraction + * process. + * + * @param from the source {@link Path} to move. + * @param to the target {@link Path} to move to. + */ + void moveAndProcessExtraction(Path from, Path to); + +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/CommandletFileExtractorImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/CommandletFileExtractorImpl.java new file mode 100644 index 000000000..0df062a98 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/CommandletFileExtractorImpl.java @@ -0,0 +1,157 @@ +package com.devonfw.tools.ide.commandlet.FileExtractor; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Stream; + +import com.devonfw.tools.ide.cli.CliException; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.io.FileAccess; +import com.devonfw.tools.ide.io.TarCompression; +import com.devonfw.tools.ide.process.ProcessContext; +import com.devonfw.tools.ide.tool.ToolCommandlet; +import com.devonfw.tools.ide.util.FilenameUtil; + +/** + * Implements common {@link CommandletFileExtractor} for a {@link ToolCommandlet} + */ +public class CommandletFileExtractorImpl implements CommandletFileExtractor { + + protected final IdeContext context; + + protected final ToolCommandlet commandlet; + + /** + * The constructor + * + * @param context the {@link IdeContext}. + * @param commandlet the {@link ToolCommandlet} + */ + public CommandletFileExtractorImpl(IdeContext context, ToolCommandlet commandlet) { + + this.context = context; + this.commandlet = commandlet; + } + + @Override + public void extract(Path file, Path targetDir, boolean isExtract) { + + FileAccess fileAccess = this.context.getFileAccess(); + if (isExtract) { + Path tmpDir = fileAccess.createTempDir("extract-" + file.getFileName()); + this.context.trace("Trying to extract the downloaded file {} to {} and move it to {}.", file, tmpDir, targetDir); + String extension = FilenameUtil.getExtension(file.getFileName().toString()); + this.context.trace("Determined file extension {}", extension); + TarCompression tarCompression = TarCompression.of(extension); + ExtractorFileType fileType = ExtractorFileType.valueOf(extension.toUpperCase()); + + if (tarCompression != null) { + fileAccess.untar(file, tmpDir, tarCompression); + } else if (fileType == ExtractorFileType.ZIP || fileType == ExtractorFileType.JAR) { + fileAccess.unzip(file, tmpDir); + } else if (fileType == ExtractorFileType.DMG) { + extractLinuxDmg(file, tmpDir); + } else if (fileType == ExtractorFileType.MSI) { + extractWindowsMsi(file, tmpDir); + } else if (fileType == ExtractorFileType.PKG) { + extractPkg(file, tmpDir); + + } else { + throw new IllegalStateException("Unknown archive format " + extension + ". Can not extract " + file); + } + moveAndProcessExtraction(getProperInstallationSubDirOf(tmpDir), targetDir); + fileAccess.delete(tmpDir); + } else { + this.context.trace("Extraction is disabled for '{}' hence just moving the downloaded file {}.", + commandlet.getName(), file); + + if (Files.isDirectory(file)) { + fileAccess.move(file, targetDir); + } else { + try { + Files.createDirectories(targetDir); + } catch (IOException e) { + throw new IllegalStateException("Failed to create folder " + targetDir); + } + fileAccess.move(file, targetDir.resolve(file.getFileName())); + } + } + } + + @Override + public void moveAndProcessExtraction(Path from, Path to) { + + this.context.getFileAccess().move(from, to); + } + + /** + * @param path the {@link Path} to start the recursive search from. + * @return the deepest subdir {@code s} of the passed path such that all directories between {@code s} and the passed + * path (including {@code s}) are the sole item in their respective directory and {@code s} is not named + * "bin". + */ + private Path getProperInstallationSubDirOf(Path path) { + + try (Stream stream = Files.list(path)) { + Path[] subFiles = stream.toArray(Path[]::new); + if (subFiles.length == 0) { + throw new CliException("The downloaded package for the tool " + commandlet.getName() + + " seems to be empty as you can check in the extracted folder " + path); + } else if (subFiles.length == 1) { + String filename = subFiles[0].getFileName().toString(); + if (!filename.equals(IdeContext.FOLDER_BIN) && !filename.equals(IdeContext.FOLDER_CONTENTS) + && !filename.endsWith(".app") && Files.isDirectory(subFiles[0])) { + return getProperInstallationSubDirOf(subFiles[0]); + } + } + return path; + } catch (IOException e) { + throw new IllegalStateException("Failed to get sub-files of " + path); + } + } + + private void extractLinuxDmg(Path file, Path tmpDir) { + + assert this.context.getSystemInfo().isMac(); + + FileAccess fileAccess = this.context.getFileAccess(); + Path mountPath = this.context.getIdeHome().resolve(IdeContext.FOLDER_UPDATES).resolve(IdeContext.FOLDER_VOLUME); + fileAccess.mkdirs(mountPath); + ProcessContext pc = this.context.newProcess(); + pc.executable("hdiutil"); + pc.addArgs("attach", "-quiet", "-nobrowse", "-mountpoint", mountPath, file); + pc.run(); + Path appPath = fileAccess.findFirst(mountPath, p -> p.getFileName().toString().endsWith(".app"), false); + if (appPath == null) { + throw new IllegalStateException("Failed to unpack DMG as no MacOS *.app was found in file " + file); + } + fileAccess.copy(appPath, tmpDir); + pc.addArgs("detach", "-force", mountPath); + pc.run(); + } + + private void extractWindowsMsi(Path file, Path tmpDir) { + + FileAccess fileAccess = this.context.getFileAccess(); + this.context.newProcess().executable("msiexec").addArgs("/a", file, "/qn", "TARGETDIR=" + tmpDir).run(); + // msiexec also creates a copy of the MSI + Path msiCopy = tmpDir.resolve(file.getFileName()); + fileAccess.delete(msiCopy); + } + + private void extractPkg(Path file, Path tmpDir) { + + FileAccess fileAccess = this.context.getFileAccess(); + + Path tmpDirPkg = fileAccess.createTempDir("ide-pkg-"); + ProcessContext pc = this.context.newProcess(); + // we might also be able to use cpio from commons-compression instead of external xar... + pc.executable("xar").addArgs("-C", tmpDirPkg, "-xf", file).run(); + Path contentPath = fileAccess.findFirst(tmpDirPkg, p -> p.getFileName().toString().equals("Payload"), true); + fileAccess.untar(contentPath, tmpDir, TarCompression.GZ); + fileAccess.delete(tmpDirPkg); + + } + +} \ No newline at end of file diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/ExctractorFileType.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/ExctractorFileType.java new file mode 100644 index 000000000..2fb33bbce --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/FileExtractor/ExctractorFileType.java @@ -0,0 +1,5 @@ +package com.devonfw.tools.ide.commandlet.FileExtractor; + +enum ExtractorFileType { + ZIP, JAR, DMG, MSI, PKG, TAR, GZ, TGZ +} \ No newline at end of file diff --git a/cli/src/main/java/com/devonfw/tools/ide/context/AbstractIdeContext.java b/cli/src/main/java/com/devonfw/tools/ide/context/AbstractIdeContext.java index a1c8466d3..60019d36d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/context/AbstractIdeContext.java +++ b/cli/src/main/java/com/devonfw/tools/ide/context/AbstractIdeContext.java @@ -1,5 +1,17 @@ package com.devonfw.tools.ide.context; +import java.io.IOException; +import java.net.InetAddress; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; + import com.devonfw.tools.ide.cli.CliArgument; import com.devonfw.tools.ide.cli.CliArguments; import com.devonfw.tools.ide.cli.CliException; @@ -33,18 +45,6 @@ import com.devonfw.tools.ide.repo.ToolRepository; import com.devonfw.tools.ide.url.model.UrlMetadata; -import java.io.IOException; -import java.net.InetAddress; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; - /** * Abstract base implementation of {@link IdeContext}. */ diff --git a/cli/src/main/java/com/devonfw/tools/ide/io/FileAccessImpl.java b/cli/src/main/java/com/devonfw/tools/ide/io/FileAccessImpl.java index de17c0f98..d10357a0a 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/io/FileAccessImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/io/FileAccessImpl.java @@ -104,8 +104,7 @@ public void download(String url, Path target) { * @param target Path of the target directory. * @param response the {@link HttpResponse} to use. */ - private void downloadFileWithProgressBar(String url, Path target, HttpResponse response) - throws IOException { + private void downloadFileWithProgressBar(String url, Path target, HttpResponse response) { long contentLength = response.headers().firstValueAsLong("content-length").orElse(0); if (contentLength == 0) { diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/GlobalToolCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/GlobalToolCommandlet.java index 739337f09..586c7ec85 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/GlobalToolCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/GlobalToolCommandlet.java @@ -1,5 +1,9 @@ package com.devonfw.tools.ide.tool; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; + import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.io.FileAccess; @@ -9,10 +13,6 @@ import com.devonfw.tools.ide.repo.ToolRepository; import com.devonfw.tools.ide.version.VersionIdentifier; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Set; - /** * {@link ToolCommandlet} that is installed globally. */ diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java index c0b339413..f1585be43 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java @@ -1,5 +1,11 @@ package com.devonfw.tools.ide.tool; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Set; + import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.io.FileAccess; @@ -8,12 +14,6 @@ import com.devonfw.tools.ide.repo.ToolRepository; import com.devonfw.tools.ide.version.VersionIdentifier; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; -import java.util.Set; - /** * {@link ToolCommandlet} that is installed locally into the IDE. */ diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java index b5d8d4df6..a4e513425 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java @@ -1,6 +1,14 @@ package com.devonfw.tools.ide.tool; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Set; + import com.devonfw.tools.ide.commandlet.Commandlet; +import com.devonfw.tools.ide.commandlet.FileExtractor.CommandletFileExtractor; +import com.devonfw.tools.ide.commandlet.FileExtractor.CommandletFileExtractorImpl; import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.common.Tags; import com.devonfw.tools.ide.context.IdeContext; @@ -13,17 +21,13 @@ import com.devonfw.tools.ide.property.StringListProperty; import com.devonfw.tools.ide.version.VersionIdentifier; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.Set; - /** * {@link Commandlet} for a tool integrated into the IDE. */ public abstract class ToolCommandlet extends Commandlet implements Tags { + public CommandletFileExtractor commandletFileExtractor; + /** @see #getName() */ protected final String tool; @@ -49,6 +53,8 @@ public ToolCommandlet(IdeContext context, String tool, Set tags) { this.tags = tags; addKeyword(tool); this.arguments = add(new StringListProperty("", false, "args")); + + commandletFileExtractor = new CommandletFileExtractorImpl(context, this); } /** @@ -402,4 +408,14 @@ public void setEdition(String edition, boolean hint) { } } + /** + * Sets the {@link CommandletFileExtractor} of the commandlet. + * + * @param commandletFileExtractor an implementation of {@link CommandletFileExtractor} + */ + public void setCommandletFileExtractor(CommandletFileExtractor commandletFileExtractor) { + + this.commandletFileExtractor = commandletFileExtractor; + } + } diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/aws/Aws.java b/cli/src/main/java/com/devonfw/tools/ide/tool/aws/Aws.java index 37eaaf362..c99b1feea 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/aws/Aws.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/aws/Aws.java @@ -1,5 +1,9 @@ package com.devonfw.tools.ide.tool.aws; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Set; + import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.environment.EnvironmentVariables; @@ -8,10 +12,6 @@ import com.devonfw.tools.ide.process.ProcessContext; import com.devonfw.tools.ide.tool.LocalToolCommandlet; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Set; - /** * {@link LocalToolCommandlet} for AWS CLI (Amazon Web Services Command * Line Interface). diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/aws/AwsFileExtractor.java b/cli/src/main/java/com/devonfw/tools/ide/tool/aws/AwsFileExtractor.java new file mode 100644 index 000000000..4d764a4d6 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/aws/AwsFileExtractor.java @@ -0,0 +1,74 @@ +package com.devonfw.tools.ide.tool.aws; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFilePermission; +import java.util.Set; + +import com.devonfw.tools.ide.commandlet.FileExtractor.CommandletFileExtractorImpl; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.process.ProcessContext; +import com.devonfw.tools.ide.tool.ToolCommandlet; + +/** + * Implements a {@link CommandletFileExtractorImpl} for {@link Aws} + */ +public class AwsFileExtractor extends CommandletFileExtractorImpl { + public AwsFileExtractor(IdeContext context, ToolCommandlet commandlet) { + + super(context, commandlet); + } + + @Override + public void moveAndProcessExtraction(Path from, Path to) { + + if (this.context.getSystemInfo().isLinux()) { + // make binary executable using java nio because unpacking didn't preserve the file permissions + // TODO this can be removed if issue #132 is fixed + Path awsInDistPath = from.resolve("dist").resolve("aws"); + Path awsCompleterInDistPath = from.resolve("dist").resolve("aws_completer"); + makeExecutable(awsInDistPath); + makeExecutable(awsCompleterInDistPath); + + // running the install-script that aws shipped + ProcessContext pc = this.context.newProcess(); + Path linuxInstallScript = from.resolve("install"); + pc.executable(linuxInstallScript); + pc.addArgs("-i", from.toString(), "-b", from.toString()); + pc.run(); + + // The install-script that aws ships creates symbolic links to binaries but using absolute paths. + // Since the current process happens in a temporary dir, these links wouldn't be valid after moving the + // installation files to the target dir. So the absolute paths are replaced by relative ones. + for (String file : new String[] { "aws", "aws_completer", Path.of("v2").resolve("current").toString() }) { + Path link = from.resolve(file); + try { + this.context.getFileAccess().symlink(link.toRealPath(), link, true); + } catch (IOException e) { + throw new RuntimeException( + "Failed to replace absolute link (" + link + ") provided by AWS install script with relative link.", e); + } + } + this.context.getFileAccess().delete(linuxInstallScript); + this.context.getFileAccess().delete(from.resolve("dist")); + } + super.moveAndProcessExtraction(from, to); + } + + private void makeExecutable(Path file) { + + // TODO this can be removed if issue #132 is fixed. See https://github.com/devonfw/IDEasy/issues/132 + Set permissions = null; + try { + permissions = Files.getPosixFilePermissions(file); + permissions.add(PosixFilePermission.GROUP_EXECUTE); + permissions.add(PosixFilePermission.OWNER_EXECUTE); + permissions.add(PosixFilePermission.OTHERS_EXECUTE); + Files.setPosixFilePermissions(file, permissions); + } catch (IOException e) { + throw new RuntimeException("Adding execution permission for Group, Owner and Others did not work for " + file, e); + } + } + +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/jmc/Jmc.java b/cli/src/main/java/com/devonfw/tools/ide/tool/jmc/Jmc.java index 317910bc6..be85c252c 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/jmc/Jmc.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/jmc/Jmc.java @@ -1,5 +1,12 @@ package com.devonfw.tools.ide.tool.jmc; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Iterator; +import java.util.Set; +import java.util.stream.Stream; + import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.io.FileAccess; @@ -8,13 +15,6 @@ import com.devonfw.tools.ide.tool.ToolCommandlet; import com.devonfw.tools.ide.tool.java.Java; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Iterator; -import java.util.Set; -import java.util.stream.Stream; - /** * {@link ToolCommandlet} for JDK Mission * Control, An advanced set of tools for managing, monitoring, profiling, and troubleshooting Java applications. diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/npm/Npm.java b/cli/src/main/java/com/devonfw/tools/ide/tool/npm/Npm.java new file mode 100644 index 000000000..0a379450a --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/npm/Npm.java @@ -0,0 +1,60 @@ +package com.devonfw.tools.ide.tool.npm; + +import java.nio.file.Path; +import java.util.Set; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.io.FileAccess; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; +import com.devonfw.tools.ide.tool.ToolCommandlet; +import com.devonfw.tools.ide.tool.node.Node; + +/** + * {@link ToolCommandlet} for node. + */ + +public class Npm extends LocalToolCommandlet { + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public Npm(IdeContext context) { + + super(context, "npm", Set.of(Tag.JAVA_SCRIPT, Tag.RUNTIME)); + } + + @Override + public boolean install(boolean silent) { + + getCommandlet(Node.class).install(); + return super.doInstall(silent); + } + + @Override + public void postInstall() { + + super.postInstall(); + + FileAccess fileAccess = context.getFileAccess(); + Path nodeHomePath = this.context.getSoftwarePath().resolve("node/"); + if(context.getSystemInfo().isWindows()) { + Path npmBinBath = nodeHomePath.resolve("node_modules/npm/bin/"); + String npm = "npm"; + String npx = "npx"; + String cmd = ".cmd"; + + fileAccess.delete(nodeHomePath.resolve(npm)); + fileAccess.delete(nodeHomePath.resolve(npm + cmd)); + fileAccess.delete(nodeHomePath.resolve(npx)); + fileAccess.delete(nodeHomePath.resolve(npx + cmd)); + + fileAccess.copy(npmBinBath.resolve(npm), nodeHomePath.resolve(npm)); + fileAccess.copy(npmBinBath.resolve(npm + cmd), nodeHomePath.resolve(npm + cmd)); + fileAccess.copy(npmBinBath.resolve(npx), nodeHomePath.resolve(npx)); + fileAccess.copy(npmBinBath.resolve(npx + cmd), nodeHomePath.resolve(npx + cmd)); + } + } +} diff --git a/cli/src/main/resources/nls/Ide.properties b/cli/src/main/resources/nls/Ide.properties index ef6b3eda7..41cb593bf 100644 --- a/cli/src/main/resources/nls/Ide.properties +++ b/cli/src/main/resources/nls/Ide.properties @@ -24,6 +24,7 @@ cmd-list-editions=List the available editions of the selected tool. cmd-list-versions=List the available versions of the selected tool. cmd-mvn=Tool commandlet for Maven (Build-Tool) cmd-node=Tool commandlet for Node.js (JavaScript runtime) +cmd-npm=Tool commandlet for Npm cmd-oc=Tool commandlet for Openshift CLI (Kubernetes Management Tool) cmd-quarkus=Tool commandlet for Quarkus (Framework for cloud-native apps) cmd-set-edition=Set the edition of the selected tool. diff --git a/cli/src/main/resources/nls/Ide_de.properties b/cli/src/main/resources/nls/Ide_de.properties index 688bd923a..a2f95fa1a 100644 --- a/cli/src/main/resources/nls/Ide_de.properties +++ b/cli/src/main/resources/nls/Ide_de.properties @@ -22,6 +22,7 @@ cmd-list-editions=Listet die verfügbaren Editionen des selektierten Werkzeugs a cmd-list-versions=Listet die verfügbaren Versionen des selektierten Werkzeugs auf. cmd-mvn=Werkzeug Kommando für Maven (Build-Werkzeug) cmd-node=Werkzeug Kommando für Node.js (JavaScript Laufzeitumgebung) +cmd-npm=Werkzeug Kommando für Npm cmd-oc=Werkzeug Kommando für Openshift CLI (Kubernetes Management Tool) cmd-quarkus=Werkzeug Kommando für Quarkus (Framework für Cloud-native Anwendungen) cmd-set-edition=Setzt die Edition des selektierten Werkzeugs. diff --git a/cli/src/test/java/com/devonfw/tools/ide/commandlet/CommandLetExtractorMock.java b/cli/src/test/java/com/devonfw/tools/ide/commandlet/CommandLetExtractorMock.java new file mode 100644 index 000000000..59efdcd02 --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/commandlet/CommandLetExtractorMock.java @@ -0,0 +1,58 @@ +package com.devonfw.tools.ide.commandlet; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Iterator; +import java.util.stream.Stream; + +import com.devonfw.tools.ide.commandlet.FileExtractor.CommandletFileExtractor; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.io.FileAccess; + +/** + * Implementation of {@link CommandletFileExtractor} for testing. + */ +public class CommandLetExtractorMock implements CommandletFileExtractor { + + private final IdeContext context; + + /** + * The constructor. + * + * @param context the {@link IdeContext} + */ + public CommandLetExtractorMock(IdeContext context) { + + this.context = context; + } + + @Override + public void extract(Path file, Path targetDir, boolean isExtract) { + + FileAccess fileAccess = context.getFileAccess(); + fileAccess.mkdirs(targetDir); + + if (Files.isDirectory(file)) { + + try (Stream childStream = Files.list(file)) { + Iterator iterator = childStream.iterator(); + while (iterator.hasNext()) { + Path child = iterator.next(); + fileAccess.copy(child, targetDir.resolve(child.getFileName())); + } + } catch (IOException e) { + throw new IllegalStateException("Failed to list files to copy in " + file, e); + } + + } else { + throw new IllegalStateException("Testing mocks only supports copying folders to install location!"); + } + } + + @Override + public void moveAndProcessExtraction(Path from, Path to) { + + // do nothing in mock + } +} diff --git a/cli/src/test/java/com/devonfw/tools/ide/commandlet/InstallCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/commandlet/InstallCommandletTest.java index 67562e69f..b2352dd67 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/commandlet/InstallCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/commandlet/InstallCommandletTest.java @@ -1,108 +1,109 @@ -package com.devonfw.tools.ide.commandlet; - -import com.devonfw.tools.ide.context.AbstractIdeContextTest; -import com.devonfw.tools.ide.context.IdeContext; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.get; -import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; - -/** - * Integration test of {@link InstallCommandlet}. - */ - -public class InstallCommandletTest extends AbstractIdeContextTest { - - private static WireMockServer server; - - private static Path resourcePath = Path.of("src/test/resources"); - - @BeforeAll - static void setUp() throws IOException { - - server = new WireMockServer(WireMockConfiguration.wireMockConfig().port(1111)); - server.start(); - } - - @AfterAll - static void tearDown() throws IOException { - - server.shutdownServer(); - } - - private void mockWebServer() throws IOException { - - Path windowsFilePath = resourcePath.resolve("__files").resolve("java-17.0.6-windows-x64.zip"); - String windowsLength = String.valueOf(Files.size(windowsFilePath)); - server.stubFor(get(urlPathEqualTo("/installTest/windows")).willReturn( - aResponse().withHeader("Content-Type", "application/zip").withHeader("Content-Length", windowsLength) - .withStatus(200).withBodyFile("java-17.0.6-windows-x64.zip"))); - - Path linuxFilePath = resourcePath.resolve("__files").resolve("java-17.0.6-linux-x64.tgz"); - String linuxLength = String.valueOf(Files.size(linuxFilePath)); - server.stubFor(get(urlPathEqualTo("/installTest/linux")).willReturn( - aResponse().withHeader("Content-Type", "application/tgz").withHeader("Content-Length", linuxLength) - .withStatus(200).withBodyFile("java-17.0.6-linux-x64.tgz"))); - - server.stubFor(get(urlPathEqualTo("/installTest/macOS")).willReturn( - aResponse().withHeader("Content-Type", "application/tgz").withHeader("Content-Length", linuxLength) - .withStatus(200).withBodyFile("java-17.0.6-linux-x64.tgz"))); - } - - /** - * Test of {@link InstallCommandlet} run, when Installed Version is null. - */ - @Test - public void testInstallCommandletRunWithVersion() throws IOException { - - // arrange - IdeContext context = newContext(PROJECT_BASIC); - InstallCommandlet install = context.getCommandletManager().getCommandlet(InstallCommandlet.class); - install.tool.setValueAsString("java", context); - mockWebServer(); - // act - install.run(); - // assert - assertTestInstall(context); - } - - /** - * Test of {@link InstallCommandlet} run, when Installed Version is set. - */ - @Test - public void testInstallCommandletRunWithVersionAndVersionIdentifier() throws IOException { - - // arrange - IdeContext context = newContext(PROJECT_BASIC); - InstallCommandlet install = context.getCommandletManager().getCommandlet(InstallCommandlet.class); - install.tool.setValueAsString("java", context); - install.version.setValueAsString("17.0.6", context); - mockWebServer(); - - // act - install.run(); - // assert - assertTestInstall(context); - } - - private void assertTestInstall(IdeContext context) { - - assertThat(context.getSoftwarePath().resolve("java")).exists(); - assertThat(context.getSoftwarePath().resolve("java/InstallTest.txt")).hasContent("This is a test file."); - assertThat(context.getSoftwarePath().resolve("java/bin/HelloWorld.txt")).hasContent("Hello World!"); - if (context.getSystemInfo().isWindows()) { - assertThat(context.getSoftwarePath().resolve("java/bin/java.cmd")).exists(); - } else if (context.getSystemInfo().isLinux() || context.getSystemInfo().isMac()) { - assertThat(context.getSoftwarePath().resolve("java/bin/java")).exists(); - } - } -} +package com.devonfw.tools.ide.commandlet; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeContext; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; + +/** + * Integration test of {@link InstallCommandlet}. + */ + +public class InstallCommandletTest extends AbstractIdeContextTest { + + private static WireMockServer server; + + private static Path resourcePath = Path.of("src/test/resources"); + + @BeforeAll + static void setUp() throws IOException { + + server = new WireMockServer(WireMockConfiguration.wireMockConfig().port(1111)); + server.start(); + } + + @AfterAll + static void tearDown() throws IOException { + + server.shutdownServer(); + } + + private void mockWebServer() throws IOException { + + Path windowsFilePath = resourcePath.resolve("__files").resolve("java-17.0.6-windows-x64.zip"); + String windowsLength = String.valueOf(Files.size(windowsFilePath)); + server.stubFor(get(urlPathEqualTo("/installTest/windows")).willReturn( + aResponse().withHeader("Content-Type", "application/zip").withHeader("Content-Length", windowsLength) + .withStatus(200).withBodyFile("java-17.0.6-windows-x64.zip"))); + + Path linuxFilePath = resourcePath.resolve("__files").resolve("java-17.0.6-linux-x64.tgz"); + String linuxLength = String.valueOf(Files.size(linuxFilePath)); + server.stubFor(get(urlPathEqualTo("/installTest/linux")).willReturn( + aResponse().withHeader("Content-Type", "application/tgz").withHeader("Content-Length", linuxLength) + .withStatus(200).withBodyFile("java-17.0.6-linux-x64.tgz"))); + + server.stubFor(get(urlPathEqualTo("/installTest/macOS")).willReturn( + aResponse().withHeader("Content-Type", "application/tgz").withHeader("Content-Length", linuxLength) + .withStatus(200).withBodyFile("java-17.0.6-linux-x64.tgz"))); + } + + /** + * Test of {@link InstallCommandlet} run, when Installed Version is null. + */ + @Test + public void testInstallCommandletRunWithVersion() throws IOException { + + // arrange + IdeContext context = newContext(PROJECT_BASIC); + InstallCommandlet install = context.getCommandletManager().getCommandlet(InstallCommandlet.class); + install.tool.setValueAsString("java", context); + mockWebServer(); + // act + install.run(); + // assert + assertTestInstall(context); + } + + /** + * Test of {@link InstallCommandlet} run, when Installed Version is set. + */ + @Test + public void testInstallCommandletRunWithVersionAndVersionIdentifier() throws IOException { + + // arrange + IdeContext context = newContext(PROJECT_BASIC); + InstallCommandlet install = context.getCommandletManager().getCommandlet(InstallCommandlet.class); + install.tool.setValueAsString("java", context); + install.version.setValueAsString("17.0.6", context); + mockWebServer(); + + // act + install.run(); + // assert + assertTestInstall(context); + } + + private void assertTestInstall(IdeContext context) { + + assertThat(context.getSoftwarePath().resolve("java")).exists(); + assertThat(context.getSoftwarePath().resolve("java/InstallTest.txt")).hasContent("This is a test file."); + assertThat(context.getSoftwarePath().resolve("java/bin/HelloWorld.txt")).hasContent("Hello World!"); + if (context.getSystemInfo().isWindows()) { + assertThat(context.getSoftwarePath().resolve("java/bin/java.cmd")).exists(); + } else if (context.getSystemInfo().isLinux() || context.getSystemInfo().isMac()) { + assertThat(context.getSoftwarePath().resolve("java/bin/java")).exists(); + } + } +} diff --git a/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeContextTest.java b/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeContextTest.java index 96d44eb36..0a2fe8cad 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeContextTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeContextTest.java @@ -1,5 +1,13 @@ package com.devonfw.tools.ide.context; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.assertj.core.api.Condition; +import org.assertj.core.api.ListAssert; + import com.devonfw.tools.ide.io.FileAccess; import com.devonfw.tools.ide.io.FileAccessImpl; import com.devonfw.tools.ide.io.FileCopyMode; @@ -7,13 +15,6 @@ import com.devonfw.tools.ide.log.IdeLogLevel; import com.devonfw.tools.ide.log.IdeTestLogger; import com.devonfw.tools.ide.repo.ToolRepositoryMock; -import org.assertj.core.api.Assertions; -import org.assertj.core.api.Condition; -import org.assertj.core.api.ListAssert; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; /** * Abstract base class for tests that need mocked instances of {@link IdeContext}. @@ -216,4 +217,4 @@ protected static void assertProgressBar(IdeContext context, String taskName, lon assertProgressBar(context, taskName, maxSize, CHUNK_SIZE, chunkCount, restSize); } -} +} \ No newline at end of file diff --git a/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeTestContext.java b/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeTestContext.java index 0cfa42719..b8b412f0c 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeTestContext.java +++ b/cli/src/test/java/com/devonfw/tools/ide/context/AbstractIdeTestContext.java @@ -1,5 +1,10 @@ package com.devonfw.tools.ide.context; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + import com.devonfw.tools.ide.io.IdeProgressBar; import com.devonfw.tools.ide.io.IdeProgressBarTestImpl; import com.devonfw.tools.ide.log.IdeLogLevel; @@ -8,11 +13,6 @@ import com.devonfw.tools.ide.repo.DefaultToolRepository; import com.devonfw.tools.ide.repo.ToolRepository; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - /** * Implementation of {@link IdeContext} for testing. */ diff --git a/cli/src/test/java/com/devonfw/tools/ide/context/IdeTestContext.java b/cli/src/test/java/com/devonfw/tools/ide/context/IdeTestContext.java index b1ed23f43..2ab6e7ecc 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/context/IdeTestContext.java +++ b/cli/src/test/java/com/devonfw/tools/ide/context/IdeTestContext.java @@ -1,12 +1,12 @@ package com.devonfw.tools.ide.context; +import java.nio.file.Path; + import com.devonfw.tools.ide.log.IdeLogLevel; import com.devonfw.tools.ide.log.IdeTestLogger; import com.devonfw.tools.ide.process.ProcessContext; import com.devonfw.tools.ide.repo.ToolRepository; -import java.nio.file.Path; - /** * Implementation of {@link IdeContext} for testing. */ diff --git a/cli/src/test/java/com/devonfw/tools/ide/repo/ToolRepositoryMock.java b/cli/src/test/java/com/devonfw/tools/ide/repo/ToolRepositoryMock.java index bb187d6c7..0fc59aaed 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/repo/ToolRepositoryMock.java +++ b/cli/src/test/java/com/devonfw/tools/ide/repo/ToolRepositoryMock.java @@ -1,14 +1,14 @@ package com.devonfw.tools.ide.repo; -import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.version.VersionIdentifier; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Iterator; import java.util.stream.Stream; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.version.VersionIdentifier; + /** * Implementation of {@link ToolRepository} for testing. */ diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/jmc/JmcTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/jmc/JmcTest.java index e5768c949..b9e9578e0 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/jmc/JmcTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/jmc/JmcTest.java @@ -83,4 +83,4 @@ private void checkInstallation(IdeTestContext context) { assertLogMessage(context, IdeLogLevel.SUCCESS, "Successfully installed jmc in version 8.3.0"); } -} +} \ No newline at end of file diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/npm/NpmTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/npm/NpmTest.java new file mode 100644 index 000000000..41d3d4faa --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/npm/NpmTest.java @@ -0,0 +1,88 @@ +package com.devonfw.tools.ide.tool.npm; + +import java.nio.file.Path; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.commandlet.CommandLetExtractorMock; +import com.devonfw.tools.ide.context.AbstractIdeContext; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.devonfw.tools.ide.log.IdeLogLevel; +import com.devonfw.tools.ide.repo.ToolRepositoryMock; + +public class NpmTest extends AbstractIdeContextTest { + + private static AbstractIdeContext context; + private static Npm commandlet; + private final static String NPM_TEST_PATH = "workspaces/foo-test/my-git-repo"; + private final static String PROJECT_TEST_CASE_NAME = "npm"; + private static ToolRepositoryMock toolRepositoryMock; + private static Path mockResultPath; + + @BeforeAll + static void setUp() { + + toolRepositoryMock = buildToolRepositoryMockForNpm(PROJECT_TEST_CASE_NAME); + + context = newContext(PROJECT_TEST_CASE_NAME, NPM_TEST_PATH, true, toolRepositoryMock); + toolRepositoryMock.setContext(context); + mockResultPath = Path.of("target/test-projects/npm/project"); + context.setDefaultExecutionDirectory(mockResultPath); + + CommandLetExtractorMock commandLetExtractorMock = new CommandLetExtractorMock(context); + commandlet = new Npm(context); + commandlet.setCommandletFileExtractor(commandLetExtractorMock); + } + + @Test + public void npmPostInstallShouldMoveFiles() { + assertThat(context.getSoftwarePath().resolve("node/npm")).hasContent("This is npm"); + assertThat(context.getSoftwarePath().resolve("node/npx")).hasContent("This is npx"); + + // act + commandlet.install(); + + // assert + String expectedMessage = "Successfully installed npm in version 9.9.2"; + assertLogMessage((IdeTestContext) context, IdeLogLevel.SUCCESS, expectedMessage, false); + + if (context.getSystemInfo().isWindows()) { + assertThat(context.getSoftwarePath().resolve("node/npm")).exists(); + assertThat(context.getSoftwarePath().resolve("node/npm.cmd")).exists(); + assertThat(context.getSoftwarePath().resolve("node/npx")).exists(); + assertThat(context.getSoftwarePath().resolve("node/npx.cmd")).exists(); + + assertThat(context.getSoftwarePath().resolve("node/npm")).hasContent("This is npm bin"); + assertThat(context.getSoftwarePath().resolve("node/npx")).hasContent("This is npx bin"); + } + } + + @Test + public void npmShouldRunExecutableSuccessful() { + + //arrange + String expectedOutputWindowsNpm = "Dummy npm bin 9.9.2 on windows"; + + // act + commandlet.install(); + commandlet.run(); + + //assert + assertThat(mockResultPath.resolve("npmTestResult.txt")).exists(); + assertThat(mockResultPath.resolve("npmTestResult.txt")).hasContent(expectedOutputWindowsNpm); + } + + private static ToolRepositoryMock buildToolRepositoryMockForNpm(String projectTestCaseName) { + + String windowsFileFolder = "npm-9.9.2"; + + ToolRepositoryMock toolRepositoryMock = new ToolRepositoryMock("npm", "9.9.2", projectTestCaseName, + windowsFileFolder, "", ""); + + toolRepositoryMock.addAlreadyInstalledTool("node", "v18.19.1"); + + return toolRepositoryMock; + } +} \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/_ide/software/default/java/java/17.0.10_7/.ide.software.version b/cli/src/test/resources/ide-projects/jmc/_ide/software/default/java/java/17.0.10_7/.ide.software.version new file mode 100644 index 000000000..82da54c37 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/_ide/software/default/java/java/17.0.10_7/.ide.software.version @@ -0,0 +1 @@ +17.0.10_7 diff --git a/cli/src/test/resources/ide-projects/jmc/_ide/software/default/java/java/17.0.10_7/bin/readme b/cli/src/test/resources/ide-projects/jmc/_ide/software/default/java/java/17.0.10_7/bin/readme new file mode 100644 index 000000000..a4d7c09a6 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/_ide/software/default/java/java/17.0.10_7/bin/readme @@ -0,0 +1 @@ +here is the mocked java executeable location \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/_ide/software/readme b/cli/src/test/resources/ide-projects/jmc/_ide/software/readme new file mode 100644 index 000000000..c5be1dc4f --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/InstallTest.txt b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/InstallTest.txt new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/InstallTest.txt @@ -0,0 +1 @@ +This is a test file. diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/JDK Mission Control/HelloWorld.txt b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/JDK Mission Control/HelloWorld.txt new file mode 100644 index 000000000..980a0d5f1 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/JDK Mission Control/HelloWorld.txt @@ -0,0 +1 @@ +Hello World! diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/JDK Mission Control/jmc b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/JDK Mission Control/jmc new file mode 100644 index 000000000..038eea977 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-linux.gtk.x86_64/JDK Mission Control/jmc @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Dummy jmc 8.3.0 on linux" > jmcTestRestult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/InstallTest.txt b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/InstallTest.txt new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/InstallTest.txt @@ -0,0 +1 @@ +This is a test file. diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/JDK Mission Control.app/Contents/jmc b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/JDK Mission Control.app/Contents/jmc new file mode 100644 index 000000000..8b6eb3cd4 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/JDK Mission Control.app/Contents/jmc @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Dummy jmc 8.3.0 on macOs" > jmcTestRestult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/legal/legal.txt b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/legal/legal.txt new file mode 100644 index 000000000..6308c936c --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-macosx.cocoa.x86_64/legal/legal.txt @@ -0,0 +1 @@ +legal \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/InstallTest.txt b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/InstallTest.txt new file mode 100644 index 000000000..6de7b8c69 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/InstallTest.txt @@ -0,0 +1 @@ +This is a test file. diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/JDK Mission Control/HelloWorld.txt b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/JDK Mission Control/HelloWorld.txt new file mode 100644 index 000000000..980a0d5f1 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/JDK Mission Control/HelloWorld.txt @@ -0,0 +1 @@ +Hello World! diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/JDK Mission Control/jmc.cmd b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/JDK Mission Control/jmc.cmd new file mode 100644 index 000000000..ab8e57341 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/org.openjdk.jmc-8.3.0-win32.win32.x86_64/JDK Mission Control/jmc.cmd @@ -0,0 +1 @@ +echo Dummy jmc 8.3.0 on windows> jmcTestRestult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/readme b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/readme new file mode 100644 index 000000000..9d835d54c --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/downloadMockLocation/readme @@ -0,0 +1 @@ +this locations equals the download location of a commandlet \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/conf/ide.properties b/cli/src/test/resources/ide-projects/jmc/project/conf/ide.properties new file mode 100644 index 000000000..224a2cf25 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/conf/ide.properties @@ -0,0 +1,16 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** + +M2_REPO=~/.m2/repository + +SOME=some-${UNDEFINED} + +TEST_ARGS1=${TEST_ARGS1} conf1 +TEST_ARGS2=${TEST_ARGS2} conf2 +TEST_ARGS5=${TEST_ARGS5} conf5 +TEST_ARGS6=${TEST_ARGS6} conf6 +TEST_ARGS7=${TEST_ARGS7} conf7 +TEST_ARGS8=${TEST_ARGS8} conf8 +TEST_ARGSa=${TEST_ARGS1} ${TEST_ARGS3} confa +TEST_ARGSc=${TEST_ARGSc} confc \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/home/.ide/ide.properties b/cli/src/test/resources/ide-projects/jmc/project/home/.ide/ide.properties index e69de29bb..ec0c3e7f6 100644 --- a/cli/src/test/resources/ide-projects/jmc/project/home/.ide/ide.properties +++ b/cli/src/test/resources/ide-projects/jmc/project/home/.ide/ide.properties @@ -0,0 +1,15 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** + +DOCKER_EDITION=docker +FOO=foo-${BAR} + +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/home/.ide/settings/eclipse/plugins/anyedit.properties b/cli/src/test/resources/ide-projects/jmc/project/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 000000000..eb298f3bb --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/cli/src/test/resources/ide-projects/jmc/project/home/Downloads/ide/readme b/cli/src/test/resources/ide-projects/jmc/project/home/Downloads/ide/readme new file mode 100644 index 000000000..f0dc29025 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/scripts/ide b/cli/src/test/resources/ide-projects/jmc/project/scripts/ide new file mode 100644 index 000000000..b0c2d7872 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/scripts/ide @@ -0,0 +1 @@ +the IDE CLI bash script \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/settings/eclipse/plugins/anyedit.properties b/cli/src/test/resources/ide-projects/jmc/project/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 000000000..09a94b116 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/cli/src/test/resources/ide-projects/jmc/project/settings/eclipse/plugins/checkstyle.properties b/cli/src/test/resources/ide-projects/jmc/project/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 000000000..6e402c7c5 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/cli/src/test/resources/ide-projects/jmc/project/setup b/cli/src/test/resources/ide-projects/jmc/project/setup new file mode 100644 index 000000000..9c5d4b1be --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/software/java/.ide.software.version b/cli/src/test/resources/ide-projects/jmc/project/software/java/.ide.software.version new file mode 100644 index 000000000..82da54c37 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/software/java/.ide.software.version @@ -0,0 +1 @@ +17.0.10_7 diff --git a/cli/src/test/resources/ide-projects/jmc/project/software/java/bin/readme b/cli/src/test/resources/ide-projects/jmc/project/software/java/bin/readme new file mode 100644 index 000000000..a4d7c09a6 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/software/java/bin/readme @@ -0,0 +1 @@ +here is the mocked java executeable location \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/ide.properties b/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/ide.properties new file mode 100644 index 000000000..fefd6bede --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/ide.properties @@ -0,0 +1,12 @@ +#******************************************************************************** +# Type of {@link EnvironmentVariables} from the +# {@link com.devonfw.tools.ide.context.IdeContext#getWorkspacePath() workspace directory}. +#******************************************************************************** +TEST_ARGS1=${TEST_ARGS1} workspace1 +TEST_ARGS3=${TEST_ARGS3} workspace3 +TEST_ARGS6=${TEST_ARGS6} workspace6 +TEST_ARGS7=${TEST_ARGS7} workspace7 +TEST_ARGS8=${TEST_ARGS8} workspace8 +TEST_ARGS9=${TEST_ARGS9} workspace9 +TEST_ARGS10=${TEST_ARGS10} workspace10 +TEST_ARGSd=${TEST_ARGSd} workspaced \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/my-git-repo/readme b/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/my-git-repo/readme new file mode 100644 index 000000000..059135125 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/my-git-repo/readme @@ -0,0 +1 @@ +my-git-repo in foo-test workspace of jmc test case \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/readme b/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/readme new file mode 100644 index 000000000..144e7e389 --- /dev/null +++ b/cli/src/test/resources/ide-projects/jmc/project/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of jmc test case \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/.ide.software.version b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/.ide.software.version new file mode 100644 index 000000000..60495ee0a --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/.ide.software.version @@ -0,0 +1 @@ +v18.19.1 diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npm b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npm new file mode 100644 index 000000000..23094033f --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npm @@ -0,0 +1 @@ +This is npm bin \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npm.cmd b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npm.cmd new file mode 100644 index 000000000..d293a6e9c --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npm.cmd @@ -0,0 +1 @@ +echo Dummy npm bin 9.9.2 on windows> npmTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npx b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npx new file mode 100644 index 000000000..98615a289 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npx @@ -0,0 +1 @@ +This is npx bin \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npx.cmd b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npx.cmd new file mode 100644 index 000000000..9cf53fe43 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/node_modules/npm/bin/npx.cmd @@ -0,0 +1 @@ +echo Dummy npx bin on windows> npxTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npm b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npm new file mode 100644 index 000000000..318ec5500 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npm @@ -0,0 +1 @@ +This is npm \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npm.cmd b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npm.cmd new file mode 100644 index 000000000..8ae288d8a --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npm.cmd @@ -0,0 +1 @@ +echo Dummy npm 9.9.2 on windows> npmTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npx b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npx new file mode 100644 index 000000000..eb58f3611 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npx @@ -0,0 +1 @@ +This is npx \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npx.cmd b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npx.cmd new file mode 100644 index 000000000..fe8cb36f6 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/default/node/node/v18.19.1/npx.cmd @@ -0,0 +1 @@ +echo Dummy npx on windows> npxTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/_ide/software/readme b/cli/src/test/resources/ide-projects/npm/_ide/software/readme new file mode 100644 index 000000000..c5be1dc4f --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/downloadMockLocation/npm-9.9.2/package/bin/dummyTextFile.txt b/cli/src/test/resources/ide-projects/npm/downloadMockLocation/npm-9.9.2/package/bin/dummyTextFile.txt new file mode 100644 index 000000000..2ed32aeb7 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/downloadMockLocation/npm-9.9.2/package/bin/dummyTextFile.txt @@ -0,0 +1 @@ +Dummy text file diff --git a/cli/src/test/resources/ide-projects/npm/project/conf/ide.properties b/cli/src/test/resources/ide-projects/npm/project/conf/ide.properties new file mode 100644 index 000000000..224a2cf25 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/conf/ide.properties @@ -0,0 +1,16 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** + +M2_REPO=~/.m2/repository + +SOME=some-${UNDEFINED} + +TEST_ARGS1=${TEST_ARGS1} conf1 +TEST_ARGS2=${TEST_ARGS2} conf2 +TEST_ARGS5=${TEST_ARGS5} conf5 +TEST_ARGS6=${TEST_ARGS6} conf6 +TEST_ARGS7=${TEST_ARGS7} conf7 +TEST_ARGS8=${TEST_ARGS8} conf8 +TEST_ARGSa=${TEST_ARGS1} ${TEST_ARGS3} confa +TEST_ARGSc=${TEST_ARGSc} confc \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/home/.ide/ide.properties b/cli/src/test/resources/ide-projects/npm/project/home/.ide/ide.properties new file mode 100644 index 000000000..ec0c3e7f6 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/home/.ide/ide.properties @@ -0,0 +1,15 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** + +DOCKER_EDITION=docker +FOO=foo-${BAR} + +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/home/.ide/settings/eclipse/plugins/anyedit.properties b/cli/src/test/resources/ide-projects/npm/project/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 000000000..eb298f3bb --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/cli/src/test/resources/ide-projects/npm/project/home/Downloads/ide/readme b/cli/src/test/resources/ide-projects/npm/project/home/Downloads/ide/readme new file mode 100644 index 000000000..f0dc29025 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/home/readme b/cli/src/test/resources/ide-projects/npm/project/home/readme new file mode 100644 index 000000000..5e8bc178c --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/readme b/cli/src/test/resources/ide-projects/npm/project/readme new file mode 100644 index 000000000..256f5732c --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/readme @@ -0,0 +1 @@ +this is the IDE_HOME directory \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/scripts/ide b/cli/src/test/resources/ide-projects/npm/project/scripts/ide new file mode 100644 index 000000000..b0c2d7872 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/scripts/ide @@ -0,0 +1 @@ +the IDE CLI bash script \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/settings/eclipse/plugins/anyedit.properties b/cli/src/test/resources/ide-projects/npm/project/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 000000000..09a94b116 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/cli/src/test/resources/ide-projects/npm/project/settings/eclipse/plugins/checkstyle.properties b/cli/src/test/resources/ide-projects/npm/project/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 000000000..6e402c7c5 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/cli/src/test/resources/ide-projects/npm/project/settings/ide.properties b/cli/src/test/resources/ide-projects/npm/project/settings/ide.properties new file mode 100644 index 000000000..c80f1e604 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/settings/ide.properties @@ -0,0 +1,22 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** + +JAVA_VERSION=17* +MVN_VERSION=3.9.* +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate + +IDE_TOOLS=mvn,eclipse + +BAR=bar-${SOME} + +TEST_ARGS1=${TEST_ARGS1} settings1 +TEST_ARGS4=${TEST_ARGS4} settings4 +TEST_ARGS5=${TEST_ARGS5} settings5 +TEST_ARGS6=${TEST_ARGS6} settings6 +TEST_ARGS7=${TEST_ARGS7} settings7 +TEST_ARGS8=settings8 +TEST_ARGS9=settings9 +TEST_ARGSb=${TEST_ARGS10} settingsb ${TEST_ARGSa} ${TEST_ARGSb} +TEST_ARGSc=${TEST_ARGSc} settingsc \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/setup b/cli/src/test/resources/ide-projects/npm/project/setup new file mode 100644 index 000000000..9c5d4b1be --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/.ide.software.version b/cli/src/test/resources/ide-projects/npm/project/software/node/.ide.software.version new file mode 100644 index 000000000..60495ee0a --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/.ide.software.version @@ -0,0 +1 @@ +v18.19.1 diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npm b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npm new file mode 100644 index 000000000..23094033f --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npm @@ -0,0 +1 @@ +This is npm bin \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npm.cmd b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npm.cmd new file mode 100644 index 000000000..d293a6e9c --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npm.cmd @@ -0,0 +1 @@ +echo Dummy npm bin 9.9.2 on windows> npmTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npx b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npx new file mode 100644 index 000000000..98615a289 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npx @@ -0,0 +1 @@ +This is npx bin \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npx.cmd b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npx.cmd new file mode 100644 index 000000000..9cf53fe43 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/npm/bin/npx.cmd @@ -0,0 +1 @@ +echo Dummy npx bin on windows> npxTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/readme b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/readme new file mode 100644 index 000000000..de5e013c7 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/node_modules/readme @@ -0,0 +1 @@ +here is the mocked node executeable location \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/npm b/cli/src/test/resources/ide-projects/npm/project/software/node/npm new file mode 100644 index 000000000..8ae288d8a --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/npm @@ -0,0 +1 @@ +echo Dummy npm 9.9.2 on windows> npmTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/npm.cmd b/cli/src/test/resources/ide-projects/npm/project/software/node/npm.cmd new file mode 100644 index 000000000..8ae288d8a --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/npm.cmd @@ -0,0 +1 @@ +echo Dummy npm 9.9.2 on windows> npmTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/npx b/cli/src/test/resources/ide-projects/npm/project/software/node/npx new file mode 100644 index 000000000..eb58f3611 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/npx @@ -0,0 +1 @@ +This is npx \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/software/node/npx.cmd b/cli/src/test/resources/ide-projects/npm/project/software/node/npx.cmd new file mode 100644 index 000000000..fe8cb36f6 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/software/node/npx.cmd @@ -0,0 +1 @@ +echo Dummy npx on windows> npxTestResult.txt \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/ide.properties b/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/ide.properties new file mode 100644 index 000000000..fefd6bede --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/ide.properties @@ -0,0 +1,12 @@ +#******************************************************************************** +# Type of {@link EnvironmentVariables} from the +# {@link com.devonfw.tools.ide.context.IdeContext#getWorkspacePath() workspace directory}. +#******************************************************************************** +TEST_ARGS1=${TEST_ARGS1} workspace1 +TEST_ARGS3=${TEST_ARGS3} workspace3 +TEST_ARGS6=${TEST_ARGS6} workspace6 +TEST_ARGS7=${TEST_ARGS7} workspace7 +TEST_ARGS8=${TEST_ARGS8} workspace8 +TEST_ARGS9=${TEST_ARGS9} workspace9 +TEST_ARGS10=${TEST_ARGS10} workspace10 +TEST_ARGSd=${TEST_ARGSd} workspaced \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/my-git-repo/readme b/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/my-git-repo/readme new file mode 100644 index 000000000..af864499d --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/my-git-repo/readme @@ -0,0 +1 @@ +my-git-repo in foo-test workspace of npm test case \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/readme b/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/readme new file mode 100644 index 000000000..f7a72d8d2 --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of npm test case \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/project/workspaces/main/readme b/cli/src/test/resources/ide-projects/npm/project/workspaces/main/readme new file mode 100644 index 000000000..ebbc1b9ec --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/project/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of npm test case \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/npm/readme b/cli/src/test/resources/ide-projects/npm/readme new file mode 100644 index 000000000..15b91829e --- /dev/null +++ b/cli/src/test/resources/ide-projects/npm/readme @@ -0,0 +1 @@ +this is the IDE_ROOT directory \ No newline at end of file diff --git a/documentation/IDEasy-usage.asciidoc b/documentation/IDEasy-usage.asciidoc index 7917902c1..3c58109dc 100644 --- a/documentation/IDEasy-usage.asciidoc +++ b/documentation/IDEasy-usage.asciidoc @@ -1,39 +1,39 @@ -= Usage - -include::usage.asciidoc[leveloffset=2] - -<<<< - -include::configuration.asciidoc[leveloffset=2] - -<<<< - -include::variables.asciidoc[leveloffset=2] - -<<<< - -include::cli.asciidoc[leveloffset=2] - -include::docker-desktop-alternative.asciidoc[leveloffset=3] - -<<<< - -include::structure.asciidoc[leveloffset=2] - -include::conf.asciidoc[leveloffset=3] - -include::log.asciidoc[leveloffset=3] - -include::scripts.asciidoc[leveloffset=3] - -include::settings.asciidoc[leveloffset=3] - -include::software.asciidoc[leveloffset=3] - -include::system.asciidoc[leveloffset=3] - -include::updates.asciidoc[leveloffset=3] - -include::workspaces.asciidoc[leveloffset=3] - -include::projects.asciidoc[leveloffset=3] += Usage + +include::usage.asciidoc[leveloffset=2] + +<<<< + +include::configuration.asciidoc[leveloffset=2] + +<<<< + +include::variables.asciidoc[leveloffset=2] + +<<<< + +include::cli.asciidoc[leveloffset=2] + +include::docker-desktop-alternative.asciidoc[leveloffset=3] + +<<<< + +include::structure.asciidoc[leveloffset=2] + +include::conf.asciidoc[leveloffset=3] + +include::log.asciidoc[leveloffset=3] + +include::scripts.asciidoc[leveloffset=3] + +include::settings.asciidoc[leveloffset=3] + +include::software.asciidoc[leveloffset=3] + +include::system.asciidoc[leveloffset=3] + +include::updates.asciidoc[leveloffset=3] + +include::workspaces.asciidoc[leveloffset=3] + +include::projects.asciidoc[leveloffset=3] \ No newline at end of file diff --git a/documentation/npm.asciidoc b/documentation/npm.asciidoc new file mode 100644 index 000000000..db91744bc --- /dev/null +++ b/documentation/npm.asciidoc @@ -0,0 +1,21 @@ +:toc: +toc::[] + += npm + +The `npm` commandlet allows to install, configure, and launch https://www.npmjs.com/[npm]. Calling `devon npm «args»` is more or less the same as calling `npm «args»` but with the benefit that the version of npm preferred by your project is used (and will be installed if not yet available). + +The arguments (`devon npm «args»`) are explained by the following table: + +.Usage of `devon npm` +[options="header"] +|======================= +|*Argument(s)* |*Meaning* +| |run default build, link:configuration.asciidoc[configurable] via `NPM_BUILD_OPTS` +|`setup` |setup NPM (install and verify), link:configuration.asciidoc[configurable] via `NPM_VERSION` +|`get-version` |print the version of your current project +|`set-version «nv» [«cv»]` |set the version of your current project to `«nv»` (assuming your current version is `«cv»`) +|`check-top-level-project` |check if you are running on a top-level project or fail if in a module or no NPM project at all +|`release` |Start a clean deploy release build, link:configuration.asciidoc[configurable] via `NPM_RELEASE_OPTS` +|`«args»` |run NPM with the given arguments (`«args»`) +|======================= \ No newline at end of file