Skip to content
Merged
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
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@

## Unreleased

This is the first preview release of **App Versioning 2.0**, featuring redesigned `VersionCodeSpec` and `VersionNameSpec` APIs along with improved `GitTag` and `SemVer` APIs.

Please see the [2.0 Migration Guide](docs/migration-guide.md) for full details on breaking changes and how to upgrade from 1.x.

Note that the APIs are subject to change before the stable `2.0.0` release. Feedback and bug reports are welcome!

### Changed
- Minimum Android Gradle Plugin version is now **9.0.0** when using Gradle **9.6.0** and above.
- New `AppVersioningExtension`, `GitTag`, and `SemVer` APIs.
- Minimum Android Gradle Plugin version is now **9.0.0**.
- Compile with AGP 9.4.1.
- Compile with Kotlin 2.4.21.

Expand Down
291 changes: 81 additions & 210 deletions README.md

Large diffs are not rendered by default.

123 changes: 36 additions & 87 deletions api/app-versioning.api
Original file line number Diff line number Diff line change
@@ -1,162 +1,111 @@
public class io/github/reactivecircus/appversioning/AppVersioningExtension {
public static final field Companion Lio/github/reactivecircus/appversioning/AppVersioningExtension$Companion;
public final fun getBareGitRepoDirectory ()Lorg/gradle/api/file/DirectoryProperty;
public final fun getEnabled ()Lorg/gradle/api/provider/Property;
public final fun getFetchTagsWhenNoneExistsLocally ()Lorg/gradle/api/provider/Property;
public final fun getGitRootDirectory ()Lorg/gradle/api/file/DirectoryProperty;
public final fun getReleaseBuildOnly ()Lorg/gradle/api/provider/Property;
public final fun getTagFilter ()Lorg/gradle/api/provider/Property;
public final fun overrideVersionCode (Lgroovy/lang/Closure;)V
public final fun overrideVersionCode (Lkotlin/jvm/functions/Function3;)V
public final fun overrideVersionName (Lgroovy/lang/Closure;)V
public final fun overrideVersionName (Lkotlin/jvm/functions/Function3;)V
}

public final class io/github/reactivecircus/appversioning/AppVersioningExtension$Companion {
public final fun getVersionCode ()Lorg/gradle/api/provider/Property;
public final fun getVersionName ()Lorg/gradle/api/provider/Property;
public final fun versionCode (Lgroovy/lang/Closure;)V
public final fun versionName (Lgroovy/lang/Closure;)V
}

public final class io/github/reactivecircus/appversioning/AppVersioningPlugin : org/gradle/api/Plugin {
public static final field Companion Lio/github/reactivecircus/appversioning/AppVersioningPlugin$Companion;
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/Project;)V
}

public final class io/github/reactivecircus/appversioning/AppVersioningPlugin$Companion {
}

public final class io/github/reactivecircus/appversioning/GitTag {
public fun <init> (Ljava/lang/String;ILjava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()I
public final fun component3 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;ILjava/lang/String;)Lio/github/reactivecircus/appversioning/GitTag;
public static synthetic fun copy$default (Lio/github/reactivecircus/appversioning/GitTag;Ljava/lang/String;ILjava/lang/String;ILjava/lang/Object;)Lio/github/reactivecircus/appversioning/GitTag;
public fun equals (Ljava/lang/Object;)Z
public final fun getCommitHash ()Ljava/lang/String;
public final fun getCommitsSinceLatestTag ()I
public final fun getRawTagName ()Ljava/lang/String;
public final fun getName ()Ljava/lang/String;
public fun hashCode ()I
public final fun toSemVer ()Lio/github/reactivecircus/appversioning/SemVer;
public final fun toSemVer (Ljava/lang/String;)Lio/github/reactivecircus/appversioning/SemVer;
public static synthetic fun toSemVer$default (Lio/github/reactivecircus/appversioning/GitTag;Ljava/lang/String;ILjava/lang/Object;)Lio/github/reactivecircus/appversioning/SemVer;
public fun toString ()Ljava/lang/String;
}

