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

jreleaser / jreleaser / #475

03 Apr 2025 10:50AM UTC coverage: 40.322% (-8.9%) from 49.193%
#475

push

github

aalmiray
feat(release): Support Forgejo as releaser

Closes #1842

Closes #1843

182 of 1099 new or added lines in 45 files covered. (16.56%)

4239 existing lines in 333 files now uncovered.

20797 of 51577 relevant lines covered (40.32%)

0.4 hits per line

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

0.0
/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/Distributions.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.distribution;
19

20
import org.jreleaser.bundle.RB;
21
import org.jreleaser.extensions.api.workflow.WorkflowListenerException;
22
import org.jreleaser.model.JReleaserException;
23
import org.jreleaser.model.api.JReleaserCommand;
24
import org.jreleaser.model.api.hooks.ExecutionEvent;
25
import org.jreleaser.model.internal.JReleaserContext;
26
import org.jreleaser.model.internal.distributions.Distribution;
27
import org.jreleaser.model.internal.packagers.Packager;
28
import org.jreleaser.model.spi.packagers.PackagerProcessingException;
29

30
import java.util.List;
31
import java.util.Locale;
32

33
import static org.jreleaser.model.internal.JReleaserSupport.supportedPackagers;
34

35
/**
36
 * @author Andres Almiray
37
 * @since 0.1.0
38
 */
39
public final class Distributions {
40
    private Distributions() {
41
        // noop
42
    }
43

44
    public static void process(JReleaserContext context, DistributionProcessor.PackagingAction action) {
UNCOV
45
        List<Distribution> activeDistributions = context.getModel().getActiveDistributions();
×
46

UNCOV
47
        if (activeDistributions.isEmpty()) {
×
48
            context.getLogger().debug(RB.$("distributions.not.enabled"), action.getText().toLowerCase(Locale.ENGLISH));
×
49
            return;
×
50
        }
51

UNCOV
52
        if (!context.getIncludedDistributions().isEmpty()) {
×
53
            for (String distributionName : context.getIncludedDistributions()) {
×
54
                Distribution distribution = activeDistributions.stream()
×
55
                    .filter(d -> distributionName.equals(d.getName()))
×
56
                    .findFirst().orElse(null);
×
57

58
                if (null == distribution) {
×
59
                    context.getLogger().error(RB.$("distributions.no.match"), distributionName);
×
60
                    return;
×
61
                }
62

63
                if (!context.getIncludedPackagers().isEmpty()) {
×
64
                    for (String packagerName : context.getIncludedPackagers()) {
×
65
                        if (!supportedPackagers().contains(packagerName)) {
×
66
                            context.getLogger().warn(RB.$("ERROR_unsupported_packager", packagerName));
×
67
                            continue;
×
68
                        }
69

70
                        context.getLogger().info(RB.$("distributions.apply.action"), action.getText());
×
71

72
                        processDistribution(context, distribution, packagerName, action);
×
73
                    }
×
74
                } else {
75
                    processDistribution(context, distribution, action);
×
76
                }
77
            }
×
UNCOV
78
        } else if (!context.getIncludedPackagers().isEmpty()) {
×
79
            for (String packagerName : context.getIncludedPackagers()) {
×
80
                if (!supportedPackagers().contains(packagerName)) {
×
81
                    context.getLogger().warn(RB.$("ERROR_unsupported_packager", packagerName));
×
82
                    continue;
×
83
                }
84

85
                context.getLogger().info(RB.$("distributions.apply.action"), action.getText());
×
86
                for (Distribution distribution : activeDistributions) {
×
87
                    processDistribution(context, distribution, packagerName, action);
×
88
                }
×
89
            }
×
90
        } else {
91
            // process all
UNCOV
92
            context.getLogger().info(RB.$("distributions.apply.action"), action.getText());
×
UNCOV
93
            for (Distribution distribution : activeDistributions) {
×
UNCOV
94
                if (context.getExcludedDistributions().contains(distribution.getName())) {
×
95
                    context.getLogger().info(RB.$("distributions.distribution.excluded"), distribution.getName());
×
96
                    continue;
×
97
                }
98

UNCOV
99
                processDistribution(context, distribution, action);
×
UNCOV
100
            }
×
101
        }
UNCOV
102
    }
×
103

104
    private static void processDistribution(JReleaserContext context, Distribution distribution, DistributionProcessor.PackagingAction action) {
UNCOV
105
        context.getLogger().increaseIndent();
×
UNCOV
106
        context.getLogger().info(RB.$("distributions.apply.action.to"), action.getText(), distribution.getName());
×
107

UNCOV
108
        fireDistributionStartEvent(context, distribution);
×
109

UNCOV
110
        for (String packagerName : supportedPackagers()) {
×
UNCOV
111
            if (context.getExcludedPackagers().contains(packagerName)) {
×
UNCOV
112
                context.getLogger().info(RB.$("packagers.packager.excluded"), packagerName);
×
UNCOV
113
                continue;
×
114
            }
UNCOV
115
            processPackager(context, distribution, packagerName, action);
×
UNCOV
116
        }
×
117

UNCOV
118
        fireDistributionEndEvent(context, distribution);
×
119

UNCOV
120
        context.getLogger().decreaseIndent();
×
UNCOV
121
    }
×
122

123
    private static void processDistribution(JReleaserContext context, Distribution distribution, String packagerName, DistributionProcessor.PackagingAction action) {
124
        context.getLogger().increaseIndent();
×
125
        context.getLogger().info(RB.$("distributions.apply.action.to"), action.getText(), distribution.getName());
×
126

127
        processPackager(context, distribution, packagerName, action);
×
128

129
        context.getLogger().decreaseIndent();
×
130
    }
×
131

132
    private static void processPackager(JReleaserContext context, Distribution distribution, String packagerName, DistributionProcessor.PackagingAction action) {
UNCOV
133
        Packager<?> packager = distribution.findPackager(packagerName);
×
134

135
        try {
UNCOV
136
            context.getLogger().increaseIndent();
×
UNCOV
137
            context.getLogger().setPrefix(packagerName);
×
UNCOV
138
            firePackagerEvent(ExecutionEvent.before(actionToStep(action.getType())), context, distribution, action.getType(), packager);
×
139

UNCOV
140
            DistributionProcessor processor = createDistributionProcessor(context,
×
141
                distribution,
142
                packagerName);
143

UNCOV
144
            action.getFunction().consume(processor);
×
145

UNCOV
146
            firePackagerEvent(ExecutionEvent.success(actionToStep(action.getType())), context, distribution, action.getType(), packager);
×
147
        } catch (PackagerProcessingException e) {
×
148
            firePackagerEvent(ExecutionEvent.failure(actionToStep(action.getType()), e), context, distribution, action.getType(), packager);
×
149
            throw new JReleaserException(RB.$("ERROR_unexpected_error"), e);
×
150
        } finally {
UNCOV
151
            context.getLogger().restorePrefix();
×
UNCOV
152
            context.getLogger().decreaseIndent();
×
153
        }
UNCOV
154
    }
×
155

156
    private static String actionToStep(DistributionProcessor.PackagingAction.Type type) {
UNCOV
157
        switch (type) {
×
158
            case PACKAGE:
UNCOV
159
                return JReleaserCommand.PACKAGE.toStep();
×
160
            case PUBLISH:
UNCOV
161
                return JReleaserCommand.PUBLISH.toStep();
×
162
            default:
163
                // noop
164
                break;
165
        }
UNCOV
166
        return JReleaserCommand.PREPARE.toStep();
×
167
    }
168

169
    private static DistributionProcessor createDistributionProcessor(JReleaserContext context,
170
                                                                     Distribution distribution,
171
                                                                     String packagerName) {
UNCOV
172
        return DistributionProcessor.builder()
×
UNCOV
173
            .context(context)
×
UNCOV
174
            .distributionName(distribution.getName())
×
UNCOV
175
            .packagerName(packagerName)
×
UNCOV
176
            .build();
×
177
    }
178

179
    private static void fireDistributionStartEvent(JReleaserContext context, Distribution distribution) {
180
        try {
UNCOV
181
            context.fireDistributionStartEvent(distribution.asImmutable());
×
182
        } catch (WorkflowListenerException e) {
×
183
            context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName()));
×
184
            context.getLogger().trace(e);
×
185
            if (!e.getListener().isContinueOnError()) {
×
186
                if (e.getCause() instanceof RuntimeException) {
×
187
                    throw (RuntimeException) e.getCause();
×
188
                } else {
189
                    throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause());
×
190
                }
191
            }
