diff --git a/README.adoc b/README.adoc index 3810034dc..919af3e1f 100644 --- a/README.adoc +++ b/README.adoc @@ -7,7 +7,7 @@ image::documentation/images/logo.png["Logo",align="center",width=60%] Tool to automate the setup and updates of a development environment for any project (Successor of https://github.com/devonfw/ide[devonfw-ide]). image:https://img.shields.io/github/license/devonfw/IDEasy.svg?label=License["Apache License, Version 2.0",link=https://github.com/devonfw/IDEasy/blob/master/LICENSE] -image:https://img.shields.io/maven-central/v/com.devonfw.tools.ide/ide-cli.svg?label=Maven%20Central["Maven Central",link=https://search.maven.org/search?q=g:com.devonfw.tools.ide] +image:https://img.shields.io/maven-central/v/com.devonfw.tools.IDEasy/ide-cli.svg?label=Maven%20Central["Maven Central",link=https://search.maven.org/search?q=g:com.devonfw.tools.IDEasy] image:https://github.com/devonfw/IDEasy/actions/workflows/build.yml/badge.svg["Build Status",link="https://github.com/devonfw/IDEasy/actions/workflows/build.yml"] image:https://github.com/devonfw/IDEasy/actions/workflows/update-urls.yml/badge.svg["Update URLS Status",link="https://github.com/devonfw/IDEasy/actions/workflows/update-urls.yml"] image:https://github.com/devonfw/IDEasy/actions/workflows/nightly-build.yml/badge.svg["Nightly Release", link="https://github.com/devonfw/IDEasy/actions/workflows/nightly-build.yml"] 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 2444fe166..083ee7356 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 @@ -24,6 +24,7 @@ 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.pgadmin.PgAdmin; import com.devonfw.tools.ide.tool.quarkus.Quarkus; import com.devonfw.tools.ide.tool.sonar.Sonar; import com.devonfw.tools.ide.tool.terraform.Terraform; @@ -101,6 +102,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Docker(context)); add(new Sonar(context)); add(new GraalVm(context)); + add(new PgAdmin(context)); } private void add(Commandlet commandlet) { diff --git a/cli/src/main/java/com/devonfw/tools/ide/common/Tag.java b/cli/src/main/java/com/devonfw/tools/ide/common/Tag.java index 1eda29dcf..521b28f0b 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/common/Tag.java +++ b/cli/src/main/java/com/devonfw/tools/ide/common/Tag.java @@ -214,6 +214,9 @@ public final class Tag { /** {@link #Tag} for WSL. */ public static final Tag WSL = create("wsl", VIRTUALIZATION); + /** {@link Tag} for everything related to databases. */ + public static final Tag DB = create("database", ROOT); + /** {@link #Tag} for network. */ public static final Tag NETWORK = create("network", ROOT, false, "remote"); 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 097f36828..6149abea0 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 @@ -33,26 +33,28 @@ public GlobalToolCommandlet(IdeContext context, String tool, Set tags) { } /** - * Performs the installation of the {@link #getName() tool} via a package manager. + * Performs the installation or uninstallation of the {@link #getName() tool} via a package manager. * * @param silent {@code true} if called recursively to suppress verbose logging, {@code false} otherwise. * @param commandStrings commandStrings The package manager command strings to execute. - * @return {@code true} if installation succeeds with any of the package manager commands, {@code false} otherwise. + * @return {@code true} if installation or uninstallation succeeds with any of the package manager commands, + * {@code false} otherwise. */ - protected boolean installWithPackageManager(boolean silent, String... commandStrings) { + protected boolean runWithPackageManager(boolean silent, String... commandStrings) { List pmCommands = Arrays.stream(commandStrings).map(PackageManagerCommand::of).toList(); - return installWithPackageManager(silent, pmCommands); + return runWithPackageManager(silent, pmCommands); } /** - * Performs the installation of the {@link #getName() tool} via a package manager. - * + * Performs the installation or uninstallation of the {@link #getName() tool} via a package manager. + * * @param silent {@code true} if called recursively to suppress verbose logging, {@code false} otherwise. - * @param pmCommands A list of {@link PackageManagerCommand} to be used for installation. - * @return {@code true} if installation succeeds with any of the package manager commands, {@code false} otherwise. + * @param pmCommands A list of {@link PackageManagerCommand} to be used for installation or uninstallation. + * @return {@code true} if installation or uninstallation succeeds with any of the package manager commands, + * {@code false} otherwise. */ - protected boolean installWithPackageManager(boolean silent, List pmCommands) { + protected boolean runWithPackageManager(boolean silent, List pmCommands) { for (PackageManagerCommand pmCommand : pmCommands) { PackageManager packageManager = pmCommand.packageManager(); @@ -63,7 +65,7 @@ protected boolean installWithPackageManager(boolean silent, List getPackageManagerCommands() { + private List getPackageManagerCommandsInstall() { String edition = getEdition(); ToolRepository toolRepository = this.context.getDefaultToolRepository(); diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java new file mode 100644 index 000000000..ed3c26643 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java @@ -0,0 +1,87 @@ +package com.devonfw.tools.ide.tool.pgadmin; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.repo.ToolRepository; +import com.devonfw.tools.ide.tool.GlobalToolCommandlet; +import com.devonfw.tools.ide.tool.PackageManager; +import com.devonfw.tools.ide.tool.PackageManagerCommand; +import com.devonfw.tools.ide.version.VersionIdentifier; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +/** + * {@link GlobalToolCommandlet} for pgadmin + */ +public class PgAdmin extends GlobalToolCommandlet { + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public PgAdmin(IdeContext context) { + + //TODO: add relevant Tag. + super(context, "pgadmin", Set.of(Tag.DB)); + } + + @Override + protected boolean doInstall(boolean silent) { + + if (this.context.getSystemInfo().isLinux()) { + return runWithPackageManager(silent, getPackageManagerCommandsInstall()); + } else { + return super.doInstall(silent); + } + } + + private List getPackageManagerCommandsInstall() { + + String edition = getEdition(); + ToolRepository toolRepository = this.context.getDefaultToolRepository(); + VersionIdentifier configuredVersion = getConfiguredVersion(); + String resolvedVersion = toolRepository.resolveVersion(this.tool, edition, configuredVersion).toString(); + + List pmCommands = new ArrayList<>(); + + pmCommands.add(new PackageManagerCommand(PackageManager.APT, Arrays.asList( + "curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | " + + "sudo gpg --yes --dearmor -o /usr/share/keyrings/packages-pgadmin-org.gpg", + "sudo sh -c 'echo \"deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] " + + "https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main\" " + + "> /etc/apt/sources.list.d/pgadmin4.list && apt update'", String.format( + "sudo apt install -y --allow-downgrades pgadmin4=%1$s pgadmin4-server=%1$s pgadmin4-desktop=%1$s pgadmin4-web=%1$s", + resolvedVersion)))); + + return pmCommands; + } + + @Override + public void uninstall() { + + if (this.context.getSystemInfo().isLinux()) { + runWithPackageManager(false, getPackageManagerCommandsUninstall()); + } else { + super.uninstall(); + } + } + + private List getPackageManagerCommandsUninstall() { + + List pmCommands = new ArrayList<>(); + + pmCommands.add(new PackageManagerCommand(PackageManager.APT, + Arrays.asList("sudo apt -y autoremove pgadmin4 pgadmin4-server pgadmin4-desktop pgadmin4-web"))); + + return pmCommands; + } + + @Override + protected String getBinaryName() { + + return "pgadmin4"; + } +} \ No newline at end of file diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdminUrlUpdater.java b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdminUrlUpdater.java new file mode 100644 index 000000000..5e5a4ed6f --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdminUrlUpdater.java @@ -0,0 +1,55 @@ +package com.devonfw.tools.ide.tool.pgadmin; + +import com.devonfw.tools.ide.os.OperatingSystem; +import com.devonfw.tools.ide.url.model.folder.UrlVersion; +import com.devonfw.tools.ide.url.updater.WebsiteUrlUpdater; +import com.devonfw.tools.ide.version.VersionIdentifier; + +import java.util.regex.Pattern; + +/** + * {@link WebsiteUrlUpdater} for pgadmin. + */ +public class PgAdminUrlUpdater extends WebsiteUrlUpdater { + + @Override + protected String getTool() { + + return "pgadmin"; + } + + @Override + protected String getVersionUrl() { + + return "https://www.postgresql.org/ftp/pgadmin/pgadmin4/"; + } + + @Override + protected Pattern getVersionPattern() { + + return Pattern.compile("v(\\d{1,2}+\\.\\d+)"); + } + + @Override + protected String getVersionPrefixToRemove() { + + return "v"; + } + + @Override + protected void addVersion(UrlVersion urlVersion) { + + VersionIdentifier vid = urlVersion.getVersionIdentifier(); + + String baseUrl = "https://ftp.postgresql.org/pub/pgadmin/pgadmin4/"; + doAddVersion(urlVersion, baseUrl + "v${version}/windows/pgadmin4-${version}-x64.exe", OperatingSystem.WINDOWS); + + if (vid.compareVersion(VersionIdentifier.of("7.6")).isGreater()) { + doAddVersion(urlVersion, baseUrl + "v${version}/macos/pgadmin4-${version}-arm64.dmg", MAC, ARM64); + doAddVersion(urlVersion, baseUrl + "v${version}/macos/pgadmin4-${version}-x86_64.dmg", MAC, X64); + } else { + doAddVersion(urlVersion, baseUrl + "v${version}/macos/pgadmin4-${version}.dmg", MAC); + } + } + +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java b/cli/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java index 1fbf44b8f..ef10818fb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java +++ b/cli/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java @@ -1,13 +1,5 @@ package com.devonfw.tools.ide.url.updater; -import java.nio.file.Path; -import java.time.Instant; -import java.util.Arrays; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.devonfw.tools.ide.tool.androidstudio.AndroidStudioUrlUpdater; import com.devonfw.tools.ide.tool.aws.AwsUrlUpdater; import com.devonfw.tools.ide.tool.az.AzureUrlUpdater; @@ -26,6 +18,7 @@ import com.devonfw.tools.ide.tool.gradle.GradleUrlUpdater; import com.devonfw.tools.ide.tool.helm.HelmUrlUpdater; import com.devonfw.tools.ide.tool.intellij.IntellijUrlUpdater; +import com.devonfw.tools.ide.tool.jasypt.JasyptUrlUpdater; import com.devonfw.tools.ide.tool.java.JavaUrlUpdater; import com.devonfw.tools.ide.tool.jenkins.JenkinsUrlUpdater; import com.devonfw.tools.ide.tool.jmc.JmcUrlUpdater; @@ -37,6 +30,7 @@ import com.devonfw.tools.ide.tool.node.NodeUrlUpdater; import com.devonfw.tools.ide.tool.npm.NpmUrlUpdater; import com.devonfw.tools.ide.tool.oc.OcUrlUpdater; +import com.devonfw.tools.ide.tool.pgadmin.PgAdminUrlUpdater; import com.devonfw.tools.ide.tool.pip.PipUrlUpdater; import com.devonfw.tools.ide.tool.python.PythonUrlUpdater; import com.devonfw.tools.ide.tool.quarkus.QuarkusUrlUpdater; @@ -45,7 +39,13 @@ import com.devonfw.tools.ide.tool.tomcat.TomcatUrlUpdater; import com.devonfw.tools.ide.tool.vscode.VsCodeUrlUpdater; import com.devonfw.tools.ide.url.model.folder.UrlRepository; -import com.devonfw.tools.ide.tool.jasypt.JasyptUrlUpdater; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.file.Path; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; /** * The {@code UpdateManager} class manages the update process for various tools by using a list of @@ -63,12 +63,12 @@ public class UpdateManager extends AbstractProcessorWithTimeout { new AzureUrlUpdater(), new CobigenUrlUpdater(), new DockerDesktopUrlUpdater(), new DotNetUrlUpdater(), new EclipseCppUrlUpdater(), new EclipseJeeUrlUpdater(), new EclipseJavaUrlUpdater(), new GCloudUrlUpdater(), new GcViewerUrlUpdater(), new GhUrlUpdater(), new GraalVmCommunityUpdater(), new GraalVmOracleUrlUpdater(), - new GradleUrlUpdater(), new HelmUrlUpdater(), new IntellijUrlUpdater(), new JavaUrlUpdater(), - new JenkinsUrlUpdater(), new JmcUrlUpdater(), new KotlincUrlUpdater(), new KotlincNativeUrlUpdater(), - new LazyDockerUrlUpdater(), new MvnUrlUpdater(), new Mvn4UrlUpdater(), new NodeUrlUpdater(), new NpmUrlUpdater(), new OcUrlUpdater(), - new PipUrlUpdater(), new PythonUrlUpdater(), new QuarkusUrlUpdater(), new DockerRancherDesktopUrlUpdater(), - new SonarUrlUpdater(), new TerraformUrlUpdater(), new TomcatUrlUpdater(), new VsCodeUrlUpdater(), - new JasyptUrlUpdater()); + new GradleUrlUpdater(), new HelmUrlUpdater(), new IntellijUrlUpdater(), new JasyptUrlUpdater(), + new JavaUrlUpdater(), new JenkinsUrlUpdater(), new JmcUrlUpdater(), new KotlincUrlUpdater(), + new KotlincNativeUrlUpdater(), new LazyDockerUrlUpdater(), new MvnUrlUpdater(), new Mvn4UrlUpdater(), + new NodeUrlUpdater(), new NpmUrlUpdater(), new OcUrlUpdater(), new PgAdminUrlUpdater(), new PipUrlUpdater(), + new PythonUrlUpdater(), new QuarkusUrlUpdater(), new DockerRancherDesktopUrlUpdater(), new SonarUrlUpdater(), + new TerraformUrlUpdater(), new TomcatUrlUpdater(), new VsCodeUrlUpdater()); /** * The constructor. diff --git a/cli/src/main/resources/nls/Help.properties b/cli/src/main/resources/nls/Help.properties index 2fe92f2e4..fbae1e104 100644 --- a/cli/src/main/resources/nls/Help.properties +++ b/cli/src/main/resources/nls/Help.properties @@ -65,6 +65,8 @@ cmd.npm=Tool commandlet for Npm (JavaScript Node Package Manager). cmd.npm.detail=TODO npm cmd.oc=Tool commandlet for Openshift CLI (Kubernetes management tool). cmd.oc.detail=TODO oc +cmd.pgadmin=Tool commandlet for pgAdmin. +cmd.pgadmin.detail=pgAdmin is an open source management tool for PostgreSQL and derivative relational databases. Detailed documentation can be found at https://www.pgadmin.org/docs/pgadmin4/latest/index.html cmd.quarkus=Tool commandlet for Quarkus (framework for cloud-native apps). cmd.quarkus.detail=TODO quarkus cmd.repository=Setup pre-configured git repositories (clone, build, import). diff --git a/cli/src/main/resources/nls/Help_de.properties b/cli/src/main/resources/nls/Help_de.properties index 598ddbec0..b549c743c 100644 --- a/cli/src/main/resources/nls/Help_de.properties +++ b/cli/src/main/resources/nls/Help_de.properties @@ -65,6 +65,8 @@ cmd.npm=Werkzeug Kommando für Npm (JavaScript Node Package Manager). cmd.npm.detail=TODO DE npm cmd.oc=Werkzeug Kommando für Openshift CLI (Kubernetes Management Tool). cmd.oc.detail=TODO DE oc +cmd.pgadmin=Werkzeug Kommando für pgAdmin. +cmd.pgadmin.detail=pgAdmin ist ein Open-Source-Verwaltungswerkzeug for PostgreSQL und verwandte relationale Datenbanken. Detaillierte Dokumentation ist erhältlich unter https://www.pgadmin.org/docs/pgadmin4/latest/index.html cmd.quarkus=Werkzeug Kommando für Quarkus (Framework für Cloud-native Anwendungen). cmd.quarkus.detail=TODO DE quarkus cmd.repository=Richtet das vorkonfigurierte Git Repository ein.