diff --git a/build.gradle.kts b/build.gradle.kts index d15aef0..1adc636 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,5 @@ import com.ncorti.ktfmt.gradle.tasks.KtfmtCheckTask import com.ncorti.ktfmt.gradle.tasks.KtfmtFormatTask -import com.vanniktech.maven.publish.SonatypeHost import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent @@ -57,7 +56,7 @@ kotlin { } mavenPublishing { - publishToMavenCentral(SonatypeHost.S01, true) + publishToMavenCentral(automaticRelease = true) signAllPublications() pom { diff --git a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenHttpClient.kt b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenHttpClient.kt index df6bd5b..85657eb 100644 --- a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenHttpClient.kt +++ b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenHttpClient.kt @@ -37,13 +37,13 @@ internal class MavenHttpClient( setBody(LocalFileContent(file)) } val size = file.length() - logger.info { "Uploaded $url: status=${resp.status} size=$size" } + logger.debug { "Uploaded $url: status=${resp.status} size=$size" } return size } internal suspend fun upload(url: Url, content: String) { val resp = httpClient.put(url) { setBody(content) } - logger.info { "Uploaded $url: ${resp.status}" } + logger.debug { "Uploaded $url: ${resp.status}" } } internal suspend fun parseDirectoryListing(url: Url): List { diff --git a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenRepositoryCrawler.kt b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenRepositoryCrawler.kt index a8badae..a512af8 100644 --- a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenRepositoryCrawler.kt +++ b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenRepositoryCrawler.kt @@ -33,7 +33,7 @@ internal class MavenRepositoryCrawler( url: Url, crawlDelay: Duration, ) { - logger.info { "Reading index: $url" } + logger.debug { "Reading index: $url" } val childLinks = httpClient.parseDirectoryListing(url) logger.debug { "Found ${childLinks.size} links in $url" } diff --git a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncEngine.kt b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncEngine.kt index 3bc262e..bdc13b5 100644 --- a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncEngine.kt +++ b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncEngine.kt @@ -39,6 +39,13 @@ internal class MavenSyncEngine( metrics.recordInSync(metadata.group, metadata.artifact, inSyncVersions) val missingVersions = sourceVersions - targetVersions + logger.info { + "Discovered ${metadata.group}:${metadata.artifact} — ${sourceVersions.size} versions" + + " in source, ${inSyncVersions.size} in sync, ${missingVersions.size} to sync" + } + inSyncVersions.forEach { version -> + logger.info { "In sync ${metadata.group}:${metadata.artifact}:${version.value}" } + } if (missingVersions.isEmpty()) { logger.debug { "No missing versions for ${metadata.group}:${metadata.artifact}" } return @@ -46,12 +53,24 @@ internal class MavenSyncEngine( logger.info { "Syncing missing versions for ${metadata.group}:${metadata.artifact}: $missingVersions" } + var synced = 0 + var failed = 0 missingVersions .map { Coordinates(metadata.group, metadata.artifact, it) } - .forEach { coordinates -> syncVersion(coordinates) } + .forEach { coordinates -> + when (syncVersion(coordinates)) { + VersionOutcome.Synced -> synced++ + VersionOutcome.Failed -> failed++ + VersionOutcome.NoAssets -> Unit + } + } + logger.info { + "Completed ${metadata.group}:${metadata.artifact} —" + + " inSync=${inSyncVersions.size} synced=$synced failed=$failed" + } } - private suspend fun syncVersion(coordinates: Coordinates) { + private suspend fun syncVersion(coordinates: Coordinates): VersionOutcome { val mark = TimeSource.Monotonic.markNow() try { val assets = @@ -61,25 +80,37 @@ internal class MavenSyncEngine( options.transferSignatures, ) - if (assets.isEmpty()) return + if (assets.isEmpty()) return VersionOutcome.NoAssets var bytes = 0L assets.forEach { asset -> bytes += source.copyAsset(asset, target) } target.releaseVersion(coordinates) + val duration = mark.elapsedNow() metrics.recordSynced( coordinates = coordinates, assetCount = assets.size, bytes = bytes, - duration = mark.elapsedNow(), + duration = duration, ) + logger.info { + "Synced $coordinates — ${assets.size} assets, ${formatBytes(bytes)} in $duration" + } delay(options.downloadDelay) + return VersionOutcome.Synced } catch (e: CancellationException) { throw e } catch (e: Exception) { val msg = e.message ?: e.toString() logger.error(e) { "Failed to sync $coordinates: $msg" } metrics.recordFailure(coordinates, msg, mark.elapsedNow()) + return VersionOutcome.Failed } } + + private enum class VersionOutcome { + Synced, + Failed, + NoAssets, + } } diff --git a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncMain.kt b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncMain.kt index 4fd569b..cd466c1 100644 --- a/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncMain.kt +++ b/src/main/kotlin/io/cloudshiftdev/mavensync/MavenSyncMain.kt @@ -25,7 +25,11 @@ public suspend fun main(args: Array) { val config = loadConfiguration(args) - logger.info { "Effective configuration: $config" } + logger.info { + "Starting maven-sync: source=${config.source.url} target=${config.target.url} " + + "paths=${config.source.paths} concurrency=${config.artifactConcurrency}" + } + logger.debug { "Effective configuration: $config" } val metrics = SyncMetrics() try { @@ -34,6 +38,7 @@ public suspend fun main(args: Array) { MavenSyncEngine(source, target, config.toSyncOptions(), metrics).sync() } } + logger.info { "Sync complete" } } finally { val report = metrics.snapshot() logger.info { "\n" + report.renderDetailed() } diff --git a/src/main/kotlin/io/cloudshiftdev/mavensync/SyncMetrics.kt b/src/main/kotlin/io/cloudshiftdev/mavensync/SyncMetrics.kt index b3c110b..89c18b6 100644 --- a/src/main/kotlin/io/cloudshiftdev/mavensync/SyncMetrics.kt +++ b/src/main/kotlin/io/cloudshiftdev/mavensync/SyncMetrics.kt @@ -141,7 +141,7 @@ internal data class SyncReport(val totalDuration: Duration, val artifacts: List< } } -private fun formatBytes(bytes: Long): String { +internal fun formatBytes(bytes: Long): String { if (bytes < 1024) return "$bytes B" val units = listOf("KB", "MB", "GB", "TB") var value = bytes.toDouble() / 1024.0