From c89f8af05fa1a29f599d79bf09e62afcf156aa6c Mon Sep 17 00:00:00 2001 From: slskiba <161473135+slskiba@users.noreply.github.com> Date: Fri, 2 Aug 2024 13:35:54 +0200 Subject: [PATCH] #430: Add source of env variable for debugging (#482) --- .../ide/commandlet/EnvironmentCommandlet.java | 25 +++++++++++--- .../AbstractEnvironmentVariables.java | 14 ++++---- .../EnvironmentVariablesPropertiesFile.java | 7 ++-- .../EnvironmentVariablesResolved.java | 6 ++-- .../tools/ide/environment/VariableLine.java | 34 +++++++++++++++++-- .../commandlet/EnvironmentCommandletTest.java | 9 +++++ 6 files changed, 75 insertions(+), 20 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandlet.java index 1a5495a40..dd7fa6491 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandlet.java @@ -1,6 +1,7 @@ package com.devonfw.tools.ide.commandlet; import java.util.Collection; +import java.util.stream.Collectors; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeContext; @@ -59,12 +60,26 @@ public void run() { } ((AbstractIdeContext) this.context).setPathSyntax(pathSyntax); Collection variables = this.context.getVariables().collectVariables(); - for (VariableLine line : variables) { - String lineValue = line.getValue(); - lineValue = "\"" + lineValue + "\""; - line = line.withValue(lineValue); - this.context.info(line.toString()); + if (this.context.debug().isEnabled()) { + for (String source : variables.stream().map(VariableLine::getSource).collect(Collectors.toSet())) { + this.context.debug("from {}:", source); + for (VariableLine line : variables) { + if (line.getSource().equals(source)) { + printEnvLine(line); + } + } + } + } else { + for (VariableLine line : variables) { + printEnvLine(line); + } } } + private void printEnvLine(VariableLine line) { + String lineValue = line.getValue(); + lineValue = "\"" + lineValue + "\""; + line = line.withValue(lineValue); + this.context.info(line.toString()); + } } diff --git a/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java b/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java index 61a73b980..dae728e2b 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java +++ b/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java @@ -3,9 +3,9 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; +import java.util.HashMap; import java.util.List; -import java.util.Set; +import java.util.Map; import java.util.regex.Matcher; import com.devonfw.tools.ide.context.IdeContext; @@ -114,15 +114,15 @@ public final Collection collectExportedVariables() { private final Collection collectVariables(boolean onlyExported) { - Set variableNames = new HashSet<>(); + Map variableNames = new HashMap<>(); collectVariables(variableNames); List variables = new ArrayList<>(variableNames.size()); - for (String name : variableNames) { + for (String name : variableNames.keySet()) { boolean export = isExported(name); if (!onlyExported || export) { String value = get(name, false); if (value != null) { - variables.add(VariableLine.of(export, name, value)); + variables.add(VariableLine.of(export, name, value, variableNames.get(name))); } } } @@ -130,9 +130,9 @@ private final Collection collectVariables(boolean onlyExported) { } /** - * @param variables the {@link Set} where to add the names of the variables defined here. + * @param variables the {@link Map} where to add the names of the variables defined here as keys, and their corresponding source as value. */ - protected void collectVariables(Set variables) { + protected void collectVariables(Map variables) { if (this.parent != null) { this.parent.collectVariables(variables); diff --git a/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesPropertiesFile.java b/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesPropertiesFile.java index 963a67996..6413a15bc 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesPropertiesFile.java +++ b/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesPropertiesFile.java @@ -189,9 +189,12 @@ protected Map getVariables() { } @Override - protected void collectVariables(Set variableNames) { + protected void collectVariables(Map variableNames) { + + for (String key : this.variables.keySet()) { + variableNames.put(key, this.propertiesFilePath.toString()); + } - variableNames.addAll(this.variables.keySet()); super.collectVariables(variableNames); } diff --git a/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesResolved.java b/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesResolved.java index 748860463..5fe2bd426 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesResolved.java +++ b/cli/src/main/java/com/devonfw/tools/ide/environment/EnvironmentVariablesResolved.java @@ -1,6 +1,6 @@ package com.devonfw.tools.ide.environment; -import java.util.Set; +import java.util.Map; import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.variable.VariableDefinition; @@ -49,11 +49,11 @@ public EnvironmentVariables resolved() { } @Override - protected void collectVariables(Set variables) { + protected void collectVariables(Map variables) { for (VariableDefinition var : IdeVariables.VARIABLES) { if (var.isExport() || var.isForceDefaultValue()) { - variables.add(var.getName()); + variables.put(var.getName(), "defaults"); } } super.collectVariables(variables); diff --git a/cli/src/main/java/com/devonfw/tools/ide/environment/VariableLine.java b/cli/src/main/java/com/devonfw/tools/ide/environment/VariableLine.java index 9855018ba..cfc99daf2 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/environment/VariableLine.java +++ b/cli/src/main/java/com/devonfw/tools/ide/environment/VariableLine.java @@ -40,6 +40,14 @@ public String getComment() { return null; } + /** + * @return the source of the variable. + */ + public String getSource() { + + return null; + } + /** * @param newName the new variable {@link #getName() name}. * @return the new {@link VariableLine} with the modified {@link #getName() name}. @@ -77,12 +85,14 @@ static final class Variable extends VariableLine { private final String line; + private final Object source; + Variable(boolean export, String name, String value) { - this(export, name, value, null); + this(export, name, value, null, null); } - private Variable(boolean export, String name, String value, String line) { + private Variable(boolean export, String name, String value, String line, Object source) { super(); this.export = export; @@ -100,6 +110,7 @@ private Variable(boolean export, String name, String value, String line) { } else { this.line = line; } + this.source = source; } @Override @@ -120,6 +131,11 @@ public String getValue() { return this.value; } + @Override + public String getSource() { + return source.toString(); + } + @Override public VariableLine withName(String newName) { @@ -269,7 +285,7 @@ public static VariableLine of(String line, IdeLogger logger, Object source) { } else if (value.startsWith("\"") && value.endsWith("\"")) { value = value.substring(1, value.length() - 1); } - return new Variable(export, name, value, line); + return new Variable(export, name, value, line, source); } end++; } @@ -288,4 +304,16 @@ public static VariableLine of(boolean export, String name, String value) { return new Variable(export, name, value); } + /** + * @param export the {@link #isExport() export flag}. + * @param name the {@link #getName() name}. + * @param value the {@link #getValue() value}. + * @param source the {@link #getSource() source} of the variable. + * @return the {@link VariableLine} for the given values. + */ + public static VariableLine of(boolean export, String name, String value, Object source) { + + return new Variable(export, name, value, null, source); + } + } diff --git a/cli/src/test/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandletTest.java index 1c6476eaf..6b5f1e0e1 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/commandlet/EnvironmentCommandletTest.java @@ -1,5 +1,7 @@ package com.devonfw.tools.ide.commandlet; +import java.nio.file.Path; + import org.junit.jupiter.api.Test; import com.devonfw.tools.ide.context.AbstractIdeContextTest; @@ -22,6 +24,8 @@ public void testRun() { String path = "project/workspaces/foo-test/my-git-repo"; IdeTestContext context = newContext(PROJECT_BASIC, path, false); EnvironmentCommandlet env = context.getCommandletManager().getCommandlet(EnvironmentCommandlet.class); + Path settingsIdeProperties = context.getSettingsPath().resolve("ide.properties"); + Path confIdeProperties = context.getConfPath().resolve("ide.properties"); // act env.run(); // assert @@ -34,6 +38,11 @@ public void testRun() { assertLogMessage(context, IdeLogLevel.INFO, "JAVA_VERSION=\"17*\""); assertLogMessage(context, IdeLogLevel.INFO, "INTELLIJ_EDITION=\"ultimate\""); assertLogMessage(context, IdeLogLevel.INFO, "DOCKER_EDITION=\"docker\""); + //assert messages of debug level grouping of environment variable are present + assertLogMessage(context, IdeLogLevel.DEBUG, "from defaults:"); + assertLogMessage(context, IdeLogLevel.DEBUG, "from " + settingsIdeProperties + ":"); + assertLogMessage(context, IdeLogLevel.DEBUG, "from " + confIdeProperties + ":"); + } /**