UNCOV
192
        }
×
UNCOV
193
    }
×
194

195
    private static void fireDistributionEndEvent(JReleaserContext context, Distribution distribution) {
UNCOV
196
        if (!distribution.isEnabled()) return;
×
197

198
        try {
UNCOV
199
            context.fireDistributionEndEvent(distribution.asImmutable());
×
200
        } catch (WorkflowListenerException e) {
×
201
            context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName()));
×
202
            context.getLogger().trace(e);
×
203
            if (!e.getListener().isContinueOnError()) {
×
204
                if (e.getCause() instanceof RuntimeException) {
×
205
                    throw (RuntimeException) e.getCause();
×
206
                } else {
207
                    throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause());
×
208
                }
209
            }
UNCOV
210
        }
×
UNCOV
211
    }
×
212

213
    private static void firePackagerEvent(ExecutionEvent event, JReleaserContext context, Distribution distribution, DistributionProcessor.PackagingAction.Type type, Packager<?> packager) {
UNCOV
214
        if (!packager.isEnabled()) return;
×
215

216
        try {
UNCOV
217
            switch (type) {
×
218
                case PREPARE:
UNCOV
219
                    context.firePackagerPrepareEvent(event, distribution.asImmutable(), packager.asImmutable());
×
UNCOV
220
                    break;
×
221
                case PACKAGE:
UNCOV
222
                    context.firePackagerPackageEvent(event, distribution.asImmutable(), packager.asImmutable());
×
UNCOV
223
                    break;
×
224
                case PUBLISH:
UNCOV
225
                    context.firePackagerPublishEvent(event, distribution.asImmutable(), packager.asImmutable());
×
226
                    break;
227
            }
228
        } catch (WorkflowListenerException e) {
×
229
            context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName()));
×
230
            context.getLogger().trace(e);
×
231
            if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) {
×
232
                if (e.getCause() instanceof RuntimeException) {
×
233
                    throw (RuntimeException) e.getCause();
×
234
                } else {
235
                    throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause());
×
236
                }
237
            }
UNCOV
238
        }
×
UNCOV
239
    }
×
240
}
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