Skip to content

Commit e1d419b

Browse files
committed
Merge branch 'firebase-sessions' into sessions-action
2 parents 56ae038 + f1c51b5 commit e1d419b

File tree

87 files changed

+2104
-207
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+2104
-207
lines changed

appcheck/firebase-appcheck-debug-testing/firebase-appcheck-debug-testing.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ plugins {
1717
}
1818

1919
firebaseLibrary {
20+
libraryGroup "appcheck"
2021
testLab.enabled = true
2122
publishSources = true
2223
}

appcheck/firebase-appcheck-debug/firebase-appcheck-debug.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ plugins {
1717
}
1818

1919
firebaseLibrary {
20+
libraryGroup "appcheck"
2021
publishSources = true
2122
}
2223

appcheck/firebase-appcheck-playintegrity/firebase-appcheck-playintegrity.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ plugins {
1717
}
1818

1919
firebaseLibrary {
20+
libraryGroup "appcheck"
2021
publishSources = true
2122
}
2223

appcheck/firebase-appcheck/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
# 16.1.2
44
* [unchanged] Updated to keep [app_check] SDK versions aligned.
55

6+
7+
## Kotlin
8+
The Kotlin extensions library transitively includes the updated
9+
`firebase-appcheck` library. The Kotlin extensions library has no additional
10+
updates.
11+
612
# 16.1.1
713
* [changed] Migrated [app_check] SDKs to use standard Firebase executors.
814
(GitHub [#4431](//github.com/firebase/firebase-android-sdk/issues/4431){: .external}

appcheck/firebase-appcheck/firebase-appcheck.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ plugins {
1717
}
1818

1919
firebaseLibrary {
20+
libraryGroup "appcheck"
2021
publishSources = true
2122
}
2223

appcheck/firebase-appcheck/ktx/ktx.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ plugins {
1818
}
1919

2020
firebaseLibrary {
21-
releaseWith project(':appcheck:firebase-appcheck')
21+
libraryGroup "appcheck"
2222
testLab.enabled = true
2323
publishJavadoc = true
2424
publishSources = true

buildSrc/src/main/java/com/google/firebase/gradle/MultiProjectReleasePlugin.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.gradle.api.Plugin;
2424
import org.gradle.api.Project;
2525
import org.gradle.api.Task;
26+
import org.gradle.api.tasks.Copy;
27+
import org.gradle.api.tasks.TaskProvider;
2628
import org.gradle.api.tasks.bundling.Zip;
2729

2830
/**
@@ -63,7 +65,34 @@ public void apply(Project project) {
6365
task.getDestinationDirectory().set(project.getRootDir());
6466
});
6567

66-
project.getTasks().create("generateReleaseConfig", ReleaseGenerator.class);
68+
TaskProvider<ReleaseGenerator> generatorTask =
69+
project
70+
.getTasks()
71+
.register(
72+
"makeReleaseConfigFiles",
73+
ReleaseGenerator.class,
74+
task -> {
75+
task.getCurrentRelease()
76+
.convention(project.property("currentRelease").toString());
77+
task.getPastRelease().convention(project.property("pastRelease").toString());
78+
task.getPrintReleaseConfig()
79+
.convention(project.property("printOutput").toString());
80+
task.getReleaseConfigFile()
81+
.convention(project.getLayout().getBuildDirectory().file("release.cfg"));
82+
task.getReleaseReportFile()
83+
.convention(
84+
project.getLayout().getBuildDirectory().file("release_report.md"));
85+
});
86+
87+
project
88+
.getTasks()
89+
.register(
90+
"generateReleaseConfig",
91+
Copy.class,
92+
task -> {
93+
task.from(generatorTask);
94+
task.into(project.getRootDir());
95+
});
6796

6897
project
6998
.getGradle()
@@ -87,7 +116,6 @@ public void apply(Project project) {
87116
"Required projectsToPublish parameter missing.");
88117
}
89118
}));
90-
91119
project.getTasks().findByName("firebasePublish").dependsOn(validateProjectsToPublish);
92120
});
93121
}

buildSrc/src/main/java/com/google/firebase/gradle/ReleaseGenerator.kt

Lines changed: 152 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,57 +13,114 @@
1313
// limitations under the License.
1414
package com.google.firebase.gradle
1515

16+
import com.google.common.collect.ImmutableList
17+
import com.google.firebase.gradle.plugins.FirebaseLibraryExtension
1618
import java.io.File
1719
import org.eclipse.jgit.api.Git
1820
import org.eclipse.jgit.api.ListBranchCommand
1921
import org.eclipse.jgit.api.errors.GitAPIException
2022
import org.eclipse.jgit.lib.Constants
2123
import org.eclipse.jgit.lib.ObjectId
24+
import org.eclipse.jgit.revwalk.RevCommit
2225
import org.gradle.api.DefaultTask
26+
import org.gradle.api.Project
27+
import org.gradle.api.file.RegularFileProperty
28+
import org.gradle.api.provider.Property
29+
import org.gradle.api.tasks.Input
30+
import org.gradle.api.tasks.OutputFile
2331
import org.gradle.api.tasks.TaskAction
32+
import org.gradle.kotlin.dsl.findByType
2433

2534
data class FirebaseLibrary(val moduleNames: List<String>, val directories: List<String>)
2635

27-
open class ReleaseGenerator : DefaultTask() {
36+
data class CommitDiff(
37+
val commitId: String,
38+
val author: String,
39+
val message: String,
40+
) {
41+
constructor(
42+
revCommit: RevCommit
43+
) : this(revCommit.id.name, revCommit.authorIdent.name, revCommit.fullMessage) {}
44+
45+
override fun toString(): String =
46+
"""
47+
|* ${message.split("\n").first()}
48+
| https://github.com/firebase/firebase-android-sdk/commit/${commitId} [${author}]
49+
50+
"""
51+
.trimMargin()
52+
}
53+
54+
abstract class ReleaseGenerator : DefaultTask() {
55+
56+
@get:Input abstract val currentRelease: Property<String>
57+
58+
@get:Input abstract val pastRelease: Property<String>
59+
60+
@get:Input abstract val printReleaseConfig: Property<String>
61+
62+
@get:OutputFile abstract val releaseConfigFile: RegularFileProperty
63+
64+
@get:OutputFile abstract val releaseReportFile: RegularFileProperty
65+
2866
@TaskAction
2967
@Throws(Exception::class)
3068
fun generateReleaseConfig() {
31-
val currentRelease = project.property("currentRelease").toString()
32-
val pastRelease = project.property("pastRelease").toString()
33-
val printReleaseConfig = project.property("printOutput").toString().toBoolean()
3469
val rootDir = project.rootDir
35-
val availableModules = parseSubProjects(rootDir)
36-
val firebaseLibraries = extractLibraries(availableModules, rootDir)
70+
val availableModules = project.subprojects.filter { it.plugins.hasPlugin("firebase-library") }
3771

3872
val repo = Git.open(rootDir)
3973
val headRef = repo.repository.resolve(Constants.HEAD)
40-
val branchRef = getObjectRefForBranchName(repo, pastRelease)
74+
val branchRef = getObjectRefForBranchName(repo, pastRelease.get())
75+
76+
val libsToRelease = getChangedChangelogs(repo, branchRef, headRef, availableModules)
77+
val changedLibsWithNoChangelog =
78+
getChangedLibraries(repo, branchRef, headRef, availableModules) subtract
79+
libsToRelease.map { it.path }.toSet()
4180

42-
val changedLibraries = getChangedLibraries(repo, branchRef, headRef, firebaseLibraries)
43-
writeReleaseConfig(rootDir, changedLibraries, currentRelease)
44-
if (printReleaseConfig) {
45-
println(changedLibraries.joinToString(",", "LIBRARIES TO RELEASE: "))
81+
val changes = getChangesForLibraries(repo, branchRef, headRef, libsToRelease)
82+
writeReleaseConfig(
83+
releaseConfigFile.get().asFile,
84+
ReleaseConfig(currentRelease.get(), libsToRelease.map { it.path }.toSet())
85+
)
86+
val releaseReport = generateReleaseReport(changes, changedLibsWithNoChangelog)
87+
if (printReleaseConfig.get().toBoolean()) {
88+
project.logger.info(releaseReport)
4689
}
90+
writeReleaseReport(releaseReportFile.get().asFile, releaseReport)
4791
}
4892

49-
private fun extractLibraries(
50-
availableModules: Set<String>,
51-
rootDir: File
52-
): List<FirebaseLibrary> {
53-
val nonKtxModules = availableModules.filter { !it.endsWith("ktx") }.toSet()
54-
return nonKtxModules
55-
.map { moduleName ->
56-
val ktxModuleName = "$moduleName:ktx"
57-
58-
val moduleNames = listOf(moduleName, ktxModuleName).filter { availableModules.contains(it) }
59-
val directories = moduleNames.map { it.replace(":", "/") }
93+
private fun generateReleaseReport(
94+
changes: Map<String, List<CommitDiff>>,
95+
changedLibrariesWithNoChangelog: Set<String>
96+
) =
97+
"""
98+
|# Release Report
99+
|${
100+
changes.entries.joinToString("\n") {
101+
"""
102+
|## ${it.key}
103+
104+
|${it.value.joinToString("\n") { it.toString() }}
105+
""".trimMargin()
106+
}
107+
}
108+
|
109+
|## SDKs with changes, but no changelogs
110+
|${changedLibrariesWithNoChangelog.joinToString(" \n")}
111+
"""
112+
.trimMargin()
60113

61-
FirebaseLibrary(moduleNames, directories)
62-
}
63-
.filter { firebaseLibrary ->
64-
firebaseLibrary.directories.first().let { File(rootDir, "$it/gradle.properties").exists() }
65-
}
66-
}
114+
private fun getChangesForLibraries(
115+
repo: Git,
116+
branchRef: ObjectId,
117+
headRef: ObjectId,
118+
changedLibraries: Set<Project>
119+
) =
120+
changedLibraries
121+
.map { getRelativeDir(it) }
122+
.associateWith { getDirChanges(repo, branchRef, headRef, it) }
123+
.toMap()
67124

68125
private fun parseSubProjects(rootDir: File) =
69126
File(rootDir, "subprojects.cfg")
@@ -77,21 +134,46 @@ open class ReleaseGenerator : DefaultTask() {
77134
.branchList()
78135
.setListMode(ListBranchCommand.ListMode.REMOTE)
79136
.call()
80-
.firstOrNull { it.name == "refs/remotes/origin/$branchName" }
137+
.firstOrNull { it.name == "refs/remotes/origin/releases/$branchName" }
81138
?.objectId
82139
?: throw RuntimeException("Could not find branch named $branchName")
83140

84141
private fun getChangedLibraries(
85142
repo: Git,
86143
previousReleaseRef: ObjectId,
87144
currentReleaseRef: ObjectId,
88-
libraries: List<FirebaseLibrary>
145+
libraries: List<Project>
146+
) =
147+
libraries
148+
.filter {
149+
checkDirChanges(repo, previousReleaseRef, currentReleaseRef, "${getRelativeDir(it)}/")
150+
}
151+
.flatMap {
152+
it.extensions.findByType<FirebaseLibraryExtension>()?.projectsToRelease?.map { it.path }
153+
?: emptyList()
154+
}
155+
.toSet()
156+
157+
private fun getChangedChangelogs(
158+
repo: Git,
159+
previousReleaseRef: ObjectId,
160+
currentReleaseRef: ObjectId,
161+
libraries: List<Project>
89162
) =
90163
libraries
91164
.filter { library ->
92-
library.directories.any { checkDirChanges(repo, previousReleaseRef, currentReleaseRef, it) }
165+
checkDirChanges(
166+
repo,
167+
previousReleaseRef,
168+
currentReleaseRef,
169+
"${getRelativeDir(library)}/CHANGELOG.md"
170+
)
171+
}
172+
.flatMap {
173+
it.extensions.findByType<FirebaseLibraryExtension>()?.projectsToRelease
174+
?: ImmutableList.of(it)
93175
}
94-
.flatMap { it.moduleNames }
176+
.toSet()
95177

96178
private fun checkDirChanges(
97179
repo: Git,
@@ -101,25 +183,49 @@ open class ReleaseGenerator : DefaultTask() {
101183
) =
102184
repo
103185
.log()
104-
.addPath("$directory/")
186+
.addPath(directory)
105187
.addRange(previousReleaseRef, currentReleaseRef)
106188
.setMaxCount(1)
107189
.call()
108190
.iterator()
109191
.hasNext()
110192

111-
private fun writeReleaseConfig(configPath: File, libraries: List<String>, releaseName: String) {
112-
File(configPath, "release.cfg")
113-
.writeText(
114-
"""
115-
[release]
116-
name = $releaseName
117-
mode = RELEASE
118-
119-
[modules]
120-
${libraries.joinToString("\n".padEnd(21, ' '))}
121-
"""
122-
.trimIndent()
123-
)
193+
private fun getDirChanges(
194+
repo: Git,
195+
previousReleaseRef: ObjectId,
196+
currentReleaseRef: ObjectId,
197+
directory: String
198+
) =
199+
repo.log().addPath(directory).addRange(previousReleaseRef, currentReleaseRef).call().map {
200+
CommitDiff(it)
201+
}
202+
203+
private fun writeReleaseReport(file: File, report: String) = file.writeText(report)
204+
205+
private fun writeReleaseConfig(file: File, config: ReleaseConfig) =
206+
file.writeText(config.toFile())
207+
208+
private fun getRelativeDir(project: Project) = project.path.substring(1).replace(':', '/')
209+
}
210+
211+
data class ReleaseConfig(val releaseName: String, val libs: Set<String>) {
212+
companion object {
213+
fun fromFile(file: File): ReleaseConfig {
214+
val contents = file.readLines()
215+
val libs = contents.filter { it.startsWith(":") }.toSet()
216+
val releaseName = contents.first { it.startsWith("name") }.substringAfter("=").trim()
217+
return ReleaseConfig(releaseName, libs)
218+
}
124219
}
220+
221+
fun toFile() =
222+
"""
223+
|[release]
224+
|name = $releaseName
225+
|mode = RELEASE
226+
227+
|[modules]
228+
|${libs.sorted().joinToString("\n")}
229+
"""
230+
.trimMargin()
125231
}

buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaPlugin.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,9 @@ abstract class DackkaPlugin : Plugin<Project> {
174174
val classpath =
175175
compileConfiguration.jars + project.javadocConfig.jars + project.files(bootClasspath)
176176

177-
val sourceDirectories = sourceSets.flatMap { it.javaDirectories }
177+
val sourceDirectories =
178+
sourceSets.flatMap { it.javaDirectories } +
179+
sourceSets.flatMap { it.kotlinDirectories }
178180

179181
val packageLists = fetchPackageLists(project)
180182
val excludedFiles = projectSpecificSuppressedFiles(project)

0 commit comments

Comments
 (0)