Bug 1499254 - add primary-dependency support. r=tomprince,Callek
authorAki Sasaki <asasaki@mozilla.com>
Tue, 23 Oct 2018 21:12:51 +0000
changeset 491030 2eea4d6c1597ce9a997eca8bc5fdb78119d7aced
parent 491029 6f85b1efc3d27984fda22198353a56fee1cdd994
child 491031 848914c4c934be47a40a70fc09c5c26cd8df0ec4
push id247
push userfmarier@mozilla.com
push dateSat, 27 Oct 2018 01:06:44 +0000
reviewerstomprince, Callek
bugs1499254
milestone65.0a1
Bug 1499254 - add primary-dependency support. r=tomprince,Callek Depends on D9194 Differential Revision: https://phabricator.services.mozilla.com/D9196
taskcluster/ci/l10n/kind.yml
taskcluster/ci/nightly-l10n/kind.yml
taskcluster/taskgraph/loader/multi_dep.py
taskcluster/taskgraph/transforms/l10n.py
taskcluster/taskgraph/transforms/name_sanity.py
--- a/taskcluster/ci/l10n/kind.yml
+++ b/taskcluster/ci/l10n/kind.yml
@@ -2,191 +2,193 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 loader: taskgraph.loader.multi_dep:loader
 
 group-by: platform
 
 transforms:
-   - taskgraph.transforms.l10n:transforms
-   - taskgraph.transforms.use_toolchains:transforms
-   - taskgraph.transforms.job:transforms
-   - taskgraph.transforms.task:transforms
+    - taskgraph.transforms.l10n:transforms
+    - taskgraph.transforms.use_toolchains:transforms
+    - taskgraph.transforms.job:transforms
+    - taskgraph.transforms.task:transforms
 
 kind-dependencies:
-   - build
-   - build-signing
-   - repackage
-   - repackage-signing
-   - toolchain
+    - build
+    - build-signing
+    - repackage
+    - repackage-signing
+    - toolchain
+
+primary-dependency: build
 
 only-for-build-platforms:
-   - linux64/opt
-   - linux/opt
-   - android-api-16/opt
-   - macosx64/opt
-   - win32/opt
-   - win64/opt
+    - linux64/opt
+    - linux/opt
+    - android-api-16/opt
+    - macosx64/opt
+    - win32/opt
+    - win64/opt
 
 job-template:
