lists.torproject.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

tbb-commits

Thread Start a new thread
Threads by month
  • ----- 2025 -----
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
tbb-commits@lists.torproject.org

  • 1 participants
  • 19102 discussions
[Git][tpo/applications/tor-browser] Pushed new tag FIREFOX_128_8_0esr_BUILD1
by ma1 (@ma1) 25 Feb '25

25 Feb '25
ma1 pushed new tag FIREFOX_128_8_0esr_BUILD1 at The Tor Project / Applications / Tor Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/FIREFOX_1… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new branch tor-browser-128.8.0esr-14.0-1
by ma1 (@ma1) 25 Feb '25

25 Feb '25
ma1 pushed new branch tor-browser-128.8.0esr-14.0-1 at The Tor Project / Applications / Tor Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new branch base-browser-128.8.0esr-14.0-1
by ma1 (@ma1) 25 Feb '25

25 Feb '25
ma1 pushed new branch base-browser-128.8.0esr-14.0-1 at The Tor Project / Applications / Tor Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-128.7.0esr-14.5-1] fixup! MB 213: Customize the search engines list
by morgan (@morgan) 24 Feb '25

24 Feb '25
morgan pushed to branch mullvad-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Mullvad Browser Commits: b4851e25 by Pier Angelo Vendrame at 2025-02-24T17:14:27+01:00 fixup! MB 213: Customize the search engines list MB 395: Make Leta the default search engine. - - - - - 1 changed file: - toolkit/components/search/content/mullvadBrowserSearchEngines.json Changes: ===================================== toolkit/components/search/content/mullvadBrowserSearchEngines.json ===================================== @@ -1,48 +1,48 @@ [ { - "aliases": ["duckduckgo", "ddg"], - "name": "DuckDuckGo", + "aliases": ["mullvad-leta", "leta", "mullvad", "ml"], + "name": "Mullvad Leta", "urls": { "search": { - "base": "https://duckduckgo.com/", + "base": "https://leta.mullvad.net/", "params": [], "searchTermParamName": "q" } }, - "id": "04e99a38-13ee-47d8-8aa4-64482b3dea99", - "identifier": "ddg", + "id": "ee88d691-6d7a-4adb-9fec-5a205565505a", + "identifier": "mullvad-leta", "recordType": "engine", "orderHint": 100, "variants": [] }, { - "aliases": ["ddg-html", "duckduckgohtml", "ddgh"], - "name": "DuckDuckGo (HTML)", + "aliases": ["duckduckgo", "ddg"], + "name": "DuckDuckGo", "urls": { "search": { - "base": "https://html.duckduckgo.com/html/", + "base": "https://duckduckgo.com/", "params": [], "searchTermParamName": "q" } }, - "id": "98d8c84b-7455-431d-98b9-890e7bcc0041", - "identifier": "ddg-html", + "id": "04e99a38-13ee-47d8-8aa4-64482b3dea99", + "identifier": "ddg", "recordType": "engine", "orderHint": 90, "variants": [] }, { - "aliases": ["mullvad-leta", "leta", "mullvad", "ml"], - "name": "Mullvad Leta", + "aliases": ["ddg-html", "duckduckgohtml", "ddgh"], + "name": "DuckDuckGo (HTML)", "urls": { "search": { - "base": "https://leta.mullvad.net/", + "base": "https://html.duckduckgo.com/html/", "params": [], "searchTermParamName": "q" } }, - "id": "ee88d691-6d7a-4adb-9fec-5a205565505a", - "identifier": "mullvad-leta", + "id": "98d8c84b-7455-431d-98b9-890e7bcc0041", + "identifier": "ddg-html", "recordType": "engine", "orderHint": 80, "variants": [] View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/b48… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/b48… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] fixup! TB 42669: [android] Use custom no-op app-services
by Dan Ballard (@dan) 20 Feb '25

20 Feb '25
Dan Ballard pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 4b5dd7c9 by clairehurst at 2025-02-20T14:14:29-07:00 fixup! TB 42669: [android] Use custom no-op app-services - - - - - 1 changed file: - tools/geckoview/build-fenix.sh Changes: ===================================== tools/geckoview/build-fenix.sh ===================================== @@ -6,8 +6,6 @@ VARIANT=$3 source android-env.sh -export NIMBUS_FML=$DEV_ROOT/mobile/android/fenix/app/nimbus-fml - cd $DEV_ROOT/mobile/android/fenix MOZCONFIG=mozconfig-android-$ARCH $GRADLE_HOME/bin/gradle --no-daemon -Dorg.gradle.jvmargs=-Xmx20g -PdisableOptimization assemble$VARIANT tools/tba-sign-devbuilds.sh View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4b5dd7c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4b5dd7c… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] fixup! fixup! [android] Modify build system
by Dan Ballard (@dan) 20 Feb '25

20 Feb '25
Dan Ballard pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 8cee8bc2 by Dan Ballard at 2025-02-20T18:24:27+00:00 fixup! fixup! [android] Modify build system bug 42669: fenix dir missing from nimbusFml path - - - - - 1 changed file: - mobile/android/fenix/app/build.gradle Changes: ===================================== mobile/android/fenix/app/build.gradle ===================================== @@ -315,7 +315,7 @@ android.applicationVariants.configureEach { variant -> if (project.hasProperty("disableTor")) { disableTor = project.getProperty("disableTor") } - System.setProperty("nimbusFml", "${topsrcdir}/mobile/android/tools/nimbus-fml") + System.setProperty("nimbusFml", "${topsrcdir}/mobile/android/fenix/tools/nimbus-fml") println("----------------------------------------------") println("Variant name: " + variant.name) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8cee8bc… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8cee8bc… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] 3 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...
by morgan (@morgan) 20 Feb '25

