From 37756e99009b8bdc09d130653cd239a9a60f42e6 Mon Sep 17 00:00:00 2001 From: Dennis Ameling Date: Sun, 7 Jun 2026 19:46:32 +0200 Subject: [PATCH] (firefox) Add native ARM64 (win64-aarch64) support Detect the native OS architecture at install time and pick the matching Mozilla build via an architecture -> build map (x86/x64/arm64), so Windows on ARM installs the native win64-aarch64 build instead of the emulated x64 one. - tools/chocolateyInstall.ps1: declare a per-package $builds map of architecture -> @{ Url; Checksum } and resolve the build via a shared Get-MozillaBuild helper. Resolution honors --forcex86 first, then the native arch from Chocolatey's Get-OSArchitecture (correct even under x64 emulation), falling back to x64 on older Chocolatey or when no arm64 checksum exists. - tools/helpers.ps1 (shared with Thunderbird): GetChecksums also returns the win64-aarch64 checksum (patterns anchored so 64 and 64-aarch64 rows can't cross-match); add the shared Get-MozillaBuild architecture resolver; add the UTF-8 BOM to match the repository convention for *.ps1 files. - update_helper.ps1 (shared with Thunderbird): capture win64-aarch64 checksums from Mozilla SHA512SUMS, version each URL by its os= token, and add a shared GetMozillaUrlFormats emitting the x86/x64/arm64 URL formats. - update.ps1: pass Win64Arm64Format through both streams. - tools/LanguageChecksums.csv: add the win64-aarch64 checksum rows. Verified installing the native arm64 build on Windows on ARM. Co-Authored-By: Claude Opus 4.8 (1M context) --- automatic/firefox/tools/LanguageChecksums.csv | 103 ++++++++++++++++++ automatic/firefox/tools/chocolateyInstall.ps1 | 23 ++-- automatic/firefox/tools/helpers.ps1 | 42 ++++++- automatic/firefox/update.ps1 | 26 +++-- automatic/firefox/update_helper.ps1 | 50 ++++++--- 5 files changed, 205 insertions(+), 39 deletions(-) diff --git a/automatic/firefox/tools/LanguageChecksums.csv b/automatic/firefox/tools/LanguageChecksums.csv index dd151e0724b..2ac12e98dba 100644 --- a/automatic/firefox/tools/LanguageChecksums.csv +++ b/automatic/firefox/tools/LanguageChecksums.csv @@ -101,6 +101,109 @@ vi|32|93741b8b282b81e7ca2c7553e2fa67552590725507eb64035ab0b579cf9d944bafe115aa7e xh|32|005cd9874dd36856912502f87c4737bd9dc9af48a23aac6f878ce28756bd419af6e242b88f33610a01f7f9f3e7c3ca2aa8d41cf87a5007ffce3fd51f2a79de85 zh-CN|32|3b726a344165561290b55b5fd7d9310298228b9b28e5966afd5b0a86b54a4f5157da49f8cf7891d43f014602c645210e78ce6cc501d71a20ee2972479ba1fc67 zh-TW|32|aabe73a66015855a2c6c6b378924c4e604de7a266abc3acf6a70bb7f9739b6b19eef583527ded2b916a1d0aaf11f3b43bb5febec073595d2547eb96dbb9f1ce6 +ach|64-aarch64|1a87d35d2bb3c9c88344b12496f1e9f90389304ea72f89c5a69dc37e0b9c29d5c8141d48cd9f598518ce613b44cad2ecc1cddb0aceaef63225da4bedfd492b03 +af|64-aarch64|17d371b1c5d0e873c4626f89c55b53554d7f6425880d8dec4d1bc2f97a28e0ff728b1e79cf50f592d68abdcc84bdec6825cd55594b1894183863626716f8bda5 +an|64-aarch64|f3cccb58e754c8d913f734c6d063374737a3169b85b6f4d2b7f0fef9eff0794ad59965472a4c2b68f8262d246dc85f3a6af1184cf297a4054b1af5b9627f386a +ar|64-aarch64|d306035220d90cddf2f338cf410458428046fe4c72689b919fa3f0c5e889799d3c86562d8b653fbce4423cad826d538f50f10c087da33360a6d3ecc37c9a6187 +ast|64-aarch64|0a0b4923c7931b674c2548b9ad7e88159dc73572c205643e19b8fbd68f6fe6a93708d06fe72d117b24edc59fc46ad5e7251985744377879b6b888ebb4f4248bf +az|64-aarch64|af70215efce022fc28e3bdfaff299e5f82df9c6b3bc32941d95504aa93106f27946f89c001c379a3b9f0dd8a473017c7f2b371d2bf0fda0555b2a41e2083721d +be|64-aarch64|5a83cfdc65db309ec8ef05099b07d5eab482838cc85b567144566e5dd717b9f4f065d1c738f095591201edec171083eea94e1e4348eeae62a6437f1d7b1efa9a +bg|64-aarch64|8d4a2b86eafa3c4701940f564fde8feee0ca2a8c2f95321630bc13acbd12bb588f6579f291e7c658677389bc070a1e20d378fa018263bcd2d664d5c1fc24e16c +bn|64-aarch64|088a66e9b2cd83b7ef6ac14f52a11603f11f2ec63b311de7ee791b7a3155183a19c74254cabcfd184612950d6c5899c4c1a8c3167a31d38ad56731d5836e8335 +br|64-aarch64|eeac0c9ed0e4d3f434c0d353933713cfb1b215a8ea255f3ff3e518ef2c188c710091ef263085842a046e0f5e901e16d8a1cfb7f48589893c061846ab5f6fa63b +bs|64-aarch64|64adeea4a3941559aca18353839de3296119cdddbf4d0dd6ad0b80442c92318fb91f82a53d87a69d1f3329da4249fb5e6a5c506d035215bf3f4083c783ebd3c6 +ca-valencia|64-aarch64|ae02d34b03d83cd120c4139ec73e9a7eeb661796812068493a3cc1810c0f8e77ee00bcc764c12906e2cefc5db3636ec8bf8a33b43baa18f936fe1fd8b39a5cf7 +ca|64-aarch64|c7fd530e51b5bb37341074f0b4cba4283650eafb062368bca6accf04085fd523d106c50a32a484595fbc8386c40e505ab13b299579d5438ac36a0e85b4da7326 +cak|64-aarch64|5604306ab6586f3489fe48b906448506a49dd4558e48ba1068c142747bcaddb607aae450dda132fd40a1de214a16e265e790e51cadcb240d21ad37dfc3e79045 +cs|64-aarch64|ca7541b6b18015abf804b37abc23295c6d5dc4fd975cfb3622d54ef6bab5d9e228615f6843fca48881a15ef7ea58d0eed08a8c5f8e0e3892e0de553afcc07e47 +cy|64-aarch64|257a34e5f79164c8fe4a70c2acf8fefaa4713ef6c1eac52733583513f079c035d4e6c94b464226209de2c86ffaf6506b0efad861f774aa001e33a97b055ebdd1 +da|64-aarch64|c6bb3b61c0423f1df017cd08dc28c94aa36f9d149885533889821c50c56729bb11912a56d970469caf03cc8aba3d091c48ffa87cc544b27e173161e61b2b527a +de|64-aarch64|42a89167f427daa00788a0bc1f807bc78236303c6e5b8e544cd06e9e6efbb7eed83947e394f0bf63ab061521b948a7434fe82ec4ad2930fb7bbe716447f89384 +dsb|64-aarch64|fa078f443925b2bb680a0b78d6d7be9eacac6d8d2b15b50e16387dae36667dabd7288c73967734b79095adc06fffb6276ea1b29d7da0c6262206f4fd9aeab9dc +el|64-aarch64|80f70aacba50815fd87f07672efc5273fd34422f5e96278c28e9e14a60e8b294005583eb41415f4d3e0191fa8666381fc0b68093a993d2eba7f4d86c920de2de +en-CA|64-aarch64|2a081577a963631ba32c6ca1bab9c65541512962225af34f7c2fd99a81b4ba9cc9a60da23995c46d99b01776420d61215f398943bedb9954a76ddd5139b9c3c4 +en-GB|64-aarch64|6ef1060734ad7260b40e0152ddd81391535e351e3edcd06bacf5825cef2d47305a31184d1d9d1173ba716a4f4f9afb06f52ea9a2a35c58c9ece10fe0799f2443 +en-US|64-aarch64|6e5a95a5c035b6a897c63e67f013a1b69ca69af64296ccefc67afc7daf0461df60af3a5c6356587638de2defd78884ccd716ce0144d9984018edb1cc253b9c82 +eo|64-aarch64|2f22f0bc16187ebb822f8607d374d949b031238c8329ab5859f6f4ec0303ee1820c3c78383bac9751d505532aa251f1e96c0dc1363ccbfcfd16532057d4bdc11 +es-AR|64-aarch64|c3ead6b5dd9c5aacadaccc14ff27f0ce0200ee90068cf279387a9f6d12bbd9d598ffabe8924fd94026a4cc3d72ffdb51f9f1b02fa9d40e74412d0d77b3c7a92d +es-CL|64-aarch64|09d5419fc01ea066a029a989852169f37d7d4a652d4d786ef73896ce1065209ce6f76393b005dc61a7827383e89209b0da569f0761c09151124a9f01c26d71e2 +es-ES|64-aarch64|6f7c3d4e244d63d21de0164d9d83423d44d68e7843b470225e96e9e7f3c1b98cc324cfcfeecf32a80e7d360b2777eed65f3f875199cdb6968b60975bcdac730f +es-MX|64-aarch64|12e43d55eab88b3344e02f556dc3dc71a386232874d9d5732946245bfc62413d03365ebdfaa8e05695cb7db0130c4eb225e614becffb48e9654f3193128d293a +et|64-aarch64|4448f2d0e028d37bb379603113bc99ed8a22d14dc1e9194c6204bff0737c0fad94f9bd490982add38cce6076775264076fabc8e2a03537beacdfe1dbef94e9b1 +eu|64-aarch64|835d374678f3d50d089d1ec752615811de6193db9c8e39ac8751e2f14933eb0e6bc8e3277c17d6d8fbf41ecada30d6c9d75646fca06b53f7188b7fa45cc1fb84 +fa|64-aarch64|c09c6d55d09f0d3c4df03226473290f7a44c71b47128bcd878865e40aae4ca42676f0ddc6cad7a2c4becd24ac4da0f210c199a9b562279e925503fa430d78c68 +ff|64-aarch64|e2d41aeb2ff2d702fdd363f59a39609fe9d14d05be3865e1e140cf7b9e61039353b29945e80040dabc853f4467c74994c8bb424720fe3a6f27705177eab6feeb +fi|64-aarch64|f9d9a6a9b74b721314443010ae5052df6d8c6804893f1d2f3f1991ea328aa27481d8fb7ad56f49b5316462eda305f6f5d3513cbf1f8005b73889022943b37874 +fr|64-aarch64|1993a142f75e1d232df0dc7d20c4a9bcd89ecfd37449301d5efcfcba053eabe7db64c113f8ead13262c2ee0b42653c94b47ef1b720d80ff73aa8f7e903517141 +fur|64-aarch64|80bf8d8ba24af4bafa09e22003ae602e76387a1ae38e38dd79942d18c45d575e0540941998c67651116cbc7b229e0b1ff547e809d2ba24f874ab693499d37da8 +fy-NL|64-aarch64|f7d228fedf794c2b3cec36bc29ded82f9e81fbd2816caf350f36a8f4140f44772cfe4ec08f0a1a64747951435da5d168a95aecba5d85d71d5961357a5a02112f +ga-IE|64-aarch64|37b5d3d98a778f647b6254f6fe94427923690671526d7ba44297819cfd4c050bb67c134704cc9cb9f4c7f253808bebb649b588d4d7dcca592ad9ff55d98a6264 +gd|64-aarch64|c71c8e09330c4409269ecee5385cc975045f47f0accc61eb2e1011875e8ae3e839a746aa8784c761904fd1422480732c281c0576e79fa41c5759c991b4c2e8d8 +gl|64-aarch64|2af20b4632e0df8127763198c7468486cd66f67b9c3f14d6eb527e922573b53f682fd4931fe9279292b2aab6b539802bedfc0d55bd36b4ddf137b27d8662d8d1 +gn|64-aarch64|24d9928856e9261bbcb85c9a608429526e0278047d7aea2682091b44b76aef62857285b3a70d86b270427ac3d70840b4e427c986fbab5edebf59006d7edba06a +gu-IN|64-aarch64|62ccc2dd33063d509e01e1bb81b4364749001701603ec23c04195251ffb8a1f5f13b94270de6eeaf729abd9f8c1b5d7377752ca9007d532ea5624fc3e6897cbb +he|64-aarch64|1e254e05cc559ec05b9c0733dd6929a4ee2045a12162a7d7ac05a2dd3a75b01fe5ae250b31df8c282fab0d6995e5a3952d0f8935665d313fd4f49e0d412eb408 +hi-IN|64-aarch64|4eafa1f5fc64d263270a00686efcf5b134fa3e66912410751226a3585cfe6940e4f132f6445fa76cd2cf082e956ced40d007baea48e03515d30a5c6e3f68ddfc +hr|64-aarch64|dd91ab658b25909bc2527f47176a0b67f1df557f3e75eaac7efdab10df22bc7014d935a0ceb1b29dd5bb41f4c1158f42dcf50c64055c53cca5eee2366ada331c +hsb|64-aarch64|b0d88e68c7ed56a799d4f9868a30d9bf4086243d50b6dbacc2ce78ae14dd955f52ab0b6fca73cbcdfc58dd380c7add52538c7cf5a84370c3a5ee2d08fa0fd58e +hu|64-aarch64|d0c5dec7955cf8e724a098dbe64a6f768420fda61acb2599eccfc3c30bac633b33959b664a9d4206b861aae247cb01bf2c943eab2d42cf95a1ea418e76d1c8f5 +hy-AM|64-aarch64|066f753c18c7ef769dfa2b2929462a81d5b18a83678265c2b601f34216a2eb8013c747428e6ecf3394cbda88b4dc755763c0a59accf9e30753fc798f5296927f +ia|64-aarch64|78d5f0acf6446205767b7f8981191e7142b3dc4077b0852ca15f0aae4d6bf20821359eaaca492ee3d821016c126c8906c908cfd4e28e2bd70c4fa2b103f02781 +id|64-aarch64|3101ceda33091c7c5c8021f06e3f6232ed40de7bec1facd39490af2e795d0f608028694e4e4e3a0992f4abc690d89e44af24eb8f24eb6b2efaebcef42c18e093 +is|64-aarch64|ebd9b0a6206359cc8fe583c4f2a39e97f9ad56fa48866270c60a1407610f1abfaa901560d95c6586880ef7a1f03bcd0d9de5652acee03b44930c926edec57fb5 +it|64-aarch64|3c8f6ae656b639f8c0511bffe51444a9bb49dbefbe8ca1ffda018d63af1616cbf8ca306361023ca16c7b3360d4e42ff51109fe9f567306a3b8f08e8dd3ccfbbe +ja|64-aarch64|d6f8ad9304cf5f9159eaa3954bc907b8da0370f5f6127feec80fdfcf825d6b61c475f9fbfaffe75895f6ffed6a5f12b4483e127ac0deeba5d004c432110fd604 +ka|64-aarch64|08cd9ba7ec4df017a4273ef013e8fe1b56ce6e4cf62365e1b5d9a3e2e07f34d86e35069ecfa438776f9b96184603bd1d2021a70747e2a35b837529612a1c49de +kab|64-aarch64|6110e08a96e13c5523e1de4cbec485c5c31f2f8248d60c480add2c37a070049a364c57d87c5140f3e2027b9be04a9e937b69d80559de5a0b576a37a8d717fcec +kk|64-aarch64|d57559da81bc0021b584abc9b33d546e787a0d75b59dfdcf2a262593622635bfe81d882af11714f5bbffee6062ed680123a195d1259c7735ee2cfedfa1ecda0a +km|64-aarch64|a8e9f0151204f0a661c9f04212d7f88a1faad1db4c877ba1ab44d16766de776d0975146849d6984a3f24f1f8227b7d9c520fb2a2acad51c0555ee2aab58e0b07 +kn|64-aarch64|8651b6279d3022571fc6dce2b5546b41a0835f7aa57e1d03d1e55451761d65f4328ae0703c7f8bf684f5359d129f85a300dc164e0507297cad3c6812ed11ce6e +ko|64-aarch64|03dea55c9ca853e0ce60d546442af8c5c72c90d12f04cbb24f4c7117d2cf882952cb8acb13c3d9ba71787bc11c2d314cd4a3b1ff35bf224297f4c056ae93e480 +lij|64-aarch64|506fe9c9e3ce0056ef3e657cf23b4a534e258e319c35061ace29f902daa657cb7c0ba7a97303d03b9fa5ef92625a3e22a6b2de5c4d697cb17c020baaafbaf401 +lt|64-aarch64|b4e1bbe99ffeb9d8d4d8e5b64ac341fbd378b6e4146c3d2ea955869b10ca7e749bfd91a77ef6fbc94420c12629267a2d87b24353da80a56dfefb2079ac33064f +lv|64-aarch64|26a80b8fa7b331e412dd9f1f3b95eb4518a43911ebe63847d4ca4fece502843ac15971a4dc29d612453db4443943ce3f5ad63da3c186c589e4902bac7c9b563f +mk|64-aarch64|e2bef16754596946f1556d731bfee6b857b7f7e092b5fb81fa7cafd6c174a0a608794954ad6c006171b19d6e018268f97a3b63340fedb6e0682365ff1e257ecf +mr|64-aarch64|5b420f2ec4a69a775ce07d9f2bbaf6689a7e590c1e93f6f8dc308d350f838aef149e2aa731f70bd472502733b2585aefd360ebd80a41c0e60f5f42cd5a004c7d +ms|64-aarch64|90c0aa2ae4697aa2a3c35b11a05e2f1d89b9d18b59334a0dd3483e34197a31b94bb2cbddc4f1f7b5aa31868be5d27c6d85513d914e4dd56a43ca73a09f2e4b01 +my|64-aarch64|f2e73ba9819a3efa49dac5d09616129907bf0a004bfe27fe361157b71553ea317d76d7fb59995e7d45d0532cdb87d5340205175b59b814c98682d5621c79b826 +nb-NO|64-aarch64|30bea52acd80ee8da35ffb468c5aa9869ef222709a8ab29f30d652334bc14aba2706f24f736a8687034aa7cc9c8ccf3f22f47e23198f5dcf0d163dfa4cebe69f +ne-NP|64-aarch64|62a5a77b044c8122f86c139c4ea9d037dc402569caf37d4612bd80ccc65a380d364108aa39013aac5678c1e2064830c08d693bc5e648966e02305ecf7bf06684 +nl|64-aarch64|c3476caf7a278f54c83a4bb45ee921977a5fc0876c822c7d23be80223c32a6594528f757bc2ef8bcbe264f4661d4b491657d8f294cc9b1f78e20f1611c63a7bc +nn-NO|64-aarch64|2543179a80df2e5485c60eee17d13898da9aacaa07ee89e6b90e86dbe239bb645fce2269bd665614997a057ffd0704a7876b9485588660aebd30a3002ec2fcdc +oc|64-aarch64|0034c1ca1280473a5a421da91ea2d7e79dea6299b1c662eca6774018ddbdee47bb9f0ebbf562e63689189e31506c18853bddd34c940fa19ca7ac3d2f652b009b +pa-IN|64-aarch64|e792e03b6939b12d4314bb1ca5ab8cc5b7b357c41fae66fb207bcf599d5937417f9e436af8fa5c90a11c5bf3c421b6facfa258d9038d7e7d7ac85219462afeab +pl|64-aarch64|9ba536034cf7e1086a19412674c6ebebfef95e2214fde7d6ad7f648dacd40ccc97e5ccec9e12e1bed7cbf25e11ff96110d33f04e435784839c8729d69c9a0483 +pt-BR|64-aarch64|a2a888f9134229626e1c873aef9e6b9771716440d2f3cba09496d310d8ddb21316e01940a1d82bd5782bd6b81c40d6143a13a3a7808ddf65759d08e286162572 +pt-PT|64-aarch64|a17af72ef9469be6d44ad8f471aec8dc1b8466bbbce9225435672fa2c56da7107968b5e354367cdd0c6d6004105e68c2518688a1f5dfdf0890d06f1190b58b90 +rm|64-aarch64|54823c578f1900571c683c7a7025a0c2d87633380999cccad73e586a89bb026140ab649692484d51735184b337c1f803b7c1f801cd8cfac4268e070dbb885b19 +ro|64-aarch64|cf93484a5497010527f7cf75f5de312ef453b5614720116e3350b5d93c83df3df48306c92190d4793c0ddddc23d055f58cf0da35701b74486b200136e9c22892 +ru|64-aarch64|7bf3992b6bb404f0e85601259de0278cf81920d938714ea919f83a5e5998ec82b0049c4cd49fcbad04c7c26498a378b573ded6e447717428640ed52998258818 +sat|64-aarch64|d0691c091c415dd85f09529259d41c206727038fc3797817e786eb06cd1ba2411dcd5a5e7781d8e5c16e8288a179cac9139d43f633b657348e75264db65755f5 +sc|64-aarch64|3d3f133811aed9a49988c7d05758ffd3f12d1c92fec3fc750bb800af324807b821662b9ea28c971ec798bbff8f8ed9187ff80b94946bb6ba44383b4d5375c073 +sco|64-aarch64|0c174ff311818a18aba3acc17bce290d451e8a84e790c60af6824bb001bbc2624faedf8a929dff28d205b58e9d9c28713f8314a5d1969755ed0efd455eece494 +si|64-aarch64|3a7f4275fcdb61bc98acad1b960b35773e3b77d1f9d859ac4b6b5474dbcf266c912727b77e8e8de7b48b244e19db539ff8151fd81be5165de3e613e134503622 +sk|64-aarch64|c9a69a88d0ca479bb1a4411865e671169f369e56cae2e6343f407d5d44af804cfde4c19e5bc8522e7fdff333163d40ccad4ffad0f43bd54317fc5d463bcb3fda +skr|64-aarch64|b669209138394e76c8c026f4b9584ae595aa389316a0e5875796b6040cc2677f4ba3506a5b0a75a458d048d87b91a92795ff613cfafe34fd33fbb43a23f421ab +sl|64-aarch64|d83386af6aa5134516804c1e3bbee4fd4d8c14640a9d119df1ad78bb93591f8e3557cf9013ce87b0462a14bc8230def499615085c717acc72190e3b9041eb5bd +son|64-aarch64|b6405039938b5059c9ea9a27c1eca013a6c58ef71432d22a3cf51397dd05b2a6a8933ac0651012c252b5a7e4b3180d6052c66e13a7e67c93521562f603d38122 +sq|64-aarch64|3d68fcac3189d04b73eb04ec2ec28bde404017e23294f894e4fdcde656b9f7f7792de35aa755869c636386f8e297caefc80ef31597a7c709a32234b727558692 +sr|64-aarch64|c10de116fb33e312fc865edf9962b9fc4f38fb38af2e55899b0a9cba67de545c84138b8fecb39d2474f8178b91e944f5333c3946aa99a0fbf958c7471521c4b0 +sv-SE|64-aarch64|0c10e9db2af8a5611ecd7cf43014911e183b4e7aabb8ff19cce00869239b257005d8274344f7e9512283240fdfa44a31a6eecf20d42c85560a417806c10abcc8 +szl|64-aarch64|6ac60abaa43ae95498db6b39031c883e9b686b942a0274903e6d372435226624e233b0cfb9f36be4fbc6811503a62e098b5bfbd759a41c599a8c38ac83b717c7 +ta|64-aarch64|439dbc1e4abbeb20d27ede250d554e550466554e034ea56b15a3364dccdbcb392dcf6aa36ae431c44fedb35d5733430d0ea3867b5168971b2b04099ea832caae +te|64-aarch64|f59a8f37e46467bec47cb81c37f2d561a966eb7ce1fe8c8fffcffae6984d3dc6f51f29466477d64abb966d02532008ca46dd4fe3fb5a5c66c6cd264c73400c56 +tg|64-aarch64|52fe6c1ada1fc73c6f6e9d4cd0aa767645bb783952187ef54a89f14c8c6e10833ecc5eaf6924822b4a4b7a0f588c45da884a748417d25483495836fcf72b1d23 +th|64-aarch64|b69a4dc384e8a0aeb33c1396468a29b301e9d53a0ea3e8f33452b5af3059d0e85c40c4ade72241bb8b363a1cadbbf8ce51c552cefb63ab9da444752baa7e604d +tl|64-aarch64|168ea521005b853c53352c4b2ebb92a8e977c45fcc8275f6269465cf9f2898166655f74d3ad63a81b125a1fbdb59355d2c6bb1d63911a13b075251451a99368e +tr|64-aarch64|230d5076ffd21a189d53d564a5f3b7b65b9dc4cc59af5d23bc4c13272cc8e376480884dc062a521fa9a978486c0ad2ddceb4995b8d6fee88d576af04b7e20b8c +trs|64-aarch64|01a629729d562658d3dd07ada0c13ebb77e8e8430b50859398240928a553820fa09eefbfa44a56a3163519397339b2727270f63058d7420d7caf77ce35dedcb8 +uk|64-aarch64|cd55c2dd45df805c9ec3cad5ce5c108daf3468ee0572b2ab968ff628d98a4b6e5a42a1922ec36ec21d07a1aaffab4eefca69691f5facf9f6f43dc2af9e7ac552 +ur|64-aarch64|5cf62c64bc401eefed70636e9cbfa486ce2b66d00203e552b34fe977f2c68af4944d4880b18b26223b1d2247f261ad1be98f7336d64e5e31bc94c0ece8ebd95d +uz|64-aarch64|b246fb4131cf5b351452a12837819518807c3f70e689b12f8961a3784253fbf7555f4d6dd3f149190dfca34f5abd5d24e3fde6ada9f7e7f07a27ce2e63b67937 +vi|64-aarch64|b57e5d82ce14d81348aa72820955b9b76cc3fcf8a26320f1cad0a1e3dfd472a78b05d670f8ebb7c7eb275907627affe268f02698a15d5f001b698a83ed43b6bc +xh|64-aarch64|1a7222a25772b7bb9d5f0e3150fcfb7e62c52407630895e6738c3f02e43d68f14b9b1919e470c464c69b26082f5ce597181e7aab24e9f91a16ed5cfb239cad57 +zh-CN|64-aarch64|8b48565086897336a2b2f165db14616e8704d1a3bb97e76c36c4afd17fa0dad18a4882a93b3c8140e6c7af080768b0340d975ddd23dad66c1c31fde77204b295 +zh-TW|64-aarch64|bede3945fb7fc8dee96fd69e31b5878ce6b71824b8b74d8667d84fbf258dd2b795630e8e53330369f271780a173df88c997a87475ce5c27bb85bf8cf4440e272 ach|64|b36504bf665c324484d7bceae1865f85e0d2af2f67d7ddd8da2147facf7052e838cc78cd0843e4983575ccb11948629fb5d83c21bbd3b143d0cba836a8d8e878 af|64|8e72639eb73db613361a4dd8505cab6c63a7d5672c6d9221709cf7fc895756076f7cd59634540afbbf88924a4fda3958d4465a195cc52030a7523b57d734224c an|64|41a91af7de7ee369aaf663f9c944426387be970e53e24074fae9a9d7571ef28ee099c4b5b38bf62e2d84486179ab6183ac5b554cab943be5ff5425c0706e632c diff --git a/automatic/firefox/tools/chocolateyInstall.ps1 b/automatic/firefox/tools/chocolateyInstall.ps1 index f0c86e6cf08..9e99fe34c88 100644 --- a/automatic/firefox/tools/chocolateyInstall.ps1 +++ b/automatic/firefox/tools/chocolateyInstall.ps1 @@ -56,23 +56,30 @@ else { $locale = GetLocale -localeFile "$toolsPath\LanguageChecksums.csv" -product $softwareName $checksums = GetChecksums -language $locale -checksumFile "$toolsPath\LanguageChecksums.csv" + # Map each architecture that Chocolatey can report to its matching Mozilla + # build (download "os" token + checksum). Adding a new architecture later + # (e.g. a future win64-riscv64 build) only needs another entry here plus a + # matching checksum column produced by the package's update script. The URLs + # are kept as literals so the automatic updater can bump their version. + $builds = @{ + 'x86' = @{ Url = "https://download.mozilla.org/?product=firefox-152.0.4-ssl&os=win&lang=${locale}"; Checksum = $checksums.Win32 } + 'x64' = @{ Url = "https://download.mozilla.org/?product=firefox-152.0.4-ssl&os=win64&lang=${locale}"; Checksum = $checksums.Win64 } + 'arm64' = @{ Url = "https://download.mozilla.org/?product=firefox-152.0.4-ssl&os=win64-aarch64&lang=${locale}"; Checksum = $checksums.Win64Arm64 } + } + + $build = Get-MozillaBuild -builds $builds -product $softwareName + $packageArgs = @{ packageName = $packageName fileType = 'exe' softwareName = "$softwareName*" - Checksum = $checksums.Win32 + Checksum = $build.Checksum ChecksumType = 'sha512' - Url = "https://download.mozilla.org/?product=firefox-152.0.4-ssl&os=win&lang=${locale}" + Url = $build.Url silentArgs = "$sa /S" validExitCodes = @(0) } - if (!(Get-32bitOnlyInstalled($softwareName)) -and (Get-OSArchitectureWidth 64)) { - $packageArgs.Checksum64 = $checksums.Win64 - $packageArgs.ChecksumType64 = 'sha512' - $packageArgs.Url64 = "https://download.mozilla.org/?product=firefox-152.0.4-ssl&os=win64&lang=${locale}" - } - Install-ChocolateyPackage @packageArgs } diff --git a/automatic/firefox/tools/helpers.ps1 b/automatic/firefox/tools/helpers.ps1 index 56bbcc1631f..9b8a10b4e5f 100644 --- a/automatic/firefox/tools/helpers.ps1 +++ b/automatic/firefox/tools/helpers.ps1 @@ -1,4 +1,4 @@ -function GetUninstallPath() { +function GetUninstallPath() { param( [Parameter(Mandatory = $true)] [string]$product @@ -142,11 +142,43 @@ function GetChecksums() { ) Write-Debug "Loading checksums from: $checksumFile" $checksumContent = Get-Content $checksumFile - $checksum32 = ($checksumContent -match "$language\|32") -split '\|' | Select-Object -Last 1 - $checksum64 = ($checksumContent -match "$language\|64") -split '\|' | Select-Object -Last 1 + # The trailing '\|' is required so the '64' pattern does not also match the + # '64-aarch64' rows (and vice versa). + $checksum32 = ($checksumContent -match "$language\|32\|") -split '\|' | Select-Object -Last 1 + $checksum64 = ($checksumContent -match "$language\|64\|") -split '\|' | Select-Object -Last 1 + $checksum64Arm = ($checksumContent -match "$language\|64-aarch64\|") -split '\|' | Select-Object -Last 1 return @{ - 'Win32' = $checksum32 - 'Win64' = $checksum64 + 'Win32' = $checksum32 + 'Win64' = $checksum64 + 'Win64Arm64' = $checksum64Arm } } + +function Get-MozillaBuild() { + # Selects the architecture-specific build to install from a map of + # architecture -> @{ Url; Checksum }. Honors the -x86 / --forcex86 flag first, + # then falls back to the native OS architecture reported by Chocolatey's + # Get-OSArchitecture (which is correct even when Chocolatey runs under x64 + # emulation on Windows on ARM). On older Chocolatey that function is absent, so + # we stay on x86/x64. A non-x64 build is only chosen when a checksum for it is + # available; otherwise we fall back to x64 (which also runs emulated on ARM64). + param( + [Parameter(Mandatory = $true)] + [hashtable]$builds, + [Parameter(Mandatory = $true)] + [string]$product + ) + + $architecture = 'x86' + if (!(Get-32bitOnlyInstalled $product) -and (Get-OSArchitectureWidth 64) -and ($env:chocolateyForceX86 -ne $true)) { + $architecture = 'x64' + $nativeArchitecture = if (Get-Command Get-OSArchitecture -ErrorAction SilentlyContinue) { Get-OSArchitecture } + if ($nativeArchitecture -and $builds.ContainsKey($nativeArchitecture) -and $builds[$nativeArchitecture].Checksum) { + $architecture = $nativeArchitecture + } + } + + Write-Verbose "Installing the $architecture build of $product" + return $builds[$architecture] +} diff --git a/automatic/firefox/update.ps1 b/automatic/firefox/update.ps1 index 7440ebb18a8..fdb677d95bf 100644 --- a/automatic/firefox/update.ps1 +++ b/automatic/firefox/update.ps1 @@ -31,12 +31,13 @@ function global:au_GetLatest { $streams = @{} $streams.Add("latest", @{ - LocaleURL = "$releases" - Version = $version - RemoteVersion = $version - Win32Format = $data.Win32Format - Win64Format = $data.Win64Format - SoftwareName = 'Mozilla Firefox' + LocaleURL = "$releases" + Version = $version + RemoteVersion = $version + Win32Format = $data.Win32Format + Win64Format = $data.Win64Format + Win64Arm64Format = $data.Win64Arm64Format + SoftwareName = 'Mozilla Firefox' ReleaseNotes = "https://www.mozilla.org/en-US/firefox/${version}/releasenotes/" PackageName = 'Firefox' ExeName = "Firefox Setup ${version}.exe" @@ -46,12 +47,13 @@ function global:au_GetLatest { $version = $data.Version $streams.Add('esr', @{ - LocaleURL = "$releasesESR" - Version = $version - RemoteVersion = $version - Win32Format = $data.Win32Format - Win64Format = $data.Win64Format - SoftwareName = 'Mozilla Firefox*ESR' + LocaleURL = "$releasesESR" + Version = $version + RemoteVersion = $version + Win32Format = $data.Win32Format + Win64Format = $data.Win64Format + Win64Arm64Format = $data.Win64Arm64Format + SoftwareName = 'Mozilla Firefox*ESR' ReleaseNotes = "https://www.mozilla.org/en-US/firefox/${version}/releaseNotes/" ExeName = "Firefox Setup ${version}esr.exe" PackageName = 'FirefoxESR' diff --git a/automatic/firefox/update_helper.ps1 b/automatic/firefox/update_helper.ps1 index 9ac0752331a..0d8039d18d2 100644 --- a/automatic/firefox/update_helper.ps1 +++ b/automatic/firefox/update_helper.ps1 @@ -1,6 +1,32 @@ import-module "$PSScriptRoot\..\..\scripts\au_extensions.psm1" $localeChecksumFile = 'LanguageChecksums.csv' +function GetMozillaUrlFormats() { + # Builds the per-architecture download URL formats from a base 'os=win' URL + # (with the version baked in and ${locale} left as a placeholder). Shared by + # the Firefox and Thunderbird update scripts. + param( + [Parameter(Mandatory = $true)] + [string]$Url, + [Parameter(Mandatory = $true)] + [string]$Version, + [bool]$Supports64Bit = $true + ) + + $result = @{ + Version = $Version + Win32Format = $Url -replace 'latest', $Version + } + + if ($Supports64Bit) { + $result += @{ + Win64Format = $Url -replace 'os=win', 'os=win64' -replace 'latest', $Version + Win64Arm64Format = $Url -replace 'os=win', 'os=win64-aarch64' -replace 'latest', $Version + } + } + return $result +} + function GetVersionAndUrlFormats() { param( [string]$UpdateUrl, @@ -20,17 +46,7 @@ function GetVersionAndUrlFormats() { $url = $url -replace 'esr-latest', "${version}esr" } - $result = @{ - Version = $version - Win32Format = $url -replace 'latest', $version - } - - if ($Supports64Bit) { - $result += @{ - Win64Format = $url -replace 'os=win', 'os=win64' -replace 'win32', 'win64' -replace 'latest', $version - } - } - return $result + return GetMozillaUrlFormats -Url $url -Version $version -Supports64Bit $Supports64Bit } function CreateChecksumsFile() { @@ -50,7 +66,8 @@ function CreateChecksumsFile() { $reOpts = [System.Text.RegularExpressions.RegexOptions]::Multiline ` -bor [System.Text.RegularExpressions.RegexOptions]::IgnoreCase - $checksumRows = [regex]::Matches("$allChecksums", "^(?:b')?([a-f\d]+)'?\s*win(32|64)\/([a-z\-]+)\/$ExecutableName\s*$", $reOpts) | ForEach-Object { + # 'win64-aarch64' is listed first so the alternation prefers it over 'win64'. + $checksumRows = [regex]::Matches("$allChecksums", "^(?:b')?([a-f\d]+)'?\s*win(64-aarch64|64|32)\/([a-z\-]+)\/$ExecutableName\s*$", $reOpts) | ForEach-Object { return "$($_.Groups[3].Value)|$($_.Groups[2].Value)|$($_.Groups[1].Value)" } @@ -68,17 +85,22 @@ function SearchAndReplace() { [bool]$Supports64Bit = $true ) + # The download URLs are matched on their "os" token so each architecture's + # literal in the $builds map is updated independently. The token boundaries + # ('os=win&' vs 'os=win64&' vs 'os=win64-aarch64&') keep the patterns from + # overlapping. $installReplacements = @{ "(?i)(^[$]packageName\s*=\s*)('.*')" = "`$1'$($Data.PackageName)'" "(?i)(^[$]softwareName\s*=\s*)('.*')" = "`$1'$($Data.SoftwareName)'" "(?i)(-version\s*)('.*')" = "`$1'$($Data.RemoteVersion)'" - '(?i)(\s*Url\s*=\s*)(".*")' = "`$1`"$($Data.Win32Format)`"" + '(?i)"[^"]*[?&]os=win&[^"]*"' = "`"$($Data.Win32Format)`"" '(?i)(\s*\-(checksum|locale)File\s*)".*"' = "`$1`"`$toolsPath\$localeChecksumFile`"" } if ($Supports64Bit) { $installReplacements += @{ - '(?i)(\.Url64\s*=\s*)(".*")' = "`$1`"$($Data.Win64Format)`"" + '(?i)"[^"]*[?&]os=win64&[^"]*"' = "`"$($Data.Win64Format)`"" + '(?i)"[^"]*[?&]os=win64-aarch64&[^"]*"' = "`"$($Data.Win64Arm64Format)`"" } }