-   description:
-      by-build-platform:
-         default: Localization
-         android-api-16: Single Locale Repack
-   locales-file:
-      by-build-platform:
-         default: browser/locales/l10n-onchange-changesets.json
-         android-api-16: mobile/locales/l10n-onchange-changesets.json
-   ignore-locales:
-      by-build-platform:
-         # OSX has a special locale for japanese
-         macosx64.*: [ja]
-         default: [ja-JP-mac]
-   run-time:
-      by-build-platform:
-         default: 36000
-         android-api-16: 18000
-   docker-image:
-      by-build-platform:
-         android-api-16:
-            in-tree: android-build
-         default: null
-   secrets:
-      by-build-platform:
-         default: false
-         android-api-16: true
-   toolchains:
-      by-build-platform:
-         default: []
-         macosx64:
-            - linux64-libdmg
-            - linux64-hfsplus
-         android-api-16:
-            - android-gradle-dependencies
-            - android-sdk-linux
-   tooltool:
-      by-build-platform:
-         default: internal
-         linux.*: public
-   index:
-      type: l10n
-      product:
-         by-build-platform:
-            default: firefox
-            android-api-16: mobile
-      job-name:
-         by-build-platform:
-            linux: linux-opt
-            linux64: linux64-opt
-            macosx64: macosx64-opt
-            win32: win32-opt
-            win64: win64-opt
-            android-api-16: android-api-16-opt
-   run-on-projects: ['all']
-   worker-type:
-      by-build-platform:
-         default: aws-provisioner-v1/gecko-{level}-b-linux
-         android-api-16: aws-provisioner-v1/gecko-{level}-b-android
-         win.*: aws-provisioner-v1/gecko-{level}-b-win2012
-   treeherder:
-      symbol: L10n
-      tier:
-         by-build-platform:
-            default: 1
-            android-api-16: 2
-      platform:
-         by-build-platform:
-            linux64: linux64/opt
-            linux: linux32/opt
-            macosx64: osx-cross/opt
-            win32: windows2012-32/opt
-            win64: windows2012-64/opt
-            android-api-16: android-4-0-armv7-api16/opt
-   env:
-      by-build-platform:
-         linux.*:   # linux64 and 32 get same treatment here
-            EN_US_PACKAGE_NAME: target.tar.bz2
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
-            MAR_TOOLS_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
-         macosx64:
-            EN_US_PACKAGE_NAME: target.dmg
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<repackage>/artifacts/{artifact_prefix}
-            MAR_TOOLS_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
-         win.*:
-            EN_US_PACKAGE_NAME: target.zip
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
-            EN_US_INSTALLER_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<repackage-signing>/artifacts/{artifact_prefix}
-            MAR_TOOLS_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
-         android-api-16:
-            EN_US_PACKAGE_NAME: target.apk
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}
-   mozharness:
-      config:
-         by-build-platform:
-            linux:
-               - single_locale/{project}.py
-               - single_locale/linux32.py
-               - single_locale/tc_common.py
-               - single_locale/tc_linux32.py
-               - single_locale/onchange.py
-            linux64:
-               - single_locale/{project}.py
-               - single_locale/linux64.py
-               - single_locale/tc_common.py
-               - single_locale/tc_linux64.py
-               - single_locale/onchange.py
+    description:
+        by-build-platform:
+            default: Localization
+            android-api-16: Single Locale Repack
+    locales-file:
+        by-build-platform:
+            default: browser/locales/l10n-onchange-changesets.json
+            android-api-16: mobile/locales/l10n-onchange-changesets.json
+    ignore-locales:
+        by-build-platform:
+            # OSX has a special locale for japanese
+            macosx64.*: [ja]
+            default: [ja-JP-mac]
+    run-time:
+        by-build-platform:
+            default: 36000
+            android-api-16: 18000
+    docker-image:
+        by-build-platform:
+            android-api-16:
+                in-tree: android-build
+            default: null
+    secrets:
+        by-build-platform:
+            default: false
+            android-api-16: true
+    toolchains:
+        by-build-platform:
+            default: []
             macosx64:
-               - single_locale/{project}.py
-               - single_locale/macosx64.py
-               - single_locale/tc_common.py
-               - single_locale/tc_macosx64.py
-               - single_locale/onchange.py
-            win32:
-               - single_locale/{project}.py
-               - single_locale/win32.py
-               - single_locale/tc_common.py
-               - single_locale/tc_win32.py
-               - single_locale/onchange.py
-            win64:
-               - single_locale/{project}.py
-               - single_locale/win64.py
-               - single_locale/tc_common.py
-               - single_locale/tc_win64.py
-               - single_locale/onchange.py
+                - linux64-libdmg
+                - linux64-hfsplus
+            android-api-16:
+                - android-gradle-dependencies
+                - android-sdk-linux
+    tooltool:
+        by-build-platform:
+            default: internal
+            linux.*: public
+    index:
+        type: l10n
+        product:
+            by-build-platform:
+                default: firefox
+                android-api-16: mobile
+        job-name:
+            by-build-platform:
+                linux: linux-opt
+                linux64: linux64-opt
+                macosx64: macosx64-opt
+                win32: win32-opt
+                win64: win64-opt
+                android-api-16: android-api-16-opt
+    run-on-projects: ['all']
+    worker-type:
+        by-build-platform:
+            default: aws-provisioner-v1/gecko-{level}-b-linux
+            android-api-16: aws-provisioner-v1/gecko-{level}-b-android
+            win.*: aws-provisioner-v1/gecko-{level}-b-win2012
+    treeherder:
+        symbol: L10n
+        tier:
+            by-build-platform:
+                default: 1
+                android-api-16: 2
+        platform:
+            by-build-platform:
+                linux64: linux64/opt
+                linux: linux32/opt
+                macosx64: osx-cross/opt
+                win32: windows2012-32/opt
+                win64: windows2012-64/opt
+                android-api-16: android-4-0-armv7-api16/opt
+    env:
+        by-build-platform:
+            linux.*:    # linux64 and 32 get same treatment here
+                EN_US_PACKAGE_NAME: target.tar.bz2
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
+                MAR_TOOLS_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
+            macosx64:
+                EN_US_PACKAGE_NAME: target.dmg
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<repackage>/artifacts/{artifact_prefix}
+                MAR_TOOLS_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
+            win.*:
+                EN_US_PACKAGE_NAME: target.zip
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
+                EN_US_INSTALLER_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<repackage-signing>/artifacts/{artifact_prefix}
+                MAR_TOOLS_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
             android-api-16:
