summaryrefslogtreecommitdiffstats
path: root/mobile/android/autopublish-settings.gradle
blob: 8d233abb12f7c317846acbba3cb9d5dceb782bc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* 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
}