Skip to content

Commit bc2d596

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 <[email protected]>
1 parent b3d8889 commit bc2d596

File tree

3 files changed

+213
-0
lines changed

3 files changed

+213
-0
lines changed

sentry/api/sentry.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6969,6 +6969,10 @@ public final class io/sentry/util/DebugMetaPropertiesApplier {
69696969
public static fun applyToOptions (Lio/sentry/SentryOptions;Ljava/util/List;)V
69706970
public static fun getBuildTool (Ljava/util/Properties;)Ljava/lang/String;
69716971
public static fun getBuildToolVersion (Ljava/util/Properties;)Ljava/lang/String;
6972+
public static fun getDistributionBuildConfiguration (Ljava/util/Properties;)Ljava/lang/String;
6973+
public static fun getDistributionOrgAuthToken (Ljava/util/Properties;)Ljava/lang/String;
6974+
public static fun getDistributionOrgSlug (Ljava/util/Properties;)Ljava/lang/String;
6975+
public static fun getDistributionProjectSlug (Ljava/util/Properties;)Ljava/lang/String;
69726976
public static fun getProguardUuid (Ljava/util/Properties;)Ljava/lang/String;
69736977
}
69746978

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+
public static @Nullable String getDistributionOrgSlug(
139+
final @NotNull Properties debugMetaProperties) {
140+
return debugMetaProperties.getProperty("io.sentry.distribution.org-slug");
141+
}
142+
143+
public static @Nullable String getDistributionProjectSlug(
144+
final @NotNull Properties debugMetaProperties) {
145+
return debugMetaProperties.getProperty("io.sentry.distribution.project-slug");
146+
}
147+
148+
public static @Nullable String getDistributionOrgAuthToken(
149+
final @NotNull Properties debugMetaProperties) {
150+
return debugMetaProperties.getProperty("io.sentry.distribution.org-auth-token");
151+
}
152+
153+
public static @Nullable String getDistributionBuildConfiguration(
154+
final @NotNull Properties debugMetaProperties) {
155+
return debugMetaProperties.getProperty("io.sentry.distribution.build-configuration");
156+
}
92157
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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+
103+
@Test
104+
fun `getDistributionOrgSlug returns value from properties`() {
105+
val properties = Properties()
106+
properties.setProperty("io.sentry.distribution.org-slug", "test-org")
107+
108+
assertEquals("test-org", DebugMetaPropertiesApplier.getDistributionOrgSlug(properties))
109+
}
110+
111+
@Test
112+
fun `getDistributionProjectSlug returns value from properties`() {
113+
val properties = Properties()
114+
properties.setProperty("io.sentry.distribution.project-slug", "test-project")
115+
116+
assertEquals("test-project", DebugMetaPropertiesApplier.getDistributionProjectSlug(properties))
117+
}
118+
119+
@Test
120+
fun `getDistributionOrgAuthToken returns value from properties`() {
121+
val properties = Properties()
122+
properties.setProperty("io.sentry.distribution.org-auth-token", "test-token")
123+
124+
assertEquals("test-token", DebugMetaPropertiesApplier.getDistributionOrgAuthToken(properties))
125+
}
126+
127+
@Test
128+
fun `getDistributionBuildConfiguration returns value from properties`() {
129+
val properties = Properties()
130+
properties.setProperty("io.sentry.distribution.build-configuration", "debug")
131+
132+
assertEquals("debug", DebugMetaPropertiesApplier.getDistributionBuildConfiguration(properties))
133+
}
134+
135+
@Test
136+
fun `getter methods return null when property not set`() {
137+
val properties = Properties()
138+
139+
assertNull(DebugMetaPropertiesApplier.getDistributionOrgSlug(properties))
140+
assertNull(DebugMetaPropertiesApplier.getDistributionProjectSlug(properties))
141+
assertNull(DebugMetaPropertiesApplier.getDistributionOrgAuthToken(properties))
142+
assertNull(DebugMetaPropertiesApplier.getDistributionBuildConfiguration(properties))
143+
}
144+
}

0 commit comments

Comments
 (0)