Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### Fixes

- Pass auto-install state to component metadata rules instead of a global singleton, fixing project isolation ([#1352](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1352))

### Dependencies

- Bump Android SDK from v8.45.0 to v8.46.0 ([#1343](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1343))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import org.gradle.api.artifacts.ComponentMetadataContext
import org.gradle.api.artifacts.ComponentMetadataRule
import org.slf4j.Logger

abstract class AbstractInstallStrategy : ComponentMetadataRule {
abstract class AbstractInstallStrategy(
private val autoInstallEnabled: Boolean,
private val sentryVersion: String,
) : ComponentMetadataRule {

protected lateinit var logger: Logger

Expand All @@ -23,8 +26,7 @@ abstract class AbstractInstallStrategy : ComponentMetadataRule {
protected open val maxSupportedSentryVersion: SemVer = SemVer(0, 0, 0)

override fun execute(context: ComponentMetadataContext) {
val autoInstallState = AutoInstallState.getInstance()
if (!autoInstallState.enabled) {
if (!autoInstallEnabled) {
logger.info { "$sentryModuleId won't be installed because autoInstallation is disabled" }
return
}
Expand Down Expand Up @@ -53,7 +55,7 @@ abstract class AbstractInstallStrategy : ComponentMetadataRule {

if (minSupportedSentryVersion.major > 0) {
try {
val sentrySemVersion = SemVer.parse(autoInstallState.sentryVersion)
val sentrySemVersion = SemVer.parse(sentryVersion)
if (sentrySemVersion < minSupportedSentryVersion) {
logger.warn {
"$sentryModuleId won't be installed because the current sentry version " +
Expand All @@ -65,7 +67,7 @@ abstract class AbstractInstallStrategy : ComponentMetadataRule {
} catch (ex: IllegalArgumentException) {
logger.warn {
"$sentryModuleId won't be installed because the provided " +
"sentry version(${autoInstallState.sentryVersion}) could not be " +
"sentry version(${sentryVersion}) could not be " +
"processed as a semantic version."
}
return
Expand All @@ -74,7 +76,7 @@ abstract class AbstractInstallStrategy : ComponentMetadataRule {

if (maxSupportedSentryVersion.major > 0) {
try {
val sentrySemVersion = SemVer.parse(autoInstallState.sentryVersion)
val sentrySemVersion = SemVer.parse(sentryVersion)
if (sentrySemVersion > maxSupportedSentryVersion) {
logger.debug {
"$sentryModuleId won't be installed because the current sentry version " +
Expand All @@ -86,7 +88,7 @@ abstract class AbstractInstallStrategy : ComponentMetadataRule {
} catch (ex: IllegalArgumentException) {
logger.warn {
"$sentryModuleId won't be installed because the provided " +
"sentry version(${autoInstallState.sentryVersion}) could not be " +
"sentry version(${sentryVersion}) could not be " +
"processed as a semantic version."
}
return
Expand All @@ -95,7 +97,6 @@ abstract class AbstractInstallStrategy : ComponentMetadataRule {

context.details.allVariants { metadata ->
metadata.withDependencies { dependencies ->
val sentryVersion = autoInstallState.sentryVersion
dependencies.add("$SENTRY_GROUP:$sentryModuleId:$sentryVersion")

logger.info { "$sentryModuleId was successfully installed with version: $sentryVersion" }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.sentry.android.gradle.autoinstall

import io.sentry.android.gradle.SentryPlugin.Companion.SENTRY_SDK_VERSION
import io.sentry.android.gradle.autoinstall.compose.ComposeInstallStrategy
import io.sentry.android.gradle.autoinstall.fragment.FragmentInstallStrategy
import io.sentry.android.gradle.autoinstall.graphql.Graphql22InstallStrategy
Expand Down Expand Up @@ -64,29 +65,31 @@ private val delayedStrategies =
fun Project.installDependencies(extension: SentryPluginExtension, isAndroid: Boolean) {
configurations.named("implementation").configure { configuration ->
configuration.withDependencies { dependencies ->
project.dependencies.components { component ->
delayedStrategies.forEach { it.register(component) }
}
val autoInstallEnabled = extension.autoInstallation.enabled.get()

// if autoInstallation is disabled, the autoInstallState will contain initial values
// which all default to false, hence, the integrations won't be installed as well
if (extension.autoInstallation.enabled.get()) {
val sentryVersion = dependencies.findSentryVersion(isAndroid)
with(AutoInstallState.getInstance(gradle)) {
// The version and enabled flag are resolved here and passed to the component metadata rules
// as parameters, so the rules don't rely on shared mutable state across projects.
val sentryVersion =
if (autoInstallEnabled) {
val detectedVersion = dependencies.findSentryVersion(isAndroid)
val sentryArtifactId =
if (isAndroid) {
SentryModules.SENTRY_ANDROID.name
} else {
SentryModules.SENTRY.name
}
this.sentryVersion =
installSentrySdk(sentryVersion, dependencies, sentryArtifactId, extension)
this.enabled = true
installSentrySdk(detectedVersion, dependencies, sentryArtifactId, extension)
} else {
SENTRY_SDK_VERSION
}

project.dependencies.components { component ->
(strategies + delayedStrategies).forEach {
it.register(component, autoInstallEnabled, sentryVersion)
}
}
}
}
project.dependencies.components { component -> strategies.forEach { it.register(component) } }
}

private fun Project.installSentrySdk(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@ package io.sentry.android.gradle.autoinstall
import org.gradle.api.artifacts.dsl.ComponentMetadataHandler

interface InstallStrategyRegistrar {
fun register(component: ComponentMetadataHandler)
fun register(
component: ComponentMetadataHandler,
autoInstallEnabled: Boolean,
sentryVersion: String,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,20 @@ import org.slf4j.Logger

abstract class ComposeInstallStrategy : AbstractInstallStrategy {

constructor(logger: Logger) : super() {
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
logger: Logger,
) : super(autoInstallEnabled, sentryVersion) {
this.logger = logger
}

@Suppress("unused") // used by Gradle
@Inject // inject is needed to avoid Gradle error
constructor() : this(SentryPlugin.logger)
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
) : this(autoInstallEnabled, sentryVersion, SentryPlugin.logger)

override val sentryModuleId: String
get() = SENTRY_COMPOSE_ID
Expand All @@ -31,11 +38,14 @@ abstract class ComposeInstallStrategy : AbstractInstallStrategy {

internal const val SENTRY_COMPOSE_ID = "sentry-compose-android"

override fun register(component: ComponentMetadataHandler) {
component.withModule(
"androidx.compose.runtime:runtime",
ComposeInstallStrategy::class.java,
) {}
override fun register(
component: ComponentMetadataHandler,
autoInstallEnabled: Boolean,
sentryVersion: String,
) {
component.withModule("androidx.compose.runtime:runtime", ComposeInstallStrategy::class.java) {
it.params(autoInstallEnabled, sentryVersion)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,20 @@ import org.slf4j.Logger
// @CacheableRule // TODO: make it cacheable somehow (probably depends on parameters)
abstract class FragmentInstallStrategy : AbstractInstallStrategy {

constructor(logger: Logger) : super() {
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
logger: Logger,
) : super(autoInstallEnabled, sentryVersion) {
this.logger = logger
}

@Suppress("unused") // used by Gradle
@Inject // inject is needed to avoid Gradle error
constructor() : this(SentryPlugin.logger)
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
) : this(autoInstallEnabled, sentryVersion, SentryPlugin.logger)

override val sentryModuleId: String
get() = SENTRY_FRAGMENT_ID
Expand All @@ -30,8 +37,14 @@ abstract class FragmentInstallStrategy : AbstractInstallStrategy {
private const val FRAGMENT_ID = "fragment"
internal const val SENTRY_FRAGMENT_ID = "sentry-android-fragment"

override fun register(component: ComponentMetadataHandler) {
component.withModule("$FRAGMENT_GROUP:$FRAGMENT_ID", FragmentInstallStrategy::class.java) {}
override fun register(
component: ComponentMetadataHandler,
autoInstallEnabled: Boolean,
sentryVersion: String,
) {
component.withModule("$FRAGMENT_GROUP:$FRAGMENT_ID", FragmentInstallStrategy::class.java) {
it.params(autoInstallEnabled, sentryVersion)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,20 @@ import org.slf4j.Logger
// @CacheableRule
abstract class Graphql22InstallStrategy : AbstractInstallStrategy {

constructor(logger: Logger) : super() {
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
logger: Logger,
) : super(autoInstallEnabled, sentryVersion) {
this.logger = logger
}

@Suppress("unused") // used by Gradle
@Inject // inject is needed to avoid Gradle error
constructor() : this(SentryPlugin.logger)
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
) : this(autoInstallEnabled, sentryVersion, SentryPlugin.logger)

override val sentryModuleId: String
get() = SENTRY_GRAPHQL_ID
Expand All @@ -35,8 +42,14 @@ abstract class Graphql22InstallStrategy : AbstractInstallStrategy {

private val MIN_SUPPORTED_VERSION = SemVer(22, 0, 0)

override fun register(component: ComponentMetadataHandler) {
component.withModule("$GRAPHQL_GROUP:$GRAPHQL_ID", Graphql22InstallStrategy::class.java) {}
override fun register(
component: ComponentMetadataHandler,
autoInstallEnabled: Boolean,
sentryVersion: String,
) {
component.withModule("$GRAPHQL_GROUP:$GRAPHQL_ID", Graphql22InstallStrategy::class.java) {
it.params(autoInstallEnabled, sentryVersion)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,20 @@ import org.slf4j.Logger
// @CacheableRule
abstract class GraphqlInstallStrategy : AbstractInstallStrategy {

constructor(logger: Logger) : super() {
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
logger: Logger,
) : super(autoInstallEnabled, sentryVersion) {
this.logger = logger
}

@Suppress("unused") // used by Gradle
@Inject // inject is needed to avoid Gradle error
constructor() : this(SentryPlugin.logger)
constructor(
autoInstallEnabled: Boolean,
sentryVersion: String,
) : this(autoInstallEnabled, sentryVersion, SentryPlugin.logger)

override val sentryModuleId: String
get() = SENTRY_GRAPHQL_ID
Expand All @@ -37,8 +44,14 @@ abstract class GraphqlInstallStrategy : AbstractInstallStrategy {

private val MAX_SUPPORTED_VERSION = SemVer(21, 9999, 9999)

override fun register(component: ComponentMetadataHandler) {
component.withModule("$GRAPHQL_GROUP:$GRAPHQL_ID", GraphqlInstallStrategy::class.java) {}
override fun register(
component: ComponentMetadataHandler,
autoInstallEnabled: Boolean,
sentryVersion: String,
) {
component.withModule("$GRAPHQL_GROUP:$GRAPHQL_ID", GraphqlInstallStrategy::class.java) {
it.params(autoInstallEnabled, sentryVersion)
}
}
}
}
Loading
Loading