20 Feb '25
morgan pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 8e663084 by Henry Wilkes at 2025-02-20T17:30:12+00:00 fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection TB 43328: Improve the Tor log dialog. - - - - - 0cc2f849 by Henry Wilkes at 2025-02-20T17:38:02+00:00 fixup! TB 40933: Add tor-launcher functionality TB 43328: Make getLog return the LogEntry data. - - - - - 21c61532 by Henry Wilkes at 2025-02-20T17:38:03+00:00 fixup! Tor Browser strings TB 43328: Improve the Tor log. - - - - - 5 changed files: - browser/components/torpreferences/content/torLogDialog.js - browser/components/torpreferences/content/torLogDialog.xhtml - browser/components/torpreferences/content/torPreferences.css - toolkit/components/tor-launcher/TorProvider.sys.mjs - toolkit/locales/en-US/toolkit/global/tor-browser.ftl Changes: ===================================== browser/components/torpreferences/content/torLogDialog.js ===================================== @@ -4,20 +4,18 @@ const { setTimeout, clearTimeout } = ChromeUtils.importESModule( "resource://gre/modules/Timer.sys.mjs" ); -const { TorProviderBuilder } = ChromeUtils.importESModule( +const { TorProviderBuilder, TorProviderTopics } = ChromeUtils.importESModule( "resource://gre/modules/TorProviderBuilder.sys.mjs" ); -window.addEventListener( - "DOMContentLoaded", - () => { +const gTorLogDialog = { + init() { const dialog = document.getElementById("torPreferences-torLog-dialog"); const copyLogButton = dialog.getButton("extra1"); copyLogButton.setAttribute("data-l10n-id", "tor-log-dialog-copy-button"); - const logText = document.getElementById( - "torPreferences-torDialog-textarea" - ); + this._logTable = document.getElementById("tor-log-table"); + this._logBody = document.getElementById("tor-log-body"); let restoreButtonTimeout = null; copyLogButton.addEventListener("command", () => { @@ -25,7 +23,14 @@ window.addEventListener( let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService( Ci.nsIClipboardHelper ); - clipboard.copyString(logText.value); + // The copied text should match the text content the user would get if + // they hand-selected the entire table. + clipboard.copyString( + Array.from( + this._logTable.querySelectorAll("td"), + el => el.textContent + ).join("\n") + ); copyLogButton.setAttribute( "data-l10n-id", @@ -47,13 +52,79 @@ window.addEventListener( }, RESTORE_TIME); }); + // Intercept the copy event. + // NOTE: We attach this to the window rather than the _logTable because if + // the whole table is selected it will not receive the "copy" event. + window.addEventListener("copy", event => { + event.preventDefault(); + event.clipboardData.setData( + "text", + // By default the selected text will insert "\n\t" between the <td> + // elements, which separates the timestamp from the message column. + // We drop this "\t" character, to just keep the "\n". + window.getSelection().toString().replace(/^\t/gm, "") + ); + }); + // A waiting state should not be needed at this point. // Also, we probably cannot even arrive here if the provider failed to // initialize, otherwise we could use a try/catch, and write the exception // text in the logs, instead. - TorProviderBuilder.build().then( - provider => (logText.value = provider.getLog()) - ); + TorProviderBuilder.build().then(provider => { + Services.obs.addObserver(this, TorProviderTopics.TorLog); + window.addEventListener( + "unload", + () => { + Services.obs.removeObserver(this, TorProviderTopics.TorLog); + }, + { once: true } + ); + + for (const logEntry of provider.getLog()) { + this.addLogEntry(logEntry, true); + } + // Set the initial scroll to the bottom. + this._logTable.scrollTo({ + top: this._logTable.scrollTopMax, + behaviour: "instant", + }); + }); + }, + + observe(subject, topic) { + if (topic === TorProviderTopics.TorLog) { + this.addLogEntry(subject.wrappedJSObject, false); + } + }, + + addLogEntry(logEntry, initial) { + const timeEl = document.createElement("td"); + timeEl.textContent = logEntry.timestamp; + timeEl.classList.add("time"); + const messageEl = document.createElement("td"); + messageEl.textContent = `[${logEntry.type}] ${logEntry.msg}`; + messageEl.classList.add("message"); + + const row = document.createElement("tr"); + row.append(timeEl, messageEl); + + // If this is a new entry, and we are currently scrolled to the bottom (with + // a 6px allowance) we keep the scroll position at the bottom to "follow" + // the updates. + const scrollToBottom = + !initial && this._logTable.scrollTop >= this._logTable.scrollTopMax - 6; + + this._logBody.append(row); + if (scrollToBottom) { + this._logTable.scrollTo({ top: this._logTable.scrollTopMax }); + } + }, +}; + +window.addEventListener( + "DOMContentLoaded", + () => { + gTorLogDialog.init(); }, { once: true } ); ===================================== browser/components/torpreferences/content/torLogDialog.xhtml ===================================== @@ -23,10 +23,33 @@ <script src="chrome://browser/content/torpreferences/torLogDialog.js" /> - <html:textarea - id="torPreferences-torDialog-textarea" - multiline="true" - readonly="true" - /> + <!-- We use a <table> element rather than a <ol>. A table structure allows + - screen reader users to navigate within one column so they can avoid the + - readback of the timestamp on every row. See tor-browser#43328. + - NOTE: We add the explicit role="table". Whilst this should not be + - neccessary, nor is it recommended, some screen readers (Orca 46) do not + - read out the default table role if the CSS `display` is not `table`. + - NOTE: Even though this table is updated with live information, we do + - not want to make this an aria-live area or use a "log updated" + - notification because the log messages are potentially busy. + - Moreover, the live updates is a convience so that the log doesn't need + - to be manually refreshed, rather than important information. + - NOTE: We add a tabindex=0 to make this element focusable with or + - without the overflow. This also makes the table the the initial focus + - of the dialog. + - NOTE: We add lang="en" and dir="ltr" to the <tbody> since the content + - of the log is in English. We do not add this to the <table> element + - since its aria-label is localised and we want the scrollbar to match + - the locale direction. + - NOTE: We avoid any whitespace between the <table> and <tbody> to ensure + - it does not contribute to the text content when the top of the table is + - manually copied. --> + <html:table + id="tor-log-table" + role="table" + data-l10n-id="tor-log-dialog-table" + tabindex="0" + ><html:tbody id="tor-log-body" lang="en" dir="ltr"></html:tbody + ></html:table> </dialog> </window> ===================================== browser/components/torpreferences/content/torPreferences.css ===================================== @@ -1058,12 +1058,39 @@ groupbox#torPreferences-bridges-group textarea { } /* Tor logs dialog */ -textarea#torPreferences-torDialog-textarea { +#tor-log-table { flex: 1 0 auto; - font-family: monospace; - font-size: 0.8em; - white-space: pre; overflow: auto; - /* 10 lines */ min-height: 20em; + height: 20em; + display: flex; + flex-direction: column; + padding: var(--space-small); + margin-block-end: 4px; + border: 1px solid var(--in-content-box-border-color); + border-radius: var(--border-radius-small); + font-size: var(--font-size-small); +} + +#tor-log-body, +#tor-log-table tr { + display: contents; +} + +#tor-log-table td { + flex: 0 0 auto; + padding: 0; +} + +#tor-log-table td.time { + color: var(--text-color-deemphasized); + margin-block-end: var(--space-xsmall); +} + +#tor-log-table td.message { + overflow-wrap: anywhere; +} + +#tor-log-table tr:not(:last-of-type) td.message { + margin-block-end: var(--space-medium); } ===================================== toolkit/components/tor-launcher/TorProvider.sys.mjs ===================================== @@ -512,14 +512,12 @@ export class TorProvider { } /** - * Returns captured log message as a text string (one message per line). + * Returns captured log messages. * - * @returns {string} The logs we collected from the tor daemon so far + * @returns {LogEntry[]} The logs we collected from the tor daemon so far. */ getLog() { - return this.#logs - .map(logObj => `${logObj.timestamp} [${logObj.type}] ${logObj.msg}`) - .join(TorLauncherUtil.isWindows ? "\r\n" : "\n"); + return structuredClone(this.#logs); } /** ===================================== toolkit/locales/en-US/toolkit/global/tor-browser.ftl ===================================== @@ -423,6 +423,9 @@ tor-view-log-button = View log… # "log" is a noun, referring to the recorded text output of the Tor process. tor-log-dialog-title = .title = Tor log +# The screen-reader name for the Tor log table. Should match the dialog title. +tor-log-dialog-table = + .aria-label = { tor-log-dialog-title.title } # "log" is a noun, referring to the recorded text output of the Tor process. tor-log-dialog-copy-button = .label = Copy Tor log to clipboard View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8aa4f8… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8aa4f8… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][maint-14.0] bug 41337: always copy gcc/stdlibc++ into firefox and remove from tor-expert-bundle
by Dan Ballard (@dan) 20 Feb '25

20 Feb '25
Dan Ballard pushed to branch maint-14.0 at The Tor Project / Applications / tor-browser-build Commits: 90a754f9 by Dan Ballard at 2025-02-19T13:50:34-08:00 bug 41337: always copy gcc/stdlibc++ into firefox and remove from tor-expert-bundle - - - - - 4 changed files: - projects/browser/build - projects/firefox/build - projects/tor/README.md - projects/tor/build Changes: ===================================== projects/browser/build ===================================== @@ -120,12 +120,6 @@ mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b # Move tor and dependencies to where TB expects them mv_tbdir tor/* "$TORBINPATH" - # on linux, libstdc++ lives in it's own directory - [% IF c("var/linux") %] - mkdir -p "$TBDIR/$TORBINPATH/libstdc++" - mv "$TBDIR/$TORBINPATH"/libstdc++.so.* "$TBDIR/$TORBINPATH/libstdc++" - [% END %] - # the expert bundle includes tor-gencert, which isn't needed for browser releases [% IF c("var/windows") %] rm "$TBDIR/$TORBINPATH/tor-gencert.exe" @@ -189,6 +183,13 @@ tar -C "${TB_STAGE_DIR}" -xf [% c('input_files_by_name/firefox') %]/browser.tar. done popd rm -rf $TMP_MANUAL_PATH + + # on linux, libstdc++ lives in it's own directory + [% IF c("var/linux") %] + # For legacy reasons, libstdc++ is with tor binaries in Tor Browser. + # We would have to test the updater to move it outside. + mv "$TBDIR/libstdc++" "$TBDIR/$TORBINPATH/libstdc++" + [% END %] [% END -%] [% IF c("var/namecoin") %] ===================================== projects/firefox/build ===================================== @@ -329,16 +329,20 @@ END; [% IF c("var/linux") -%] /var/tmp/dist/gcc/bin/g++ $rootdir/abicheck.cc -o Browser/abicheck -std=c++17 - [% IF !c("var/tor-browser") -%] - libdest=Browser/libstdc++ - mkdir -p "$libdest" - # FIXME: tor-browser-build#40749 - cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.* "$libdest" - [% IF c("var/asan") -%] - cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libasan.so.* "$libdest" - cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libubsan.so.* "$libdest" - [% END -%] + libdest=Browser/libstdc++ + mkdir -p "$libdest" + # Not copying libstdc++.so.* as that dups with the full libstdc++.so.6.0.xx the .6 links to + # and libstdc++.so.6.0.28-gdb.py which is also not needed + cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.* "$libdest" + [% IF c("var/asan") -%] + cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libasan.so.* "$libdest" + cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libubsan.so.* "$libdest" [% END -%] + # Strip and generate debuginfo for libs + for LIB in "$libdest"/*so* + do + "$STRIP" "$LIB" + done [% END -%] echo "Starting to package artifacts $(date)" ===================================== projects/tor/README.md ===================================== @@ -38,8 +38,5 @@ We plan to do it also on desktop platforms, see ## Other Linux libraries -For Linux we also include here libstdc++ (and the sanitizers, if enabled), even -though they aren't needed by tor. - -Also, on we provide debug symbols, but only for Linux, and only in +For Linux we provide debug symbols, but only for Linux, and only in `tor-expert-bundle`. ===================================== projects/tor/build ===================================== @@ -52,22 +52,7 @@ openssldir=/var/tmp/dist/openssl cp $openssldir/lib/libssl.so.3 "$TORBINDIR" cp $openssldir/lib/libcrypto.so.3 "$TORBINDIR" cp $libeventdir/lib/libevent-2.1.so.7 "$TORBINDIR" - # We need to copy the libstdc++.so.6 for Tor Browser on older Linux distros. - # Copying it into /Browser, which feels more natural, and amending - # LD_LIBRARY_PATH breaks updates from a Tor Browser with the old - # LD_LIBRARY_PATH value to the Tor Browser with the newer one. Thus, we copy - # the libstdc++ into the directory with the libs tor depends on, too. See bug - # 13359 for further details. - libdir=[% c("var/libdir") %] - [% IF c("var/linux-cross") -%] - libdir="[% c("var/crosstarget") %]/$libdir" - [% END -%] - cp "/var/tmp/dist/gcc/$libdir/libstdc++.so.6" "$TORBINDIR" - [% IF c("var/asan") -%] - cp "/var/tmp/dist/gcc/$libdir/libasan.so.6" "$TORBINDIR" - cp "/var/tmp/dist/gcc/$libdir/libubsan.so.1" "$TORBINDIR" - [% END -%] - chmod 700 "$TORBINDIR"/*.so* + # This is needed to make RPATH unavailable. See bug 9150. export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$TORBINDIR" [% END %] @@ -136,17 +121,9 @@ cd $distdir do LIB=`basename $i` - if [ $LIB == 'libstdc++.so.6' ]; then - # keeping this separate to maintain reproducibility; we can probably - # treat this the same as the rest (though it seems libstdc++ doesn't come with - # any useful debug symbols since we don't build it, so maybe we should figure - # out how to package them - "$STRIP" "$TORBINDIR/$LIB" - else - "$OBJCOPY" --only-keep-debug "$TORBINDIR/$LIB" "$TORDEBUGDIR/$LIB" - "$STRIP" "$TORBINDIR/$LIB" - "$OBJCOPY" --add-gnu-debuglink="$TORDEBUGDIR/$LIB" "$TORBINDIR/$LIB" - fi + "$OBJCOPY" --only-keep-debug "$TORBINDIR/$LIB" "$TORDEBUGDIR/$LIB" + "$STRIP" "$TORBINDIR/$LIB" + "$OBJCOPY" --add-gnu-debuglink="$TORDEBUGDIR/$LIB" "$TORBINDIR/$LIB" done [% END %] View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/9… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/9… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Update uplift and add backport issue template for consistency with tor-browser
by morgan (@morgan) 20 Feb '25

20 Feb '25
morgan pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: fa7e94b4 by Morgan at 2025-02-20T14:59:12+00:00 Update uplift and add backport issue template for consistency with tor-browser - - - - - 2 changed files: - + .gitlab/issue_templates/Backport.md - .gitlab/issue_templates/Uplift.md Changes: ===================================== .gitlab/issue_templates/Backport.md ===================================== @@ -0,0 +1,29 @@ +<!-- +Title: + Backport tor-browser-build-browser#12345: Title of Issue + +This is an issue for tracking back-porting a patch-set (e.g. from main to maint-14.0) +--> + +## Backport Patchset + +### Book-keeping + +#### Gitlab Issue(s) +- tor-browser#12345 +- mullvad-browser#123 +- tor-browser-build#12345 + +#### Merge Request(s) +- tor-browser-build!1234 + +#### Target Channels + +- [ ] maint-14.0 +- [ ] maint-13.5 + +### Notes + +<!-- whatever additional info, context, etc that would be helpful for backporting --> + +/label ~"Apps::Type::Backport" ===================================== .gitlab/issue_templates/Uplift.md ===================================== @@ -1,17 +1,25 @@ <!-- Title: Uplift tor-browser-build#12345: Title of Issue + +This is an issue for tracking uplift of a patch-set to an upstream build-dependency (e.g. MinGW, clang, etc) + --> -# Uplift Patchset +## Uplift Patchset -## Gitlab Issue(s) +### Book-keeping + +#### Gitlab Issue(s) - tor-browser-build#12345 -## Upstream Project Issue(s): +#### Merge Request(s) +- tor-browser-build!1234 + +#### Upstream Project Issue(s): -## Notes +### Notes <!-- whatever additional info, context, etc that would be helpful for uplifting --> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-128.7.0esr-14.5-1] 2 commits: fixup! Adding issue and merge request templates
by morgan (@morgan) 20 Feb '25

20 Feb '25
morgan pushed to branch mullvad-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Mullvad Browser Commits: a4dcc590 by Morgan at 2025-02-20T14:41:28+00:00 fixup! Adding issue and merge request templates add backport template and tweak the uplift template - - - - - 3551913c by Morgan at 2025-02-20T14:46:09+00:00 fixup! MB 188: Customize Gitlab Issue and Merge templates tweak backport temlpate for mullvad-browser - - - - - 1 changed file: - + .gitlab/issue_templates/Backport.md Changes: ===================================== .gitlab/issue_templates/Backport.md ===================================== @@ -0,0 +1,27 @@ +<!-- +Title: + Backport mullvad-browser#123: Title of Issue + +This is an issue for tracking back-porting a patch-set (e.g. from Alpha to Stable) +--> + +## Backport Patchset + +### Book-keeping + +#### Gitlab Issue(s) +- tor-browser#12345 +- mullvad-browser#123 + +#### Merge Request(s) +- mullvad-browser!123 + +#### Target Channels + +- [ ] Stable + +### Notes + +<!-- whatever additional info, context, etc that would be helpful for backporting --> + +/label ~"Apps::Type::Backport" View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/db… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/db… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] fixup! Adding issue and merge request templates
by morgan (@morgan) 20 Feb '25

20 Feb '25
morgan pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 8aa4f8c7 by Morgan at 2025-02-20T14:38:14+00:00 fixup! Adding issue and merge request templates add backport template and tweak the uplift template - - - - - 2 changed files: - + .gitlab/issue_templates/Backport.md - .gitlab/issue_templates/Uplift.md Changes: ===================================== .gitlab/issue_templates/Backport.md ===================================== @@ -0,0 +1,28 @@ +<!-- +Title: + Backport tor-browser#12345: Title of Issue + +This is an issue for tracking back-porting a patch-set (e.g. from Alpha to Stable) +--> + +## Backport Patchset + +### Book-keeping + +#### Gitlab Issue(s) +- tor-browser#12345 +- mullvad-browser#123 + +#### Merge Request(s) +- tor-browser!123 + +#### Target Channels + +- [ ] Stable +- [ ] Legacy + +### Notes + +<!-- whatever additional info, context, etc that would be helpful for backporting --> + +/label ~"Apps::Type::Backport" ===================================== .gitlab/issue_templates/Uplift.md ===================================== @@ -1,18 +1,25 @@ <!-- Title: Uplift tor-browser#12345: Title of Issue + +This is an issue for tracking uplift of a patch-set to Firefox --> -# Uplift Patchset +## Uplift Patchset + +### Book-keeping -## Gitlab Issue(s) +#### Gitlab Issue(s) - tor-browser#12345 -- mullvad-browser#12345 +- mullvad-browser#123 + +#### Merge Request(s) +- tor-browser!123 -## Upstream Mozilla Issue(s): +#### Upstream Mozilla Issue(s): - https://bugzilla.mozilla.org/show_bug.cgi?id=12345 -## Notes +### Notes <!-- whatever additional info, context, etc that would be helpful for uplifting --> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8aa4f8c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8aa4f8c… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] fixup! TB 42669: [android] Use custom no-op app-services
by Dan Ballard (@dan) 19 Feb '25

19 Feb '25
Dan Ballard pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 6c42a1f6 by Dan Ballard at 2025-02-19T18:04:53+00:00 fixup! TB 42669: [android] Use custom no-op app-services Bug 42669: use topsrcdir as defined by us in local.properties for gradle to support different project dirs in AS - - - - - 1 changed file: - mobile/android/fenix/app/build.gradle Changes: ===================================== mobile/android/fenix/app/build.gradle ===================================== @@ -315,8 +315,7 @@ android.applicationVariants.configureEach { variant -> if (project.hasProperty("disableTor")) { disableTor = project.getProperty("disableTor") } - System.setProperty("nimbusFml", rootProject.projectDir.toPath().resolve("tools").resolve("nimbus-fml").toAbsolutePath().toString()) - + System.setProperty("nimbusFml", "${topsrcdir}/mobile/android/tools/nimbus-fml") println("----------------------------------------------") println("Variant name: " + variant.name) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6c42a1f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6c42a1f… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-128.7.0esr-14.5-1] 2 commits: dropme! BB 40925: Implemented the Security Level component
by morgan (@morgan) 19 Feb '25

19 Feb '25
morgan pushed to branch mullvad-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 155722f5 by Pier Angelo Vendrame at 2025-02-19T14:29:30+00:00 dropme! BB 40925: Implemented the Security Level component BB 43498: Remove our old patch for 43129. This commit should be ignored at the next rebase (and we will likely have a conflict on the security level commit). - - - - - db2459bd by Pier Angelo Vendrame at 2025-02-19T14:29:30+00:00 Bug 1923260 - Exempt Android resources from svg.disabled. r=peterv Differential Revision: https://phabricator.services.mozilla.com/D224895 - - - - - 1 changed file: - dom/base/nsNodeInfoManager.cpp Changes: ===================================== dom/base/nsNodeInfoManager.cpp ===================================== @@ -344,16 +344,6 @@ void nsNodeInfoManager::RemoveNodeInfo(NodeInfo* aNodeInfo) { } static bool IsSystemOrAddonOrAboutPrincipal(nsIPrincipal* aPrincipal) { -#ifdef ANDROID - if (aPrincipal->SchemeIs("resource")) { - nsAutoCString spec; - aPrincipal->GetAsciiSpec(spec); - if (StringBeginsWith(spec, "resource://android/assets/"_ns)) { - return true; - } - } -#endif - return aPrincipal->IsSystemPrincipal() || BasePrincipal::Cast(aPrincipal)->AddonPolicy() || // NOTE: about:blank and about:srcdoc inherit the principal of their @@ -361,6 +351,21 @@ static bool IsSystemOrAddonOrAboutPrincipal(nsIPrincipal* aPrincipal) { aPrincipal->SchemeIs("about"); } +static bool IsAndroidResource(nsIURI* aURI) { +#ifdef ANDROID + if (aURI->SchemeIs("resource")) { + nsAutoCString host, path; + aURI->GetHost(host); + aURI->GetFilePath(path); + if (host.EqualsLiteral("android") && + StringBeginsWith(path, "/assets/"_ns)) { + return true; + } + } +#endif + return false; +} + bool nsNodeInfoManager::InternalSVGEnabled() { MOZ_ASSERT(!mSVGEnabled, "Caller should use the cached mSVGEnabled!"); @@ -386,6 +391,7 @@ bool nsNodeInfoManager::InternalSVGEnabled() { // of system or add-on UI or about: page) bool conclusion = (SVGEnabled || IsSystemOrAddonOrAboutPrincipal(mPrincipal) || + IsAndroidResource(mDocument->GetDocumentURI()) || (loadInfo && (loadInfo->GetExternalContentPolicyType() == ExtContentPolicy::TYPE_IMAGE || View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/5b… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/5b… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41372: Fix rename-branding-strings.py path.
by boklm (@boklm) 19 Feb '25

19 Feb '25
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: a395d359 by Henry Wilkes at 2025-02-19T14:11:51+00:00 Bug 41372: Fix rename-branding-strings.py path. - - - - - 1 changed file: - projects/firefox/build Changes: ===================================== projects/firefox/build ===================================== @@ -178,8 +178,8 @@ branding_dir=browser/branding/[% c("var/branding_directory_prefix") %]-[% c("var mkdir -p "$l10n_branding_dir" # Convert the translations repository branding files into files that work # for this specific build. - python3 rename-branding-strings.py $lang/branding/brand.ftl "$brand_ftl_renames" > "$l10n_branding_dir/brand.ftl" - python3 rename-branding-strings.py $lang/brand.properties "$brand_properties_renames" > "$l10n_branding_dir/brand.properties" + python3 $rootdir/rename-branding-strings.py $lang/branding/brand.ftl "$brand_ftl_renames" > "$l10n_branding_dir/brand.ftl" + python3 $rootdir/rename-branding-strings.py $lang/brand.properties "$brand_properties_renames" > "$l10n_branding_dir/brand.properties" done popd View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-128.7.0esr-14.5-1] 2 commits: dropme! BB 40925: Implemented the Security Level component
by morgan (@morgan) 19 Feb '25

19 Feb '25
morgan pushed to branch base-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: f675e2ca by Pier Angelo Vendrame at 2025-02-19T14:24:57+00:00 dropme! BB 40925: Implemented the Security Level component BB 43498: Remove our old patch for 43129. This commit should be ignored at the next rebase (and we will likely have a conflict on the security level commit). - - - - - 20e649a8 by Pier Angelo Vendrame at 2025-02-19T14:24:57+00:00 Bug 1923260 - Exempt Android resources from svg.disabled. r=peterv Differential Revision: https://phabricator.services.mozilla.com/D224895 - - - - - 1 changed file: - dom/base/nsNodeInfoManager.cpp Changes: ===================================== dom/base/nsNodeInfoManager.cpp ===================================== @@ -344,16 +344,6 @@ void nsNodeInfoManager::RemoveNodeInfo(NodeInfo* aNodeInfo) { } static bool IsSystemOrAddonOrAboutPrincipal(nsIPrincipal* aPrincipal) { -#ifdef ANDROID - if (aPrincipal->SchemeIs("resource")) { - nsAutoCString spec; - aPrincipal->GetAsciiSpec(spec); - if (StringBeginsWith(spec, "resource://android/assets/"_ns)) { - return true; - } - } -#endif - return aPrincipal->IsSystemPrincipal() || BasePrincipal::Cast(aPrincipal)->AddonPolicy() || // NOTE: about:blank and about:srcdoc inherit the principal of their @@ -361,6 +351,21 @@ static bool IsSystemOrAddonOrAboutPrincipal(nsIPrincipal* aPrincipal) { aPrincipal->SchemeIs("about"); } +static bool IsAndroidResource(nsIURI* aURI) { +#ifdef ANDROID + if (aURI->SchemeIs("resource")) { + nsAutoCString host, path; + aURI->GetHost(host); + aURI->GetFilePath(path); + if (host.EqualsLiteral("android") && + StringBeginsWith(path, "/assets/"_ns)) { + return true; + } + } +#endif + return false; +} + bool nsNodeInfoManager::InternalSVGEnabled() { MOZ_ASSERT(!mSVGEnabled, "Caller should use the cached mSVGEnabled!"); @@ -386,6 +391,7 @@ bool nsNodeInfoManager::InternalSVGEnabled() { // of system or add-on UI or about: page) bool conclusion = (SVGEnabled || IsSystemOrAddonOrAboutPrincipal(mPrincipal) || + IsAndroidResource(mDocument->GetDocumentURI()) || (loadInfo && (loadInfo->GetExternalContentPolicyType() == ExtContentPolicy::TYPE_IMAGE || View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/523639… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/523639… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] 2 commits: dropme! BB 40925: Implemented the Security Level component
by morgan (@morgan) 19 Feb '25

19 Feb '25
morgan pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 7fc0ffe8 by Pier Angelo Vendrame at 2025-02-19T08:57:31+01:00 dropme! BB 40925: Implemented the Security Level component BB 43498: Remove our old patch for 43129. This commit should be ignored at the next rebase (and we will likely have a conflict on the security level commit). - - - - - 7b27fd84 by Pier Angelo Vendrame at 2025-02-19T08:57:43+01:00 Bug 1923260 - Exempt Android resources from svg.disabled. r=peterv Differential Revision: https://phabricator.services.mozilla.com/D224895 - - - - - 1 changed file: - dom/base/nsNodeInfoManager.cpp Changes: ===================================== dom/base/nsNodeInfoManager.cpp ===================================== @@ -344,16 +344,6 @@ void nsNodeInfoManager::RemoveNodeInfo(NodeInfo* aNodeInfo) { } static bool IsSystemOrAddonOrAboutPrincipal(nsIPrincipal* aPrincipal) { -#ifdef ANDROID - if (aPrincipal->SchemeIs("resource")) { - nsAutoCString spec; - aPrincipal->GetAsciiSpec(spec); - if (StringBeginsWith(spec, "resource://android/assets/"_ns)) { - return true; - } - } -#endif - return aPrincipal->IsSystemPrincipal() || BasePrincipal::Cast(aPrincipal)->AddonPolicy() || // NOTE: about:blank and about:srcdoc inherit the principal of their @@ -361,6 +351,21 @@ static bool IsSystemOrAddonOrAboutPrincipal(nsIPrincipal* aPrincipal) { aPrincipal->SchemeIs("about"); } +static bool IsAndroidResource(nsIURI* aURI) { +#ifdef ANDROID + if (aURI->SchemeIs("resource")) { + nsAutoCString host, path; + aURI->GetHost(host); + aURI->GetFilePath(path); + if (host.EqualsLiteral("android") && + StringBeginsWith(path, "/assets/"_ns)) { + return true; + } + } +#endif + return false; +} + bool nsNodeInfoManager::InternalSVGEnabled() { MOZ_ASSERT(!mSVGEnabled, "Caller should use the cached mSVGEnabled!"); @@ -386,6 +391,7 @@ bool nsNodeInfoManager::InternalSVGEnabled() { // of system or add-on UI or about: page) bool conclusion = (SVGEnabled || IsSystemOrAddonOrAboutPrincipal(mPrincipal) || + IsAndroidResource(mDocument->GetDocumentURI()) || (loadInfo && (loadInfo->GetExternalContentPolicyType() == ExtContentPolicy::TYPE_IMAGE || View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/6fa642… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/6fa642… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] 3 commits: Bug 41363: Split update_responses files per platform
by morgan (@morgan) 19 Feb '25

19 Feb '25
morgan pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 8b3ef788 by Nicolas Vigier at 2025-02-19T04:18:14+01:00 Bug 41363: Split update_responses files per platform To make reverting update for a single platform easier, we split update response files, using a separate directory for each platform. - - - - - 38dcaae7 by Nicolas Vigier at 2025-02-19T04:19:25+01:00 Bug 41363: Make separate update_responses commit for each platform - - - - - 7504979e by Nicolas Vigier at 2025-02-19T04:19:29+01:00 Bug 41363: Fix error message about $update_responses_repository_dir being undefined - - - - - 4 changed files: - projects/release/create_update_responses_tar - tools/signing/functions - tools/signing/upload-update_responses-to-staticiforme - tools/update-responses/update_responses Changes: ===================================== projects/release/create_update_responses_tar ===================================== @@ -1,9 +1,10 @@ #!/bin/bash [% c("var/set_default_env") -%] [% SET channel = c('var/channel') -%] +rm -Rf [% shell_quote(c("basedir")) %]/tools/update-responses/htdocs/[% channel %] [% shell_quote(c("basedir")) %]/tools/update-responses/update_responses [% channel %] mkdir -p [% shell_quote(path(dest_dir)) %]/update-responses mv [% shell_quote(c("basedir")) %]/tools/update-responses/htdocs/[% channel %] [% channel %] -chmod 775 [% channel %] -chmod 664 [% channel %]/.htaccess [% channel %]/* +find [% channel %] -type d -exec chmod 775 {} \; +find [% channel %] -type f -exec chmod 664 {} \; tar cf [% shell_quote(path(dest_dir)) %]/update-responses/update-responses-[% channel %]-[% c("version") %].tar [% channel %] ===================================== tools/signing/functions ===================================== @@ -23,7 +23,7 @@ function check_update_responses_repository_dir { if test -z "$update_responses_repository_dir" || ! test -d "$update_responses_repository_dir" then cat << 'EOF' > /dev/stderr -$aus1_repository_dir is not defined, or the directory does not exist +$update_responses_repository_dir is not defined, or the directory does not exist You should clone git@gitlab.torproject.org:tpo/applications/tor-browser-update-responses.git and set $update_responses_repository_dir in set-config.update-responses EOF ===================================== tools/signing/upload-update_responses-to-staticiforme ===================================== @@ -39,8 +39,32 @@ do mv "$file" "$tbb_version_type/$fname" done +# Keep directory from previous release if they are not in the new release. +# This happens when a release does not include some platforms. +for file in $(ls -1 "$old_ur/$tbb_version_type") +do + test -d "$old_ur/$tbb_version_type/$file" || continue + test -d "$tbb_version_type/$file" && continue + mv -f "$old_ur/$tbb_version_type/$file" "$tbb_version_type/$file" +done + +# Commit each sub-directory separately +for file in $(ls -1 "$tbb_version_type") +do + test -d "$tbb_version_type/$file" || continue + git add "$tbb_version_type/$file" + git add "$tbb_version_type/download-$file.json" + git diff --quiet --cached --exit-code || \ + git commit -m "$tbb_version_type: new version, $tbb_version ($file)" +done + +git add "$tbb_version_type"/download-android-*.json +git diff --quiet --cached --exit-code || \ + git commit -m "$tbb_version_type: new version, $tbb_version (android)" + git add "$tbb_version_type" -git commit -m "$tbb_version_type: new version, $tbb_version" +git diff --quiet --cached --exit-code || \ + git commit -m "$tbb_version_type: new version, $tbb_version" git push # we just need to push mullvadbrowser's update responses to git, not deploy to staticiforme ===================================== tools/update-responses/update_responses ===================================== @@ -29,7 +29,6 @@ setlocale(LC_ALL, "C"); my $htdocsdir = "$FindBin::Bin/htdocs"; my $config = LoadFile("$FindBin::Bin/config.yml"); -my %htdocsfiles; my $releases_dir = $config->{releases_dir}; $releases_dir = "$FindBin::Bin/$releases_dir" unless $releases_dir =~ m/^\//; my @check_errors; @@ -51,12 +50,6 @@ sub get_tmpdir { : ()); } -sub build_targets_by_os { - exit_error "Unknown build target for OS $_[0]" unless $config->{build_targets}{$_[0]}; - my $r = $config->{build_targets}{$_[0]}; - return ref $r eq 'ARRAY' ? @$r : ($r); -} - sub get_nbprocs { return $ENV{NUM_PROCS} if defined $ENV{NUM_PROCS}; if (-f '/proc/cpuinfo') { @@ -80,19 +73,11 @@ sub setup_martools { } sub write_htdocs { - my ($channel, $file, $content) = @_; + my ($channel, $dir, $file, $content) = @_; mkdir $htdocsdir unless -d $htdocsdir; mkdir "$htdocsdir/$channel" unless -d "$htdocsdir/$channel"; - write_file("$htdocsdir/$channel/$file", $content); - $htdocsfiles{$channel}->{$file} = 1; -} - -sub clean_htdocs { - my ($channel) = @_; - opendir(my $d, "$htdocsdir/$channel"); - my @files = grep { ! $htdocsfiles{$channel}->{$_} } readdir $d; - closedir $d; - unlink map { "$htdocsdir/$channel/$_" } @files; + mkdir "$htdocsdir/$channel/$dir" unless -d "$htdocsdir/$channel/$dir"; + write_file("$htdocsdir/$channel/$dir/$file", $content); } sub get_sha512_hex_of_file { @@ -418,24 +403,31 @@ sub write_responses { my $versions_str = join('+', @$versions); foreach my $os (keys %oses) { my $resp = get_response($config, $versions, $os); - write_htdocs($channel, "$versions_str-$os.xml", $resp); + write_htdocs($channel, $os, "$versions_str-$os.xml", $resp); foreach my $from_version (keys %from_versions) { $resp = get_response($config, $versions, $os, $from_version); - write_htdocs($channel, "$from_version-$versions_str-$os.xml", $resp); + write_htdocs($channel, $os, "$from_version-$versions_str-$os.xml", $resp); } + write_htdocs($channel, $os, 'no-update.xml', + '<?xml version="1.0" encoding="UTF-8"?>' + . "\n<updates></updates>\n"); } - write_htdocs($channel, 'no-update.xml', - '<?xml version="1.0" encoding="UTF-8"?>' - . "\n<updates></updates>\n"); } sub write_htaccess { my ($config, $channel) = @_; - my $flags = "[last]"; - my $htaccess = "RewriteEngine On\n"; - $htaccess .= $config->{htaccess_rewrite_rules}{$channel} // ''; + + my $htaccess_main = "RewriteEngine On\n"; + $htaccess_main .= $config->{htaccess_rewrite_rules}{$channel} // ''; my $versions = as_array($config->{channels}{$channel}); my $versions_str = join('+', @$versions); + foreach my $os (sort keys %{$config->{build_targets}}) { + foreach my $bt (@{ as_array($config->{build_targets}{$os}) }) { + $htaccess_main .= "RewriteRule ^$bt/(.*) $os/\$1 [last]\n"; + } + } + write_htdocs($channel, '.', '.htaccess', $htaccess_main); + my (%oses, %from_versions); foreach my $version (@$versions) { my $files = $config->{versions}{$version}{files}; @@ -445,20 +437,20 @@ sub write_htaccess { $from_versions{$from_version} = 1; } } - $htaccess .= "RewriteRule ^[^\/]+/$version/ no-update.xml $flags\n"; } - foreach my $os (sort keys %oses) { - foreach my $bt (build_targets_by_os($os)) { + foreach my $version (@$versions) { + my $files = $config->{versions}{$version}{files}; + foreach my $os (sort keys %oses) { + my $htaccess_os = "RewriteEngine On\n"; + $htaccess_os .= "RewriteRule ^$version/ no-update.xml [last]\n"; foreach my $from_version (sort keys %from_versions) { - $htaccess .= "RewriteRule ^$bt/$from_version/ALL " - . "$from_version-$versions_str-$os.xml $flags\n"; + $htaccess_os .= "RewriteRule ^$from_version/ " + . "$from_version-$versions_str-$os.xml [last]\n"; } - $htaccess .= "RewriteRule ^$bt/[^\/]+/ALL " - . "$versions_str-$os.xml $flags\n"; - $htaccess .= "RewriteRule ^$bt/ $versions_str-$os.xml $flags\n"; + $htaccess_os .= "RewriteRule ^[^\/]+/ $versions_str-$os.xml [last]\n"; + write_htdocs($channel, $os, '.htaccess', $htaccess_os); } } - write_htdocs($channel, '.htaccess', $htaccess); } sub write_downloads_json { @@ -472,11 +464,11 @@ sub write_downloads_json { tag => "$tag", downloads => get_version_downloads($config, $version), }; - write_htdocs($channel, 'downloads.json', + write_htdocs($channel, '.', 'downloads.json', JSON->new->utf8->canonical->encode($data)); my $pp_downloads = get_perplatform_downloads($config, $version, $tag); foreach my $os (keys %{$pp_downloads}) { - write_htdocs($channel, "download-$os.json", + write_htdocs($channel, '.', "download-$os.json", JSON->new->utf8->canonical->encode($pp_downloads->{$os})); } } @@ -636,11 +628,9 @@ my %actions = ( exit_error "Wrong arguments" unless @ARGV == 1; my $channel = $ARGV[0]; exit_error "Unknown channel $channel" unless $config->{channels}{$channel}; - $htdocsfiles{$channel} = { '.' => 1, '..' => 1 }; write_responses($config, $channel); write_htaccess($config, $channel); write_downloads_json($config, $channel); - clean_htdocs($channel); }, gen_incrementals => sub { my ($config) = @_; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] 3 commits: Bug 41374: Remove support for migrate_archs and migrate_langs in update_responses
by morgan (@morgan) 18 Feb '25

18 Feb '25
morgan pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 8adf3820 by Nicolas Vigier at 2025-02-18T13:29:49+00:00 Bug 41374: Remove support for migrate_archs and migrate_langs in update_responses Those options have not been used for some time, and removing them simplifies the following changes we're doing to split files per platform. - - - - - 16dabc5e by Nicolas Vigier at 2025-02-18T13:29:49+00:00 Bug 40799: Remove legacy locale iteration in update-responses - - - - - 002fb3b9 by Nicolas Vigier at 2025-02-18T13:29:49+00:00 Bug 40799: Remove legacy locale support in tools/dmg2mar - - - - - 3 changed files: - projects/release/update_responses_config.yml - tools/dmg2mar - tools/update-responses/update_responses Changes: ===================================== projects/release/update_responses_config.yml ===================================== @@ -51,10 +51,6 @@ versions: - [% ver %] [% END; END -%] - # for example, osx32: osx64 - migrate_archs: - # for example, pt-PT: pt-BR - migrate_langs: # minSupportedOsVersion on macOS corresponds to the Darwin version ( https://en.wikipedia.org/wiki/Darwin_(operating_system) ) macos: # macOS v10.15.0 ===================================== tools/dmg2mar ===================================== @@ -102,7 +102,7 @@ sub get_dmg_files_from_sha256sums { next unless $filename; chomp $filename; next unless $filename =~ m/^$appname_dmg-macos-(.+)\.dmg$/; - push @files, { filename => $filename, version => $1, lang => 'ALL' }; + push @files, { filename => $filename, version => $1 }; } return @files; } @@ -116,11 +116,7 @@ sub convert_files { print "Finished $_[2]\n"; }); foreach my $file (get_dmg_files_from_sha256sums) { - # The 'ja' locale is a special case: it is called 'ja-JP-mac' - # internally on OSX, but the dmg file still uses 'ja' to avoid - # confusing users. - my $mar_lang = $file->{lang} eq 'ja' ? 'ja-JP-mac' : $file->{lang}; - my $output = "$appname_mar-macos-$file->{version}_$mar_lang.mar"; + my $output = "$appname_mar-macos-$file->{version}_ALL.mar"; my $step_name = "$file->{filename} -> $output"; print "Starting $step_name\n"; $pm->start($step_name) and next; ===================================== tools/update-responses/update_responses ===================================== @@ -113,9 +113,9 @@ sub get_version_files { foreach my $file (readdir $d) { next unless -f "$vdir/$file"; if ($file !~ m/incremental\.mar$/ && - $file =~ m/^$appname-(.+)-${version}_(.+)\.mar$/) { - my ($os, $lang) = ($1, $2); - $files->{$os}{$lang}{complete} = { + $file =~ m/^$appname-(.+)-${version}_ALL\.mar$/) { + my $os = $1; + $files->{$os}{complete} = { type => 'complete', URL => "$download_url/$file", size => -s "$vdir/$file", @@ -126,9 +126,9 @@ sub get_version_files { }; next; } - if ($file =~ m/^$appname-(.+)--(.+)-${version}_(.+)\.incremental\.mar$/) { - my ($os, $from_version, $lang) = ($1, $2, $3); - $files->{$os}{$lang}{partial}{$from_version} = { + if ($file =~ m/^$appname-(.+)--(.+)-${version}_ALL\.incremental\.mar$/) { + my ($os, $from_version) = ($1, $2); + $files->{$os}{partial}{$from_version} = { type => 'partial', URL => "$download_url/$file", size => -s "$vdir/$file", @@ -235,14 +235,14 @@ sub extract_mar { } sub mar_filename { - my ($config, $appname, $version, $os, $lang) = @_; - version_dir($config, $version) . "/$appname-$os-${version}_$lang.mar"; + my ($config, $appname, $version, $os) = @_; + version_dir($config, $version) . "/$appname-$os-${version}_ALL.mar"; } sub create_incremental_mar { - my ($config, $pm, $from_version, $new_version, $os, $lang, $channel) = @_; + my ($config, $pm, $from_version, $new_version, $os, $channel) = @_; my $appname = $config->{appname_marfile}; - my $mar_file = "$appname-$os--${from_version}-${new_version}_$lang.incremental.mar"; + my $mar_file = "$appname-$os--${from_version}-${new_version}_ALL.incremental.mar"; my $mar_file_path = version_dir($config, $new_version) . '/' . $mar_file; if ($ENV{MAR_SKIP_EXISTING} && -f $mar_file_path) { print "Skipping $mar_file\n"; @@ -253,7 +253,7 @@ sub create_incremental_mar { my $finished_file = sub { exit_error "Error creating $mar_file" unless $_[1] == 0; print "Finished $mar_file\n"; - $config->{versions}{$new_version}{files}{$os}{$lang}{partial}{$from_version} = { + $config->{versions}{$new_version}{files}{$os}{partial}{$from_version} = { type => 'partial', URL => "$download_url/$mar_file", size => -s $mar_file_path, @@ -267,9 +267,9 @@ sub create_incremental_mar { my $tmpdir = get_tmpdir($config); my $mar_c_from = get_config($config, $from_version, $os, 'mar_compression'); my $mar_c_new = get_config($config, $new_version, $os, 'mar_compression'); - extract_mar(mar_filename($config, $appname, $from_version, $os, $lang), + extract_mar(mar_filename($config, $appname, $from_version, $os), "$tmpdir/A", $mar_c_from); - extract_mar(mar_filename($config, $appname, $new_version, $os, $lang), + extract_mar(mar_filename($config, $appname, $new_version, $os), "$tmpdir/B", $mar_c_new); # bug 26054: make sure previous macOS version is code signed if (!$ENV{NO_CODESIGNATURE} && ($os eq 'macos') @@ -306,10 +306,8 @@ sub create_incremental_mars_for_version { get_version_files($config, $from_version); my $from_v = $config->{versions}{$from_version}; foreach my $os (keys %{$v->{files}}) { - foreach my $lang (keys %{$v->{files}{$os}}) { - next unless defined $from_v->{files}{$os}{$lang}{complete}; - create_incremental_mar($config, $pm, $from_version, $version, $os, $lang, $channel); - } + next unless defined $from_v->{files}{$os}{complete}; + create_incremental_mar($config, $pm, $from_version, $version, $os, $channel); } } $pm->wait_all_children; @@ -333,31 +331,29 @@ sub get_buildinfos { setup_martools; my $files = $config->{versions}{$version}{files}; foreach my $os (keys %$files) { - foreach my $lang (keys %{$files->{$os}}) { - next unless $files->{$os}{$lang}{complete}; - my $tmpdir = get_tmpdir($config); - my $mar_compression = get_config($config, $version, $os, 'mar_compression'); - extract_mar( - mar_filename($config, $config->{appname_marfile}, $version, $os, $lang), - "$tmpdir", - $mar_compression); - my $appfile = "$tmpdir/application.ini" if -f "$tmpdir/application.ini"; - $appfile = "$tmpdir/Contents/Resources/application.ini" - if -f "$tmpdir/Contents/Resources/application.ini"; - exit_error "Could not find application.ini" unless $appfile; - foreach my $line (read_file($appfile)) { - if ($line =~ m/^BuildID=(.*)$/) { - $config->{versions}{$version}{buildID} = $1; - return; - } + next unless $files->{$os}{complete}; + my $tmpdir = get_tmpdir($config); + my $mar_compression = get_config($config, $version, $os, 'mar_compression'); + extract_mar( + mar_filename($config, $config->{appname_marfile}, $version, $os), + "$tmpdir", + $mar_compression); + my $appfile = "$tmpdir/application.ini" if -f "$tmpdir/application.ini"; + $appfile = "$tmpdir/Contents/Resources/application.ini" + if -f "$tmpdir/Contents/Resources/application.ini"; + exit_error "Could not find application.ini" unless $appfile; + foreach my $line (read_file($appfile)) { + if ($line =~ m/^BuildID=(.*)$/) { + $config->{versions}{$version}{buildID} = $1; + return; } - exit_error "Could not extract buildID from application.ini"; } + exit_error "Could not extract buildID from application.ini"; } } sub get_response { - my ($config, $versions, $os, $lang, $from_version) = @_; + my ($config, $versions, $os, $from_version) = @_; my $res; my $writer = XML::Writer->new(OUTPUT => \$res, ENCODING => 'UTF-8'); $writer->xmlDecl; @@ -384,13 +380,13 @@ sub get_response { defined $minversion ? ( minSupportedOSVersion => $minversion ) : (), defined $mininstruc ? ( minSupportedInstructionSet => $mininstruc ) : (), ); - if (my $patch = $config->{versions}{$version}{files}{$os}{$lang}{complete}) { + if (my $patch = $config->{versions}{$version}{files}{$os}{complete}) { my @sorted_patch = map { $_ => $patch->{$_} } sort keys %$patch; $writer->startTag('patch', @sorted_patch); $writer->endTag('patch'); } if ($from_version) { - if (my $patch = $config->{versions}{$version}{files}{$os}{$lang}{partial}{$from_version}) { + if (my $patch = $config->{versions}{$version}{files}{$os}{partial}{$from_version}) { my @sorted_patch = map { $_ => $patch->{$_} } sort keys %$patch; $writer->startTag('patch', @sorted_patch); $writer->endTag('patch'); @@ -407,38 +403,25 @@ sub get_response { sub write_responses { my ($config, $channel) = @_; my $versions = as_array($config->{channels}{$channel}); - my (%oses, %langs, %from_versions); + my (%oses, %from_versions); foreach my $version (@$versions) { get_version_files($config, $version); get_buildinfos($config, $version); my $files = $config->{versions}{$version}{files}; - my $migrate_archs = $config->{versions}{$version}{migrate_archs} // {}; - foreach my $old_os (keys %$migrate_archs) { - my $new_os = $migrate_archs->{$old_os}; - foreach my $lang (keys %{$files->{$new_os}}) { - $files->{$old_os}{$lang}{complete} = - $files->{$new_os}{$lang}{complete}; - } - } foreach my $os (keys %$files) { $oses{$os} = 1; - foreach my $lang (keys %{$files->{$os}}) { - $langs{$lang} = 1; - foreach my $from_version (keys %{$files->{$os}{$lang}{partial}}) { - $from_versions{$from_version} = 1; - } + foreach my $from_version (keys %{$files->{$os}{partial}}) { + $from_versions{$from_version} = 1; } } } my $versions_str = join('+', @$versions); foreach my $os (keys %oses) { - foreach my $lang (keys %langs) { - my $resp = get_response($config, $versions, $os, $lang); - write_htdocs($channel, "$versions_str-$os-$lang.xml", $resp); - foreach my $from_version (keys %from_versions) { - $resp = get_response($config, $versions, $os, $lang, $from_version); - write_htdocs($channel, "$from_version-$versions_str-$os-$lang.xml", $resp); - } + my $resp = get_response($config, $versions, $os); + write_htdocs($channel, "$versions_str-$os.xml", $resp); + foreach my $from_version (keys %from_versions) { + $resp = get_response($config, $versions, $os, $from_version); + write_htdocs($channel, "$from_version-$versions_str-$os.xml", $resp); } } write_htdocs($channel, 'no-update.xml', @@ -453,38 +436,26 @@ sub write_htaccess { $htaccess .= $config->{htaccess_rewrite_rules}{$channel} // ''; my $versions = as_array($config->{channels}{$channel}); my $versions_str = join('+', @$versions); - my (%oses, %langs, %from_versions); - my $migrate_langs; + my (%oses, %from_versions); foreach my $version (@$versions) { - $migrate_langs = $config->{versions}{$version}{migrate_langs} - if $config->{versions}{$version}{migrate_langs}; my $files = $config->{versions}{$version}{files}; foreach my $os (keys %$files) { $oses{$os} = 1; - foreach my $lang (keys %{$files->{$os}}) { - $langs{$lang} = 1; - foreach my $from_version (keys %{$files->{$os}{$lang}{partial}}) { - $from_versions{$from_version} = 1; - } + foreach my $from_version (keys %{$files->{$os}{partial}}) { + $from_versions{$from_version} = 1; } } $htaccess .= "RewriteRule ^[^\/]+/$version/ no-update.xml $flags\n"; } foreach my $os (sort keys %oses) { foreach my $bt (build_targets_by_os($os)) { - foreach my $lang (sort keys %langs) { - foreach my $from_version (sort keys %from_versions) { - $htaccess .= "RewriteRule ^$bt/$from_version/$lang " - . "$from_version-$versions_str-$os-$lang.xml $flags\n"; - } - $htaccess .= "RewriteRule ^$bt/[^\/]+/$lang " - . "$versions_str-$os-$lang.xml $flags\n"; + foreach my $from_version (sort keys %from_versions) { + $htaccess .= "RewriteRule ^$bt/$from_version/ALL " + . "$from_version-$versions_str-$os.xml $flags\n"; } - foreach my $lang (sort keys %$migrate_langs) { - $htaccess .= "RewriteRule ^$bt/[^\/]+/$lang " - . "$versions_str-$os-$migrate_langs->{$lang}.xml $flags\n"; - } - $htaccess .= "RewriteRule ^$bt/ $versions_str-$os-ALL.xml $flags\n"; + $htaccess .= "RewriteRule ^$bt/[^\/]+/ALL " + . "$versions_str-$os.xml $flags\n"; + $htaccess .= "RewriteRule ^$bt/ $versions_str-$os.xml $flags\n"; } } write_htdocs($channel, '.htaccess', $htaccess); @@ -567,28 +538,26 @@ sub check_update_responses_channel { my $channel_versions = as_array($config->{channels}{$channel}); my ($channel_version) = @$channel_versions; foreach my $build_target (build_targets_list()) { - foreach my $lang (qw(en-US de)) { - my $url = "$base_url/$channel/$build_target/1.0/$lang"; - my $dom = get_remote_xml($url); - if ($dom) { - my $version = check_get_version($dom); - log_step($url, 'version', $version eq $channel_version, - "expected: $channel_version received: $version"); - } - $url = "$base_url/$channel/$build_target/$channel_version/$lang"; + my $url = "$base_url/$channel/$build_target/1.0/ALL"; + my $dom = get_remote_xml($url); + if ($dom) { + my $version = check_get_version($dom); + log_step($url, 'version', $version eq $channel_version, + "expected: $channel_version received: $version"); + } + $url = "$base_url/$channel/$build_target/$channel_version/ALL"; + $dom = get_remote_xml($url); + log_step($url, 'no_update', check_no_update($dom)) if $dom; + my @inc = @{$config->{versions}{$channel_version}{incremental_from}} + if $config->{versions}{$channel_version}{incremental_from}; + foreach my $inc_from (@inc) { + my $url = "$base_url/$channel/$build_target/$inc_from/ALL"; $dom = get_remote_xml($url); - log_step($url, 'no_update', check_no_update($dom)) if $dom; - my @inc = @{$config->{versions}{$channel_version}{incremental_from}} - if $config->{versions}{$channel_version}{incremental_from}; - foreach my $inc_from (@inc) { - my $url = "$base_url/$channel/$build_target/$inc_from/$lang"; - $dom = get_remote_xml($url); - next unless $dom; - my $version = check_get_version($dom); - log_step($url, 'version', $version eq $channel_version, - "expected: $channel_version received: $version"); - log_step($url, 'has_incremental', check_has_incremental($dom)); - } + next unless $dom; + my $version = check_get_version($dom); + log_step($url, 'version', $version eq $channel_version, + "expected: $channel_version received: $version"); + log_step($url, 'has_incremental', check_has_incremental($dom)); } } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41372: Handle branding strings for tor-browser build.
by Pier Angelo Vendrame (@pierov) 18 Feb '25

18 Feb '25
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 858ee2ee by Henry Wilkes at 2025-02-18T11:35:44+00:00 Bug 41372: Handle branding strings for tor-browser build. - - - - - 3 changed files: - projects/firefox/build - projects/firefox/config - + projects/firefox/rename-branding-strings.py Changes: ===================================== projects/firefox/build ===================================== @@ -136,15 +136,50 @@ branding_dir=browser/branding/[% c("var/branding_directory_prefix") %]-[% c("var [% IF c("var/tor-browser") -%] tar -C "$rootdir" -xf "$rootdir/[% c('input_files_by_name/translation-tor-browser') %]" + + # For the purpose of Weblate, all releases share a single brand.ftl and + # brand.properties file per locale in the translations repository. + # See tor-browser-build#41372. + # In brand.ftl, both `-brand-short-name` and `-brand-full-name` should + # differ between releases. As such, they have additional entries in the + # translations repository file (Weblate): + # -brand-short-name for the stable release. + # -brand-short-name_alpha for the alpha release. + # -brand-short-name_nightly for the nightly release. + # And similarly for -brand-full-name. + # For the final build, we only want to keep the string that matches the + # built release, and remove its suffix if it has one. So for the stable + # release we want to keep -brand-short-name. For the alpha release we want + # to keep -brand-short-name_alpha instead, and rename it to be + # -brand-short-name. + # + # As such, we parse the brand.ftl file to rename these strings to keep the + # version we want using rename-branding-strings.py. + # + # We do a similar thing with brandShortName and brandFullName in + # brand.properties. + + # Instructions for the script to perform the renames. + brand_ftl_renames='{ + "suffix": "[% c("var/branding_string_suffix") %]", + "ids": ["-brand-short-name", "-brand-full-name"] + }' + brand_properties_renames='{ + "suffix": "[% c("var/branding_string_suffix") %]", + "ids": ["brandShortName", "brandFullName"] + }' + pushd "$rootdir/translation-tor-browser" ln -s ja ja-JP-mac for lang in $supported_locales; do mv $lang/tor-browser.ftl "$l10ncentral/$lang/toolkit/toolkit/global/" - # Branding. Currently all releases use the same branding. + # Branding. l10n_branding_dir="$l10ncentral/$lang/$branding_dir/" mkdir -p "$l10n_branding_dir" - mv $lang/branding/brand.ftl "$l10n_branding_dir" - mv $lang/brand.properties "$l10n_branding_dir" + # Convert the translations repository branding files into files that work + # for this specific build. + python3 rename-branding-strings.py $lang/branding/brand.ftl "$brand_ftl_renames" > "$l10n_branding_dir/brand.ftl" + python3 rename-branding-strings.py $lang/brand.properties "$brand_properties_renames" > "$l10n_branding_dir/brand.properties" done popd ===================================== projects/firefox/config ===================================== @@ -54,6 +54,10 @@ var: rm -Rf "$rezip_tmpdir" l10n-changesets: '[% exec("git --no-pager show " _ c("git_hash") _ ":browser/locales/l10n-changesets.json", { exec_noco => 1 }) %]' + # The branding_string_suffix for the alpha and nightly should be + # '_alpha' and '_nightly', matching the "suffix" chosen in the + # tor-browser:update-translations.yml file. + branding_string_suffix: '_[% c("var/channel") %]' steps: src-tarballs: @@ -94,6 +98,12 @@ targets: var: nightly_updates_publish_dir_prefix: basebrowser- + release: + var: + # For the stable release, the suffix is empty. + # I.e. we want to select `-brand-short-name` directly. + branding_string_suffix: '' + nightly: git_hash: '[% c("var/project-name") %]-[% c("var/firefox_version") %]-[% c("var/browser_branch") %]' tag_gpg_id: 0 @@ -183,6 +193,8 @@ input_files: - project: binutils name: binutils enable: '[% c("var/linux") && ! c("var/linux-cross") %]' + - filename: rename-branding-strings.py + enable: '[% c("var/has_l10n") && c("var/tor-browser") %]' - filename: fix-info-plist.py enable: '[% c("var/macos") %]' - filename: nsis-uninstall.patch ===================================== projects/firefox/rename-branding-strings.py ===================================== @@ -0,0 +1,96 @@ +import argparse +import json +import re + +arg_parser = argparse.ArgumentParser( + description="Filter a branding file to only include the expected strings" +) +arg_parser.add_argument("file", metavar="<file>", help="branding file to process") +arg_parser.add_argument( + "details", metavar="<details>", help="JSON specification for renaming" +) + +args = arg_parser.parse_args() +details_dict = json.loads(args.details) +# The suffix we want to search for or remove. +# Can be empty if we want to select the IDs that have no suffix. +suffix = details_dict["suffix"] +# The string IDs we want to rename. +rename_ids = details_dict["ids"] + + +def parse_ids(string, pattern): + """ + Extract the IDs found in a string. + + :param string: The string to parse. + :param pattern: The pattern to capture IDs. + + :yields: A tuple containing a chunk of string and whether the chunk + is an ID. + """ + regex = re.compile(pattern, flags=re.MULTILINE + re.ASCII) + while True: + match = regex.search(string) + if not match: + yield string, False + return + + yield string[: match.start("id")], False + yield match.group("id"), True + string = string[match.end("id") :] + + +# We want to parse the file and rename the IDs we are interested in. +# If the ID starts with one of the `rename_ids` but the suffix does +# not match we append an "_UNUSED" suffix to the ID, to keep it in the output +# but functionally unused in the final build. +# Otherwise, if the ID starts with one of the `rename_ids` and the suffix +# matches we will remove the suffix from the ID, so that it is used in the +# final build. +# Everything else found in the file, like entry values, comments and blank +# lines, will be included in the output as it was. +# +# NOTE: This script is constructed to be *independent* of the order in which +# strings are present in the file. Weblate does not guarantee the order of +# translated files to use the same ordering as the original en-US file. +# +# NOTE: This script should work for all locales. In particular, for Fluent files +# it needs to be able to handle Fluent Terms that are multi-valued (conditional) +# and Terms with attributes. Therefore, whilst we could have written a script to +# *remove* unwanted strings, the parsing logic would have been far more complex +# to be able to handle all these cases. Hence why we only parse for the Fluent +# IDs and rename them, which is much simpler. +with open(args.file, "r") as file: + if file.name.endswith(".ftl"): + # A Fluent ID is the identifier for a Message or Term, which always + # starts on a newline, and will be followed by an "=" character. + id_pattern = r"^(?P<id>-?[a-zA-Z][a-zA-Z0-9_-]*) *=" + elif file.name.endswith(".properties"): + # A properties ID can be preceded by whitespace, and can be any + # character other than whitespace, ":" or "=". The first character also + # cannot be "!" or "#" since this starts a comment. Technically the + # Java ".properties" spec allows a ID to include one of these characters + # if it is escaped by a "\", but we don't expect or care about such IDs. + # The Java spec also has a limited set of whitespace, which excludes + # "\v", but we do not expect Weblate or any other serialiser to + # insert whitespace beyond "\n", "\r", "\t" or " ". + id_pattern = r"^\s*(?P<id>[^!#:=\s][^:=\s]*)" + else: + raise ValueError(f"Unknown file type {file.name}") + + for part, is_id in parse_ids(file.read(), id_pattern): + if is_id: + for string_id in rename_ids: + if part.startswith(string_id): + if part == string_id + suffix: + # This string matches the suffix, so we want to use its + # value. We adjust the ID to remove the suffix before + # printing. + part = string_id + else: + # Keep this entry in the output, but make it unused by + # appending to the ID. + part += "_UNUSED" + break + print(part, end="") View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] 3 commits: fixup! Add CI for Tor Browser
by Pier Angelo Vendrame (@pierov) 18 Feb '25

18 Feb '25
Pier Angelo Vendrame pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: d9fe34de by Henry Wilkes at 2025-02-18T10:08:15+00:00 fixup! Add CI for Tor Browser TB 43446: Include alpha and nightly branding in the translation CI. - - - - - 34838694 by Henry Wilkes at 2025-02-18T10:10:32+00:00 fixup! BB 42305: Add script to combine translation files across versions. TB 43446: Allow the combine translation script to select some branding strings from different files. - - - - - 6fa642ea by Henry Wilkes at 2025-02-18T10:10:33+00:00 fixup! TB 2176: Rebrand Firefox to TorBrowser TB 43446: Change the branding name for the alpha and nightly releases. - - - - - 13 changed files: - .gitlab/ci/jobs/update-translations.yml - browser/branding/tb-alpha/locales/en-US/brand.ftl - browser/branding/tb-alpha/locales/en-US/brand.properties - browser/branding/tb-nightly/locales/en-US/brand.ftl - browser/branding/tb-nightly/locales/en-US/brand.properties - browser/branding/tb-release/locales/en-US/brand.ftl - browser/branding/tb-release/locales/en-US/brand.properties - tools/base-browser/l10n/combine-translation-versions.py - tools/base-browser/l10n/combine/combine.py - tools/base-browser/l10n/combine/tests/test_android.py - tools/base-browser/l10n/combine/tests/test_dtd.py - tools/base-browser/l10n/combine/tests/test_fluent.py - tools/base-browser/l10n/combine/tests/test_properties.py Changes: ===================================== .gitlab/ci/jobs/update-translations.yml ===================================== @@ -17,12 +17,48 @@ { "name": "brand.ftl", "where": ["browser/branding/tb-release", "toolkit/torbutton"], + "branding": { + "versions": [ + { + "name": "Alpha", + "suffix": "_alpha", + "where": ["browser/branding/tb-alpha"] + }, + { + "name": "Nightly", + "suffix": "_nightly", + "where": ["browser/branding/tb-nightly"] + } + ], + "ids": [ + "-brand-short-name", + "-brand-full-name" + ] + }, "branch": "tor-browser", "directory": "branding" }, { "name": "brand.properties", "where": ["browser/branding/tb-release", "toolkit/torbutton"], + "branding": { + "versions": [ + { + "name": "Alpha", + "suffix": "_alpha", + "where": ["browser/branding/tb-alpha"] + }, + { + "name": "Nightly", + "suffix": "_nightly", + "where": ["browser/branding/tb-nightly"] + } + ], + "ids": [ + "brandShortName", + "brandFullName" + ] + }, "branch": "tor-browser" }, { "name": "tor-browser.ftl", "branch": "tor-browser" }, ===================================== browser/branding/tb-alpha/locales/en-US/brand.ftl ===================================== @@ -2,12 +2,16 @@ # that is used by Firefox) to avoid picking up the -brand-short-name values # that Mozilla includes in the Firefox language packs. +# The shortened application name for Tor Browser. Shared between versions. -brand-shorter-name = Tor Browser --brand-short-name = Tor Browser --brand-full-name = Tor Browser +# The default application name for the "alpha" release. +-brand-short-name = Tor Browser Alpha +# The full application name for the "alpha" release. +-brand-full-name = Tor Browser Alpha # This brand name can be used in messages where the product name needs to # remain unchanged across different versions (Nightly, Beta, etc.). -brand-product-name = Tor Browser +# The name of the Tor Project organisation. -vendor-short-name = Tor Project # "Tor" is a trademark names, so should not be translated (not including the quote marks, which can be localized). # "The Tor Project, Inc." is an organisation name. ===================================== browser/branding/tb-alpha/locales/en-US/brand.properties ===================================== @@ -3,6 +3,9 @@ # 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/. +# The shortened application name for Tor Browser. Shared between versions. brandShorterName=Tor Browser -brandShortName=Tor Browser -brandFullName=Tor Browser +# The default application name for the "alpha" release. +brandShortName=Tor Browser Alpha +# The full application name for the "alpha" release. +brandFullName=Tor Browser Alpha ===================================== browser/branding/tb-nightly/locales/en-US/brand.ftl ===================================== @@ -2,12 +2,16 @@ # that is used by Firefox) to avoid picking up the -brand-short-name values # that Mozilla includes in the Firefox language packs. +# The shortened application name for Tor Browser. Shared between versions. -brand-shorter-name = Tor Browser --brand-short-name = Tor Browser --brand-full-name = Tor Browser +# The default application name for the "nightly" release. +-brand-short-name = Tor Browser Nightly +# The full application name for the "nightly" release. +-brand-full-name = Tor Browser Nightly # This brand name can be used in messages where the product name needs to # remain unchanged across different versions (Nightly, Beta, etc.). -brand-product-name = Tor Browser +# The name of the Tor Project organisation. -vendor-short-name = Tor Project # "Tor" is a trademark names, so should not be translated (not including the quote marks, which can be localized). # "The Tor Project, Inc." is an organisation name. ===================================== browser/branding/tb-nightly/locales/en-US/brand.properties ===================================== @@ -3,6 +3,9 @@ # 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/. +# The shortened application name for Tor Browser. Shared between versions. brandShorterName=Tor Browser -brandShortName=Tor Browser -brandFullName=Tor Browser +# The default application name for the "nightly" release. +brandShortName=Tor Browser Nightly +# The full application name for the "nightly" release. +brandFullName=Tor Browser Nightly ===================================== browser/branding/tb-release/locales/en-US/brand.ftl ===================================== @@ -2,12 +2,16 @@ # that is used by Firefox) to avoid picking up the -brand-short-name values # that Mozilla includes in the Firefox language packs. +# The shortened application name for Tor Browser. Shared between versions. -brand-shorter-name = Tor Browser +# The default application name for the stable release. -brand-short-name = Tor Browser +# The full application name for the stable release. -brand-full-name = Tor Browser # This brand name can be used in messages where the product name needs to # remain unchanged across different versions (Nightly, Beta, etc.). -brand-product-name = Tor Browser +# The name of the Tor Project organisation. -vendor-short-name = Tor Project # "Tor" is a trademark names, so should not be translated (not including the quote marks, which can be localized). # "The Tor Project, Inc." is an organisation name. ===================================== browser/branding/tb-release/locales/en-US/brand.properties ===================================== @@ -3,6 +3,9 @@ # 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/. +# The shortened application name for Tor Browser. Shared between versions. brandShorterName=Tor Browser +# The default application name for the stable release. brandShortName=Tor Browser +# The full application name for the stable release. brandFullName=Tor Browser ===================================== tools/base-browser/l10n/combine-translation-versions.py ===================================== @@ -306,9 +306,34 @@ for file_dict in json.loads(args.files): f"{current_file.path} : {stable_file.path}" ) + content = None if current_file is None else current_file.content + + # If we have a branding file, we want to also include strings from the other + # branding directories that differ from the stable release. + # The strings that *differ* per release should be specified in + # file_dict["branding"]["ids"]. These strings will be copied from the other + # release's branding directory, with an addition suffix added to their ID, + # as specified in the version_dict["suffix"]. + branding = file_dict.get("branding", None) + if branding: + include_ids = branding["ids"] + for version_dict in branding["versions"]: + branding_dirs = version_dict.get("where", None) + branding_file = current_branch.get_file(name, branding_dirs) + if branding_file is None: + raise Exception(f"{name} does not exist in {branding_dirs}") + content = combine_files( + name, + content, + branding_file.content, + f'{version_dict["name"]} Release.', + include_ids, + version_dict["suffix"], + ) + content = combine_files( name, - None if current_file is None else current_file.content, + content, None if stable_file is None else stable_file.content, f"Will be unused in {current_branch.browser_version_name}!", ) ===================================== tools/base-browser/l10n/combine/combine.py ===================================== @@ -14,26 +14,32 @@ if TYPE_CHECKING: def combine_files( filename: str, - new_content: str | None, - old_content: str | None, + primary_content: str | None, + alternative_content: str | None, comment_prefix: str, + include_ids: list[str] | None = None, + alternative_suffix: str = "", ) -> str | None: """Combine two translation files into one to include all strings from both. - The new content is presented first, and any strings only found in the old - content are placed at the end with an additional comment. + The primary content is presented first, followed by the alternative content + at the end with an additional comment. :param filename: The filename for the file, determines the format. - :param new_content: The new content for the file, or None if it has been - deleted. - :param old_content: The old content for the file, or None if it did not - exist before. - :comment_prefix: A comment to include for any strings that are only found in - the old content. This will be placed before any other comments for the - string. + :param primary_content: The primary content for the file, or None if it does + not exist. + :param alternative_content: The alternative content for the file, or None if + it does not exist. + :param comment_prefix: A comment to include for any strings that are + appended to the content. This will be placed before any other comments for + the string. + :param include_ids: String IDs from `alternative_content` we want to + include. If this is `None` then we include all strings that do not already + have a matching ID in `primary_content`. + :param duplicate_suffix: The suffix to apply to the alternative IDs. :returns: The combined content, or None if both given contents are None. """ - if new_content is None and old_content is None: + if primary_content is None and alternative_content is None: return None # getParser from compare_locale returns the same instance for the same file @@ -41,7 +47,7 @@ def combine_files( parser = getParser(filename) is_android = filename.endswith(".xml") - if new_content is None: + if primary_content is None: if is_android: # File was deleted, add some document parts. content_start = ( @@ -54,7 +60,7 @@ def combine_files( content_end = "" existing_keys = [] else: - parser.readUnicode(new_content) + parser.readUnicode(primary_content) # Start with the same content as the current file. # For android strings, we want to keep the final "</resources>" until after. @@ -96,8 +102,8 @@ def combine_files( entry_iter: Iterable[Any] = () # If the file does not exist in the old branch, don't make any additions. - if old_content is not None: - parser.readUnicode(old_content) + if alternative_content is not None: + parser.readUnicode(alternative_content) entry_iter = parser.walk(only_localizable=False) for entry in entry_iter: if isinstance(entry, Junk): @@ -134,13 +140,19 @@ def combine_files( if not isinstance(entry, Entity): raise ValueError(f"Unexpected type: {entry.__class__.__name__}") - if entry.key in existing_keys: - # Already included this string in the new translation file. + if include_ids is None: + # We include the entry if it is not already included. + include_entry = entry.key not in existing_keys + else: + # We include the entry if it is in our list. + include_entry = entry.key in include_ids + if not include_entry: # Drop the gathered comments for this Entity. stacked_comments.clear() continue if isinstance(entry, FluentEntity): + id_regex = rf"^({re.escape(entry.key)})( *=)" if fluent_group_comment is not None: # We have a found GroupComment which has not been included yet. # All following Entity's will be under its scope, until the next @@ -149,12 +161,15 @@ def combine_files( # Added GroupComment, so don't need to add again. fluent_group_comment = None elif isinstance(entry, DTDEntity): + id_regex = rf"^(\s*<!ENTITY\s*{re.escape(entry.key)})(\s)" # Include our additional comment before we print the rest for this # Entity. additions.append(f"<!-- LOCALIZATION NOTE: {comment_prefix} -->") elif isinstance(entry, PropertiesEntity): + id_regex = rf"^({re.escape(entry.key)})( *=)" additions.append(f"# {comment_prefix}") elif isinstance(entry, AndroidEntity): + id_regex = rf'^(\s*<string\s[^>]*name="{re.escape(entry.key)})(")' additions.append(f"<!-- {comment_prefix} -->") else: raise ValueError(f"Unexpected Entity type: {entry.__class__.__name__}") @@ -162,7 +177,17 @@ def combine_files( # Add any other comment lines that came directly before this Entity. additions.extend(stacked_comments) stacked_comments.clear() - additions.append(entry.all) + entry_content = entry.all + if alternative_suffix: + # NOTE: compare_locales does not allow us to set the entry.key + # value. Instead we use a regular expression to append the suffix to + # the expected key. + entry_content, count = re.subn( + id_regex, rf"\1{alternative_suffix}\2", entry_content, flags=re.M + ) + if count != 1: + raise ValueError(f"Failed to substitute the ID for {entry.key}") + additions.append(entry_content) content_middle = "" ===================================== tools/base-browser/l10n/combine/tests/test_android.py ===================================== @@ -24,6 +24,20 @@ def assert_result(new_content, old_content, expect): ) +def assert_alternative(content, alternative_content, alternative_ids, expect): + content = wrap_in_xml(content) + alternative_content = wrap_in_xml(alternative_content) + expect = wrap_in_xml(expect) + assert expect == combine_files( + "test_strings.xml", + content, + alternative_content, + "ALTERNATIVE STRING", + alternative_ids, + "_alt", + ) + + def test_combine_empty(): assert_result(None, None, None) @@ -328,3 +342,74 @@ def test_removed_string_with_comment(): <string name="removed_4">Fourth removed</string> """, ) + + +def test_alternatives(): + assert_alternative( + """\ + <string name="string_1">First string</string> + """, + """\ + <string name="string_1">Alternative string</string> + """, + ["string_1"], + """\ + <string name="string_1">First string</string> + + <!-- ALTERNATIVE STRING --> + <string name="string_1_alt">Alternative string</string> + """, + ) + assert_alternative( + """\ + <!-- Comment 1 --> + <string name="string_1">First string</string> + <!-- Comment 2 --> + <string name="string_2">Second string</string> + <string name="string_3">Third string</string> + """, + """\ + <string name="string_1">First string</string> + <!-- Alt comment --> + <string name="string_2">Alternative string</string> + <string name="string_3">Third string different</string> + <string name="string_4">Other string</string> + """, + ["string_2"], + """\ + <!-- Comment 1 --> + <string name="string_1">First string</string> + <!-- Comment 2 --> + <string name="string_2">Second string</string> + <string name="string_3">Third string</string> + + <!-- ALTERNATIVE STRING --> + <!-- Alt comment --> + <string name="string_2_alt">Alternative string</string> + """, + ) + assert_alternative( + """\ + <string name="string_1">First string</string> + <string name="string_2">Second string</string> + <string name="string_3">Third string</string> + """, + """\ + <string name="string_1">Alternative string</string> + <string name="string_3">Third string</string> + <!-- comment --> + <string name="string_4">Other string</string> + """, + ["string_1", "string_4"], + """\ + <string name="string_1">First string</string> + <string name="string_2">Second string</string> + <string name="string_3">Third string</string> + + <!-- ALTERNATIVE STRING --> + <string name="string_1_alt">Alternative string</string> + <!-- ALTERNATIVE STRING --> + <!-- comment --> + <string name="string_4_alt">Other string</string> + """, + ) ===================================== tools/base-browser/l10n/combine/tests/test_dtd.py ===================================== @@ -16,6 +16,23 @@ def assert_result(new_content, old_content, expect): ) +def assert_alternative(content, alternative_content, alternative_ids, expect): + if content is not None: + content = textwrap.dedent(content) + if alternative_content is not None: + alternative_content = textwrap.dedent(alternative_content) + if expect is not None: + expect = textwrap.dedent(expect) + assert expect == combine_files( + "test.dtd", + content, + alternative_content, + "ALTERNATIVE STRING", + alternative_ids, + ".alt", + ) + + def test_combine_empty(): assert_result(None, None, None) @@ -323,3 +340,74 @@ def test_removed_string_with_comment(): <!ENTITY removed.4 "Fourth removed"> """, ) + + +def test_alternatives(): + assert_alternative( + """\ + <!ENTITY string.1 "First string"> + """, + """\ + <!ENTITY string.1 "Alternative string"> + """, + ["string.1"], + """\ + <!ENTITY string.1 "First string"> + + <!-- LOCALIZATION NOTE: ALTERNATIVE STRING --> + <!ENTITY string.1.alt "Alternative string"> + """, + ) + assert_alternative( + """\ + <!-- LOCALIZATION NOTE: Comment 1 --> + <!ENTITY string.1 "First string"> + <!-- LOCALIZATION NOTE: Comment 2 --> + <!ENTITY string.2 "Second string"> + <!ENTITY string.3 "Third string"> + """, + """\ + <!ENTITY string.1 "First string"> + <!-- LOCALIZATION NOTE: Alt comment --> + <!ENTITY string.2 "Alternative string"> + <!ENTITY string.3 "Third string different"> + <!ENTITY string.4 "Other string"> + """, + ["string.2"], + """\ + <!-- LOCALIZATION NOTE: Comment 1 --> + <!ENTITY string.1 "First string"> + <!-- LOCALIZATION NOTE: Comment 2 --> + <!ENTITY string.2 "Second string"> + <!ENTITY string.3 "Third string"> + + <!-- LOCALIZATION NOTE: ALTERNATIVE STRING --> + <!-- LOCALIZATION NOTE: Alt comment --> + <!ENTITY string.2.alt "Alternative string"> + """, + ) + assert_alternative( + """\ + <!ENTITY string.1 "First string"> + <!ENTITY string.2 "Second string"> + <!ENTITY string.3 "Third string"> + """, + """\ + <!ENTITY string.1 "Alternative string"> + <!ENTITY string.3 "Third string"> + <!-- LOCALIZATION NOTE: comment --> + <!ENTITY string.4 "Other string"> + """, + ["string.1", "string.4"], + """\ + <!ENTITY string.1 "First string"> + <!ENTITY string.2 "Second string"> + <!ENTITY string.3 "Third string"> + + <!-- LOCALIZATION NOTE: ALTERNATIVE STRING --> + <!ENTITY string.1.alt "Alternative string"> + <!-- LOCALIZATION NOTE: ALTERNATIVE STRING --> + <!-- LOCALIZATION NOTE: comment --> + <!ENTITY string.4.alt "Other string"> + """, + ) ===================================== tools/base-browser/l10n/combine/tests/test_fluent.py ===================================== @@ -16,6 +16,23 @@ def assert_result(new_content, old_content, expect): ) +def assert_alternative(content, alternative_content, alternative_ids, expect): + if content is not None: + content = textwrap.dedent(content) + if alternative_content is not None: + alternative_content = textwrap.dedent(alternative_content) + if expect is not None: + expect = textwrap.dedent(expect) + assert expect == combine_files( + "test.ftl", + content, + alternative_content, + "ALTERNATIVE STRING", + alternative_ids, + "-alt", + ) + + def test_combine_empty(): assert_result(None, None, None) @@ -342,3 +359,119 @@ def test_removed_string_with_comment(): removed-4 = Fourth removed """, ) + + +def test_alternatives(): + assert_alternative( + """\ + string-1 = First string + .title = hello + """, + """\ + string-1 = Alternative string + .title = different + """, + ["string-1"], + """\ + string-1 = First string + .title = hello + + + ## ALTERNATIVE STRING + + string-1-alt = Alternative string + .title = different + """, + ) + assert_alternative( + """\ + string-1 = First string + .title = hello + """, + """\ + string-1 = Alternative string + """, + ["string-1"], + """\ + string-1 = First string + .title = hello + + + ## ALTERNATIVE STRING + + string-1-alt = Alternative string + """, + ) + assert_alternative( + """\ + -term-1 = First string + """, + """\ + -term-1 = Alternative string + """, + ["-term-1"], + """\ + -term-1 = First string + + + ## ALTERNATIVE STRING + + -term-1-alt = Alternative string + """, + ) + assert_alternative( + """\ + # Comment 1 + string-1 = First string + # Comment 2 + string-2 = Second string + string-3 = Third string + """, + """\ + string-1 = First string + # Alt comment + string-2 = Alternative string + string-3 = Third string different + string-4 = Other string + """, + ["string-2"], + """\ + # Comment 1 + string-1 = First string + # Comment 2 + string-2 = Second string + string-3 = Third string + + + ## ALTERNATIVE STRING + + # Alt comment + string-2-alt = Alternative string + """, + ) + assert_alternative( + """\ + string-1 = First string + string-2 = Second string + string-3 = Third string + """, + """\ + string-1 = Alternative string + string-3 = Third string + # comment + -string-4 = Other string + """, + ["string-1", "-string-4"], + """\ + string-1 = First string + string-2 = Second string + string-3 = Third string + + + ## ALTERNATIVE STRING + + string-1-alt = Alternative string + # comment + -string-4-alt = Other string + """, + ) ===================================== tools/base-browser/l10n/combine/tests/test_properties.py ===================================== @@ -16,6 +16,23 @@ def assert_result(new_content, old_content, expect): ) +def assert_alternative(content, alternative_content, alternative_ids, expect): + if content is not None: + content = textwrap.dedent(content) + if alternative_content is not None: + alternative_content = textwrap.dedent(alternative_content) + if expect is not None: + expect = textwrap.dedent(expect) + assert expect == combine_files( + "test.properties", + content, + alternative_content, + "ALTERNATIVE STRING", + alternative_ids, + ".alt", + ) + + def test_combine_empty(): assert_result(None, None, None) @@ -320,3 +337,74 @@ def test_removed_string_with_comment(): removed.4 = Fourth removed """, ) + + +def test_alternatives(): + assert_alternative( + """\ + string.1 = First string + """, + """\ + string.1 = Alternative string + """, + ["string.1"], + """\ + string.1 = First string + + # ALTERNATIVE STRING + string.1.alt = Alternative string + """, + ) + assert_alternative( + """\ + # Comment 1 + string.1 = First string + # Comment 2 + string.2 = Second string + string.3 = Third string + """, + """\ + string.1 = First string + # Alt comment + string.2 = Alternative string + string.3 = Third string different + string.4 = Other string + """, + ["string.2"], + """\ + # Comment 1 + string.1 = First string + # Comment 2 + string.2 = Second string + string.3 = Third string + + # ALTERNATIVE STRING + # Alt comment + string.2.alt = Alternative string + """, + ) + assert_alternative( + """\ + string.1 = First string + string.2 = Second string + string.3 = Third string + """, + """\ + string.1 = Alternative string + string.3 = Third string + # comment + string.4 = Other string + """, + ["string.1", "string.4"], + """\ + string.1 = First string + string.2 = Second string + string.3 = Third string + + # ALTERNATIVE STRING + string.1.alt = Alternative string + # ALTERNATIVE STRING + # comment + string.4.alt = Other string + """, + ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d94603… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d94603… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][maint-14.0] MB 394: Fix package dependency for Debian Trixie
by boklm (@boklm) 18 Feb '25

18 Feb '25
boklm pushed to branch maint-14.0 at The Tor Project / Applications / tor-browser-build Commits: 119ce448 by Nicolas Vigier at 2025-02-18T12:01:51+01:00 MB 394: Fix package dependency for Debian Trixie The libgdk-pixbuf2.0-0 package has been removed from Debian Trixie. We update the symbols file to depend on both libgdk-pixbuf2.0-0 and libgdk-pixbuf-2.0-0. https://bugzilla.mozilla.org/show_bug.cgi?id=1933835 - - - - - 1 changed file: - projects/linux-packages/config Changes: ===================================== projects/linux-packages/config ===================================== @@ -31,6 +31,11 @@ targets: # some :i386 packages fail to install when /var/lib/dpkg/available # does not exist, so create it as an empty file echo > /var/lib/dpkg/available + post_pkginst: | + # Alter the symbols file for libgdk-pixbuf to handle the transition to libgdk-pixbuf-2.0-0 + # This is only necessary until we upgrade to something newer than buster. + # See mullvad-browser#394 and https://bugzilla.mozilla.org/show_bug.cgi?id=1933835 + find /var/lib/dpkg/info/ -name libgdk-pixbuf2.0-0*symbols | xargs sed -i "/libgdk-pixbuf2.0-0/s/libgdk-pixbuf2.0-0/libgdk-pixbuf2.0-0 #MINVER# | libgdk-pixbuf-2.0-0/" arch_deps: # Packages needed to build the deb package - dpkg-dev View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] MB 394: Fix package dependency for Debian Trixie
by boklm (@boklm) 18 Feb '25

18 Feb '25
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 15aae5bd by Nicolas Vigier at 2025-02-17T12:47:15+01:00 MB 394: Fix package dependency for Debian Trixie The libgdk-pixbuf2.0-0 package has been removed from Debian Trixie. We update the symbols file to depend on both libgdk-pixbuf2.0-0 and libgdk-pixbuf-2.0-0. https://bugzilla.mozilla.org/show_bug.cgi?id=1933835 - - - - - 1 changed file: - projects/linux-packages/config Changes: ===================================== projects/linux-packages/config ===================================== @@ -32,6 +32,11 @@ targets: # some foreign-arch packages fail to install when /var/lib/dpkg/available # does not exist, so create it as an empty file echo > /var/lib/dpkg/available + post_pkginst: | + # Alter the symbols file for libgdk-pixbuf to handle the transition to libgdk-pixbuf-2.0-0 + # This is only necessary until we upgrade to something newer than buster. + # See mullvad-browser#394 and https://bugzilla.mozilla.org/show_bug.cgi?id=1933835 + find /var/lib/dpkg/info/ -name libgdk-pixbuf2.0-0*symbols | xargs sed -i "/libgdk-pixbuf2.0-0/s/libgdk-pixbuf2.0-0/libgdk-pixbuf2.0-0 #MINVER# | libgdk-pixbuf-2.0-0/" arch_deps: # Packages needed to build the deb package - dpkg-dev @@ -67,6 +72,11 @@ targets: # some foreign-arch packages fail to install when /var/lib/dpkg/available # does not exist, so create it as an empty file echo > /var/lib/dpkg/available + post_pkginst: | + # Alter the symbols file for libgdk-pixbuf to handle the transition to libgdk-pixbuf-2.0-0 + # This is only necessary until we upgrade to something newer than buster. + # See mullvad-browser#394 and https://bugzilla.mozilla.org/show_bug.cgi?id=1933835 + find /var/lib/dpkg/info/ -name libgdk-pixbuf2.0-0*symbols | xargs sed -i "/libgdk-pixbuf2.0-0/s/libgdk-pixbuf2.0-0/libgdk-pixbuf2.0-0 #MINVER# | libgdk-pixbuf-2.0-0/" arch_deps: # Packages needed to build the deb package - dpkg-dev View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] 2 commits: fixup! TB 42247: Android helpers for the TorProvider
by Pier Angelo Vendrame (@pierov) 17 Feb '25

17 Feb '25
Pier Angelo Vendrame pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: 14d735fe by Dan Ballard at 2025-02-13T11:58:47-08:00 fixup! TB 42247: Android helpers for the TorProvider Rename TorIntegrationAndroid.java to TorAndroidIntegration.java - - - - - d94603fa by Dan Ballard at 2025-02-13T12:00:18-08:00 fixup! [android] Implement Android-native Connection Assist UI rename TorIntegrationAndroid.java to TorAndroidIntegration.java - - - - - 4 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java → mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorAndroidIntegration.java Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt ===================================== @@ -156,7 +156,7 @@ import mozilla.components.browser.engine.gecko.GeckoEngine import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.tor.TorConnectionAssistViewModel -import org.mozilla.geckoview.TorIntegrationAndroid +import org.mozilla.geckoview.TorAndroidIntegration /** * The main activity of the application. The application is primarily a single Activity (this one) @@ -165,7 +165,7 @@ import org.mozilla.geckoview.TorIntegrationAndroid * - browser screen */ @SuppressWarnings("TooManyFunctions", "LargeClass", "LongMethod") -open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorIntegrationAndroid.BootstrapStateChangeListener { +open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorAndroidIntegration.BootstrapStateChangeListener { private lateinit var binding: ActivityHomeBinding lateinit var themeManager: ThemeManager lateinit var browsingModeManager: BrowsingModeManager ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt ===================================== @@ -8,9 +8,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import mozilla.components.browser.engine.gecko.GeckoEngine import org.mozilla.fenix.ext.components -import org.mozilla.geckoview.TorIntegrationAndroid -import org.mozilla.geckoview.TorIntegrationAndroid.BootstrapStateChangeListener -import org.mozilla.geckoview.TorIntegrationAndroid.TorLogListener +import org.mozilla.geckoview.TorAndroidIntegration +import org.mozilla.geckoview.TorAndroidIntegration.BootstrapStateChangeListener +import org.mozilla.geckoview.TorAndroidIntegration.TorLogListener import org.mozilla.geckoview.TorSettings import org.mozilla.geckoview.TorSettings.BridgeBuiltinType import org.mozilla.geckoview.TorSettings.BridgeSource @@ -73,7 +73,7 @@ class TorControllerGV( override val isBootstrapped get() = isTorBootstrapped override val isConnected get() = (_lastKnownStatus.value.isStarted() && !isTorRestarting) - private fun getTorIntegration(): TorIntegrationAndroid { + private fun getTorIntegration(): TorAndroidIntegration { return (context.components.core.engine as GeckoEngine).getTorIntegrationController() } ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java ===================================== @@ -244,7 +244,7 @@ public final class GeckoRuntime implements Parcelable { private final ProfilerController mProfilerController; private final GeckoScreenChangeListener mScreenChangeListener; - private TorIntegrationAndroid mTorIntegration; + private TorAndroidIntegration mTorIntegration; private GeckoRuntime() { mWebExtensionController = new WebExtensionController(this); @@ -495,7 +495,7 @@ public final class GeckoRuntime implements Parcelable { mScreenChangeListener.enable(); } - mTorIntegration = new TorIntegrationAndroid(context); + mTorIntegration = new TorAndroidIntegration(context); mProfilerController.addMarker( "GeckoView Initialization START", mProfilerController.getProfilerTime()); @@ -1015,7 +1015,7 @@ public final class GeckoRuntime implements Parcelable { * Get the Tor integration controller for this runtime. */ @UiThread - public @NonNull TorIntegrationAndroid getTorIntegrationController() { + public @NonNull TorAndroidIntegration getTorIntegrationController() { return mTorIntegration; } ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java → mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorAndroidIntegration.java ===================================== @@ -29,8 +29,8 @@ import org.mozilla.gecko.util.EventCallback; import org.mozilla.gecko.util.GeckoBundle; import org.mozilla.geckoview.androidlegacysettings.TorLegacyAndroidSettings; -public class TorIntegrationAndroid implements BundleEventListener { - private static final String TAG = "TorIntegrationAndroid"; +public class TorAndroidIntegration implements BundleEventListener { + private static final String TAG = "TorAndroidIntegration"; // Events we listen to private static final String EVENT_TOR_START = "GeckoView:Tor:StartTor"; @@ -88,7 +88,7 @@ public class TorIntegrationAndroid implements BundleEventListener { */ private TorSettings mSettings = null; - /* package */ TorIntegrationAndroid(Context context) { + /* package */ TorAndroidIntegration(Context context) { mLibraryDir = context.getApplicationInfo().nativeLibraryDir; mCacheDir = context.getCacheDir().getAbsolutePath(); mIpcDirectory = mCacheDir + "/tor-private"; @@ -269,7 +269,7 @@ public class TorIntegrationAndroid implements BundleEventListener { public void run() { cleanIpcDirectory(); - final String ipcDir = TorIntegrationAndroid.this.mIpcDirectory; + final String ipcDir = TorAndroidIntegration.this.mIpcDirectory; final ArrayList<String> args = new ArrayList<>(); args.add(mLibraryDir + "/libTor.so"); args.add("DisableNetwork"); @@ -354,7 +354,7 @@ public class TorIntegrationAndroid implements BundleEventListener { } private void cleanIpcDirectory() { - File directory = new File(TorIntegrationAndroid.this.mIpcDirectory); + File directory = new File(TorAndroidIntegration.this.mIpcDirectory); if (!directory.isDirectory()) { if (!directory.mkdirs()) { Log.e(TAG, "Failed to create the IPC directory."); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/22ad3e… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/22ad3e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.7.0esr-14.5-1] 2 commits: fixup! TB 42669: [android] Use custom no-op app-services
by Dan Ballard (@dan) 13 Feb '25

13 Feb '25
Dan Ballard pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser Commits: b374c1f2 by Dan Ballard at 2025-02-13T11:43:11-08:00 fixup! TB 42669: [android] Use custom no-op app-services Bug 42669: get latest application services by date and put in tools - - - - - 22ad3eca by Dan Ballard at 2025-02-13T11:43:11-08:00 fixup! [android] Modify build system Bug 42669: Inject gradle property for nimbus-fml path for application services - - - - - 3 changed files: - .gitignore - mobile/android/fenix/app/build.gradle - mobile/android/fenix/tools/tba-fetch-deps.sh Changes: ===================================== .gitignore ===================================== @@ -359,7 +359,7 @@ media/libvpx/config/**/config.log mobile/android/.experimenter.json # Tor libraries for local builds -mobile/android/fenix/app/nimbus-fml +mobile/android/fenix/tools/nimbus-fml mobile/android/fenix/app/tor-expert-bundle.aar mobile/android/fenix/app/src/main/assets/extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi ===================================== mobile/android/fenix/app/build.gradle ===================================== @@ -315,6 +315,8 @@ android.applicationVariants.configureEach { variant -> if (project.hasProperty("disableTor")) { disableTor = project.getProperty("disableTor") } + System.setProperty("nimbusFml", rootProject.projectDir.toPath().resolve("tools").resolve("nimbus-fml").toAbsolutePath().toString()) + println("----------------------------------------------") println("Variant name: " + variant.name) @@ -323,6 +325,7 @@ android.applicationVariants.configureEach { variant -> println("Flavor: " + variant.flavorName) println("Telemetry enabled: " + !isDebugOrDCD) println("Tor is disabled: " + disableTor) + println("nimbusFml: " + System.getProperty("nimbusFml")) buildConfigField "boolean", "DISABLE_TOR", "$disableTor" ===================================== mobile/android/fenix/tools/tba-fetch-deps.sh ===================================== @@ -47,7 +47,7 @@ if [ "$os" = "unsupported" ] || [ "$arch" = "unsupported" ]; then exit 2 fi -app_services="$(find "$TOR_BROWSER_BUILD/out/application-services" -name 'application-services*.tar.zst' -print | sort | tail -1)" +app_services="$(ls -1t "$TOR_BROWSER_BUILD/out/application-services/"application-services*.tar.zst | head -1)" mkdir -p "$GRADLE_MAVEN_REPOSITORIES/org/mozilla" if [ -f "$app_services" ]; then tar -C /tmp -xf "$app_services" @@ -67,14 +67,14 @@ if [ -f "$app_services" ]; then unzip -d /tmp/nimbus-fml /tmp/nimbus-fml.zip nimbus_fml="$(find "/tmp/nimbus-fml/" -name 'nimbus-fml*' | grep "$arch-$os")" echo "Using nimbus-fml binary: $nimbus_fml" - cp $nimbus_fml app/ + cp $nimbus_fml tools/ rm -rf /tmp/nimbus-fml rm /tmp/nimbus-fml.zip else - cp /tmp/application-services/nimbus-fml app/ + cp /tmp/application-services/nimbus-fml tools/ fi - chmod +x app/nimbus-fml + chmod +x tools/nimbus-fml rm -rf /tmp/application-services else View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e01fb0… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e01fb0… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Update MR template and add Uplift issue template
by morgan (@morgan) 13 Feb '25

13 Feb '25
morgan pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: f48f1e95 by Morgan at 2025-02-13T16:56:36+00:00 Update MR template and add Uplift issue template - - - - - 2 changed files: - + .gitlab/issue_templates/Uplift.md - .gitlab/merge_request_templates/default.md Changes: ===================================== .gitlab/issue_templates/Uplift.md ===================================== @@ -0,0 +1,18 @@ +<!-- +Title: + Uplift tor-browser-build#12345: Title of Issue +--> + +# Uplift Patchset + +## Gitlab Issue(s) +- tor-browser-build#12345 + +## Upstream Project Issue(s): + + +## Notes + +<!-- whatever additional info, context, etc that would be helpful for uplifting --> + +/label ~"Apps::Type::Uplift" ===================================== .gitlab/merge_request_templates/default.md ===================================== @@ -42,6 +42,9 @@ ### Issue Tracking - [ ] Link resolved issues with appropriate [Release Prep issue](https://gitlab.torproject.org/groups/tpo/applications/-/issues/?sort… for changelog generation +### Uplifting +- [ ] Patchset is a candidate for uplift to upstream projects (e.g. mingw, clang, etc) + ### Review #### Request Reviewer View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • ...
  • 765
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.