Skip to content

Commit 47bad3a

Browse files
runningcodeclaude
andcommitted
Add support for reading distribution options from sentry-debug-meta.properties
Extends DebugMetaPropertiesApplier to read and apply distribution configuration from properties files. This allows the Gradle plugin to populate distribution options (orgSlug, projectSlug, orgAuthToken, buildConfiguration) that will be automatically loaded when the SDK initializes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent bc10971 commit 47bad3a

File tree

2 files changed

+167
-0
lines changed

2 files changed

+167
-0
lines changed

sentry/src/main/java/io/sentry/util/DebugMetaPropertiesApplier.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public static void apply(
1717
if (debugMetaProperties != null) {
1818
applyToOptions(options, debugMetaProperties);
1919
applyBuildTool(options, debugMetaProperties);
20+
applyDistributionOptions(options, debugMetaProperties);
2021
}
2122
}
2223

@@ -89,4 +90,68 @@ private static void applyBuildTool(
8990
final @NotNull Properties debugMetaProperties) {
9091
return debugMetaProperties.getProperty("io.sentry.build-tool-version");
9192
}
93+
94+
private static void applyDistributionOptions(
95+
final @NotNull SentryOptions options, final @NotNull List<Properties> debugMetaProperties) {
96+
for (Properties properties : debugMetaProperties) {
97+
final @Nullable String orgSlug = getDistributionOrgSlug(properties);
98+
final @Nullable String projectSlug = getDistributionProjectSlug(properties);
99+
final @Nullable String orgAuthToken = getDistributionOrgAuthToken(properties);
100+
final @Nullable String buildConfiguration = getDistributionBuildConfiguration(properties);
101+
102+
if (orgSlug != null || projectSlug != null || orgAuthToken != null) {
103+
final @NotNull SentryOptions.DistributionOptions distributionOptions =
104+
options.getDistribution();
105+
106+
if (orgSlug != null && distributionOptions.orgSlug.isEmpty()) {
107+
options.getLogger().log(SentryLevel.DEBUG, "Distribution org slug found: %s", orgSlug);
108+
distributionOptions.orgSlug = orgSlug;
109+
}
110+
111+
if (projectSlug != null && distributionOptions.projectSlug.isEmpty()) {
112+
options
113+
.getLogger()
114+
.log(SentryLevel.DEBUG, "Distribution project slug found: %s", projectSlug);
115+
distributionOptions.projectSlug = projectSlug;
116+
}
117+
118+
if (orgAuthToken != null && distributionOptions.orgAuthToken.isEmpty()) {
119+
options.getLogger().log(SentryLevel.DEBUG, "Distribution org auth token found");
120+
distributionOptions.orgAuthToken = orgAuthToken;
121+
}
122+
123+
if (buildConfiguration != null && distributionOptions.buildConfiguration == null) {
124+
options
125+
.getLogger()
126+
.log(
127+
SentryLevel.DEBUG,
128+
"Distribution build configuration found: %s",
129+
buildConfiguration);
130+
distributionOptions.buildConfiguration = buildConfiguration;
131+
}
132+
133+
break;
134+
}
135+
}
136+
}
137+
138+
private static @Nullable String getDistributionOrgSlug(
139+
final @NotNull Properties debugMetaProperties) {
140+
return debugMetaProperties.getProperty("io.sentry.distribution.org-slug");
141+
}
142+
143+
private static @Nullable String getDistributionProjectSlug(
144+
final @NotNull Properties debugMetaProperties) {
145+
return debugMetaProperties.getProperty("io.sentry.distribution.project-slug");
146+
}
147+
148+
private static @Nullable String getDistributionOrgAuthToken(
149+
final @NotNull Properties debugMetaProperties) {
150+
return debugMetaProperties.getProperty("io.sentry.distribution.org-auth-token");
151+
}
152+
153+
private static @Nullable String getDistributionBuildConfiguration(
154+
final @NotNull Properties debugMetaProperties) {
155+
return debugMetaProperties.getProperty("io.sentry.distribution.build-configuration");
156+
}
92157
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package io.sentry.util
2+
3+
import io.sentry.SentryOptions
4+
import java.util.Properties
5+
import kotlin.test.Test
6+
import kotlin.test.assertEquals
7+
import kotlin.test.assertNull
8+
9+
class DebugMetaPropertiesApplierTest {
10+
11+
@Test
12+
fun `applies distribution options from properties`() {
13+
val properties = Properties()
14+
properties.setProperty("io.sentry.distribution.org-slug", "test-org")
15+
properties.setProperty("io.sentry.distribution.project-slug", "test-project")
16+
properties.setProperty("io.sentry.distribution.org-auth-token", "test-token")
17+
properties.setProperty("io.sentry.distribution.build-configuration", "debug")
18+
19+
val options = SentryOptions()
20+
DebugMetaPropertiesApplier.apply(options, listOf(properties))
21+
22+
assertEquals("test-org", options.distribution.orgSlug)
23+
assertEquals("test-project", options.distribution.projectSlug)
24+
assertEquals("test-token", options.distribution.orgAuthToken)
25+
assertEquals("debug", options.distribution.buildConfiguration)
26+
}
27+
28+
@Test
29+
fun `applies partial distribution options from properties`() {
30+
val properties = Properties()
31+
properties.setProperty("io.sentry.distribution.org-slug", "test-org")
32+
properties.setProperty("io.sentry.distribution.project-slug", "test-project")
33+
34+
val options = SentryOptions()
35+
DebugMetaPropertiesApplier.apply(options, listOf(properties))
36+
37+
assertEquals("test-org", options.distribution.orgSlug)
38+
assertEquals("test-project", options.distribution.projectSlug)
39+
assertEquals("", options.distribution.orgAuthToken)
40+
assertNull(options.distribution.buildConfiguration)
41+
}
42+
43+
@Test
44+
fun `does not override existing distribution options`() {
45+
val properties = Properties()
46+
properties.setProperty("io.sentry.distribution.org-slug", "properties-org")
47+
properties.setProperty("io.sentry.distribution.project-slug", "properties-project")
48+
properties.setProperty("io.sentry.distribution.org-auth-token", "properties-token")
49+
properties.setProperty("io.sentry.distribution.build-configuration", "properties-config")
50+
51+
val options = SentryOptions()
52+
options.distribution.orgSlug = "existing-org"
53+
options.distribution.projectSlug = "existing-project"
54+
options.distribution.orgAuthToken = "existing-token"
55+
options.distribution.buildConfiguration = "existing-config"
56+
57+
DebugMetaPropertiesApplier.apply(options, listOf(properties))
58+
59+
assertEquals("existing-org", options.distribution.orgSlug)
60+
assertEquals("existing-project", options.distribution.projectSlug)
61+
assertEquals("existing-token", options.distribution.orgAuthToken)
62+
assertEquals("existing-config", options.distribution.buildConfiguration)
63+
}
64+
65+
@Test
66+
fun `applies distribution options from first properties file with values`() {
67+
val properties1 = Properties()
68+
val properties2 = Properties()
69+
properties2.setProperty("io.sentry.distribution.org-slug", "org-from-second")
70+
properties2.setProperty("io.sentry.distribution.project-slug", "project-from-second")
71+
72+
val options = SentryOptions()
73+
DebugMetaPropertiesApplier.apply(options, listOf(properties1, properties2))
74+
75+
assertEquals("org-from-second", options.distribution.orgSlug)
76+
assertEquals("project-from-second", options.distribution.projectSlug)
77+
}
78+
79+
@Test
80+
fun `does nothing when properties list is empty`() {
81+
val options = SentryOptions()
82+
val originalOrgSlug = options.distribution.orgSlug
83+
val originalProjectSlug = options.distribution.projectSlug
84+
85+
DebugMetaPropertiesApplier.apply(options, emptyList())
86+
87+
assertEquals(originalOrgSlug, options.distribution.orgSlug)
88+
assertEquals(originalProjectSlug, options.distribution.projectSlug)
89+
}
90+
91+
@Test
92+
fun `does nothing when properties list is null`() {
93+
val options = SentryOptions()
94+
val originalOrgSlug = options.distribution.orgSlug
95+
val originalProjectSlug = options.distribution.projectSlug
96+
97+
DebugMetaPropertiesApplier.apply(options, null)
98+
99+
assertEquals(originalOrgSlug, options.distribution.orgSlug)
100+
assertEquals(originalProjectSlug, options.distribution.projectSlug)
101+
}
102+
}

0 commit comments

Comments
 (0)