fune/mobile/android/autopublish-settings.gradle
Lina Butler 3a17ce396e Bug 1895781 - Move the App Services and Glean auto-publish logic to its own settings file. r=nalexander
This commit factors out the logic into its own settings file, adds
docs, and only imports the settings file into applications that
consume App Services and Glean via Maven (i.e., not GeckoView).

Differential Revision: https://phabricator.services.mozilla.com/D209897
2024-05-10 06:21:28 +00:00

114 lines
5.5 KiB
Groovy

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// This settings file configures an Android project for substituting a
// local Application Services and/or Glean.
//
// For convenience, this file reads the `autoPublish.*` properties from
// `$topsrcdir/local.properties`, so that you only need to set them once
// for all Android projects.
//
// You can also set or override these properties on a per-project basis,
// by setting them in `$topsrcdir/mobile/android/{project}/local.properties`,
// if you want to only substitute App Services or Glean for a specific project,
// or to substitute different versions for different projects.
//
// This settings file configures the build to automatically publish the
// contents of your Application Services and Glean checkouts to the
// Maven local repository. Any dependencies are then substituted to use
// the locally published versions.
def rootLocalProperties = new File(gradle.mozconfig.topsrcdir, "local.properties").with { localPropertiesFile ->
def localProperties = new Properties()
if (localPropertiesFile.canRead()) {
localPropertiesFile.withInputStream { localProperties.load(it) }
}
localProperties
}
[
"autoPublish.application-services.dir",
"autoPublish.glean.dir",
].each { key ->
def relativeOrAbsolutePath = rootLocalProperties."$key"
if (relativeOrAbsolutePath != null) {
def autoPublishDir = new File(gradle.mozconfig.topsrcdir).toPath().resolve(relativeOrAbsolutePath)
gradle.ext."localProperties.$key" = autoPublishDir.toString()
}
}
gradle.settingsEvaluated {
if (gradle.hasProperty("localProperties.autoPublish.application-services.dir")) {
// The project that we're configuring now might have overridden
// the path from `$topsrcdir/local.properties`, so we need to
// resolve it again.
def appServicesLocalPath = gradle."localProperties.autoPublish.application-services.dir".with { relativeOrAbsolutePath ->
def absolutePath = rootDir.toPath().resolve(relativeOrAbsolutePath).toString()
gradle."localProperties.autoPublish.application-services.dir" = absolutePath
absolutePath
}
logger.lifecycle("settings.gradle> Enabling automatic publication of application-services from: $appServicesLocalPath")
// Windows can't execute .py files directly, so we assume a "manually installed" python,
// which comes with a "py" launcher and respects the shebang line to specify the version.
def publishAppServicesCmd = [];
if (System.properties["os.name"].toLowerCase().contains("windows")) {
publishAppServicesCmd << "py";
}
publishAppServicesCmd << "./automation/publish_to_maven_local_if_modified.py";
runCmd(publishAppServicesCmd, appServicesLocalPath, "Published application-services for local development.", false)
} else {
logger.lifecycle("settings.gradle> Disabled auto-publication of application-services. Enable it by settings 'autoPublish.application-services.dir' in local.properties")
}
if (gradle.hasProperty("localProperties.autoPublish.glean.dir")) {
// As above, absolutize the path.
def gleanLocalPath = gradle."localProperties.autoPublish.glean.dir".with { relativeOrAbsolutePath ->
def absolutePath = rootDir.toPath().resolve(relativeOrAbsolutePath).toString()
gradle."localProperties.autoPublish.glean.dir" = absolutePath
absolutePath
}
logger.lifecycle("settings.gradle> Enabling automatic publication of Glean from: $gleanLocalPath")
// As above, hacks to execute .py files on Windows.
def publishGleanCmd = [];
if (System.properties["os.name"].toLowerCase().contains("windows")) {
publishGleanCmd << "py";
}
publishGleanCmd << "./build-scripts/publish_to_maven_local_if_modified.py";
runCmd(publishGleanCmd, gleanLocalPath, "Published Glean for local development.", false)
} else {
logger.lifecycle("settings.gradle> Disabled auto-publication of Glean. Enable it by settings 'autoPublish.glean.dir' in local.properties")
}
}
gradle.projectsLoaded { ->
gradle.rootProject.allprojects {
// Allow local appservices substitution in each project.
if (gradle.hasProperty("localProperties.autoPublish.application-services.dir")) {
def appServicesSrcDir = gradle."localProperties.autoPublish.application-services.dir"
apply from: "${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle"
}
// Allow local Glean substitution in each project.
if (gradle.hasProperty('localProperties.autoPublish.glean.dir')) {
def gleanSrcDir = gradle."localProperties.autoPublish.glean.dir"
apply from: "${gleanSrcDir}/build-scripts/substitute-local-glean.gradle"
}
}
}
def runCmd(cmd, workingDir, successMessage, captureStdout = true) {
def proc = cmd.execute(null, new File(workingDir))
def standardOutput = captureStdout ? new ByteArrayOutputStream() : System.out
proc.consumeProcessOutput(standardOutput, System.err)
proc.waitFor()
if (proc.exitValue() != 0) {
throw new GradleException("Process '${cmd}' finished with non-zero exit value ${proc.exitValue()}");
} else {
logger.lifecycle("settings.gradle> ${successMessage}")
}
return captureStdout ? standardOutput : null
}