-               - single_locale/{project}_android-api-16.py
-               - single_locale/tc_common.py
-               - single_locale/tc_android-api-16.py
-               - single_locale/onchange.py
-      # no default, so we fail on new entries
-      options:
-         - revision=$GECKO_HEAD_REV
-      actions:
-         by-build-platform:
-            default: ['clone-locales', 'list-locales', 'setup', 'repack',
-                      'summary']
-            android-api-16: ['get-secrets',
-                             'clone-locales', 'list-locales', 'setup', 'repack',
-                             'upload-repacks', 'summary']
-      script:
-         by-build-platform:
-            default: mozharness/scripts/desktop_l10n.py
-            android-api-16: mozharness/scripts/mobile_l10n.py
-   when:
-      files-changed:
-         - browser/locales/l10n-onchange-changesets.json
-         - mobile/locales/l10n-onchange-changesets.json
-         - testing/mozharness/configs/single_locale/**
-         - testing/mozharness/mozharness/mozilla/l10n/locales.py
-         - testing/mozharness/scripts/desktop_l10n.py
-         - testing/mozharness/scripts/mobile_l10n.py
-         - third_party/python/compare-locales/**
-         - toolkit/locales/**
-         - toolkit/mozapps/installer/**
+                EN_US_PACKAGE_NAME: target.apk
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}
+    mozharness:
+        config:
+            by-build-platform:
+                linux:
+                    - single_locale/{project}.py
+                    - single_locale/linux32.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_linux32.py
+                    - single_locale/onchange.py
+                linux64:
+                    - single_locale/{project}.py
+                    - single_locale/linux64.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_linux64.py
+                    - single_locale/onchange.py
+                macosx64:
+                    - single_locale/{project}.py
+                    - single_locale/macosx64.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_macosx64.py
+                    - single_locale/onchange.py
+                win32:
+                    - single_locale/{project}.py
+                    - single_locale/win32.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_win32.py
+                    - single_locale/onchange.py
+                win64:
+                    - single_locale/{project}.py
+                    - single_locale/win64.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_win64.py
+                    - single_locale/onchange.py
+                android-api-16:
+                    - single_locale/{project}_android-api-16.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_android-api-16.py
+                    - single_locale/onchange.py
+        # no default, so we fail on new entries
+        options:
+            - revision=$GECKO_HEAD_REV
+        actions:
+            by-build-platform:
+                default: ['clone-locales', 'list-locales', 'setup', 'repack',
+                          'summary']
+                android-api-16: ['get-secrets',
+                                 'clone-locales', 'list-locales', 'setup', 'repack',
+                                 'upload-repacks', 'summary']
+        script:
+            by-build-platform:
+                default: mozharness/scripts/desktop_l10n.py
+                android-api-16: mozharness/scripts/mobile_l10n.py
+    when:
+        files-changed:
+            - browser/locales/l10n-onchange-changesets.json
+            - mobile/locales/l10n-onchange-changesets.json
+            - testing/mozharness/configs/single_locale/**
+            - testing/mozharness/mozharness/mozilla/l10n/locales.py
+            - testing/mozharness/scripts/desktop_l10n.py
+            - testing/mozharness/scripts/mobile_l10n.py
+            - third_party/python/compare-locales/**
+            - toolkit/locales/**
+            - toolkit/mozapps/installer/**
--- a/taskcluster/ci/nightly-l10n/kind.yml
+++ b/taskcluster/ci/nightly-l10n/kind.yml
@@ -2,235 +2,237 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 loader: taskgraph.loader.multi_dep:loader
 
 group-by: platform
 
 transforms:
-   - taskgraph.transforms.l10n:transforms
-   - taskgraph.transforms.use_toolchains:transforms
-   - taskgraph.transforms.job:transforms
-   - taskgraph.transforms.task:transforms
+    - taskgraph.transforms.l10n:transforms
+    - taskgraph.transforms.use_toolchains:transforms
+    - taskgraph.transforms.job:transforms
+    - taskgraph.transforms.task:transforms
 
 kind-dependencies:
-   - build
-   - build-signing
-   - repackage
-   - repackage-signing
-   - toolchain
+    - build
+    - build-signing
+    - repackage
+    - repackage-signing
+    - toolchain
+
+primary-dependency: build
 
 only-for-build-platforms:
-   - linux64-nightly/opt
-   - linux-nightly/opt
-   - android-api-16-nightly/opt
-   - macosx64-nightly/opt
-   - win32-nightly/opt
-   - win64-nightly/opt
-   - linux64-devedition-nightly/opt
-   - linux-devedition-nightly/opt
-   - macosx64-devedition-nightly/opt
-   - win32-devedition-nightly/opt
-   - win64-devedition-nightly/opt
+    - linux64-nightly/opt
+    - linux-nightly/opt
+    - android-api-16-nightly/opt
+    - macosx64-nightly/opt
+    - win32-nightly/opt
+    - win64-nightly/opt
+    - linux64-devedition-nightly/opt
+    - linux-devedition-nightly/opt
+    - macosx64-devedition-nightly/opt
+    - win32-devedition-nightly/opt
+    - win64-devedition-nightly/opt
 
 job-template:
-   description:
-      by-build-platform:
-         default: Localization
-         android-api-16-nightly: Single Locale Repack
-   locales-file:
-      by-build-platform:
-         default: browser/locales/l10n-changesets.json
-         android-api-16-nightly: mobile/locales/l10n-changesets.json
-   locales-per-chunk: 5
-   run-on-projects: ['release']
-   attributes:
-      shipping_phase: promote
-   ignore-locales:
-      by-build-platform:
-         # OSX has a special locale for japanese
-         macosx64.*: [ja]
-         default: [ja-JP-mac]
-   run-time:
-      by-build-platform:
-         default: 36000
-         android-api-16-nightly: 18000
-   docker-image:
-      by-build-platform:
-         android-api-16-nightly:
-            in-tree: android-build
-         default: null
-   secrets:
-      by-build-platform:
-         default: false
-         android-api-16-nightly: true
-   toolchains:
-      by-build-platform:
-         default: []
-         macosx64.*:
-            - linux64-libdmg
-            - linux64-hfsplus
-         android-api-16-nightly:
-            - android-gradle-dependencies
-            - android-sdk-linux
-   tooltool:
-      by-build-platform:
-         default: public
-         android-api-16-nightly: internal
-         macosx64-nightly: internal
-         macosx64-devedition-nightly: internal
-         win32-nightly: internal
-         win32-devedition-nightly: internal
-         win64-nightly: internal
-         win64-devedition-nightly: internal
-   index:
-      type: nightly-l10n
-      product:
-         by-build-platform:
-            default: firefox
-            .*-devedition-.*: devedition
-            android-api-16-nightly: mobile
-      job-name:
-         by-build-platform:
-            linux-nightly: linux-opt
-            linux64-nightly: linux64-opt
-            macosx64-nightly: macosx64-opt
-            win32-nightly: win32-opt
-            win64-nightly: win64-opt
-            linux-devedition-nightly: linux-devedition-opt
-            linux64-devedition-nightly: linux64-devedition-opt
-            macosx64-devedition-nightly: macosx64-devedition-opt
-            win32-devedition-nightly: win32-devedition-opt
-            win64-devedition-nightly: win64-devedition-opt
-            android-api-16-nightly: android-api-16-opt
-   worker-type:
-      by-build-platform:
-         default: aws-provisioner-v1/gecko-{level}-b-linux
-         android-api-16-nightly: aws-provisioner-v1/gecko-{level}-b-android
-         win.*: aws-provisioner-v1/gecko-{level}-b-win2012
-   treeherder:
-      symbol: L10n(N)
-      tier:
-         by-build-platform:
-            default: 1
-            android-api-16-nightly: 2
-      platform:
-         by-build-platform:
-            linux64-nightly: linux64/opt
-            linux-nightly: linux32/opt
-            macosx64-nightly: osx-cross/opt
-            win32-nightly: windows2012-32/opt
-            win64-nightly: windows2012-64/opt
-            linux64-devedition-nightly: linux64-devedition/opt
-            linux-devedition-nightly: linux32-devedition/opt
-            macosx64-devedition-nightly: osx-cross-devedition/opt
-            win32-devedition-nightly: windows2012-32-devedition/opt
-            win64-devedition-nightly: windows2012-64-devedition/opt
-            android-api-16-nightly: android-4-0-armv7-api16/opt
-   env:
-      by-build-platform:
-         linux.*:   # linux64 and 32 get same treatment here
-            EN_US_PACKAGE_NAME: target.tar.bz2
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
-            MAR_TOOLS_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
-         macosx64.*:
-            EN_US_PACKAGE_NAME: target.dmg
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<repackage>/artifacts/{artifact_prefix}
-            MAR_TOOLS_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
-         win.*:
-            EN_US_PACKAGE_NAME: target.zip
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
-            EN_US_INSTALLER_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<repackage-signing>/artifacts/{artifact_prefix}
-            MAR_TOOLS_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
-         android-api-16-nightly:
-            EN_US_PACKAGE_NAME: target.apk
-            EN_US_BINARY_URL:
-               task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/en-US
-   mozharness:
-      config:
-         by-build-platform:
-            linux-nightly:
-               - single_locale/{project}.py
-               - single_locale/linux32.py
-               - single_locale/tc_common.py
-               - single_locale/tc_linux32.py
-               - taskcluster_nightly.py
-            linux64-nightly:
-               - single_locale/{project}.py
-               - single_locale/linux64.py
-               - single_locale/tc_common.py
-               - single_locale/tc_linux64.py
-               - taskcluster_nightly.py
-            macosx64-nightly:
-               - single_locale/{project}.py
-               - single_locale/macosx64.py
-               - single_locale/tc_common.py
-               - single_locale/tc_macosx64.py
-               - taskcluster_nightly.py
-            win32-nightly:
-               - single_locale/{project}.py
-               - single_locale/win32.py
-               - single_locale/tc_common.py
-               - single_locale/tc_win32.py
-               - taskcluster_nightly.py
-            win64-nightly:
-               - single_locale/{project}.py
-               - single_locale/win64.py
-               - single_locale/tc_common.py
-               - single_locale/tc_win64.py
-               - taskcluster_nightly.py
-            linux-devedition-nightly:
-               - single_locale/{project}.py
-               - single_locale/linux_devedition.py
-               - single_locale/tc_common.py
-               - single_locale/tc_linux32.py
-               - taskcluster_nightly.py
-            linux64-devedition-nightly:
-               - single_locale/{project}.py
-               - single_locale/linux64_devedition.py
-               - single_locale/tc_common.py
-               - single_locale/tc_linux64.py
-               - taskcluster_nightly.py
-            macosx64-devedition-nightly:
-               - single_locale/{project}.py
-               - single_locale/macosx64_devedition.py
-               - single_locale/tc_common.py
-               - single_locale/tc_macosx64.py
-               - taskcluster_nightly.py
-            win32-devedition-nightly:
-               - single_locale/{project}.py
-               - single_locale/win32_devedition.py
-               - single_locale/tc_common.py
-               - single_locale/tc_win32.py
-               - taskcluster_nightly.py
-            win64-devedition-nightly:
-               - single_locale/{project}.py
-               - single_locale/win64_devedition.py
-               - single_locale/tc_common.py
-               - single_locale/tc_win64.py
-               - taskcluster_nightly.py
+    description:
+        by-build-platform:
+            default: Localization
+            android-api-16-nightly: Single Locale Repack
+    locales-file:
+        by-build-platform:
+            default: browser/locales/l10n-changesets.json
+            android-api-16-nightly: mobile/locales/l10n-changesets.json
+    locales-per-chunk: 5
+    run-on-projects: ['release']
+    attributes:
+        shipping_phase: promote
+    ignore-locales:
+        by-build-platform:
+            # OSX has a special locale for japanese
+            macosx64.*: [ja]
+            default: [ja-JP-mac]
+    run-time:
+        by-build-platform:
+            default: 36000
+            android-api-16-nightly: 18000
+    docker-image:
+        by-build-platform:
+            android-api-16-nightly:
+                in-tree: android-build
+            default: null
+    secrets:
+        by-build-platform:
+            default: false
+            android-api-16-nightly: true
+    toolchains:
+        by-build-platform:
+            default: []
+            macosx64.*:
+                - linux64-libdmg
+                - linux64-hfsplus
             android-api-16-nightly:
-               - taskcluster_nightly.py
-               - single_locale/{project}_android-api-16.py
-               - single_locale/tc_common.py
-               - single_locale/tc_android-api-16.py
-      # no default, so we fail on new entries
-      options:
-         - revision=$GECKO_HEAD_REV
-      actions:
-         by-build-platform:
-            default: ['clone-locales', 'list-locales', 'setup', 'repack',
-                      'summary']
-            android-api-16-nightly: ['get-secrets',
-                                     'clone-locales', 'list-locales', 'setup', 'repack',
-                                     'upload-repacks', 'summary']
-      script:
-         by-build-platform:
-            default: mozharness/scripts/desktop_l10n.py
-            android-api-16-nightly: mozharness/scripts/mobile_l10n.py
+                - android-gradle-dependencies
+                - android-sdk-linux
+    tooltool:
+        by-build-platform:
+            default: public
+            android-api-16-nightly: internal
+            macosx64-nightly: internal
+            macosx64-devedition-nightly: internal
+            win32-nightly: internal
+            win32-devedition-nightly: internal
+            win64-nightly: internal
+            win64-devedition-nightly: internal
+    index:
+        type: nightly-l10n
+        product:
+            by-build-platform:
+                default: firefox
+                .*-devedition-.*: devedition
+                android-api-16-nightly: mobile
+        job-name:
+            by-build-platform:
+                linux-nightly: linux-opt
+                linux64-nightly: linux64-opt
+                macosx64-nightly: macosx64-opt
+                win32-nightly: win32-opt
+                win64-nightly: win64-opt
+                linux-devedition-nightly: linux-devedition-opt
+                linux64-devedition-nightly: linux64-devedition-opt
+                macosx64-devedition-nightly: macosx64-devedition-opt
+                win32-devedition-nightly: win32-devedition-opt
+                win64-devedition-nightly: win64-devedition-opt
+                android-api-16-nightly: android-api-16-opt
+    worker-type:
+        by-build-platform:
+            default: aws-provisioner-v1/gecko-{level}-b-linux
+            android-api-16-nightly: aws-provisioner-v1/gecko-{level}-b-android
+            win.*: aws-provisioner-v1/gecko-{level}-b-win2012
+    treeherder:
+        symbol: L10n(N)
+        tier:
+            by-build-platform:
+                default: 1
+                android-api-16-nightly: 2
+        platform:
+            by-build-platform:
+                linux64-nightly: linux64/opt
+                linux-nightly: linux32/opt
+                macosx64-nightly: osx-cross/opt
+                win32-nightly: windows2012-32/opt
+                win64-nightly: windows2012-64/opt
+                linux64-devedition-nightly: linux64-devedition/opt
+                linux-devedition-nightly: linux32-devedition/opt
+                macosx64-devedition-nightly: osx-cross-devedition/opt
+                win32-devedition-nightly: windows2012-32-devedition/opt
+                win64-devedition-nightly: windows2012-64-devedition/opt
+                android-api-16-nightly: android-4-0-armv7-api16/opt
+    env:
+        by-build-platform:
+            linux.*:    # linux64 and 32 get same treatment here
+                EN_US_PACKAGE_NAME: target.tar.bz2
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
+                MAR_TOOLS_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
+            macosx64.*:
+                EN_US_PACKAGE_NAME: target.dmg
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<repackage>/artifacts/{artifact_prefix}
+                MAR_TOOLS_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
+            win.*:
+                EN_US_PACKAGE_NAME: target.zip
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build-signing>/artifacts/{artifact_prefix}
+                EN_US_INSTALLER_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<repackage-signing>/artifacts/{artifact_prefix}
+                MAR_TOOLS_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/host/bin
+            android-api-16-nightly:
+                EN_US_PACKAGE_NAME: target.apk
+                EN_US_BINARY_URL:
+                    task-reference: https://queue.taskcluster.net/v1/task/<build>/artifacts/{artifact_prefix}/en-US
+    mozharness:
+        config:
+            by-build-platform:
+                linux-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/linux32.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_linux32.py
+                    - taskcluster_nightly.py
+                linux64-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/linux64.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_linux64.py
+                    - taskcluster_nightly.py
+                macosx64-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/macosx64.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_macosx64.py
+                    - taskcluster_nightly.py
+                win32-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/win32.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_win32.py
+                    - taskcluster_nightly.py
+                win64-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/win64.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_win64.py
+                    - taskcluster_nightly.py
+                linux-devedition-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/linux_devedition.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_linux32.py
+                    - taskcluster_nightly.py
+                linux64-devedition-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/linux64_devedition.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_linux64.py
+                    - taskcluster_nightly.py
+                macosx64-devedition-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/macosx64_devedition.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_macosx64.py
+                    - taskcluster_nightly.py
+                win32-devedition-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/win32_devedition.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_win32.py
+                    - taskcluster_nightly.py
+                win64-devedition-nightly:
+                    - single_locale/{project}.py
+                    - single_locale/win64_devedition.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_win64.py
+                    - taskcluster_nightly.py
+                android-api-16-nightly:
+                    - taskcluster_nightly.py
+                    - single_locale/{project}_android-api-16.py
+                    - single_locale/tc_common.py
+                    - single_locale/tc_android-api-16.py
+        # no default, so we fail on new entries
+        options:
+            - revision=$GECKO_HEAD_REV
+        actions:
+            by-build-platform:
+                default: ['clone-locales', 'list-locales', 'setup', 'repack',
+                          'summary']
+                android-api-16-nightly: ['get-secrets',
+                                         'clone-locales', 'list-locales', 'setup', 'repack',
+                                         'upload-repacks', 'summary']
+        script:
+            by-build-platform:
+                default: mozharness/scripts/desktop_l10n.py
+                android-api-16-nightly: mozharness/scripts/mobile_l10n.py
--- a/taskcluster/taskgraph/loader/multi_dep.py
+++ b/taskcluster/taskgraph/loader/multi_dep.py
@@ -22,35 +22,39 @@ def loader(kind, path, config, params, l
     """
     Load tasks based on the jobs dependant kinds, designed for use as
     multiple-dependent needs.
 
     Required ``group-by-fn`` is used to define how we coalesce the
     multiple deps together to pass to transforms, e.g. all kinds specified get
     collapsed by platform with `platform`
 
+    Optional ``primary-dependency`` (ordered list or string) is used to determine
+    which upstream kind to inherit attrs from. See ``get_primary_dep``.
+
     The `only-for-build-platforms` kind configuration, if specified, will limit
     the build platforms for which a job will be created. Alternatively there is
     'not-for-build-platforms' kind configuration which will be consulted only after
     'only-for-build-platforms' is checked (if present), and omit any jobs where the
     build platform matches.
 
     Optional ``job-template`` kind configuration value, if specified, will be used to
     pass configuration down to the specified transforms used.
     """
     job_template = config.get('job-template')
 
     for dep_tasks in group_tasks(config, loaded_tasks):
         job = {'dependent-tasks': dep_tasks}
+        job['primary-dependency'] = get_primary_dep(config, dep_tasks)
         if job_template:
             job.update(copy.deepcopy(job_template))
         # copy shipping_product from upstream
-        product = dep_tasks[dep_tasks.keys()[0]].attributes.get(
+        product = job['primary-dependency'].attributes.get(
             'shipping_product',
-            dep_tasks[dep_tasks.keys()[0]].task.get('shipping-product')
+            job['primary-dependency'].task.get('shipping-product')
         )
         if product:
             job.setdefault('shipping-product', product)
 
         yield job
 
 
 def group_tasks(config, tasks):
@@ -92,8 +96,39 @@ def platform_grouping(config, tasks):
 
         groups.setdefault((platform, build_type, product), []).append(task)
     return groups
 
 
 def assert_unique_members(kinds, error_msg=None):
     if len(kinds) != len(set(kinds)):
         raise Exception(error_msg)
+
+
+def get_primary_dep(config, dep_tasks):
+    """Find the dependent task to inherit attributes from.
+
+    If ``primary-dependency`` is defined in ``kind.yml`` and is a string,
+    then find the first dep with that task kind and return it. If it is
+    defined and is a list, the first kind in that list with a matching dep
+    is the primary dependency. If it's undefined, return the first dep.
+
+    """
+    primary_dependencies = config.get('primary-dependency')
+    if isinstance(primary_dependencies, str):
+        primary_dependencies = [primary_dependencies]
+    if not primary_dependencies:
+        assert len(dep_tasks) == 1, "Must define a primary-dependency!"
+        return dep_tasks.values()[0]
+    primary_dep = None
+    for primary_kind in primary_dependencies:
+        for dep_kind in dep_tasks:
+            if dep_kind == primary_kind:
+                assert primary_dep is None, \
+                    "Too many primary dependent tasks in dep_tasks: {}!".format(
+                        [t.label for t in dep_tasks]
+                    )
+                primary_dep = dep_tasks[dep_kind]
+    if primary_dep is None:
+        raise Exception("Can't find dependency of {}: {}".format(
+            config['primary-dependency'], config
+        ))
+    return primary_dep
--- a/taskcluster/taskgraph/transforms/l10n.py
+++ b/taskcluster/taskgraph/transforms/l10n.py
@@ -95,16 +95,19 @@ l10n_description_schema = Schema({
     # Description of the localized task
     Required('description'): _by_platform(basestring),
 
     Optional('run-on-projects'): job_description_schema['run-on-projects'],
 
     # dictionary of dependent task objects, keyed by kind.
     Required('dependent-tasks'): {basestring: object},
 
+    # primary dependency task
+    Required('primary-dependency'): object,
+
     # worker-type to utilize
     Required('worker-type'): _by_platform(basestring),
 
     # File which contains the used locales
     Required('locales-file'): _by_platform(basestring),
 
     # Tooltool visibility required for task.
     Required('tooltool'): _by_platform(Any('internal', 'public')),
@@ -192,28 +195,28 @@ def _remove_locales(locales, to_remove=N
     return {
         locale: revision for locale, revision in locales.items() if locale not in to_remove
     }
 
 
 @transforms.add
 def setup_name(config, jobs):
     for job in jobs:
-        dep = job['dependent-tasks']['build']
+        dep = job['primary-dependency']
         # Set the name to the same as the dep task, without kind name.
         # Label will get set automatically with this kinds name.
         job['name'] = job.get('name',
                               dep.task['metadata']['name'][len(dep.kind) + 1:])
         yield job
 
 
 @transforms.add
 def copy_in_useful_magic(config, jobs):
     for job in jobs:
-        dep = job['dependent-tasks']['build']
+        dep = job['primary-dependency']
         attributes = copy_attributes_from_dependent_job(dep)
         attributes.update(job.get('attributes', {}))
         # build-platform is needed on `job` for by-build-platform
         job['build-platform'] = attributes.get("build_platform")
         job['attributes'] = attributes
         yield job
 
 
--- a/taskcluster/taskgraph/transforms/name_sanity.py
+++ b/taskcluster/taskgraph/transforms/name_sanity.py
@@ -1,30 +1,33 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 """
 Generate labels for tasks without names, consistently.
-Uses attributes from 'dependent-task'.
+Uses attributes from `dependent-task` or `primary-dependency`.
 """
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 from taskgraph.transforms.base import TransformSequence
 
 
 transforms = TransformSequence()
 
 
 @transforms.add
 def make_label(config, jobs):
     """ Generate a sane label for a new task constructed from a dependency
     Using attributes from the dependent job and the current task kind"""
     for job in jobs:
-        dep_job = job['dependent-task']
+        if 'primary-dependency' in job:
+            dep_job = job['primary-dependency']
+        else:
+            dep_job = job['dependent-task']
         attr = dep_job.attributes.get
 
         if attr('locale', job.get('locale')):
             template = "{kind}-{locale}-{build_platform}/{build_type}"
         elif attr('l10n_chunk'):
             template = "{kind}-{build_platform}-{l10n_chunk}/{build_type}"
         elif config.kind.startswith("release-eme-free") or \
                 config.kind.startswith("release-partner-repack"):