Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import org.slf4j.LoggerFactory
import java.time.temporal.ChronoUnit
import kotlin.math.absoluteValue

class IncrementalUpdateResult (
val newRepoValue: AdoptRepos,
val updatedReleases: List<Release>
)

@ApplicationScoped
class AdoptReposBuilder @Inject constructor(
private var adoptRepository: AdoptRepository,
Expand All @@ -33,20 +38,25 @@ class AdoptReposBuilder @Inject constructor(
toUpdate: Set<String>,
repo: AdoptRepos,
gitHubMetadataSupplier: suspend (GitHubId) -> GHReleaseMetadata?,
): AdoptRepos {
val updated = repo
): IncrementalUpdateResult {
val releases = repo
.repos
.map { entry -> getUpdatedFeatureRelease(toUpdate, entry, repo, gitHubMetadataSupplier) }

return AdoptRepos(updated)
val newReleases = releases.map { it.first }
val updatedReleases = releases
.flatMap { it.second.getReleases() }
.distinct()

return IncrementalUpdateResult(AdoptRepos(newReleases), updatedReleases)
}

private suspend fun getUpdatedFeatureRelease(
toUpdate: Set<String>,
entry: Map.Entry<Int, FeatureRelease>,
repo: AdoptRepos,
gitHubMetadataSupplier: suspend (GitHubId) -> GHReleaseMetadata?,
): FeatureRelease {
): Pair<FeatureRelease, Releases> {
val summary = adoptRepository.getSummary(entry.key)

// Update cycle
Expand All @@ -67,15 +77,26 @@ class AdoptReposBuilder @Inject constructor(
val youngReleases = getYoungReleases(summary)
val explicitlyAdded = getExplicitlyAddedReleases(summary, toUpdate)

pruned
val fullRelease = pruned
.add(newReleases)
.add(updatedReleases)
.add(youngReleases)
.add(explicitlyAdded)
.add(binaryCountChanged)

val updated = FeatureRelease(entry.key, Releases(emptyList()))
.add(newReleases)
.add(updatedReleases)
.add(youngReleases)
.add(explicitlyAdded)
.add(binaryCountChanged)
.releases

return Pair(fullRelease, updated)
} else {
val newReleases = getNewReleases(summary, FeatureRelease(entry.key, emptyList()))
FeatureRelease(entry.key, Releases(newReleases))
val featureRelease = FeatureRelease(entry.key, Releases(newReleases))
return Pair(featureRelease, Releases(newReleases))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,14 @@ class V3Updater @Inject constructor(
database::getGhReleaseMetadata
)

if (updatedRepo != oldRepo) {
val after = writeIncrementalUpdate(updatedRepo, oldRepo)
if (updatedRepo.newRepoValue != oldRepo) {
val after = writeIncrementalUpdate(updatedRepo.newRepoValue, oldRepo)
printRepoDebugInfo(oldRepo, after, null)

val updateReleases = updatedRepo.updatedReleases.joinToString(", ") { it.release_name }

LOGGER.info("Updating Release Notes for releases: ${updateReleases}")
adoptReleaseNotes.updateReleaseNotes(updatedRepo.updatedReleases)
return@runBlocking after
}
} catch (e: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import net.adoptium.api.v3.dataSources.persitence.ApiPersistence
import net.adoptium.api.v3.models.ReleaseType
import org.slf4j.LoggerFactory
import jakarta.inject.Inject
import net.adoptium.api.v3.models.Release

@ApplicationScoped
open class AdoptReleaseNotes @Inject constructor(
Expand All @@ -31,12 +32,14 @@ open class AdoptReleaseNotes @Inject constructor(
private val LOGGER = LoggerFactory.getLogger(this::class.java)
}

open suspend fun updateReleaseNotes(adoptRepos: AdoptRepos) {
updateReleaseNotes(adoptRepos.allReleases.getReleases().toList())
}

open suspend fun updateReleaseNotes(
adoptRepos: AdoptRepos
releases: List<Release>
) {
adoptRepos
.allReleases
.getReleases()
releases
.filter { it.release_type == ReleaseType.ga }
.filter {
runBlocking {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import net.adoptium.api.testDoubles.AdoptRepositoryStub
import net.adoptium.api.testDoubles.UpdatableVersionSupplierStub
import net.adoptium.api.v3.AdoptReposBuilder
import net.adoptium.api.v3.AdoptRepository
import net.adoptium.api.v3.IncrementalUpdateResult
import net.adoptium.api.v3.ReleaseResult
import net.adoptium.api.v3.dataSources.VersionSupplier
import net.adoptium.api.v3.dataSources.models.AdoptRepos
Expand All @@ -24,23 +25,25 @@ class AdoptReposBuilderTest : BaseTest() {
private val stub = AdoptRepositoryStub()
private val adoptReposBuilder: AdoptReposBuilder = AdoptReposBuilder(stub, UpdatableVersionSupplierStub())
private var before: AdoptRepos = stub.repo
private var updated: AdoptRepos = runBlocking {
adoptReposBuilder.incrementalUpdate(emptySet(), before) { null }
private var updated: IncrementalUpdateResult = runBlocking {
adoptReposBuilder
.incrementalUpdate(emptySet(), before) { null }
}
}

@Test
fun addReleaseIsUpdatedExplicitly() {
runBlocking {
val adoptRepository = AdoptRepositoryStub()
val adoptRepo = spyk(adoptRepository)
val adoptReposBuilder = AdoptReposBuilder(adoptRepo, UpdatableVersionSupplierStub())

adoptReposBuilder.incrementalUpdate(setOf(before.repos[8]?.releases?.nodeList?.first()?.release_name!!), before) { null }
val initialResult = adoptReposBuilder.incrementalUpdate(setOf(before.repos[8]?.releases?.nodeList?.first()?.release_name!!), before) { null }
assertTrue { initialResult.updatedReleases.isNotEmpty() }

val toUpdate = updated.getFeatureRelease(8)!!.releases.nodes.values.take(AdoptRepositoryStub.unchangedIndex).last()
val toUpdate = updated.newRepoValue.getFeatureRelease(8)!!.releases.nodes.values.take(AdoptRepositoryStub.unchangedIndex).last()

updated = adoptReposBuilder.incrementalUpdate(setOf(toUpdate.release_name), before) { null }
assertTrue { updated.updatedReleases.any { it.id == toUpdate.id } }
coVerify(exactly = 1) { adoptRepo.getReleaseById(match { it.id == toUpdate.id }) }
}
}
Expand All @@ -49,47 +52,50 @@ class AdoptReposBuilderTest : BaseTest() {
fun removedReleaseIsRemovedWhenUpdated() {
runBlocking {
assertTrue { before.getFeatureRelease(8)!!.releases.hasReleaseId(GitHubId(stub.toRemove.id)) }
assertTrue { !updated.getFeatureRelease(8)!!.releases.hasReleaseId(GitHubId(stub.toRemove.id)) }
assertTrue { updated != before }
assertTrue { !updated.newRepoValue.getFeatureRelease(8)!!.releases.hasReleaseId(GitHubId(stub.toRemove.id)) }
assertTrue { !updated.updatedReleases.any { it.id == stub.toRemove.id } }
assertTrue { updated.newRepoValue != before }
}
}

@Test
fun addReleaseIsAddWhenUpdated() {
runBlocking {
assertTrue { !before.getFeatureRelease(8)!!.releases.hasReleaseId(GitHubId("foo")) }
assertTrue { updated.getFeatureRelease(8)!!.releases.getReleases().contains(AdoptRepositoryStub.toAdd) }
assertTrue { updated != before }
assertTrue { updated.newRepoValue.getFeatureRelease(8)!!.releases.getReleases().contains(AdoptRepositoryStub.toAdd) }
assertTrue { updated.updatedReleases.contains(AdoptRepositoryStub.toAdd) }
assertTrue { updated.newRepoValue != before }
}
}

@Test
fun releaseLessThan10MinOldIsNotUpdated() {
runBlocking {
assertTrue { !updated.getFeatureRelease(8)!!.releases.hasReleaseId(GitHubId("young")) }
val result = adoptReposBuilder.incrementalUpdate(emptySet(), before) { null }
assertTrue { !result.newRepoValue.getFeatureRelease(8)!!.releases.hasReleaseId(GitHubId("young")) }
assertTrue { !result.updatedReleases.any { it.id == "young" } }
}
}

@Test
fun updatedReleaseIsUpdatedWhenUpdated() {
runBlocking {
assertTrue { before.getFeatureRelease(8)!!.releases.getReleases().contains(stub.originalToUpdate) }
assertTrue { !updated.getFeatureRelease(8)!!.releases.getReleases().contains(stub.originalToUpdate) }
assertTrue { updated.getFeatureRelease(8)!!.releases.getReleases().contains(stub.toUpdate) }
assertTrue { updated != before }
assertTrue { !updated.newRepoValue.getFeatureRelease(8)!!.releases.getReleases().contains(stub.originalToUpdate) }
assertTrue { updated.newRepoValue.getFeatureRelease(8)!!.releases.getReleases().contains(stub.toUpdate) }
assertTrue { updated.updatedReleases.contains(stub.toUpdate) }
assertTrue { updated.newRepoValue != before }
}
}

@Test
fun updatedReleaseIsNotUpdatedWhenThingsDontChange() {
runBlocking {

val updated2 = adoptReposBuilder.incrementalUpdate(emptySet(), before) { null }

val updated3 = adoptReposBuilder.incrementalUpdate(emptySet(), before) { null }

assertTrue { updated == updated2 }
assertTrue { updated2 == updated3 }
assertTrue { updated.newRepoValue == updated2.newRepoValue }
assertTrue { updated2.updatedReleases == updated3.updatedReleases }
}
}

Expand All @@ -104,7 +110,10 @@ class AdoptReposBuilderTest : BaseTest() {
coEvery { adoptRepo.getReleaseById(GitHubId(AdoptRepositoryStub.toAddSemiYoungRelease.id)) } returns ReleaseResult(listOf(AdoptRepositoryStub.toAddSemiYoungRelease))

val updatedRepo = adoptReposBuilder.incrementalUpdate(emptySet(), repo) { null }
adoptReposBuilder.incrementalUpdate(emptySet(), updatedRepo) { null }
assertTrue { updatedRepo.updatedReleases.contains(AdoptRepositoryStub.toAddSemiYoungRelease) }

val updatedRepo2 = adoptReposBuilder.incrementalUpdate(emptySet(), updatedRepo.newRepoValue) { null }
assertTrue { updatedRepo2.updatedReleases.contains(AdoptRepositoryStub.toAddSemiYoungRelease) }

coVerify(exactly = 3) { adoptRepo.getReleaseById(GitHubId(AdoptRepositoryStub.toAddSemiYoungRelease.id)) }
}
Expand All @@ -117,12 +126,9 @@ class AdoptReposBuilderTest : BaseTest() {
val adoptRepo = spyk(adoptRepository)
val adoptReposBuilder = AdoptReposBuilder(adoptRepo, UpdatableVersionSupplierStub())

adoptReposBuilder.incrementalUpdate(emptySet(), before) {
val updated = adoptReposBuilder.incrementalUpdate(emptySet(), before) {
if (before.repos[11]?.releases?.nodeList?.first()?.id == it.id) {
GHReleaseMetadata(
99999,
it
)
GHReleaseMetadata(99999, it)
} else {
GHReleaseMetadata(
before.allReleases.getReleaseById(it.id)?.binaries?.size ?: 0,
Expand All @@ -131,7 +137,9 @@ class AdoptReposBuilderTest : BaseTest() {
}
}

coVerify(exactly = 1) { adoptRepo.getReleaseById(GitHubId(before.repos[11]?.releases?.nodeList?.first()?.id!!)) }
val expectedReleaseId = before.repos[11]?.releases?.nodeList?.first()?.id!!
assertTrue { updated.updatedReleases.any { it.id == expectedReleaseId } }
coVerify(exactly = 1) { adoptRepo.getReleaseById(GitHubId(expectedReleaseId)) }
}
}

Expand All @@ -141,14 +149,16 @@ class AdoptReposBuilderTest : BaseTest() {
val adoptRepo = spyk(adoptRepository)
val adoptReposBuilder = AdoptReposBuilder(adoptRepo, versionSupplier)

adoptReposBuilder.incrementalUpdate(emptySet(), before) {
val updated = adoptReposBuilder.incrementalUpdate(emptySet(), before) {
GHReleaseMetadata(
before.allReleases.getReleaseById(it.id)?.binaries?.size ?: 0,
it
)
}

coVerify(exactly = 0) { adoptRepo.getReleaseById(GitHubId(before.repos[11]?.releases?.nodeList?.first()?.id!!)) }
val releaseId = before.repos[11]?.releases?.nodeList?.first()?.id!!
assertTrue { !updated.updatedReleases.any { it.id == releaseId } }
coVerify(exactly = 0) { adoptRepo.getReleaseById(GitHubId(releaseId)) }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ class V3UpdaterTest {
coEvery { statsInterface.update(any()) } returns Unit

val adoptReleaseNotes: AdoptReleaseNotes = mockk()
coEvery { adoptReleaseNotes.updateReleaseNotes(any()) } returns Unit
coEvery { adoptReleaseNotes.updateReleaseNotes(any<AdoptRepos>()) } returns Unit
coEvery { adoptReleaseNotes.updateReleaseNotes(any<List<Release>>()) } returns Unit

mockkStatic(Quarkus::class)
val called = AtomicBoolean(false)
Expand Down