public final class io/github/reactivecircus/appversioning/SemVer {
public final class io/github/reactivecircus/appversioning/SemVer : java/lang/Comparable {
public static final field Companion Lio/github/reactivecircus/appversioning/SemVer$Companion;
public fun <init> (IIILjava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (IIILjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()I
public final fun component2 ()I
public final fun component3 ()I
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun copy (IIILjava/lang/String;Ljava/lang/String;)Lio/github/reactivecircus/appversioning/SemVer;
public static synthetic fun copy$default (Lio/github/reactivecircus/appversioning/SemVer;IIILjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/github/reactivecircus/appversioning/SemVer;
public fun compareTo (Lio/github/reactivecircus/appversioning/SemVer;)I
public synthetic fun compareTo (Ljava/lang/Object;)I
public fun equals (Ljava/lang/Object;)Z
public static final fun fromGitTag (Lio/github/reactivecircus/appversioning/GitTag;)Lio/github/reactivecircus/appversioning/SemVer;
public static final fun fromGitTag (Lio/github/reactivecircus/appversioning/GitTag;Z)Lio/github/reactivecircus/appversioning/SemVer;
public final fun getBuildMetadata ()Ljava/lang/String;
public final fun getMajor ()I
public final fun getMinor ()I
public final fun getPatch ()I
public final fun getPreRelease ()Ljava/lang/String;
public fun hashCode ()I
public static final fun parse (Ljava/lang/String;)Lio/github/reactivecircus/appversioning/SemVer;
public static final fun parseOrNull (Ljava/lang/String;)Lio/github/reactivecircus/appversioning/SemVer;
public fun toString ()Ljava/lang/String;
public final fun toVersionCode ()I
public final fun toVersionCode (I)I
public static synthetic fun toVersionCode$default (Lio/github/reactivecircus/appversioning/SemVer;IILjava/lang/Object;)I
}

public final class io/github/reactivecircus/appversioning/SemVer$Companion {
public final fun fromGitTag (Lio/github/reactivecircus/appversioning/GitTag;)Lio/github/reactivecircus/appversioning/SemVer;
public final fun fromGitTag (Lio/github/reactivecircus/appversioning/GitTag;Z)Lio/github/reactivecircus/appversioning/SemVer;
public static synthetic fun fromGitTag$default (Lio/github/reactivecircus/appversioning/SemVer$Companion;Lio/github/reactivecircus/appversioning/GitTag;ZILjava/lang/Object;)Lio/github/reactivecircus/appversioning/SemVer;
}

public final class io/github/reactivecircus/appversioning/SemVerKt {
public static final fun toSemVer (Lio/github/reactivecircus/appversioning/GitTag;Z)Lio/github/reactivecircus/appversioning/SemVer;
public static synthetic fun toSemVer$default (Lio/github/reactivecircus/appversioning/GitTag;ZILjava/lang/Object;)Lio/github/reactivecircus/appversioning/SemVer;
public final fun parse (Ljava/lang/String;)Lio/github/reactivecircus/appversioning/SemVer;
public final fun parseOrNull (Ljava/lang/String;)Lio/github/reactivecircus/appversioning/SemVer;
}

public final class io/github/reactivecircus/appversioning/VariantInfo : java/io/Serializable {
public static final field Companion Lio/github/reactivecircus/appversioning/VariantInfo$Companion;
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public final fun getBuildType ()Ljava/lang/String;
public final fun getFlavorName ()Ljava/lang/String;
public final fun getVariantName ()Ljava/lang/String;
public final fun isDebugBuild ()Z
public final fun isReleaseBuild ()Z
}

public final class io/github/reactivecircus/appversioning/VariantInfo$Companion {
public abstract interface class io/github/reactivecircus/appversioning/VersionCodeSpec : java/io/Serializable {
public static final field Companion Lio/github/reactivecircus/appversioning/VersionCodeSpec$Companion;
public abstract fun versionCode (Lio/github/reactivecircus/appversioning/VersionContext;)I
}

public final class io/github/reactivecircus/appversioning/internal/CommitId {
public static final synthetic fun box-impl (Ljava/lang/String;)Lio/github/reactivecircus/appversioning/internal/CommitId;
public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z
public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z
public final fun getValue ()Ljava/lang/String;
public fun hashCode ()I
public static fun hashCode-impl (Ljava/lang/String;)I
public fun toString ()Ljava/lang/String;
public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String;
public final synthetic fun unbox-impl ()Ljava/lang/String;
public final class io/github/reactivecircus/appversioning/VersionCodeSpec$Companion {
public final fun getSemVer ()Lio/github/reactivecircus/appversioning/VersionCodeSpec;
}

public abstract interface class io/github/reactivecircus/appversioning/VersionContext {
public abstract fun getTag ()Lio/github/reactivecircus/appversioning/GitTag;
public abstract fun getVariant ()Lio/github/reactivecircus/appversioning/VariantInfo;
}

public final class io/github/reactivecircus/appversioning/internal/GitClient {
public static final field Companion Lio/github/reactivecircus/appversioning/internal/GitClient$Companion;
public final fun checkoutTag (Ljava/lang/String;)V
public final fun commit-HhBVPuw (Ljava/lang/String;Z)Ljava/lang/String;
public static synthetic fun commit-HhBVPuw$default (Lio/github/reactivecircus/appversioning/internal/GitClient;Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String;
public final fun describeLatestTag (Ljava/lang/String;)Ljava/lang/String;
public static synthetic fun describeLatestTag$default (Lio/github/reactivecircus/appversioning/internal/GitClient;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String;
public final fun fetchRemoteTags ()V
public final fun listLocalTags ()Ljava/util/List;
public final fun tag-9kPyyPo (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public static synthetic fun tag-9kPyyPo$default (Lio/github/reactivecircus/appversioning/internal/GitClient;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V
public abstract interface class io/github/reactivecircus/appversioning/VersionNameSpec : java/io/Serializable {
public static final field Companion Lio/github/reactivecircus/appversioning/VersionNameSpec$Companion;
public abstract fun versionName (Lio/github/reactivecircus/appversioning/VersionContext;)Ljava/lang/String;
}

public final class io/github/reactivecircus/appversioning/internal/GitClient$Companion {
public final fun initialize (Ljava/io/File;)Lio/github/reactivecircus/appversioning/internal/GitClient;
public final fun open (Ljava/io/File;)Lio/github/reactivecircus/appversioning/internal/GitClient;
public final class io/github/reactivecircus/appversioning/VersionNameSpec$Companion {
public final fun getTagName ()Lio/github/reactivecircus/appversioning/VersionNameSpec;
}

public abstract class io/github/reactivecircus/appversioning/tasks/GenerateAppVersionInfo : org/gradle/api/DefaultTask {
public static final field Companion Lio/github/reactivecircus/appversioning/tasks/GenerateAppVersionInfo$Companion;
public static final field TASK_DESCRIPTION_PREFIX Ljava/lang/String;
public static final field TASK_NAME_PREFIX Ljava/lang/String;
public static final field VERSION_CODE_FALLBACK I
public static final field VERSION_NAME_FALLBACK Ljava/lang/String;
public fun <init> (Lorg/gradle/workers/WorkerExecutor;)V
public final fun generate ()V
public fun <init> ()V
public abstract fun getFetchTagsWhenNoneExistsLocally ()Lorg/gradle/api/provider/Property;
public abstract fun getGitHead ()Lorg/gradle/api/file/RegularFileProperty;
public abstract fun getGitRefsDirectory ()Lorg/gradle/api/file/DirectoryProperty;
public abstract fun getGroovyVersionCodeCustomizer ()Lorg/gradle/api/provider/Property;
public abstract fun getGroovyVersionNameCustomizer ()Lorg/gradle/api/provider/Property;
public abstract fun getKotlinVersionCodeCustomizer ()Lorg/gradle/api/provider/Property;
public abstract fun getKotlinVersionNameCustomizer ()Lorg/gradle/api/provider/Property;
public abstract fun getRootProjectDirectory ()Lorg/gradle/api/file/DirectoryProperty;
public abstract fun getRootProjectDisplayName ()Lorg/gradle/api/provider/Property;
public abstract fun getTagFilter ()Lorg/gradle/api/provider/Property;
public abstract fun getVariantInfo ()Lorg/gradle/api/provider/Property;
public abstract fun getVersionCodeFile ()Lorg/gradle/api/file/RegularFileProperty;
public abstract fun getVersionCodeSpec ()Lorg/gradle/api/provider/Property;
public abstract fun getVersionNameFile ()Lorg/gradle/api/file/RegularFileProperty;
}

public final class io/github/reactivecircus/appversioning/tasks/GenerateAppVersionInfo$Companion {
public abstract fun getVersionNameSpec ()Lorg/gradle/api/provider/Property;
}

public abstract class io/github/reactivecircus/appversioning/tasks/PrintAppVersionInfo : org/gradle/api/DefaultTask {
public static final field Companion Lio/github/reactivecircus/appversioning/tasks/PrintAppVersionInfo$Companion;
public static final field TASK_DESCRIPTION_PREFIX Ljava/lang/String;
public static final field TASK_NAME_PREFIX Ljava/lang/String;
public fun <init> ()V
public abstract fun getBuildVariantName ()Lorg/gradle/api/provider/Property;
public abstract fun getProjectName ()Lorg/gradle/api/provider/Property;
public abstract fun getVersionCodeFile ()Lorg/gradle/api/file/RegularFileProperty;
public abstract fun getVersionNameFile ()Lorg/gradle/api/file/RegularFileProperty;
public final fun print ()V
}

public final class io/github/reactivecircus/appversioning/tasks/PrintAppVersionInfo$Companion {
}

39 changes: 15 additions & 24 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ plugins {
alias(libs.plugins.detekt)
alias(libs.plugins.mavenPublish)
alias(libs.plugins.burst)
alias(libs.plugins.testkit)
}

group = property("GROUP") as String
Expand All @@ -21,6 +22,10 @@ mavenPublishing {
signAllPublications()
}

gradleTestKitSupport {
disablePublication()
}

samWithReceiver {
annotation(HasImplicitReceiver::class.qualifiedName!!)
}
Expand Down Expand Up @@ -56,34 +61,19 @@ tasks.pluginUnderTestMetadata {
pluginClasspath.from(fixtureClasspath)
}

val functionalTestSourceSet: SourceSet = sourceSets.create("functionalTest") {
compileClasspath += sourceSets["main"].output + configurations["testRuntimeClasspath"]
runtimeClasspath += output + compileClasspath
}

val functionalTestImplementation: Configuration = configurations.getByName("functionalTestImplementation")
.extendsFrom(configurations.getByName("testImplementation"))

gradlePlugin.testSourceSets(functionalTestSourceSet)

val functionalTest = tasks.register("functionalTest", Test::class) {
failFast = true
tasks.withType<Test>().configureEach {
testLogging {
events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
testClassesDirs = functionalTestSourceSet.output.classesDirs
classpath = functionalTestSourceSet.runtimeClasspath
}

val check = tasks.getByName("check", Task::class) {
dependsOn(functionalTest)
tasks.functionalTest {
failFast = true
systemProperty("fixtureAgpVersion", fixtureAgpVersion.get())
}

val test = tasks.getByName("test", Test::class) {
tasks.test {
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
testLogging {
events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
}

val fixtureAgpVersion: Provider<String> = providers
Expand All @@ -93,12 +83,16 @@ val fixtureAgpVersion: Provider<String> = providers

dependencies {
compileOnly(libs.agp.build.api)
testImplementation(kotlin("test"))
testImplementation(kotlin("test-junit"))
functionalTestImplementation(kotlin("test-junit"))
functionalTestImplementation(libs.burst)
functionalTestImplementation(libs.agp.build.api)
fixtureClasspath(libs.agp.build.gradle.flatMap { dependency ->
fixtureAgpVersion.map { version ->
"${dependency.group}:${dependency.name}:$version"
}
})
detektPlugins(libs.plugin.detektKtlintWrapper)
}

detekt {
Expand All @@ -116,6 +110,3 @@ tasks.withType<Detekt>().configureEach {
html.outputLocation.set(file("build/reports/detekt/${project.name}.html"))
}
}


dependencies.add("detektPlugins", libs.plugin.detektKtlintWrapper.get())
Binary file modified docs/images/sample.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading