• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jreleaser / jreleaser / #517

28 Jul 2025 01:13PM UTC coverage: 45.494% (+0.7%) from 44.827%
#517

push

github

aalmiray
feat(core): Log path to settings file

Relates to #1945

36 of 47 new or added lines in 6 files covered. (76.6%)

3 existing lines in 2 files now uncovered.

24034 of 52829 relevant lines covered (45.49%)

0.45 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.36
/core/jreleaser-engine/src/main/java/org/jreleaser/engine/environment/Environment.java
1
/*
2
 * SPDX-License-Identifier: Apache-2.0
3
 *
4
 * Copyright 2020-2025 The JReleaser authors.
5
 *
6
 * Licensed under the Apache License, Version 2.0 (the "License");
7
 * you may not use this file except in compliance with the License.
8
 * You may obtain a copy of the License at
9
 *
10
 *     https://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS,
14
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
 * See the License for the specific language governing permissions and
16
 * limitations under the License.
17
 */
18
package org.jreleaser.engine.environment;
19

20
import org.jreleaser.bundle.RB;
21
import org.jreleaser.config.JReleaserConfigLoader;
22
import org.jreleaser.config.JReleaserConfigParser;
23
import org.jreleaser.logging.JReleaserLogger;
24

25
import java.io.File;
26
import java.io.IOException;
27
import java.io.InputStream;
28
import java.nio.file.Files;
29
import java.nio.file.Path;
30
import java.nio.file.Paths;
31
import java.util.Optional;
32
import java.util.Properties;
33
import java.util.ServiceLoader;
34
import java.util.Set;
35
import java.util.TreeSet;
36

37
import static java.nio.file.Files.newInputStream;
38
import static org.jreleaser.model.Constants.DEFAULT_GIT_REMOTE;
39
import static org.jreleaser.model.Constants.JRELEASER_USER_HOME;
40
import static org.jreleaser.model.Constants.XDG_CONFIG_HOME;
41
import static org.jreleaser.util.Env.JRELEASER_ENV_PREFIX;
42
import static org.jreleaser.util.Env.envKey;
43
import static org.jreleaser.util.StringUtils.isBlank;
44
import static org.jreleaser.util.StringUtils.isNotBlank;
45

46
/**
47
 * @author Andres Almiray
48
 * @since 1.5.0
49
 */
50
public final class Environment {
51
    private Environment() {
52
        // noop
53
    }
54

55
    public static void display(JReleaserLogger logger, Path basedir, Path settings) {
56
        if (null != settings) {
1✔
57
            if (!Files.isDirectory(settings)) {
1✔
NEW
58
                loadVariables(logger, settings);
×
59
            } else {
60
                logger.warn(RB.$("environment.load.variables.dir", settings.toAbsolutePath()));
1✔
61
                loadSettings(logger);
1✔
62
            }
63
        } else {
64
            loadSettings(logger);
1✔
65
        }
66

67
        Path envFilePath = basedir.resolve(".env");
1✔
68
        if (Files.exists(envFilePath)) {
1✔
69
            loadVariables(logger, envFilePath);
×
70
        }
71

72
        Set<String> vars = new TreeSet<>();
1✔
73
        System.getenv().forEach((k, v) -> {
1✔
74
            if (k.startsWith(JRELEASER_ENV_PREFIX) && isNotBlank(v)) vars.add(k);
1✔
75
        });
1✔
76
        if (System.getenv().containsKey(envKey(DEFAULT_GIT_REMOTE))) {
1✔
77
            vars.add(envKey(DEFAULT_GIT_REMOTE));
×
78
        }
79

80
        if (!vars.isEmpty()) {
1✔
81
            logger.info(RB.$("environment.variables.env"));
1✔
82
            vars.forEach(message -> logger.info("  " + message));
1✔
83
        }
84
    }
1✔
85

86
    private static void loadSettings(JReleaserLogger logger) {
87
        Path configDirectory = null;
1✔
88

89
        String home = System.getenv(XDG_CONFIG_HOME);
1✔
90
        if (isNotBlank(home) && Files.exists(Paths.get(home).resolve("jreleaser"))) {
1✔
NEW
91
            configDirectory = Paths.get(home).resolve("jreleaser");
×
92
        }
93

94
        if (null == configDirectory) {
1✔
95
            home = System.getenv(JRELEASER_USER_HOME);
1✔
96
            if (isBlank(home)) {
1✔
NEW
97
                home = System.getProperty("user.home") + File.separator + ".jreleaser";
×
98
            }
99
            configDirectory = Paths.get(home);
1✔
100
        }
101

102
        loadVariables(logger, resolveConfigFileAt(configDirectory)
1✔
103
            .orElse(configDirectory.resolve("config.properties")));
1✔
104
    }
1✔
105

106
    private static void loadVariables(JReleaserLogger logger, Path file) {
107
        Set<String> vars = new TreeSet<>();
1✔
108

109
        Properties p = new Properties();
1✔
110
        logger.info(RB.$("environment.load.variables"), file.toAbsolutePath());
1✔
111
        if (Files.exists(file)) {
1✔
112
            try {
113
                if (file.getFileName().toString().endsWith(".properties") ||
1✔
114
                    file.getFileName().toString().equals(".env")) {
1✔
115
                    try (InputStream in = newInputStream(file)) {
×
116
                        p.load(in);
×
117
                    }
118
                } else {
119
                    p.putAll(JReleaserConfigLoader.loadProperties(file));
1✔
120
                }
121
            } catch (IOException e) {
×
122
                logger.debug(RB.$("environment.variables.load.error"), file.toAbsolutePath(), e);
×
123
            }
1✔
124
        } else {
125
            logger.warn(RB.$("environment.variables.source.missing"), file.toAbsolutePath());
×
126
        }
127

128
        p.stringPropertyNames().stream()
1✔
129
            .filter(k -> k.startsWith(JRELEASER_ENV_PREFIX)).
1✔
130
            forEach(vars::add);
1✔
131

132
        if (!vars.isEmpty()) {
1✔
133
            logger.info(RB.$("environment.variables.file", file.getFileName().toString()));
1✔
134
            vars.forEach(message -> logger.info("  " + message));
1✔
135
        }
136
    }
1✔
137

138
    private static Optional<Path> resolveConfigFileAt(Path directory) {
139
        ServiceLoader<JReleaserConfigParser> parsers = ServiceLoader.load(JReleaserConfigParser.class,
1✔
140
            JReleaserConfigParser.class.getClassLoader());
1✔
141

142
        for (JReleaserConfigParser parser : parsers) {
1✔
143
            Path file = directory.resolve("config." + parser.getPreferredFileExtension());
1✔
144
            if (Files.exists(file)) {
1✔
145
                return Optional.of(file);
1✔
146
            }
147
        }
1✔
148

149
        return Optional.empty();
×
150
    }
151
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc