From 260d10e19ceef2aa717806cda9c812707cf00fa8 Mon Sep 17 00:00:00 2001 From: Ryan Kelly Date: Wed, 21 Oct 2020 13:46:04 +1100 Subject: [PATCH] Import nimbus-sdk as submodule, republish as part of the megazord. This commit pulls in https://github.com/mozilla/nimbus-sdk as a git submodule, and adds some build integration to publish it as part of the application-services megazord. Instead of an all-in-one nimbus package, we produce two separate packages: * `org.mozilla.appservices:nimbus` with the Nimbus Kotlin code * `org.mozilla.appservices:full-megazord` updated to include the Nimbus Rust code. --- .buildconfig-android.yml | 7 + .circleci/config.yml | 24 +- .gitmodules | 7 +- CHANGES_UNRELEASED.md | 28 ++ Cargo.lock | 298 ++++++++++++++++- Cargo.toml | 12 + DEPENDENCIES.md | 208 +++++++++++- build.gradle | 10 +- components/external/glean | 1 + components/external/nimbus-sdk | 1 + components/glean | 1 - components/nimbus/README.md | 53 +++ components/nimbus/build.gradle | 149 +++++++++ components/nimbus/proguard-rules.pro | 7 + .../nimbus/src/main/AndroidManifest.xml | 2 + docs/metrics/logins/metrics.md | 2 +- docs/metrics/places/metrics.md | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 56177 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 51 +-- gradlew.bat | 21 +- megazords/full/Cargo.toml | 3 +- megazords/full/DEPENDENCIES.md | 306 +++++++++++++++++- .../full/android/dependency-licenses.xml | 184 +++++++++++ megazords/full/src/lib.rs | 1 + megazords/ios/DEPENDENCIES.md | 5 +- .../project.pbxproj | 10 +- megazords/ios/README.md | 27 +- megazords/ios/rust/Cargo.toml | 2 +- taskcluster/scripts/toolchain/rustup-setup.sh | 6 + tools/dependency_summary.py | 76 +++++ 31 files changed, 1427 insertions(+), 79 deletions(-) create mode 160000 components/external/glean create mode 160000 components/external/nimbus-sdk delete mode 160000 components/glean create mode 100644 components/nimbus/README.md create mode 100644 components/nimbus/build.gradle create mode 100644 components/nimbus/proguard-rules.pro create mode 100644 components/nimbus/src/main/AndroidManifest.xml diff --git a/.buildconfig-android.yml b/.buildconfig-android.yml index ae8a7ae5e..64bb355ec 100644 --- a/.buildconfig-android.yml +++ b/.buildconfig-android.yml @@ -71,6 +71,13 @@ projects: - name: tabs type: aar description: Sync 1.5 remote tabs implementation. + nimbus: + path: components/nimbus + artifactId: nimbus + publications: + - name: nimbus + type: aar + description: The Nimbus SDK, compiled to work with the Application Services full-megazord. lockbox-megazord: uploadSymbols: true path: megazords/lockbox/android diff --git a/.circleci/config.yml b/.circleci/config.yml index 7f2e8f7b9..f452aa4a0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,6 +9,12 @@ parameters: default: 1.43.0 commands: + full-checkout: + steps: + - checkout + - run: + name: "Pull git submodules" + command: git submodule update --init setup-sccache: steps: - run: @@ -92,6 +98,9 @@ commands: rustup install <> rustup default <> rustc --version + - run: + name: Install UniFFI + command: cargo install --version 0.5.0 uniffi_bindgen build-libs: parameters: platform: @@ -155,7 +164,7 @@ commands: type: string default: << pipeline.parameters.stable-rust-version >> steps: - - checkout + - full-checkout - build-desktop-libs - setup-rust-toolchain: rust-version: <> @@ -205,7 +214,6 @@ commands: python3 ./tools/dependency_summary.py --all-android-targets --package megazord --format pom --check megazords/full/android/dependency-licenses.xml python3 ./tools/dependency_summary.py --all-android-targets --package lockbox --check megazords/lockbox/DEPENDENCIES.md python3 ./tools/dependency_summary.py --all-android-targets --package lockbox --format pom --check megazords/lockbox/android/dependency-licenses.xml - sync-bugzilla-to-github: steps: - checkout @@ -255,7 +263,7 @@ jobs: macos: xcode: "12.0.0" steps: - - checkout + - full-checkout - run: brew install swiftlint swiftformat - run: swiftlint --strict - run: swiftformat megazords components/*/ios --lint --swiftversion 4 --verbose @@ -264,7 +272,7 @@ jobs: - image: circleci/rust:latest resource_class: small steps: - - checkout + - full-checkout - setup-rust-toolchain - run: rustup component add rustfmt - run: rustfmt --version @@ -300,7 +308,7 @@ jobs: - image: circleci/rust:latest resource_class: small steps: - - checkout + - full-checkout - run: ./automation/check_protobuf_files_current.py Lint Bash scripts: docker: @@ -318,7 +326,7 @@ jobs: steps: - install-rust - setup-rust-toolchain - - checkout + - full-checkout - dependency-checks Mirror Bugzilla issues into GitHub: docker: @@ -369,7 +377,7 @@ jobs: - restore_cache: name: Restore sccache cache key: sccache-cache-macos-{{ arch }} - - checkout + - full-checkout - install-rust - setup-rust-toolchain - run: @@ -449,7 +457,7 @@ jobs: macos: xcode: "12.0.0" steps: - - checkout + - full-checkout - attach_workspace: at: . - run: diff --git a/.gitmodules b/.gitmodules index 61d03fef2..bb70263c8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ -[submodule "components/glean"] - path = components/glean +[submodule "components/external/glean"] + path = components/external/glean url = https://github.com/mozilla/glean +[submodule "components/external/nimbus-sdk"] + path = components/external/nimbus-sdk + url = https://github.com/mozilla/nimbus-sdk diff --git a/CHANGES_UNRELEASED.md b/CHANGES_UNRELEASED.md index 03d4ec090..a382fa743 100644 --- a/CHANGES_UNRELEASED.md +++ b/CHANGES_UNRELEASED.md @@ -4,6 +4,34 @@ [Full Changelog](https://github.com/mozilla/application-services/compare/v66.0.0...main) +## iOS + +## What's Changed + +- The bundled version of Glean has been updated to v33.1.2. + (as part of [#3701](https://github.com/mozilla/application-services/pull/3701)) + +## Android + +## What's Changed + +- This release comes with a nontrivial increase in the compiled code size of the + `org.mozilla.appservices:full-megazord` package, adding approximately 1M per platform + thanks to the addition of the Nimbus SDK component. + ([#3701](https://github.com/mozilla/application-services/pull/3701)) +- Several core gradle dependencies have been updated, including gradle itself (now v6.5) + and the android gradle plugin (now v4.0.1). + ([#3701](https://github.com/mozilla/application-services/pull/3701)) + +## Nimbus SDK + +### What's New + +- The first version of the Nimbus Experimentation SDK is now available, via the + `org.mozilla.appservices:nimbus` package. More details can be found in the + [nimbus-sdk repo](https://github.com/mozilla/nimbus-sdk). + ([#3701](https://github.com/mozilla/application-services/pull/3701)) + ## FxA Client ### What's Fixed diff --git a/Cargo.lock b/Cargo.lock index 909af2517..bb7a850c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,6 +84,50 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "askama" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e7ebd44d0047fd48206c83c5cd3214acc7b9d87f001da170145c47ef7d12" +dependencies = [ + "askama_derive", + "askama_escape", + "askama_shared", +] + +[[package]] +name = "askama_derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d7169690c4f56343dcd821ab834972a22570a2662a19a84fd7775d5e1c3881" +dependencies = [ + "askama_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "askama_escape" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90c108c1a94380c89d2215d0ac54ce09796823cca0fd91b299cfff3b33e346fb" + +[[package]] +name = "askama_shared" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62fc272363345c8cdc030e4c259d9d028237f8b057dc9bb327772a257bde6bb5" +dependencies = [ + "askama_escape", + "nom", + "proc-macro2", + "quote", + "serde", + "syn", + "toml", +] + [[package]] name = "assert-json-diff" version = "1.1.0" @@ -205,6 +249,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "bstr" version = "0.2.14" @@ -235,6 +288,17 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" +[[package]] +name = "cargo_metadata" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3a567c24b86754d629addc2db89e340ac9398d07b5875efcff837e3878e17ec" +dependencies = [ + "semver 0.10.0", + "serde", + "serde_json", +] + [[package]] name = "caseless" version = "0.2.1" @@ -421,6 +485,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + [[package]] name = "crc32fast" version = "1.2.1" @@ -605,6 +675,15 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "dirs" version = "1.0.5" @@ -838,7 +917,7 @@ dependencies = [ "num-traits", "rand 0.6.5", "rustc_version", - "semver", + "semver 0.9.0", "serde", ] @@ -1071,6 +1150,16 @@ dependencies = [ "viaduct", ] +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.1.15" @@ -1101,9 +1190,7 @@ checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" [[package]] name = "glean-core" -version = "32.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9add31f49d7b8085c58d2f3ea926ea999f166bd2901bf7a317480ecadba6c99b" +version = "33.1.2" dependencies = [ "bincode", "chrono", @@ -1119,9 +1206,7 @@ dependencies = [ [[package]] name = "glean-ffi" -version = "32.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5288a0df737d9648c92ed449f6b97593ba4d58aaf979eaa4a137b5a1c14e2168" +version = "33.1.2" dependencies = [ "android_logger", "env_logger", @@ -1296,6 +1381,12 @@ dependencies = [ "tokio-tls", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "idna" version = "0.2.0" @@ -1360,6 +1451,29 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" +[[package]] +name = "jexl-eval" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c208de9bf204836fe5894bb756cd850075ba3acf3f327d04b656fb84046e1a4" +dependencies = [ + "anyhow", + "jexl-parser", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "jexl-parser" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95e7c453f4c7dde64c914aa5ddd1183fc61dd446112d2b80a7f62390b9f0487c" +dependencies = [ + "lalrpop-util", + "regex", +] + [[package]] name = "js-sys" version = "0.3.45" @@ -1391,6 +1505,15 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "lalrpop-util" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6771161eff561647fad8bb7e745e002c304864fb8f436b52b30acda51fca4408" +dependencies = [ + "regex", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1530,6 +1653,7 @@ dependencies = [ "fxaclient_ffi", "lazy_static", "logins_ffi", + "nimbus-sdk", "places-ffi", "push-ffi", "rc_log_ffi", @@ -1718,6 +1842,28 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "nimbus-sdk" +version = "0.4.0" +dependencies = [ + "anyhow", + "hex", + "jexl-eval", + "log 0.4.11", + "once_cell", + "rkv", + "serde", + "serde_derive", + "serde_json", + "sha2", + "thiserror", + "uniffi", + "uniffi_build", + "url", + "uuid", + "viaduct", +] + [[package]] name = "nix" version = "0.18.0" @@ -1730,6 +1876,16 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "nss" version = "0.1.0" @@ -1836,6 +1992,12 @@ version = "11.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "openssl" version = "0.10.30" @@ -1908,6 +2070,31 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "paste" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" +dependencies = [ + "paste-impl", + "proc-macro-hack", +] + +[[package]] +name = "paste" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba7ae1a2180ed02ddfdb5ab70c70d596a26dd642e097bb6fe78b1bde8588ed97" + +[[package]] +name = "paste-impl" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" +dependencies = [ + "proc-macro-hack", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -2601,18 +2788,21 @@ dependencies = [ [[package]] name = "rkv" -version = "0.10.4" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a3dbc1f4971372545ed4175f23ef206c81e5874cd574d153646e7ee78f6793" +checksum = "e97d1b6321740ce36d77d67d22ff84ac8a996cf69dbd0727b8bcae52f1c98aaa" dependencies = [ "arrayref", "bincode", "bitflags 1.2.1", "byteorder", "failure", + "id-arena", "lazy_static", "lmdb-rkv", + "log 0.4.11", "ordered-float", + "paste 0.1.18", "serde", "serde_derive", "url", @@ -2659,7 +2849,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver", + "semver 0.9.0", ] [[package]] @@ -2725,6 +2915,16 @@ dependencies = [ "semver-parser", ] +[[package]] +name = "semver" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "394cec28fa623e00903caf7ba4fa6fb9a0e260280bb8cdbbba029611108a0190" +dependencies = [ + "semver-parser", + "serde", +] + [[package]] name = "semver-parser" version = "0.7.0" @@ -2793,6 +2993,19 @@ dependencies = [ "url", ] +[[package]] +name = "sha2" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpuid-bool", + "digest", + "opaque-debug", +] + [[package]] name = "slab" version = "0.4.2" @@ -3182,18 +3395,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "318234ffa22e0920fe9a40d7b8369b5f649d490980cf7aadcf1eb91594869b42" +checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cae2447b6282786c3493999f40a9be2a6ad20cb8bd268b0a0dbf5a065535c0ab" +checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56" dependencies = [ "proc-macro2", "quote", @@ -3330,6 +3543,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + [[package]] name = "types" version = "0.1.0" @@ -3391,6 +3610,47 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +[[package]] +name = "uniffi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bec682ed64f9e7d63038df2c1482d078bde432acf10418573a1fd7414cf7e40" +dependencies = [ + "anyhow", + "bytes", + "cargo_metadata", + "ffi-support 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "log 0.4.11", + "paste 1.0.2", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d666448591e47695c05de35d1a8f3314971143b08d0ea8e95cc0983ea33da29b" +dependencies = [ + "anyhow", + "askama", + "cargo_metadata", + "clap", + "heck", + "serde", + "toml", + "weedle", +] + +[[package]] +name = "uniffi_build" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42c9c966bd14ab3871f6308acb83818232b08679767555404293119335680f5f" +dependencies = [ + "anyhow", + "uniffi_bindgen", +] + [[package]] name = "url" version = "2.1.1" @@ -3410,6 +3670,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" dependencies = [ "rand 0.7.3", + "serde", ] [[package]] @@ -3614,6 +3875,15 @@ dependencies = [ "webext-storage", ] +[[package]] +name = "weedle" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7d4f9feb723a800d8f7b74edc9fa44ff35cb0b2ec64886714362f423427f37" +dependencies = [ + "nom", +] + [[package]] name = "which" version = "3.1.1" diff --git a/Cargo.toml b/Cargo.toml index 8b49f9157..6fc8b56f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,13 @@ members = [ "testing/separated/*/", ] +# Don't include git submodules in our workspace, since those packages haven't +# been written with that in mind. They might work, but they might not. +exclude = [ + "components/external/glean/", + "components/external/nimbus-sdk/", +] + # The `default-members` are the things that are built/tested when you run `cargo # build`, `cargo test` (or most of the cargo commands not provided by a # third-party `cargo-foo` binary) from a workspace root *without* doing one of: @@ -110,3 +117,8 @@ default-members = [ opt-level = "s" debug = true lto = "thin" + +# We import some git submodules which in turn may depend on appservices crates. +# We always want to use the local version of our own crates in that case. +[patch."https://github.com/mozilla/application-services"] +viaduct = { path = "components/viaduct" } diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index f13ec3831..3c077907c 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -11,8 +11,11 @@ the details of which are reproduced below. * [MIT License: atty](#mit-license-atty) * [MIT License: bincode](#mit-license-bincode) * [MIT License: bytes](#mit-license-bytes) +* [MIT License: cargo_metadata](#mit-license-cargo_metadata) * [MIT License: caseless](#mit-license-caseless) +* [MIT License: clap](#mit-license-clap) * [MIT License: dashmap](#mit-license-dashmap) +* [MIT License: generic-array](#mit-license-generic-array) * [MIT License: h2](#mit-license-h2) * [MIT License: http-body](#mit-license-http-body) * [MIT License: hyper](#mit-license-hyper) @@ -22,16 +25,19 @@ the details of which are reproduced below. * [MIT License: mime_guess](#mit-license-mime_guess) * [MIT License: miniz_oxide](#mit-license-miniz_oxide) * [MIT License: mio](#mit-license-mio) +* [MIT License: nom](#mit-license-nom) * [MIT License: openssl-sys](#mit-license-openssl-sys) * [MIT License: ordered-float](#mit-license-ordered-float) * [MIT License: oslog](#mit-license-oslog) * [MIT License: schannel](#mit-license-schannel) * [MIT License: slab](#mit-license-slab) * [MIT License: synstructure](#mit-license-synstructure) +* [MIT License: textwrap](#mit-license-textwrap) * [MIT License: tokio, tokio-tls, tokio-util, tracing, tracing-core, tracing-futures](#mit-license-tokio-tokio-tls-tokio-util-tracing-tracing-core-tracing-futures) * [MIT License: tower-service](#mit-license-tower-service) * [MIT License: try-lock](#mit-license-try-lock) * [MIT License: want](#mit-license-want) +* [MIT License: weedle](#mit-license-weedle) * [MIT License: winapi](#mit-license-winapi) * [MIT License: winapi-util](#mit-license-winapi-util) * [MIT License: winreg](#mit-license-winreg) @@ -49,9 +55,12 @@ The following text applies to code linked from these dependencies: [NSPR](https://hg.mozilla.org/projects/nspr), [NSS](https://hg.mozilla.org/projects/nss), [ece](https://github.com/mozilla/rust-ece), -[glean-core](https://github.com/mozilla/glean), -[glean-ffi](https://github.com/mozilla/glean), -[hawk](https://github.com/taskcluster/rust-hawk) +[hawk](https://github.com/taskcluster/rust-hawk), +[jexl-eval](https://github.com/mozilla/jexl-rs), +[jexl-parser](https://github.com/mozilla/jexl-rs), +[uniffi](https://github.com/mozilla/uniffi-rs), +[uniffi_bindgen](https://github.com/mozilla/uniffi-rs), +[uniffi_build](https://github.com/mozilla/uniffi-rs) ``` Mozilla Public License Version 2.0 @@ -438,9 +447,14 @@ The following text applies to code linked from these dependencies: [android_log-sys](https://github.com/nercury/android_log-sys-rs), [android_logger](https://github.com/Nercury/android_logger-rs), [anyhow](https://github.com/dtolnay/anyhow), +[askama](https://github.com/djc/askama), +[askama_derive](https://github.com/djc/askama), +[askama_escape](https://github.com/djc/askama), +[askama_shared](https://github.com/djc/askama), [autocfg](https://github.com/cuviper/autocfg), [base64](https://github.com/marshallpierce/rust-base64), [bitflags](https://github.com/bitflags/bitflags), +[block-buffer](https://github.com/RustCrypto/utils), [cc](https://github.com/alexcrichton/cc-rs), [cfg-if](https://github.com/alexcrichton/cfg-if), [chrono](https://github.com/chronotope/chrono), @@ -448,7 +462,9 @@ The following text applies to code linked from these dependencies: [const-random](https://github.com/tkaitchuck/constrandom), [core-foundation-sys](https://github.com/servo/core-foundation-rs), [core-foundation](https://github.com/servo/core-foundation-rs), +[cpuid-bool](https://github.com/RustCrypto/utils), [crc32fast](https://github.com/srijs/rust-crc32fast), +[digest](https://github.com/RustCrypto/traits), [dogear](https://github.com/mozilla/dogear), [dtoa](https://github.com/dtolnay/dtoa), [either](https://github.com/bluss/either), @@ -472,12 +488,14 @@ The following text applies to code linked from these dependencies: [getrandom](https://github.com/rust-random/getrandom), [hashbrown](https://github.com/rust-lang/hashbrown), [hashlink](https://github.com/kyren/hashlink), +[heck](https://github.com/withoutboats/heck), [hex](https://github.com/KokaKiwi/rust-hex), [http](https://github.com/hyperium/http), [httparse](https://github.com/seanmonstar/httparse), [httpdate](https://github.com/pyfisch/httpdate), [humantime](https://github.com/tailhook/humantime), [hyper-tls](https://github.com/hyperium/hyper-tls), +[id-arena](https://github.com/fitzgen/id-arena), [idna](https://github.com/servo/rust-url/), [indexmap](https://github.com/bluss/indexmap), [iovec](https://github.com/carllerche/iovec), @@ -485,6 +503,7 @@ The following text applies to code linked from these dependencies: [itertools](https://github.com/bluss/rust-itertools), [itoa](https://github.com/dtolnay/itoa), [jna](https://github.com/java-native-access/jna), +[lalrpop-util](https://github.com/lalrpop/lalrpop), [lazy_static](https://github.com/rust-lang-nursery/lazy-static.rs), [libc](https://github.com/rust-lang/libc), [lmdb-rkv-sys](https://github.com/mozilla/lmdb-rs.git), @@ -498,9 +517,12 @@ The following text applies to code linked from these dependencies: [num-traits](https://github.com/rust-num/num-traits), [num_cpus](https://github.com/seanmonstar/num_cpus), [once_cell](https://github.com/matklad/once_cell), +[opaque-debug](https://github.com/RustCrypto/utils), [openssl-probe](https://github.com/alexcrichton/openssl-probe), [openssl-src](https://github.com/alexcrichton/openssl-src-rs), [openssl](https://github.com/sfackler/rust-openssl), +[paste-impl](https://github.com/dtolnay/paste), +[paste](https://github.com/dtolnay/paste), [percent-encoding](https://github.com/servo/rust-url/), [pin-project-internal](https://github.com/taiki-e/pin-project), [pin-project-lite](https://github.com/taiki-e/pin-project-lite), @@ -525,10 +547,13 @@ The following text applies to code linked from these dependencies: [ryu](https://github.com/dtolnay/ryu), [security-framework-sys](https://github.com/kornelski/rust-security-framework), [security-framework](https://github.com/kornelski/rust-security-framework), +[semver-parser](https://github.com/steveklabnik/semver-parser), +[semver](https://github.com/steveklabnik/semver), [serde](https://github.com/serde-rs/serde), [serde_derive](https://github.com/serde-rs/serde), [serde_json](https://github.com/serde-rs/json), [serde_urlencoded](https://github.com/nox/serde_urlencoded), +[sha2](https://github.com/RustCrypto/hashes), [smallbitvec](https://github.com/servo/smallbitvec), [smallvec](https://github.com/servo/rust-smallvec), [socket2](https://github.com/alexcrichton/socket2-rs), @@ -540,9 +565,13 @@ The following text applies to code linked from these dependencies: [thread_local](https://github.com/Amanieu/thread_local-rs), [time](https://github.com/time-rs/time), [tinyvec](https://github.com/Lokathor/tinyvec), +[toml](https://github.com/alexcrichton/toml-rs), +[typenum](https://github.com/paholg/typenum), [unicase](https://github.com/seanmonstar/unicase), [unicode-bidi](https://github.com/servo/unicode-bidi), [unicode-normalization](https://github.com/unicode-rs/unicode-normalization), +[unicode-segmentation](https://github.com/unicode-rs/unicode-segmentation), +[unicode-width](https://github.com/unicode-rs/unicode-width), [unicode-xid](https://github.com/unicode-rs/unicode-xid), [url](https://github.com/servo/rust-url), [uuid](https://github.com/uuid-rs/uuid), @@ -910,6 +939,38 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: cargo_metadata + +The following text applies to code linked from these dependencies: +[cargo_metadata](https://github.com/oli-obk/cargo_metadata) + +``` +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + ``` ------------- ## MIT License: caseless @@ -941,6 +1002,36 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: clap + +The following text applies to code linked from these dependencies: +[clap](https://github.com/clap-rs/clap) + +``` +The MIT License (MIT) + +Copyright (c) 2015-2016 Kevin B. Knapp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ``` ------------- ## MIT License: dashmap @@ -971,6 +1062,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: generic-array + +The following text applies to code linked from these dependencies: +[generic-array](https://github.com/fizyk20/generic-array.git) + +``` +The MIT License (MIT) + +Copyright (c) 2015 Bartłomiej Kamiński + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ------------- ## MIT License: h2 @@ -1250,6 +1370,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: nom + +The following text applies to code linked from these dependencies: +[nom](https://github.com/Geal/nom) + +``` +Copyright (c) 2014-2019 Geoffroy Couprie + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ``` ------------- ## MIT License: openssl-sys @@ -1414,6 +1563,36 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: textwrap + +The following text applies to code linked from these dependencies: +[textwrap](https://github.com/mgeisler/textwrap) + +``` +MIT License + +Copyright (c) 2016 Martin Geisler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ``` ------------- ## MIT License: tokio, tokio-tls, tokio-util, tracing, tracing-core, tracing-futures @@ -1546,6 +1725,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: weedle + +The following text applies to code linked from these dependencies: +[weedle](https://github.com/rustwasm/weedle) + +``` +Copyright 2018-Present Sharad Chand + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. ``` ------------- ## MIT License: winapi diff --git a/build.gradle b/build.gradle index 6fa5f470c..27554c4dc 100644 --- a/build.gradle +++ b/build.gradle @@ -3,8 +3,8 @@ buildscript { ext.kotlin_version = '1.3.71' ext.jna_version = '5.6.0' - ext.android_gradle_plugin_version = '3.6.0' - ext.android_components_version = '56.0.0' + ext.android_gradle_plugin_version = '4.0.1' + ext.android_components_version = '63.0.0' ext.build = [ ndkVersion: "21.3.6528147", // Keep it in sync in TC Dockerfile. @@ -252,7 +252,11 @@ ext.cargoExecWithSQLCipher = { spec, toolchain -> detekt { toolVersion = "1.7.4" - input = files("${projectDir}/components", "${projectDir}/gradle-plugin", "buildSrc") + input = files( + fileTree(dir: "${projectDir}/components", excludes: ["external"]), + "${projectDir}/gradle-plugin", + "buildSrc" + ) buildUponDefaultConfig = true config = files("${projectDir}/.detekt.yml") failFast = false diff --git a/components/external/glean b/components/external/glean new file mode 160000 index 000000000..379286eeb --- /dev/null +++ b/components/external/glean @@ -0,0 +1 @@ +Subproject commit 379286eeb577adc99f889e9918aec7c6bd4872ab diff --git a/components/external/nimbus-sdk b/components/external/nimbus-sdk new file mode 160000 index 000000000..de1aea075 --- /dev/null +++ b/components/external/nimbus-sdk @@ -0,0 +1 @@ +Subproject commit de1aea07533eae596b1dabd23be0b9dabb4ea2dc diff --git a/components/glean b/components/glean deleted file mode 160000 index 9c55b4ccd..000000000 --- a/components/glean +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9c55b4ccd355ecebb01e04421f5aa73b04512de2 diff --git a/components/nimbus/README.md b/components/nimbus/README.md new file mode 100644 index 000000000..cc010fbf7 --- /dev/null +++ b/components/nimbus/README.md @@ -0,0 +1,53 @@ +# The Nimbus SDK, megazorded with Application Services + +This is a re-packaging of the [Nimbus SDK](https://github.com/mozilla/nimbus-sdk/) for Android, +compiled in a way that works nicely with the application-services [megazord](../../docs/design/megazords.md). + +The Nimbus SDK builds its own standalone `org.mozilla.experiments:nimbus` package, which includes both +the Nimbus Kotlin bindings and the compiled Rust code. However, that package currently isn't published +anywhere, and it's difficult for other Rust components to integrate with Rust code compiled into a +standalone shared library. + +Instead, we recommend consumers depend on the `org.mozilla.appservices:nimbus` package, which +provides the same Nimbus Kotlin bindings, but configured to load the underlying Rust code from +the application-serivces `:full-megazord` package. This lets us compile the Rust code for Nimbus +together with the Rust code for Glean and for application-services, and have them interoperate +directly at the Rust level. + +Consumers will also need to add the following snippet to ensure that Nimbus can find the +correct shared library: + +``` + System.setProperty( + "uniffi.component.nimbus.libraryOverride", + System.getProperty("mozilla.appservices.megazord.library", "megazord") + ) +``` + +(The Nimbus SDK wrapped in android-components handles this for you automatically. + + +To update Nimbus: + +1. Select the release version to which to update, `$version`. +2. Update the submodule to that version (replace `$version` below with the correct version, e.g. `0.3.0`): + + ``` + cd components/external/nimbus-sdk + git fetch origin + git checkout v$version + ``` +3. Update `Cargo.lock` to reflect any upstream changes: + ``` + cargo update + ``` +4. Commit the changes: + + ``` + git add components/external/nimbus-sdk + git add Cargo.lock + git commit + ``` +5. Run `./gradlew nimbus:test` to ensure that things still work correctly. + If this returns an error, you may need to update `./build.gradle` to track + any build changes made in the upstream Nimbus repository. diff --git a/components/nimbus/build.gradle b/components/nimbus/build.gradle new file mode 100644 index 000000000..0c6e44153 --- /dev/null +++ b/components/nimbus/build.gradle @@ -0,0 +1,149 @@ +// ============================================= +// We're doing something a bit weird here, so +// READ THIS CAREFULLY before editing this file. +// ============================================= +// +// This is a lightly-modified version of the `build.gradle` file from Nimbus, +// which you can find at `../external/nimbus-sdk/android/build.gradle`. +// +// The aim here is to pre-package the Nimbus Kotlin code and publish it under +// `org.mozilla.appservices:nimbus` rather than `org.mozilla.experiments:nimbus`, +// and to make it depend on `org.mozilla.appservices:full-megazord` for the +// compiled Rust code. +// +// We expect consumers that want to use Nimbus and AppServices together, will +// use our re-packaged version rather than standalone Nimbus SDK. + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + + +android { + ndkVersion rootProject.ext.build.ndkVersion + compileSdkVersion rootProject.ext.build.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.ext.build['minSdkVersion'] + targetSdkVersion rootProject.ext.build['targetSdkVersion'] + + buildConfigField("String", "LIBRARY_VERSION", "\"${rootProject.ext.library.version}\"") + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + consumerProguardFiles "$rootDir/proguard-rules-consumer-jna.pro" + } + } + + // We don't have any source files of our own, we're re-packaging the ones + // from the Nimbus repo (which is included as a submodule in our repo). + sourceSets { + main.java.srcDirs += "../external/nimbus-sdk/android/src/main/java" + test.java.srcDirs += "../external/nimbus-sdk/android/src/test" + test.resources.srcDirs += "$buildDir/rustJniLibs/desktop" + test.resources.srcDirs += "${project(':full-megazord').buildDir}/rustJniLibs/desktop" + } + + // This is required to support new AndroidX support libraries. + // See mozilla-mobile/android-components#842 + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 1.8 + } + } + + testOptions { + unitTests.all { + testLogging { + showStandardStreams = true + } + + maxHeapSize = "1024m" + } + + unitTests { + includeAndroidResources = true + } + } +} + +configurations { + // There's an interaction between Gradle's resolution of dependencies with different types + // (@jar, @aar) for `implementation` and `testImplementation` and with Android Studio's built-in + // JUnit test runner. The runtime classpath in the built-in JUnit test runner gets the + // dependency from the `implementation`, which is type @aar, and therefore the JNA dependency + // doesn't provide the JNI dispatch libraries in the correct Java resource directories. I think + // what's happening is that @aar type in `implementation` resolves to the @jar type in + // `testImplementation`, and that it wins the dependency resolution battle. + // + // A workaround is to add a new configuration which depends on the @jar type and to reference + // the underlying JAR file directly in `testImplementation`. This JAR file doesn't resolve to + // the @aar type in `implementation`. This works when invoked via `gradle`, but also sets the + // correct runtime classpath when invoked with Android Studio's built-in JUnit test runner. + // Success! + jnaForTest +} + +dependencies { + jnaForTest "net.java.dev.jna:jna:$jna_version@jar" + implementation "net.java.dev.jna:jna:$jna_version@aar" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + + // Unlike standard Nimbus which builds a standalone package, this version depends + // on `:full-megazord` for the underlying native library. The full-megazord needs + // to be configured to include the corresponding Nimbus FFI functions. + implementation project(":native-support") + api project(":full-megazord") + + // For reasons unknown, resolving the jnaForTest configuration directly + // trips a nasty issue with the Android-Gradle plugin 3.2.1, like `Cannot + // change attributes of configuration ':PROJECT:kapt' after it has been + // resolved`. I think that the configuration is being made a + // super-configuration of the testImplementation and then the `.files` is + // causing it to be resolved. Cloning first dissociates the configuration, + // avoiding other configurations from being resolved. Tricky! + testImplementation files(configurations.jnaForTest.copyRecursive().files) + testImplementation 'junit:junit:4.12' +} + + +// We also do the binding generation here: +android.libraryVariants.all { variant -> + def t = tasks.register("generate${variant.name.capitalize()}UniffiBindings", Exec) { + workingDir "${project.projectDir}" + // Runs the bindings generation, note that you must have uniffi-bindgen installed and in your PATH environment variable + commandLine 'uniffi-bindgen', 'generate', '../external/nimbus-sdk/nimbus/src/nimbus.idl', '--language', 'kotlin', '--out-dir', "${buildDir}/generated/source/uniffi/${variant.name}/java" + } + variant.javaCompileProvider.get().dependsOn(t) + def sourceSet = variant.sourceSets.find { it.name == variant.name } + sourceSet.java.srcDir new File(buildDir, "generated/source/uniffi/${variant.name}/java") +} + +evaluationDependsOn(":full-megazord") +afterEvaluate { + // The `cargoBuild` task isn't available until after evaluation. + android.libraryVariants.all { variant -> + def productFlavor = "" + variant.productFlavors.each { + productFlavor += "${it.name.capitalize()}" + } + def buildType = "${variant.buildType.name.capitalize()}" + tasks["merge${productFlavor}${buildType}JniLibFolders"].dependsOn(project(':full-megazord').tasks["cargoBuild"]) + + // For unit tests. + tasks["process${productFlavor}${buildType}UnitTestJavaRes"].dependsOn(project(':full-megazord').tasks["cargoBuild"]) + } +} + +apply from: "$rootDir/publish.gradle" +ext.configurePublish() diff --git a/components/nimbus/proguard-rules.pro b/components/nimbus/proguard-rules.pro new file mode 100644 index 000000000..4ec9ba4bc --- /dev/null +++ b/components/nimbus/proguard-rules.pro @@ -0,0 +1,7 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + diff --git a/components/nimbus/src/main/AndroidManifest.xml b/components/nimbus/src/main/AndroidManifest.xml new file mode 100644 index 000000000..8c68e0e02 --- /dev/null +++ b/components/nimbus/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/docs/metrics/logins/metrics.md b/docs/metrics/logins/metrics.md index 456d932c0..0975b44e5 100644 --- a/docs/metrics/logins/metrics.md +++ b/docs/metrics/logins/metrics.md @@ -1,7 +1,7 @@ # Metrics -This document enumerates the metrics collected by this project. +This document enumerates the metrics collected by this project using the [Glean SDK](https://mozilla.github.io/glean/book/index.html). This project may depend on other projects which also collect metrics. This means you might have to go searching through the dependency tree to get a full picture of everything collected by this project. diff --git a/docs/metrics/places/metrics.md b/docs/metrics/places/metrics.md index d584f0a69..d38dbe0e6 100644 --- a/docs/metrics/places/metrics.md +++ b/docs/metrics/places/metrics.md @@ -1,7 +1,7 @@ # Metrics -This document enumerates the metrics collected by this project. +This document enumerates the metrics collected by this project using the [Glean SDK](https://mozilla.github.io/glean/book/index.html). This project may depend on other projects which also collect metrics. This means you might have to go searching through the dependency tree to get a full picture of everything collected by this project. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 29953ea141f55e3b8fc691d31b5ca8816d89fa87..490fda8577df6c95960ba7077c43220e5bb2c0d9 100644 GIT binary patch delta 50408 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%0DTKA@4oS@=qIqak|pj|Y4(v5h=+v(MZ%e%KS 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 delta 48120 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 CbwV5f diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b442974..622ab64a3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d51..2fe81a7d9 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -109,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` @@ -138,19 +154,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +175,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a..9109989e3 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/megazords/full/Cargo.toml b/megazords/full/Cargo.toml index 74781f65f..080f67b1c 100644 --- a/megazords/full/Cargo.toml +++ b/megazords/full/Cargo.toml @@ -14,6 +14,7 @@ logins_ffi = { path = "../../components/logins/ffi" } places-ffi = { path = "../../components/places/ffi" } push-ffi = { path = "../../components/push/ffi" } rc_log_ffi = { path = "../../components/rc_log" } -viaduct = { path = "../../components/viaduct", default_features = false } +viaduct = { path = "../../components/viaduct" } sync_manager_ffi = { path = "../../components/sync_manager/ffi" } +nimbus-sdk = { path = "../../components/external/nimbus-sdk/nimbus" } lazy_static = "1.4" diff --git a/megazords/full/DEPENDENCIES.md b/megazords/full/DEPENDENCIES.md index f1a75b8ea..adbc13bef 100644 --- a/megazords/full/DEPENDENCIES.md +++ b/megazords/full/DEPENDENCIES.md @@ -9,11 +9,20 @@ the details of which are reproduced below. * [MIT License: aho-corasick, byteorder, memchr](#mit-license-aho-corasick-byteorder-memchr) * [MIT License: bincode](#mit-license-bincode) * [MIT License: bytes](#mit-license-bytes) +* [MIT License: cargo_metadata](#mit-license-cargo_metadata) * [MIT License: caseless](#mit-license-caseless) +* [MIT License: clap](#mit-license-clap) +* [MIT License: generic-array](#mit-license-generic-array) * [MIT License: libsqlite3-sys, rusqlite](#mit-license-libsqlite3-sys-rusqlite) * [MIT License: matches](#mit-license-matches) +* [MIT License: nom](#mit-license-nom) +* [MIT License: ordered-float](#mit-license-ordered-float) +* [MIT License: synstructure](#mit-license-synstructure) +* [MIT License: textwrap](#mit-license-textwrap) +* [MIT License: weedle](#mit-license-weedle) * [CC0-1.0 License: base16](#cc0-10-license-base16) * [ISC License: ring](#isc-license-ring) +* [BSD-2-Clause License: arrayref](#bsd-2-clause-license-arrayref) * [BSD-3-Clause License: protobuf](#bsd-3-clause-license-protobuf) * [BSD-3-Clause License: sqlcipher](#bsd-3-clause-license-sqlcipher) * [Optional Notice: SQLite](#optional-notice-sqlite) @@ -24,7 +33,12 @@ The following text applies to code linked from these dependencies: [NSPR](https://hg.mozilla.org/projects/nspr), [NSS](https://hg.mozilla.org/projects/nss), [ece](https://github.com/mozilla/rust-ece), -[hawk](https://github.com/taskcluster/rust-hawk) +[hawk](https://github.com/taskcluster/rust-hawk), +[jexl-eval](https://github.com/mozilla/jexl-rs), +[jexl-parser](https://github.com/mozilla/jexl-rs), +[uniffi](https://github.com/mozilla/uniffi-rs), +[uniffi_bindgen](https://github.com/mozilla/uniffi-rs), +[uniffi_build](https://github.com/mozilla/uniffi-rs) ``` Mozilla Public License Version 2.0 @@ -408,30 +422,50 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice The following text applies to code linked from these dependencies: [ahash](https://github.com/tkaitchuck/ahash), [anyhow](https://github.com/dtolnay/anyhow), +[askama](https://github.com/djc/askama), +[askama_derive](https://github.com/djc/askama), +[askama_escape](https://github.com/djc/askama), +[askama_shared](https://github.com/djc/askama), +[autocfg](https://github.com/cuviper/autocfg), [base64](https://github.com/marshallpierce/rust-base64), [bitflags](https://github.com/bitflags/bitflags), +[block-buffer](https://github.com/RustCrypto/utils), [cc](https://github.com/alexcrichton/cc-rs), [cfg-if](https://github.com/alexcrichton/cfg-if), +[cpuid-bool](https://github.com/RustCrypto/utils), +[digest](https://github.com/RustCrypto/traits), [dogear](https://github.com/mozilla/dogear), [either](https://github.com/bluss/either), +[failure](https://github.com/rust-lang-nursery/failure), +[failure_derive](https://github.com/rust-lang-nursery/failure), [fallible-iterator](https://github.com/sfackler/rust-fallible-iterator), [fallible-streaming-iterator](https://github.com/sfackler/fallible-streaming-iterator), [ffi-support](https://github.com/mozilla/application-services), [getrandom](https://github.com/rust-random/getrandom), [hashbrown](https://github.com/rust-lang/hashbrown), [hashlink](https://github.com/kyren/hashlink), +[heck](https://github.com/withoutboats/heck), [hex](https://github.com/KokaKiwi/rust-hex), +[id-arena](https://github.com/fitzgen/id-arena), [idna](https://github.com/servo/rust-url/), [itertools](https://github.com/bluss/rust-itertools), [itoa](https://github.com/dtolnay/itoa), [jna](https://github.com/java-native-access/jna), +[lalrpop-util](https://github.com/lalrpop/lalrpop), [lazy_static](https://github.com/rust-lang-nursery/lazy-static.rs), [libc](https://github.com/rust-lang/libc), +[lmdb-rkv-sys](https://github.com/mozilla/lmdb-rs.git), +[lmdb-rkv](https://github.com/mozilla/lmdb-rs.git), [log](https://github.com/rust-lang/log), +[num-traits](https://github.com/rust-num/num-traits), [once_cell](https://github.com/matklad/once_cell), +[opaque-debug](https://github.com/RustCrypto/utils), +[paste-impl](https://github.com/dtolnay/paste), +[paste](https://github.com/dtolnay/paste), [percent-encoding](https://github.com/servo/rust-url/), [pkg-config](https://github.com/rust-lang/pkg-config-rs), [ppv-lite86](https://github.com/cryptocorrosion/cryptocorrosion), +[proc-macro-hack](https://github.com/dtolnay/proc-macro-hack), [proc-macro2](https://github.com/alexcrichton/proc-macro2), [prost-derive](https://github.com/danburkert/prost), [prost](https://github.com/danburkert/prost), @@ -441,10 +475,14 @@ The following text applies to code linked from these dependencies: [rand_core](https://github.com/rust-random/rand), [regex-syntax](https://github.com/rust-lang/regex), [regex](https://github.com/rust-lang/regex), +[rkv](https://github.com/mozilla/rkv), [ryu](https://github.com/dtolnay/ryu), +[semver-parser](https://github.com/steveklabnik/semver-parser), +[semver](https://github.com/steveklabnik/semver), [serde](https://github.com/serde-rs/serde), [serde_derive](https://github.com/serde-rs/serde), [serde_json](https://github.com/serde-rs/json), +[sha2](https://github.com/RustCrypto/hashes), [smallbitvec](https://github.com/servo/smallbitvec), [smallvec](https://github.com/servo/rust-smallvec), [syn](https://github.com/dtolnay/syn), @@ -452,10 +490,16 @@ The following text applies to code linked from these dependencies: [thiserror](https://github.com/dtolnay/thiserror), [thread_local](https://github.com/Amanieu/thread_local-rs), [tinyvec](https://github.com/Lokathor/tinyvec), +[toml](https://github.com/alexcrichton/toml-rs), +[typenum](https://github.com/paholg/typenum), [unicode-bidi](https://github.com/servo/unicode-bidi), [unicode-normalization](https://github.com/unicode-rs/unicode-normalization), +[unicode-segmentation](https://github.com/unicode-rs/unicode-segmentation), +[unicode-width](https://github.com/unicode-rs/unicode-width), [unicode-xid](https://github.com/unicode-rs/unicode-xid), -[url](https://github.com/servo/rust-url) +[url](https://github.com/servo/rust-url), +[uuid](https://github.com/uuid-rs/uuid), +[version_check](https://github.com/SergioBenitez/version_check) ``` Apache License @@ -756,6 +800,38 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: cargo_metadata + +The following text applies to code linked from these dependencies: +[cargo_metadata](https://github.com/oli-obk/cargo_metadata) + +``` +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + ``` ------------- ## MIT License: caseless @@ -787,6 +863,65 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: clap + +The following text applies to code linked from these dependencies: +[clap](https://github.com/clap-rs/clap) + +``` +The MIT License (MIT) + +Copyright (c) 2015-2016 Kevin B. Knapp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` +------------- +## MIT License: generic-array + +The following text applies to code linked from these dependencies: +[generic-array](https://github.com/fizyk20/generic-array.git) + +``` +The MIT License (MIT) + +Copyright (c) 2015 Bartłomiej Kamiński + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ------------- ## MIT License: libsqlite3-sys, rusqlite @@ -850,6 +985,138 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +------------- +## MIT License: nom + +The following text applies to code linked from these dependencies: +[nom](https://github.com/Geal/nom) + +``` +Copyright (c) 2014-2019 Geoffroy Couprie + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` +------------- +## MIT License: ordered-float + +The following text applies to code linked from these dependencies: +[ordered-float](https://github.com/reem/rust-ordered-float) + +``` +Copyright (c) 2015 Jonathan Reem + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +``` +------------- +## MIT License: synstructure + +The following text applies to code linked from these dependencies: +[synstructure](https://github.com/mystor/synstructure) + +``` +Copyright 2016 Nika Layzell + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` +------------- +## MIT License: textwrap + +The following text applies to code linked from these dependencies: +[textwrap](https://github.com/mgeisler/textwrap) + +``` +MIT License + +Copyright (c) 2016 Martin Geisler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` +------------- +## MIT License: weedle + +The following text applies to code linked from these dependencies: +[weedle](https://github.com/rustwasm/weedle) + +``` +Copyright 2018-Present Sharad Chand + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. ``` ------------- ## CC0-1.0 License: base16 @@ -1003,6 +1270,41 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +``` +------------- +## BSD-2-Clause License: arrayref + +The following text applies to code linked from these dependencies: +[arrayref](https://github.com/droundy/arrayref) + +``` +Copyright (c) 2015 David Roundy +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ``` ------------- ## BSD-3-Clause License: protobuf diff --git a/megazords/full/android/dependency-licenses.xml b/megazords/full/android/dependency-licenses.xml index 64ebc00ec..7ed5ae384 100644 --- a/megazords/full/android/dependency-licenses.xml +++ b/megazords/full/android/dependency-licenses.xml @@ -20,6 +20,26 @@ the details of which are reproduced below. Mozilla Public License 2.0: hawk https://github.com/taskcluster/rust-hawk/blob/master/LICENSE + + Mozilla Public License 2.0: jexl-eval + https://github.com/mozilla/jexl-rs/blob/main/LICENSE + + + Mozilla Public License 2.0: jexl-parser + https://github.com/mozilla/jexl-rs/blob/main/LICENSE + + + Mozilla Public License 2.0: uniffi + https://github.com/mozilla/uniffi-rs/blob/main/LICENSE + + + Mozilla Public License 2.0: uniffi_bindgen + https://github.com/mozilla/uniffi-rs/blob/main/LICENSE + + + Mozilla Public License 2.0: uniffi_build + https://github.com/mozilla/uniffi-rs/blob/main/LICENSE + Apache License 2.0: ahash https://github.com/tkaitchuck/ahash/blob/master/LICENSE-APACHE @@ -28,6 +48,26 @@ the details of which are reproduced below. Apache License 2.0: anyhow https://github.com/dtolnay/anyhow/blob/master/LICENSE-APACHE + + Apache License 2.0: askama + https://github.com/djc/askama/blob/main/LICENSE-APACHE + + + Apache License 2.0: askama_derive + https://github.com/djc/askama/blob/main/LICENSE-APACHE + + + Apache License 2.0: askama_escape + https://github.com/djc/askama/blob/main/LICENSE-APACHE + + + Apache License 2.0: askama_shared + https://github.com/djc/askama/blob/main/LICENSE-APACHE + + + Apache License 2.0: autocfg + https://github.com/cuviper/autocfg/blob/master/LICENSE-APACHE + Apache License 2.0: base64 https://github.com/marshallpierce/rust-base64/blob/master/LICENSE-APACHE @@ -36,6 +76,10 @@ the details of which are reproduced below. Apache License 2.0: bitflags https://github.com/bitflags/bitflags/blob/master/LICENSE-APACHE + + Apache License 2.0: block-buffer + https://github.com/RustCrypto/utils/blob/master/block-buffer/LICENSE-APACHE + Apache License 2.0: cc https://github.com/alexcrichton/cc-rs/blob/master/LICENSE-APACHE @@ -44,6 +88,18 @@ the details of which are reproduced below. Apache License 2.0: cfg-if https://github.com/alexcrichton/cfg-if/blob/master/LICENSE-APACHE + + Apache License 2.0: cfg-if + https://github.com/alexcrichton/cfg-if/blob/master/LICENSE-APACHE + + + Apache License 2.0: cpuid-bool + https://github.com/RustCrypto/utils/blob/master/cpuid-bool/LICENSE-APACHE + + + Apache License 2.0: digest + https://github.com/RustCrypto/traits/blob/master/digest/LICENSE-APACHE + Apache License 2.0: dogear https://github.com/mozilla/dogear/blob/master/LICENSE @@ -52,6 +108,14 @@ the details of which are reproduced below. Apache License 2.0: either https://github.com/bluss/either/blob/master/LICENSE-APACHE + + Apache License 2.0: failure + https://github.com/rust-lang-nursery/failure/blob/master/LICENSE-APACHE + + + Apache License 2.0: failure_derive + https://github.com/rust-lang-nursery/failure/blob/master/LICENSE-APACHE + Apache License 2.0: fallible-iterator https://github.com/sfackler/rust-fallible-iterator/blob/master/LICENSE-APACHE @@ -76,10 +140,18 @@ the details of which are reproduced below. Apache License 2.0: hashlink https://github.com/kyren/hashlink/blob/master/LICENSE-APACHE + + Apache License 2.0: heck + https://github.com/withoutboats/heck/blob/master/LICENSE-APACHE + Apache License 2.0: hex https://github.com/KokaKiwi/rust-hex/blob/master/LICENSE-APACHE + + Apache License 2.0: id-arena + https://github.com/fitzgen/id-arena/blob/master/LICENSE-APACHE + Apache License 2.0: idna https://github.com/servo/rust-url/blob//master/LICENSE-APACHE @@ -96,6 +168,10 @@ the details of which are reproduced below. Apache License 2.0: jna https://github.com/java-native-access/jna/blob/master/AL2.0 + + Apache License 2.0: lalrpop-util + https://github.com/lalrpop/lalrpop/blob/master/LICENSE-APACHE + Apache License 2.0: lazy_static https://github.com/rust-lang-nursery/lazy-static.rs/blob/master/LICENSE-APACHE @@ -104,14 +180,42 @@ the details of which are reproduced below. Apache License 2.0: libc https://github.com/rust-lang/libc/blob/master/LICENSE-APACHE + + Apache License 2.0: lmdb-rkv + https://github.com/mozilla/lmdb-rs/blob/master/LICENSE + + + Apache License 2.0: lmdb-rkv-sys + https://github.com/mozilla/lmdb-rs/blob/master/LICENSE + Apache License 2.0: log https://github.com/rust-lang/log/blob/master/LICENSE-APACHE + + Apache License 2.0: num-traits + https://github.com/rust-num/num-traits/blob/master/LICENSE-APACHE + Apache License 2.0: once_cell https://github.com/matklad/once_cell/blob/master/LICENSE-APACHE + + Apache License 2.0: opaque-debug + https://github.com/RustCrypto/utils/blob/master/opaque-debug/LICENSE-APACHE + + + Apache License 2.0: paste + https://github.com/dtolnay/paste/blob/master/LICENSE-APACHE + + + Apache License 2.0: paste + https://github.com/dtolnay/paste/blob/master/LICENSE-APACHE + + + Apache License 2.0: paste-impl + https://github.com/dtolnay/paste/blob/master/LICENSE-APACHE + Apache License 2.0: percent-encoding https://github.com/servo/rust-url/blob//master/LICENSE-APACHE @@ -124,6 +228,10 @@ the details of which are reproduced below. Apache License 2.0: ppv-lite86 https://github.com/cryptocorrosion/cryptocorrosion/blob/master/utils-simd/ppv-lite86/LICENSE-APACHE + + Apache License 2.0: proc-macro-hack + https://github.com/dtolnay/proc-macro-hack/blob/master/LICENSE-APACHE + Apache License 2.0: proc-macro2 https://github.com/alexcrichton/proc-macro2/blob/master/LICENSE-APACHE @@ -160,10 +268,22 @@ the details of which are reproduced below. Apache License 2.0: regex-syntax https://github.com/rust-lang/regex/blob/master/LICENSE-APACHE + + Apache License 2.0: rkv + https://github.com/mozilla/rkv/blob/master/LICENSE + Apache License 2.0: ryu https://github.com/dtolnay/ryu/blob/master/LICENSE-APACHE + + Apache License 2.0: semver + https://github.com/steveklabnik/semver/blob/master/LICENSE-APACHE + + + Apache License 2.0: semver-parser + https://github.com/steveklabnik/semver-parser/blob/master/LICENSE-APACHE + Apache License 2.0: serde https://github.com/serde-rs/serde/blob/master/LICENSE-APACHE @@ -176,6 +296,10 @@ the details of which are reproduced below. Apache License 2.0: serde_json https://github.com/serde-rs/json/blob/master/LICENSE-APACHE + + Apache License 2.0: sha2 + https://github.com/RustCrypto/hashes/blob/master/sha2/LICENSE-APACHE + Apache License 2.0: smallbitvec https://github.com/servo/smallbitvec/blob/master/LICENSE-APACHE @@ -204,6 +328,14 @@ the details of which are reproduced below. Apache License 2.0: tinyvec https://github.com/Lokathor/tinyvec/blob/main/LICENSE-ZLIB.md + + Apache License 2.0: toml + https://github.com/alexcrichton/toml-rs/blob/master/LICENSE-APACHE + + + Apache License 2.0: typenum + https://github.com/paholg/typenum/blob/master/LICENSE + Apache License 2.0: unicode-bidi https://github.com/servo/unicode-bidi/blob/master/LICENSE-APACHE @@ -212,6 +344,14 @@ the details of which are reproduced below. Apache License 2.0: unicode-normalization https://github.com/unicode-rs/unicode-normalization/blob/master/LICENSE-APACHE + + Apache License 2.0: unicode-segmentation + https://github.com/unicode-rs/unicode-segmentation/blob/master/LICENSE-APACHE + + + Apache License 2.0: unicode-width + https://github.com/unicode-rs/unicode-width/blob/master/LICENSE-APACHE + Apache License 2.0: unicode-xid https://github.com/unicode-rs/unicode-xid/blob/master/LICENSE-APACHE @@ -220,6 +360,14 @@ the details of which are reproduced below. Apache License 2.0: url https://github.com/servo/rust-url/blob/master/LICENSE-APACHE + + Apache License 2.0: uuid + https://github.com/uuid-rs/uuid/blob/master/LICENSE-APACHE + + + Apache License 2.0: version_check + https://github.com/SergioBenitez/version_check/blob/master/LICENSE-APACHE + MIT License: aho-corasick https://github.com/BurntSushi/aho-corasick/blob/master/LICENSE-MIT @@ -240,10 +388,22 @@ the details of which are reproduced below. MIT License: bytes https://github.com/tokio-rs/bytes/blob/master/LICENSE + + MIT License: cargo_metadata + https://github.com/oli-obk/cargo_metadata/blob/main/LICENSE-MIT + MIT License: caseless https://github.com/SimonSapin/rust-caseless/blob/master/LICENSE + + MIT License: clap + https://github.com/clap-rs/clap/blob/master/LICENSE-MIT + + + MIT License: generic-array + https://github.com/fizyk20/generic-array/blob/master/LICENSE + MIT License: libsqlite3-sys https://github.com/rusqlite/rusqlite/blob/master/LICENSE @@ -256,6 +416,26 @@ the details of which are reproduced below. MIT License: matches https://github.com/SimonSapin/rust-std-candidates/blob/master/LICENSE + + MIT License: nom + https://github.com/Geal/nom/blob/master/LICENSE + + + MIT License: ordered-float + https://github.com/reem/rust-ordered-float/blob/master/LICENSE-MIT + + + MIT License: synstructure + https://github.com/mystor/synstructure/blob/master/LICENSE + + + MIT License: textwrap + https://github.com/mgeisler/textwrap/blob/master/LICENSE + + + MIT License: weedle + https://github.com/rustwasm/weedle/blob/master/LICENSE.md + CC0-1.0 License: base16 https://github.com/thomcc/rust-base16/blob/master/LICENSE-CC0 @@ -264,6 +444,10 @@ the details of which are reproduced below. ISC License: ring https://github.com/briansmith/ring/blob/master/LICENSE + + BSD-2-Clause License: arrayref + https://github.com/droundy/arrayref/blob/master/LICENSE + BSD-3-Clause License: protobuf https://github.com/protocolbuffers/protobuf/blob/master/LICENSE diff --git a/megazords/full/src/lib.rs b/megazords/full/src/lib.rs index 3943d4202..a48692766 100644 --- a/megazords/full/src/lib.rs +++ b/megazords/full/src/lib.rs @@ -10,6 +10,7 @@ use std::os::raw::c_char; pub use fxaclient_ffi; pub use logins_ffi; +pub use nimbus; pub use places_ffi; pub use push_ffi; pub use rc_log_ffi; diff --git a/megazords/ios/DEPENDENCIES.md b/megazords/ios/DEPENDENCIES.md index 2fa510257..35d1285c1 100644 --- a/megazords/ios/DEPENDENCIES.md +++ b/megazords/ios/DEPENDENCIES.md @@ -41,8 +41,6 @@ The following text applies to code linked from these dependencies: [NSPR](https://hg.mozilla.org/projects/nspr), [NSS](https://hg.mozilla.org/projects/nss), [ece](https://github.com/mozilla/rust-ece), -[glean-core](https://github.com/mozilla/glean), -[glean-ffi](https://github.com/mozilla/glean), [hawk](https://github.com/taskcluster/rust-hawk) ``` @@ -466,6 +464,7 @@ The following text applies to code linked from these dependencies: [httpdate](https://github.com/pyfisch/httpdate), [humantime](https://github.com/tailhook/humantime), [hyper-tls](https://github.com/hyperium/hyper-tls), +[id-arena](https://github.com/fitzgen/id-arena), [idna](https://github.com/servo/rust-url/), [indexmap](https://github.com/bluss/indexmap), [iovec](https://github.com/carllerche/iovec), @@ -484,6 +483,8 @@ The following text applies to code linked from these dependencies: [num-traits](https://github.com/rust-num/num-traits), [num_cpus](https://github.com/seanmonstar/num_cpus), [once_cell](https://github.com/matklad/once_cell), +[paste-impl](https://github.com/dtolnay/paste), +[paste](https://github.com/dtolnay/paste), [percent-encoding](https://github.com/servo/rust-url/), [pin-project-internal](https://github.com/taiki-e/pin-project), [pin-project-lite](https://github.com/taiki-e/pin-project-lite), diff --git a/megazords/ios/MozillaAppServices.xcodeproj/project.pbxproj b/megazords/ios/MozillaAppServices.xcodeproj/project.pbxproj index 77fa81a8e..6fdb240c5 100644 --- a/megazords/ios/MozillaAppServices.xcodeproj/project.pbxproj +++ b/megazords/ios/MozillaAppServices.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ BF1A8787250649EA00FED88E /* Utils */, ); name = Glean; - path = "../../components/glean/glean-core/ios/Glean"; + path = "../../components/external/glean/glean-core/ios/Glean"; sourceTree = ""; }; BF1A8783250649B600FED88E /* Config */ = { @@ -370,7 +370,7 @@ BF1A87D625064B4C00FED88E /* Metrics.swift */, ); name = Generated; - path = ../../../../../megazords/ios/MozillaAppServices/Generated; + path = ../../../../../../megazords/ios/MozillaAppServices/Generated; sourceTree = ""; }; C852EEB2220A285B00A6E79A /* config */ = { @@ -702,8 +702,8 @@ inputFileListPaths = ( ); inputPaths = ( - "$(SRCROOT)/../../components/glean/glean-core/metrics.yaml", - "$(SRCROOT)/../../components/glean/glean-core/pings.yaml", + "$(SRCROOT)/../../components/external/glean/glean-core/metrics.yaml", + "$(SRCROOT)/../../components/external/glean/glean-core/pings.yaml", ); name = "Generate Glean metrics"; outputFileListPaths = ( @@ -713,7 +713,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "bash $PWD/../../components/glean/glean-core/ios/sdk_generator.sh --allow-reserved\n"; + shellScript = "bash $PWD/../../components/external/glean/glean-core/ios/sdk_generator.sh --allow-reserved\n"; }; CEEA12EF20AA1D630018998A /* Build Rust libraries */ = { isa = PBXShellScriptBuildPhase; diff --git a/megazords/ios/README.md b/megazords/ios/README.md index e1cd6cfab..cd1e414e7 100644 --- a/megazords/ios/README.md +++ b/megazords/ios/README.md @@ -10,29 +10,30 @@ The iOS 'megazord' builds all the components into a single library. This is buil ### Glean component At the moment the MozillaAppServices iOS framework bundles [Glean]. -It depends on the releases `glean-ffi` crate from [crates.io] and the corresponding iOS source code. -Glean is bundled as a [git submodule] in `components/glean` and the Xcode project references those files. +Glean is bundled as a [git submodule] in `components/external/glean` and the Xcode project references those files. To update Glean: -1. Update the version of `glean-ffi` in `megazord/ios/rust/Cargo.toml` -2. Ensure `cargo` updates the versions by running `cargo fetch` -3. Update the submodule to the same version (replace `$version` below with the correct version, e.g. `32.3.0`): +1. Select the release version to which to update, `$version`. +2. Update the submodule to that version (replace `$version` below with the correct version, e.g. `32.3.0`): - ``` - cd components/glean - git fetch origin - git checkout v$version - ``` + ``` + cd components/external/glean + git fetch origin + git checkout v$version + ``` +3. Update `Cargo.lock` to reflect any upstream changes: + ``` + cargo update + ``` 4. Commit the changes: ``` - git add components/glean - git add megazord/ios/rust/Cargo.toml + git add components/external/glean git add Cargo.lock + git commit ``` 5. Run an Xcode build to ensure everything compiles. [Glean]: https://github.com/mozilla/glean -[crates.io]: https://crates.io/crates/glean-ffi [git submodule]: https://git-scm.com/docs/git-submodule diff --git a/megazords/ios/rust/Cargo.toml b/megazords/ios/rust/Cargo.toml index 0a569105e..f9dcfcd63 100644 --- a/megazords/ios/rust/Cargo.toml +++ b/megazords/ios/rust/Cargo.toml @@ -15,4 +15,4 @@ places-ffi = { path = "../../../components/places/ffi" } rc_log_ffi = { path = "../../../components/rc_log" } viaduct = { path = "../../../components/viaduct" } viaduct-reqwest = { path = "../../../components/support/viaduct-reqwest" } -glean-ffi = { version = "32.3.0" } +glean-ffi = { path = "../../../components/external/glean/glean-core/ffi" } diff --git a/taskcluster/scripts/toolchain/rustup-setup.sh b/taskcluster/scripts/toolchain/rustup-setup.sh index df1479f2d..5bbb7e822 100755 --- a/taskcluster/scripts/toolchain/rustup-setup.sh +++ b/taskcluster/scripts/toolchain/rustup-setup.sh @@ -34,3 +34,9 @@ export PATH=$HOME/.cargo/bin:$PATH rustup toolchain install "$RUST_STABLE_VERSION" rustup default "$RUST_STABLE_VERSION" rustup target add x86_64-linux-android i686-linux-android armv7-linux-androideabi aarch64-linux-android + +cargo install --version 0.5.0 uniffi_bindgen + +# This is not the right place for it, but also it's as good a place as any. +# Make sure git submodules are initialized. +git submodule update --init diff --git a/tools/dependency_summary.py b/tools/dependency_summary.py index ac700f049..d1995d5c5 100644 --- a/tools/dependency_summary.py +++ b/tools/dependency_summary.py @@ -579,6 +579,82 @@ PACKAGE_METADATA_FIXUPS = { "fixup": "https://raw.githubusercontent.com/mozilla/lmdb-rs/master/LICENSE", } }, + "uniffi_bindgen": { + "license_url": { + "check": None, + "fixup": "https://github.com/mozilla/uniffi-rs/blob/main/LICENSE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/mozilla/uniffi-rs/main/LICENSE", + } + }, + "uniffi_build": { + "license_url": { + "check": None, + "fixup": "https://github.com/mozilla/uniffi-rs/blob/main/LICENSE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/mozilla/uniffi-rs/main/LICENSE", + } + }, + "uniffi": { + "license_url": { + "check": None, + "fixup": "https://github.com/mozilla/uniffi-rs/blob/main/LICENSE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/mozilla/uniffi-rs/main/LICENSE", + } + }, + "jexl-eval": { + "license_url": { + "check": None, + "fixup": "https://github.com/mozilla/jexl-rs/blob/main/LICENSE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/mozilla/jexl-rs/main/LICENSE", + } + }, + "jexl-parser": { + "license_url": { + "check": None, + "fixup": "https://github.com/mozilla/jexl-rs/blob/main/LICENSE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/mozilla/jexl-rs/main/LICENSE", + } + }, + "lalrpop-util": { + "license": { + "check": "Apache-2.0/MIT", + }, + "license_url": { + "check": None, + "fixup": "https://github.com/lalrpop/lalrpop/blob/master/LICENSE-APACHE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/lalrpop/lalrpop/master/LICENSE-APACHE", + } + }, + "humansize": { + "license": { + "check": "MIT/Apache-2.0", + }, + "license_url": { + "check": None, + "fixup": "https://github.com/LeopoldArkham/humansize/blob/master/LICENSE-APACHE", + }, + "license_file": { + "check": None, + "fixup": "https://raw.githubusercontent.com/LeopoldArkham/humansize/master/LICENSE-APACHE", + } + }, } # Sets of common licence file names, by license type.