From a7772f2ed881c19a778f6128e90a409da36570d7 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 15 May 2026 17:28:29 -0400 Subject: [PATCH] Calculate version using 'first-parent' only for release branches. For PRs calculate on latest released version. --- .../plugin/version/TracerVersionPlugin.kt | 21 +++++++-- .../version/TracerVersionIntegrationTest.kt | 46 +++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/version/TracerVersionPlugin.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/version/TracerVersionPlugin.kt index 5255cbf5328..4cd8669c389 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/version/TracerVersionPlugin.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/version/TracerVersionPlugin.kt @@ -48,9 +48,18 @@ class TracerVersionPlugin @Inject constructor( // Not a git repository extension.defaultVersion.get() } else { + val currentBranchProvider = gitCurrentBranchProvider(repoWorkingDirectory) providerFactory.zip( - gitDescribeProvider(extension, repoWorkingDirectory), - gitCurrentBranchProvider(repoWorkingDirectory) + currentBranchProvider.flatMap { currentBranch -> + // Use --first-parent only on release branches so they stay anchored to their own + // version line; feature branches pick up newer tags merged in from main. + gitDescribeProvider( + extension, + repoWorkingDirectory, + firstParent = currentBranch.startsWith("release/v") + ) + }, + currentBranchProvider ) { describeString, currentBranch -> toTracerVersion(describeString, extension) { when { @@ -87,7 +96,8 @@ class TracerVersionPlugin @Inject constructor( private fun gitDescribeProvider( extension: TracerVersionExtension, - repoWorkingDirectory: File + repoWorkingDirectory: File, + firstParent: Boolean, ) = providerFactory.of(GitCommandValueSource::class.java) { parameters { val tagPrefix = extension.tagVersionPrefix.get() @@ -96,10 +106,13 @@ class TracerVersionPlugin @Inject constructor( "describe", "--abbrev=8", "--tags", - "--first-parent", "--match=$tagPrefix[0-9].[0-9]*.[0-9]*", ) + if (firstParent) { + gitCommand.add("--first-parent") + } + if (extension.detectDirty.get()) { gitCommand.add("--dirty") } diff --git a/buildSrc/src/test/kotlin/datadog/gradle/plugin/version/TracerVersionIntegrationTest.kt b/buildSrc/src/test/kotlin/datadog/gradle/plugin/version/TracerVersionIntegrationTest.kt index 4f253b41633..69b10e15dc6 100644 --- a/buildSrc/src/test/kotlin/datadog/gradle/plugin/version/TracerVersionIntegrationTest.kt +++ b/buildSrc/src/test/kotlin/datadog/gradle/plugin/version/TracerVersionIntegrationTest.kt @@ -89,6 +89,29 @@ class TracerVersionIntegrationTest { ) } + @Test + fun `should increment minor from merged main version tag on feature branch`(@TempDir projectDir: File) { + val fixture = VersionPluginsFixture(projectDir) + fixture.assertTracerVersion( + expectedVersion = "1.53.0-SNAPSHOT", + beforeGradle = { + fixture.initGitRepo() + fixture.exec("git", "tag", "v1.50.0", "-m", "") + fixture.exec("git", "switch", "-c", "feature") + File(projectDir, "feature.txt").writeText("feature") + fixture.exec("git", "add", "feature.txt") + fixture.exec("git", "commit", "-m", "Feature commit") + fixture.exec("git", "switch", "main") + File(projectDir, "main.txt").writeText("main") + fixture.exec("git", "add", "main.txt") + fixture.exec("git", "commit", "-m", "Main commit") + fixture.exec("git", "tag", "v1.52.0", "-m", "") + fixture.exec("git", "switch", "feature") + fixture.exec("git", "merge", "main", "--no-edit") + }, + ) + } + @Test fun `should increment minor with snapshot and dirtiness with added commits after version tag and dirty`(@TempDir projectDir: File) { val fixture = VersionPluginsFixture(projectDir) @@ -106,6 +129,29 @@ class TracerVersionIntegrationTest { ) } + @Test + fun `should increment patch from first parent on release branch after main merge`(@TempDir projectDir: File) { + val fixture = VersionPluginsFixture(projectDir) + fixture.assertTracerVersion( + expectedVersion = "1.52.1-SNAPSHOT", + beforeGradle = { + fixture.initGitRepo() + fixture.exec("git", "tag", "v1.52.0", "-m", "") + fixture.exec("git", "switch", "-c", "release/v1.52.x") + File(projectDir, "release.txt").writeText("release") + fixture.exec("git", "add", "release.txt") + fixture.exec("git", "commit", "-m", "Release commit") + fixture.exec("git", "switch", "main") + File(projectDir, "main.txt").writeText("main") + fixture.exec("git", "add", "main.txt") + fixture.exec("git", "commit", "-m", "Main commit") + fixture.exec("git", "tag", "v1.53.0", "-m", "") + fixture.exec("git", "switch", "release/v1.52.x") + fixture.exec("git", "merge", "main", "--no-edit") + }, + ) + } + @Test fun `should increment patch on release branch and no patch release tag`(@TempDir projectDir: File) { val fixture = VersionPluginsFixture(projectDir)