tbb-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- 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
- 1 participants
- 21222 discussions
16 Jul '20
commit 1555bfb9d7dafa42c18ef04c0763c884f4862f22
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Jun 11 09:54:09 2020 +0000
Bug 34011: Bump clang to 9.0.1
We add a new project to not interfere with non-mobile toolchain
requirements for now until both series are moved to the non-ESR release
train.
---
projects/fenix-clang/43909.patch | 252 +++++++++++++++++++++++++++++++++++++++
projects/fenix-clang/build | 45 +++++++
projects/fenix-clang/config | 36 ++++++
3 files changed, 333 insertions(+)
diff --git a/projects/fenix-clang/43909.patch b/projects/fenix-clang/43909.patch
new file mode 100644
index 0000000..78d2a75
--- /dev/null
+++ b/projects/fenix-clang/43909.patch
@@ -0,0 +1,252 @@
+From c95310f2d4fd3c88241c3b5d6dbf6251d34a3256 Mon Sep 17 00:00:00 2001
+From: Nikita Popov <nikita.ppv(a)gmail.com>
+Date: Sat, 16 Nov 2019 16:22:18 +0100
+Subject: [PATCH] Restructure caching
+
+Variant on D70103. The caching is switched to always use a BB to
+cache entry map, which then contains per-value caches. A separate
+set contains value handles with a deletion callback. This allows us
+to properly invalidate overdefined values.
+
+A possible alternative would be to always cache by value first and
+have per-BB maps/sets in the each cache entry. In that case we could
+use a ValueMap and would avoid the separate value handle set. I went
+with the BB indexing at the top level to make it easier to integrate
+D69914, but possibly that's not the right choice.
+
+Differential Revision: https://reviews.llvm.org/D70376
+
+diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
+index 110c085d3f3..aa6862cb588 100644
+--- a/llvm/lib/Analysis/LazyValueInfo.cpp
++++ b/llvm/lib/Analysis/LazyValueInfo.cpp
+@@ -133,12 +133,9 @@ namespace {
+ /// A callback value handle updates the cache when values are erased.
+ class LazyValueInfoCache;
+ struct LVIValueHandle final : public CallbackVH {
+- // Needs to access getValPtr(), which is protected.
+- friend struct DenseMapInfo<LVIValueHandle>;
+-
+ LazyValueInfoCache *Parent;
+
+- LVIValueHandle(Value *V, LazyValueInfoCache *P)
++ LVIValueHandle(Value *V, LazyValueInfoCache *P = nullptr)
+ : CallbackVH(V), Parent(P) { }
+
+ void deleted() override;
+@@ -152,89 +149,63 @@ namespace {
+ /// This is the cache kept by LazyValueInfo which
+ /// maintains information about queries across the clients' queries.
+ class LazyValueInfoCache {
+- /// This is all of the cached block information for exactly one Value*.
+- /// The entries are sorted by the BasicBlock* of the
+- /// entries, allowing us to do a lookup with a binary search.
+- /// Over-defined lattice values are recorded in OverDefinedCache to reduce
+- /// memory overhead.
+- struct ValueCacheEntryTy {
+- ValueCacheEntryTy(Value *V, LazyValueInfoCache *P) : Handle(V, P) {}
+- LVIValueHandle Handle;
+- SmallDenseMap<PoisoningVH<BasicBlock>, ValueLatticeElement, 4> BlockVals;
++ /// This is all of the cached information for one basic block. It contains
++ /// the per-value lattice elements, as well as a separate set for
++ /// overdefined values to reduce memory usage.
++ struct BlockCacheEntryTy {
++ SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
++ SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
+ };
+
+- /// This tracks, on a per-block basis, the set of values that are
+- /// over-defined at the end of that block.
+- typedef DenseMap<PoisoningVH<BasicBlock>, SmallPtrSet<Value *, 4>>
+- OverDefinedCacheTy;
+- /// Keep track of all blocks that we have ever seen, so we
+- /// don't spend time removing unused blocks from our caches.
+- DenseSet<PoisoningVH<BasicBlock> > SeenBlocks;
+-
+- /// This is all of the cached information for all values,
+- /// mapped from Value* to key information.
+- DenseMap<Value *, std::unique_ptr<ValueCacheEntryTy>> ValueCache;
+- OverDefinedCacheTy OverDefinedCache;
+-
++ /// Cached information per basic block.
++ DenseMap<PoisoningVH<BasicBlock>, BlockCacheEntryTy> BlockCache;
++ /// Set of value handles used to erase values from the cache on deletion.
++ DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
+
+ public:
+ void insertResult(Value *Val, BasicBlock *BB,
+ const ValueLatticeElement &Result) {
+- SeenBlocks.insert(BB);
+-
++ auto &CacheEntry = BlockCache.try_emplace(BB).first->second;
+ // Insert over-defined values into their own cache to reduce memory
+ // overhead.
+ if (Result.isOverdefined())
+- OverDefinedCache[BB].insert(Val);
+- else {
+- auto It = ValueCache.find_as(Val);
+- if (It == ValueCache.end()) {
+- ValueCache[Val] = make_unique<ValueCacheEntryTy>(Val, this);
+- It = ValueCache.find_as(Val);
+- assert(It != ValueCache.end() && "Val was just added to the map!");
+- }
+- It->second->BlockVals[BB] = Result;
+- }
+- }
+-
+- bool isOverdefined(Value *V, BasicBlock *BB) const {
+- auto ODI = OverDefinedCache.find(BB);
+-
+- if (ODI == OverDefinedCache.end())
+- return false;
++ CacheEntry.OverDefined.insert(Val);
++ else
++ CacheEntry.LatticeElements.insert({ Val, Result });
+
+- return ODI->second.count(V);
++ auto HandleIt = ValueHandles.find_as(Val);
++ if (HandleIt == ValueHandles.end())
++ ValueHandles.insert({ Val, this });
+ }
+
+ bool hasCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
+- return true;
+-
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
+ return false;
+
+- return I->second->BlockVals.count(BB);
++ return It->second.OverDefined.count(V) ||
++ It->second.LatticeElements.count(V);
+ }
+
+ ValueLatticeElement getCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
++ return ValueLatticeElement();
++
++ if (It->second.OverDefined.count(V))
+ return ValueLatticeElement::getOverdefined();
+
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto LatticeIt = It->second.LatticeElements.find(V);
++ if (LatticeIt == It->second.LatticeElements.end())
+ return ValueLatticeElement();
+- auto BBI = I->second->BlockVals.find(BB);
+- if (BBI == I->second->BlockVals.end())
+- return ValueLatticeElement();
+- return BBI->second;
++
++ return LatticeIt->second;
+ }
+
+ /// clear - Empty the cache.
+ void clear() {
+- SeenBlocks.clear();
+- ValueCache.clear();
+- OverDefinedCache.clear();
++ BlockCache.clear();
++ ValueHandles.clear();
+ }
+
+ /// Inform the cache that a given value has been deleted.
+@@ -248,23 +219,18 @@ namespace {
+ /// OldSucc might have (unless also overdefined in NewSucc). This just
+ /// flushes elements from the cache and does not add any.
+ void threadEdgeImpl(BasicBlock *OldSucc,BasicBlock *NewSucc);
+-
+- friend struct LVIValueHandle;
+ };
+ }
+
+ void LazyValueInfoCache::eraseValue(Value *V) {
+- for (auto I = OverDefinedCache.begin(), E = OverDefinedCache.end(); I != E;) {
+- // Copy and increment the iterator immediately so we can erase behind
+- // ourselves.
+- auto Iter = I++;
+- SmallPtrSetImpl<Value *> &ValueSet = Iter->second;
+- ValueSet.erase(V);
+- if (ValueSet.empty())
+- OverDefinedCache.erase(Iter);
++ for (auto &Pair : BlockCache) {
++ Pair.second.LatticeElements.erase(V);
++ Pair.second.OverDefined.erase(V);
+ }
+
+- ValueCache.erase(V);
++ auto HandleIt = ValueHandles.find_as(V);
++ if (HandleIt != ValueHandles.end())
++ ValueHandles.erase(HandleIt);
+ }
+
+ void LVIValueHandle::deleted() {
+@@ -274,18 +240,7 @@ void LVIValueHandle::deleted() {
+ }
+
+ void LazyValueInfoCache::eraseBlock(BasicBlock *BB) {
+- // Shortcut if we have never seen this block.
+- DenseSet<PoisoningVH<BasicBlock> >::iterator I = SeenBlocks.find(BB);
+- if (I == SeenBlocks.end())
+- return;
+- SeenBlocks.erase(I);
+-
+- auto ODI = OverDefinedCache.find(BB);
+- if (ODI != OverDefinedCache.end())
+- OverDefinedCache.erase(ODI);
+-
+- for (auto &I : ValueCache)
+- I.second->BlockVals.erase(BB);
++ BlockCache.erase(BB);
+ }
+
+ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+@@ -303,10 +258,11 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ std::vector<BasicBlock*> worklist;
+ worklist.push_back(OldSucc);
+
+- auto I = OverDefinedCache.find(OldSucc);
+- if (I == OverDefinedCache.end())
++ auto I = BlockCache.find(OldSucc);
++ if (I == BlockCache.end() || I->second.OverDefined.empty())
+ return; // Nothing to process here.
+- SmallVector<Value *, 4> ValsToClear(I->second.begin(), I->second.end());
++ SmallVector<Value *, 4> ValsToClear(I->second.OverDefined.begin(),
++ I->second.OverDefined.end());
+
+ // Use a worklist to perform a depth-first search of OldSucc's successors.
+ // NOTE: We do not need a visited list since any blocks we have already
+@@ -320,10 +276,10 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ if (ToUpdate == NewSucc) continue;
+
+ // If a value was marked overdefined in OldSucc, and is here too...
+- auto OI = OverDefinedCache.find(ToUpdate);
+- if (OI == OverDefinedCache.end())
++ auto OI = BlockCache.find(ToUpdate);
++ if (OI == BlockCache.end() || OI->second.OverDefined.empty())
+ continue;
+- SmallPtrSetImpl<Value *> &ValueSet = OI->second;
++ auto &ValueSet = OI->second.OverDefined;
+
+ bool changed = false;
+ for (Value *V : ValsToClear) {
+@@ -333,11 +289,6 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ // If we removed anything, then we potentially need to update
+ // blocks successors too.
+ changed = true;
+-
+- if (ValueSet.empty()) {
+- OverDefinedCache.erase(OI);
+- break;
+- }
+ }
+
+ if (!changed) continue;
+--
+2.24.0
+
diff --git a/projects/fenix-clang/build b/projects/fenix-clang/build
new file mode 100644
index 0000000..c8cceb4
--- /dev/null
+++ b/projects/fenix-clang/build
@@ -0,0 +1,45 @@
+#!/bin/bash
+[% c("var/set_default_env") -%]
+distdir=/var/tmp/dist/[% project %]
+mkdir -p /var/tmp/dist
+tar -C /var/tmp/dist -xf [% c('input_files_by_name/cmake') %]
+export PATH="/var/tmp/dist/cmake/bin:$PATH"
+[% IF c("var/linux") %]
+ # We need a link to our GCC, otherwise the system cc gets used which points to
+ # /usr/bin/gcc.
+ [% pc('gcc', 'var/setup', { compiler_tarfile => c('input_files_by_name/gcc'),
+ hardened_gcc => 0 }) %]
+ ln -s gcc /var/tmp/dist/gcc/bin/cc
+[% END -%]
+mkdir -p /var/tmp/build
+cd /var/tmp/build
+tar -xf $rootdir/[% c('input_files_by_name/llvm') %]
+tar -xf $rootdir/[% c('input_files_by_name/clang') %]
+tar -xf $rootdir/[% c('input_files_by_name/libcxx') %]
+tar -xf $rootdir/[% c('input_files_by_name/libcxxabi') %]
+tar -xf $rootdir/[% c('input_files_by_name/lld') %]
+tar -xf $rootdir/[% c('input_files_by_name/compiler-rt') %]
+mv llvm-* llvm
+# LLVM has reproducibility issues when optimizing bitcode, which we need to
+# patch. See: #32053 for more details.
+patch -p1 < $rootdir/43909.patch
+mv clang-* llvm/tools/clang
+mv libcxx-* llvm/projects/libcxx
+mv libcxxabi-* llvm/projects/libcxxabi
+mv lld-* llvm/tools/lld
+mv compiler-rt-* llvm/projects/compiler-rt
+cd llvm
+export LLVM_HOME=$(pwd)
+mkdir build
+cd build
+cmake .. -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$distdir \
+ -DCMAKE_BUILD_TYPE:STRING=Release \
+ [% IF c("var/rlbox") -%]-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly \[% END -%]
+ $LLVM_HOME
+make -j[% c("buildconf/num_procs") %]
+make install
+cd /var/tmp/dist
+[% c('tar', {
+ tar_src => [ project ],
+ tar_args => '-czf ' _ dest_dir _ '/' _ c('filename'),
+ }) %]
diff --git a/projects/fenix-clang/config b/projects/fenix-clang/config
new file mode 100644
index 0000000..8f16354
--- /dev/null
+++ b/projects/fenix-clang/config
@@ -0,0 +1,36 @@
+# vim: filetype=yaml sw=2
+version: 9.0.1
+filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
+gpg_keyring: clang.gpg
+sig_ext: sig
+
+var:
+ container:
+ use_container: 1
+
+input_files:
+ - project: container-image
+ - name: '[% c("var/compiler") %]'
+ project: '[% c("var/compiler") %]'
+ enable: '[% c("var/linux") %]'
+ - project: cmake
+ name: cmake
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/llvm-[% c("version") %].src.tar.xz'
+ name: llvm
+ file_gpg_id: 1
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/clang-[% c("version") %].src.tar.xz'
+ name: clang
+ file_gpg_id: 1
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/libcxx-[% c("version") %].src.tar.xz'
+ name: libcxx
+ file_gpg_id: 1
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/libcxxabi-[% c("version") %].src.tar.xz'
+ name: libcxxabi
+ file_gpg_id: 1
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/lld-[% c("version") %].src.tar.xz'
+ name: lld
+ file_gpg_id: 1
+ - URL: 'https://github.com/llvm/llvm-project/releases/download/llvmorg-[% c("version") %]/compiler-rt-[% c("version") %].src.tar.xz'
+ name: compiler-rt
+ file_gpg_id: 1
+ - filename: 43909.patch
1
0
[tor-browser-build/master] Bug 33760: Update rbm.conf to match NDK 20
by sysrqb@torproject.org 16 Jul '20
by sysrqb@torproject.org 16 Jul '20
16 Jul '20
commit 336564a4572965ba3f3b8730a93a7e0bf0584107
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Jun 11 09:50:50 2020 +0000
Bug 33760: Update rbm.conf to match NDK 20
Based on a patch by sisbell, thanks!
We make it clearer that we are concerned with the cross compilation
prefix (so that all the necessary tools can be found) by renaming
`configure_host` to `cross_prefix`.
Additionally, we reorder the `configure_opt` arguments a bit to closer
match other platforms.
Finally, we introduce the Fenix related targets to be able to build
Tor Browser based on Fennec and Fenix in parallel for the time being.
---
rbm.conf | 45 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/rbm.conf b/rbm.conf
index 92c3293..9d74a37 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -196,9 +196,17 @@ targets:
- zip
- unzip
+ torbrowser-android-fenix-armv7:
+ - android-fenix-armv7
+ - android-armv7
+ - android-fenix
+ - android
torbrowser-android-armv7:
- android-armv7
- android
+ android-fenix-armv7:
+ var:
+ cross_prefix: armv7a-linux-androideabi
android-armv7:
arch: armv7
var:
@@ -207,9 +215,17 @@ targets:
toolchain_arch: arm
configure_host: arm-linux-androideabi
abi: armeabi-v7a
+ torbrowser-android-fenix-x86:
+ - android-fenix-x86
+ - android-x86
+ - android-fenix
+ - android
torbrowser-android-x86:
- android-x86
- android
+ android-fenix-x86:
+ var:
+ cross_prefix: i686-linux-android
android-x86:
arch: x86
var:
@@ -218,9 +234,17 @@ targets:
toolchain_arch: x86
configure_host: i686-linux-android
abi: x86
+ torbrowser-android-fenix-x86_64:
+ - android-fenix-x86_64
+ - android-x86_64
+ - android-fenix
+ - android
torbrowser-android-x86_64:
- android-x86_64
- android
+ android-fenix-x86_64:
+ var:
+ cross_prefix: x86_64-linux-android
android-x86_64:
arch: x86_64
var:
@@ -229,9 +253,17 @@ targets:
toolchain_arch: x86_64
configure_host: x86_64-linux-android
abi: x86_64
+ torbrowser-android-fenix-aarch64:
+ - android-fenix-aarch64
+ - android-aarch64
+ - android-fenix
+ - android
torbrowser-android-aarch64:
- android-aarch64
- android
+ android-fenix-aarch64:
+ var:
+ cross_prefix: aarch64-linux-android
android-aarch64:
arch: aarch64
var:
@@ -240,17 +272,24 @@ targets:
toolchain_arch: arm64
configure_host: aarch64-linux-android
abi: arm64-v8a
+ android-fenix:
+ var:
+ android-fenix: 1
+ compiler: fenix-android-toolchain
+ CC: '[% c("var/cross_prefix") %][% c("var/android_min_api") %]-clang'
+ CXX: '[% c("var/cross_prefix") %][% c("var/android_min_api") %]-clang'
+ configure_opt: '--host=[% c("var/cross_prefix") %] CC=[% c("var/CC") %] [% c("var/configure_opt_project") %]'
android:
var:
android: 1
compiler: android-toolchain
- # API 16 is the minimum we currently support for Tor Browser on Android
android_min_api: '[% GET c("var/android_min_api_" _ c("arch")) %]'
- # API 21 is the minimum we currently support for arm64 on Android
- android_min_api_aarch64: 21
+ # API 16 is the minimum we currently support for 32 bit on Android
android_min_api_armv7: 16
android_min_api_x86: 16
+ # API 21 is the minimum we currently support for 64 bit on Android
android_min_api_x86_64: 21
+ android_min_api_aarch64: 21
CC: '$ANDROID_NDK_HOME/[% c("var/toolchain_arch") %]/bin/clang'
CXX: '$ANDROID_NDK_HOME/[% c("var/toolchain_arch") %]/bin/clang++'
# We only build snowflake on the alpha and nightly
1
0
[tor-browser-build/master] Bug 33833: Upgrade Rust to use Android NDK 20
by sysrqb@torproject.org 16 Jul '20
by sysrqb@torproject.org 16 Jul '20
16 Jul '20
commit f2334e1dcb1714a2838b7c61569337f4e425fad5
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Jun 11 09:57:33 2020 +0000
Bug 33833: Upgrade Rust to use Android NDK 20
Bump Rust version to 1.43.0, too, which is used by Mozilla now.
We add a new project to not interfere with non-mobile toolchain
requirements for now until both series are moved to the non-ESR release
train.
---
projects/fenix-rust/43909.patch | 252 +++++++++++++++++++++++++++++++++++++++
projects/fenix-rust/build | 80 +++++++++++++
projects/fenix-rust/config | 105 ++++++++++++++++
projects/fenix-rust/unwind.patch | 162 +++++++++++++++++++++++++
4 files changed, 599 insertions(+)
diff --git a/projects/fenix-rust/43909.patch b/projects/fenix-rust/43909.patch
new file mode 100644
index 0000000..78d2a75
--- /dev/null
+++ b/projects/fenix-rust/43909.patch
@@ -0,0 +1,252 @@
+From c95310f2d4fd3c88241c3b5d6dbf6251d34a3256 Mon Sep 17 00:00:00 2001
+From: Nikita Popov <nikita.ppv(a)gmail.com>
+Date: Sat, 16 Nov 2019 16:22:18 +0100
+Subject: [PATCH] Restructure caching
+
+Variant on D70103. The caching is switched to always use a BB to
+cache entry map, which then contains per-value caches. A separate
+set contains value handles with a deletion callback. This allows us
+to properly invalidate overdefined values.
+
+A possible alternative would be to always cache by value first and
+have per-BB maps/sets in the each cache entry. In that case we could
+use a ValueMap and would avoid the separate value handle set. I went
+with the BB indexing at the top level to make it easier to integrate
+D69914, but possibly that's not the right choice.
+
+Differential Revision: https://reviews.llvm.org/D70376
+
+diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
+index 110c085d3f3..aa6862cb588 100644
+--- a/llvm/lib/Analysis/LazyValueInfo.cpp
++++ b/llvm/lib/Analysis/LazyValueInfo.cpp
+@@ -133,12 +133,9 @@ namespace {
+ /// A callback value handle updates the cache when values are erased.
+ class LazyValueInfoCache;
+ struct LVIValueHandle final : public CallbackVH {
+- // Needs to access getValPtr(), which is protected.
+- friend struct DenseMapInfo<LVIValueHandle>;
+-
+ LazyValueInfoCache *Parent;
+
+- LVIValueHandle(Value *V, LazyValueInfoCache *P)
++ LVIValueHandle(Value *V, LazyValueInfoCache *P = nullptr)
+ : CallbackVH(V), Parent(P) { }
+
+ void deleted() override;
+@@ -152,89 +149,63 @@ namespace {
+ /// This is the cache kept by LazyValueInfo which
+ /// maintains information about queries across the clients' queries.
+ class LazyValueInfoCache {
+- /// This is all of the cached block information for exactly one Value*.
+- /// The entries are sorted by the BasicBlock* of the
+- /// entries, allowing us to do a lookup with a binary search.
+- /// Over-defined lattice values are recorded in OverDefinedCache to reduce
+- /// memory overhead.
+- struct ValueCacheEntryTy {
+- ValueCacheEntryTy(Value *V, LazyValueInfoCache *P) : Handle(V, P) {}
+- LVIValueHandle Handle;
+- SmallDenseMap<PoisoningVH<BasicBlock>, ValueLatticeElement, 4> BlockVals;
++ /// This is all of the cached information for one basic block. It contains
++ /// the per-value lattice elements, as well as a separate set for
++ /// overdefined values to reduce memory usage.
++ struct BlockCacheEntryTy {
++ SmallDenseMap<AssertingVH<Value>, ValueLatticeElement, 4> LatticeElements;
++ SmallDenseSet<AssertingVH<Value>, 4> OverDefined;
+ };
+
+- /// This tracks, on a per-block basis, the set of values that are
+- /// over-defined at the end of that block.
+- typedef DenseMap<PoisoningVH<BasicBlock>, SmallPtrSet<Value *, 4>>
+- OverDefinedCacheTy;
+- /// Keep track of all blocks that we have ever seen, so we
+- /// don't spend time removing unused blocks from our caches.
+- DenseSet<PoisoningVH<BasicBlock> > SeenBlocks;
+-
+- /// This is all of the cached information for all values,
+- /// mapped from Value* to key information.
+- DenseMap<Value *, std::unique_ptr<ValueCacheEntryTy>> ValueCache;
+- OverDefinedCacheTy OverDefinedCache;
+-
++ /// Cached information per basic block.
++ DenseMap<PoisoningVH<BasicBlock>, BlockCacheEntryTy> BlockCache;
++ /// Set of value handles used to erase values from the cache on deletion.
++ DenseSet<LVIValueHandle, DenseMapInfo<Value *>> ValueHandles;
+
+ public:
+ void insertResult(Value *Val, BasicBlock *BB,
+ const ValueLatticeElement &Result) {
+- SeenBlocks.insert(BB);
+-
++ auto &CacheEntry = BlockCache.try_emplace(BB).first->second;
+ // Insert over-defined values into their own cache to reduce memory
+ // overhead.
+ if (Result.isOverdefined())
+- OverDefinedCache[BB].insert(Val);
+- else {
+- auto It = ValueCache.find_as(Val);
+- if (It == ValueCache.end()) {
+- ValueCache[Val] = make_unique<ValueCacheEntryTy>(Val, this);
+- It = ValueCache.find_as(Val);
+- assert(It != ValueCache.end() && "Val was just added to the map!");
+- }
+- It->second->BlockVals[BB] = Result;
+- }
+- }
+-
+- bool isOverdefined(Value *V, BasicBlock *BB) const {
+- auto ODI = OverDefinedCache.find(BB);
+-
+- if (ODI == OverDefinedCache.end())
+- return false;
++ CacheEntry.OverDefined.insert(Val);
++ else
++ CacheEntry.LatticeElements.insert({ Val, Result });
+
+- return ODI->second.count(V);
++ auto HandleIt = ValueHandles.find_as(Val);
++ if (HandleIt == ValueHandles.end())
++ ValueHandles.insert({ Val, this });
+ }
+
+ bool hasCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
+- return true;
+-
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
+ return false;
+
+- return I->second->BlockVals.count(BB);
++ return It->second.OverDefined.count(V) ||
++ It->second.LatticeElements.count(V);
+ }
+
+ ValueLatticeElement getCachedValueInfo(Value *V, BasicBlock *BB) const {
+- if (isOverdefined(V, BB))
++ auto It = BlockCache.find(BB);
++ if (It == BlockCache.end())
++ return ValueLatticeElement();
++
++ if (It->second.OverDefined.count(V))
+ return ValueLatticeElement::getOverdefined();
+
+- auto I = ValueCache.find_as(V);
+- if (I == ValueCache.end())
++ auto LatticeIt = It->second.LatticeElements.find(V);
++ if (LatticeIt == It->second.LatticeElements.end())
+ return ValueLatticeElement();
+- auto BBI = I->second->BlockVals.find(BB);
+- if (BBI == I->second->BlockVals.end())
+- return ValueLatticeElement();
+- return BBI->second;
++
++ return LatticeIt->second;
+ }
+
+ /// clear - Empty the cache.
+ void clear() {
+- SeenBlocks.clear();
+- ValueCache.clear();
+- OverDefinedCache.clear();
++ BlockCache.clear();
++ ValueHandles.clear();
+ }
+
+ /// Inform the cache that a given value has been deleted.
+@@ -248,23 +219,18 @@ namespace {
+ /// OldSucc might have (unless also overdefined in NewSucc). This just
+ /// flushes elements from the cache and does not add any.
+ void threadEdgeImpl(BasicBlock *OldSucc,BasicBlock *NewSucc);
+-
+- friend struct LVIValueHandle;
+ };
+ }
+
+ void LazyValueInfoCache::eraseValue(Value *V) {
+- for (auto I = OverDefinedCache.begin(), E = OverDefinedCache.end(); I != E;) {
+- // Copy and increment the iterator immediately so we can erase behind
+- // ourselves.
+- auto Iter = I++;
+- SmallPtrSetImpl<Value *> &ValueSet = Iter->second;
+- ValueSet.erase(V);
+- if (ValueSet.empty())
+- OverDefinedCache.erase(Iter);
++ for (auto &Pair : BlockCache) {
++ Pair.second.LatticeElements.erase(V);
++ Pair.second.OverDefined.erase(V);
+ }
+
+- ValueCache.erase(V);
++ auto HandleIt = ValueHandles.find_as(V);
++ if (HandleIt != ValueHandles.end())
++ ValueHandles.erase(HandleIt);
+ }
+
+ void LVIValueHandle::deleted() {
+@@ -274,18 +240,7 @@ void LVIValueHandle::deleted() {
+ }
+
+ void LazyValueInfoCache::eraseBlock(BasicBlock *BB) {
+- // Shortcut if we have never seen this block.
+- DenseSet<PoisoningVH<BasicBlock> >::iterator I = SeenBlocks.find(BB);
+- if (I == SeenBlocks.end())
+- return;
+- SeenBlocks.erase(I);
+-
+- auto ODI = OverDefinedCache.find(BB);
+- if (ODI != OverDefinedCache.end())
+- OverDefinedCache.erase(ODI);
+-
+- for (auto &I : ValueCache)
+- I.second->BlockVals.erase(BB);
++ BlockCache.erase(BB);
+ }
+
+ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+@@ -303,10 +258,11 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ std::vector<BasicBlock*> worklist;
+ worklist.push_back(OldSucc);
+
+- auto I = OverDefinedCache.find(OldSucc);
+- if (I == OverDefinedCache.end())
++ auto I = BlockCache.find(OldSucc);
++ if (I == BlockCache.end() || I->second.OverDefined.empty())
+ return; // Nothing to process here.
+- SmallVector<Value *, 4> ValsToClear(I->second.begin(), I->second.end());
++ SmallVector<Value *, 4> ValsToClear(I->second.OverDefined.begin(),
++ I->second.OverDefined.end());
+
+ // Use a worklist to perform a depth-first search of OldSucc's successors.
+ // NOTE: We do not need a visited list since any blocks we have already
+@@ -320,10 +276,10 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ if (ToUpdate == NewSucc) continue;
+
+ // If a value was marked overdefined in OldSucc, and is here too...
+- auto OI = OverDefinedCache.find(ToUpdate);
+- if (OI == OverDefinedCache.end())
++ auto OI = BlockCache.find(ToUpdate);
++ if (OI == BlockCache.end() || OI->second.OverDefined.empty())
+ continue;
+- SmallPtrSetImpl<Value *> &ValueSet = OI->second;
++ auto &ValueSet = OI->second.OverDefined;
+
+ bool changed = false;
+ for (Value *V : ValsToClear) {
+@@ -333,11 +289,6 @@ void LazyValueInfoCache::threadEdgeImpl(BasicBlock *OldSucc,
+ // If we removed anything, then we potentially need to update
+ // blocks successors too.
+ changed = true;
+-
+- if (ValueSet.empty()) {
+- OverDefinedCache.erase(OI);
+- break;
+- }
+ }
+
+ if (!changed) continue;
+--
+2.24.0
+
diff --git a/projects/fenix-rust/build b/projects/fenix-rust/build
new file mode 100644
index 0000000..a8f886b
--- /dev/null
+++ b/projects/fenix-rust/build
@@ -0,0 +1,80 @@
+#!/bin/bash
+[% c("var/set_default_env") -%]
+distdir=/var/tmp/dist/[% project %]
+mkdir -p $distdir
+tar -C /var/tmp/dist -xf [% c('input_files_by_name/cmake') %]
+export PATH="/var/tmp/dist/cmake/bin:$PATH"
+tar -C /var/tmp/dist -xf [% c('input_files_by_name/prev_rust') %]
+cd /var/tmp/dist/rust-[% c('var/prev_version') %]-x86_64-unknown-linux-gnu
+./install.sh --prefix=$distdir-rust-old
+export PATH="$distdir-rust-old/bin:$PATH"
+
+[% pc(c('var/compiler'), 'var/setup', { compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')) }) %]
+
+[% IF c("var/osx") %]
+ # We need to clear `CC` and `LDFLAGS` as they are used for the host platform
+ # (i.e. Linux).
+ unset CC
+ unset LDFLAGS
+ # Target 10.9 as our toolchain does. Without this explicit declaration Bad
+ # Things will happen, as a lot of dependent code then assumes that the
+ # official macOS target, x86_64-apple-darwin, essentially means 10.4.
+ export MACOSX_DEPLOYMENT_TARGET=[% c("var/macosx_deployment_target") %]
+ # The Rust target for macOS is x86_64-apple-darwin, yet our toolchain is built
+ # for x86_64-apple-darwin11. We can't mix those targets as clang gets confused
+ # that way. Changing the Rust target to x86_64-apple-darwin11 would require a
+ # fair amount of patching, thus we create symlinks to provide Rust with the
+ # necessary tools while using our toolchain underneath, targeting 10.9.
+ cd $cctoolsdir
+ for f in `ls x86_64-apple-darwin11-*`; do
+ ln -s $f ${f//x86_64-apple-darwin11/x86_64-apple-darwin}
+ done
+ cd ..
+ ln -s x86_64-apple-darwin11 x86_64-apple-darwin
+ mkdir $distdir/helper
+
+ # We need to adapt our CFLAGS and make sure our flags are passed down to all
+ # dependencies. Using `CFLAGS_x86_apple-darwin` did not do the trick, so resort
+ # to a wrapper script.
+ cat > $distdir/helper/x86_64-apple-darwin-clang << 'EOF'
+#!/bin/sh
+BASEDIR=/var/tmp/dist/macosx-toolchain
+$BASEDIR/cctools/bin/x86_64-apple-darwin-clang -target x86_64-apple-darwin -B $BASEDIR/cctools/bin -isysroot $BASEDIR/MacOSX10.11.sdk/ -Wl,-syslibroot,$BASEDIR/MacOSX10.11.sdk/ -Wl,-dead_strip -Wl,-pie "$@"
+EOF
+
+ chmod +x $distdir/helper/x86_64-apple-darwin-clang
+ export PATH=$distdir/helper:$PATH
+[% END %]
+
+cd $rootdir
+mkdir /var/tmp/build
+tar -C /var/tmp/build -xf [% c('input_files_by_name/rust') %]
+cd /var/tmp/build/rustc-[% c('version') %]-src
+
+# LLVM has reproducibility issues when optimizing bitcode, which we need to
+# patch. See: #32053 for more details.
+cd src/llvm-project
+patch -p1 < $rootdir/43909.patch
+cd ../../
+
+[% IF c("var/windows-i686") %]
+ # Cross-compiling for Windows 32bit is currently not possible without any
+ # patches. The reason for that is libstd expecting DWARF unwinding while most
+ # toolchains on Linux, targeting Windows 32bit, use SjLj unwinding.
+ # See: https://github.com/rust-lang/rust/issues/12859 for discussion about
+ # that and https://github.com/rust-lang/rust/pull/49633 for a newer attempt to
+ # fix this problem. We apply the patch from neersighted.
+ patch -p1 < $rootdir/unwind.patch
+[% END %]
+
+mkdir build
+cd build
+../configure --prefix=$distdir [% c("var/configure_opt") %]
+
+make -j[% c("buildconf/num_procs") %]
+make install
+cd /var/tmp/dist
+[% c('tar', {
+ tar_src => [ project ],
+ tar_args => '-czf ' _ dest_dir _ '/' _ c('filename'),
+ }) %]
diff --git a/projects/fenix-rust/config b/projects/fenix-rust/config
new file mode 100644
index 0000000..9ad9908
--- /dev/null
+++ b/projects/fenix-rust/config
@@ -0,0 +1,105 @@
+# vim: filetype=yaml sw=2
+filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
+version: '[% c("input_file_var/rust_version") %]'
+
+# those values can be changed from the input_files section of other
+# projects. See projects/lucetc/config and bug 32436.
+input_file_var:
+ rust_version: 1.43.0
+ prev_version: 1.42.0
+
+var:
+ prev_version: '[% c("input_file_var/prev_version") %]'
+ container:
+ use_container: 1
+
+targets:
+ android:
+ var:
+ arch_deps:
+ - libssl-dev
+ - pkg-config
+ - zlib1g-dev
+ configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=[% c("var/cross_prefix") %] --set=target.[% c("var/cross_prefix") %].cc=[% c("var/CC") %] --set=target.[% c("var/cross_prefix") %].ar=[% c("var/cross_prefix") %]-ar
+
+ android-armv7:
+ var:
+ configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=thumbv7neon-linux-androideabi --set=target.thumbv7neon-linux-androideabi.cc=[% c("var/CC") %] --set=target.thumbv7neon-linux-androideabi.ar=[% c("var/cross_prefix") %]-ar
+
+ linux:
+ var:
+ deps:
+ - libc6-dev-i386
+ - lib32stdc++6
+ - build-essential
+ - python
+ - automake
+ - libssl-dev
+ - pkg-config
+ - hardening-wrapper
+ # We use
+ # `--enable-local-rust` to avoid downloading the required compiler during
+ # build time
+ #
+ # `--enable-vendor` to avoid downloading crates during build time and just
+ # use the ones which are shipped with the source
+ #
+ # `--enable-extended` to build not only rustc but cargo as well
+ #
+ # `--enable-llvm-static-stdccp` to take a libstdc++ on Wheezy into account
+ # which is too old and if used gives undefined reference errors
+ #
+ # `--release-channel=stable` to just include stable features in the
+ # compiler
+ #
+ # `--sysconfdir=etc` to avoid install failures as |make install| wants to
+ # write to /etc otherwise
+ #
+ # the `target` triple to explicitly specify the architecture and platform
+ # for the compiler/std lib. Ideally, it should not be needed unless one is
+ # cross-compiling, but compiling `alloc_jemalloc` fails without that in a
+ # 32bit container. "--host=x86_64-unknown-linux-gnu" is used in its
+ # configure script in this case.
+ # `--set=` to explicitly specify the C compiler. We need to compile the
+ # bundled LLVM and it wants to use `cc`. However, we don't have that in
+ # our compiled GCC resulting in weird errors due to C and C++ compiler
+ # version mismatch. We avoid that with this configure option. We need to
+ # build our own GCC in the first place as 4.7.2 is too old to get all the
+ # Rust pieces compiled.
+ configure_opt: --enable-local-rust --enable-vendor --enable-extended --enable-llvm-static-stdcpp --release-channel=stable --sysconfdir=etc --target=x86_64-unknown-linux-gnu,i686-unknown-linux-gnu --set=target.x86_64-unknown-linux-gnu.cc=gcc --set=target.i686-unknown-linux-gnu.cc=gcc
+
+ osx-x86_64:
+ var:
+ arch_deps:
+ - libssl-dev
+ - pkg-config
+ - zlib1g-dev
+ configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=x86_64-apple-darwin --set=target.x86_64-apple-darwin.cc=x86_64-apple-darwin-clang
+
+ windows:
+ var:
+ arch_deps:
+ - libssl-dev
+ - pkg-config
+ - zlib1g-dev
+ configure_opt: --enable-local-rust --enable-vendor --enable-extended --release-channel=stable --sysconfdir=etc --target=[% c("arch") %]-pc-windows-gnu
+
+input_files:
+ - project: container-image
+ - project: cmake
+ name: cmake
+ - project: '[% c("var/compiler") %]'
+ name: '[% c("var/compiler") %]'
+ - URL: 'https://static.rust-lang.org/dist/rustc-[% c("version") %]-src.tar.gz'
+ name: rust
+ sig_ext: asc
+ file_gpg_id: 1
+ gpg_keyring: rust.gpg
+ - URL: 'https://static.rust-lang.org/dist/rust-[% c("var/prev_version") %]-x86_64-unknown-linux-gnu.tar.xz'
+ name: prev_rust
+ sig_ext: asc
+ file_gpg_id: 1
+ gpg_keyring: rust.gpg
+ - filename: unwind.patch
+ enable: '[% c("var/windows-i686") %]'
+ - filename: 43909.patch
diff --git a/projects/fenix-rust/unwind.patch b/projects/fenix-rust/unwind.patch
new file mode 100644
index 0000000..7b22dcb
--- /dev/null
+++ b/projects/fenix-rust/unwind.patch
@@ -0,0 +1,162 @@
+From b3bea7008ece7a5bdf9b5a5dcc95e82febad1854 Mon Sep 17 00:00:00 2001
+From: Bjorn Neergaard <bjorn(a)neersighted.com>
+Date: Sat, 9 Feb 2019 19:39:23 +0000
+Subject: [PATCH] Fix cross-compiling i686-pc-windows-gnu from Linux
+
+This is still very rough and serves as a proof-of-concept for fixing
+Linux -> 32-bit MinGW cross compilation workflow. Currently, clang and
+GCC's MinGW targets both only support DW2 (DWARF) or SJLJ (Set Jump Long
+Jump) unwinding on 32-bit Windows.
+
+The default for GCC (and the way it is shipped on every major distro) is
+to use SJLJ on Windows, as DWARF cannot traverse non-DWARF frames. This
+would work fine, except for the fact that libgcc (our C runtime on the
+MinGW platform) exports symbols under a different name when configured
+to use SJLJ-style unwinding, and uses a preprocessor macro internally to
+alias them.
+
+Because of this, we have to detect this scenario and link to the correct
+symbols ourselves. Linking has been tested with a full bootstrap on both
+x86_64-unknown-linux-gnu and i686-pc-windows-gnu, as well as
+cross-compilation of some of my own projects.
+
+Obviously, the detection is a bit unrefined. Right now we
+unconditionally use SJLJ when compiling Linux -> MinGW. I'd like to add
+feature detection using compiler build flags or autotools-style
+compilation and object analysis. Input on the best way to proceed here
+is welcome.
+
+Also, currently there is copy-pasted/duplicated code in libunwind.
+Ideally, this could be reduced, but this would likely require a
+rethinking of how iOS is special-cased above, to avoid further
+duplication. Input on how to best structure this file is requested.
+
+diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs
+index 249a183189..df08d6eb0c 100644
+--- a/src/bootstrap/compile.rs
++++ b/src/bootstrap/compile.rs
+@@ -162,7 +162,12 @@ pub fn std_cargo(builder: &Builder<'_>,
+ .arg("--features")
+ .arg("compiler-builtins-mem");
+ } else {
+- let features = builder.std_features();
++ let mut features = builder.std_features();
++
++ // FIXME: Temporary detection of SJLJ MinGW compilers.
++ if builder.config.build.contains("linux") && target == "i686-pc-windows-gnu" {
++ features.push_str(" sjlj_eh");
++ }
+
+ if compiler.stage != 0 && builder.config.sanitizers {
+ // This variable is used by the sanitizer runtime crates, e.g.
+diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml
+index 7d60a17042..d876d0b89a 100644
+--- a/src/libstd/Cargo.toml
++++ b/src/libstd/Cargo.toml
+@@ -71,3 +71,4 @@ wasm-bindgen-threads = []
+ # https://github.com/rust-lang-nursery/stdsimd/blob/master/crates/std_detect/…
+ std_detect_file_io = []
+ std_detect_dlsym_getauxval = []
++sjlj_eh = ["unwind/sjlj_eh"]
+diff --git a/src/libunwind/Cargo.toml b/src/libunwind/Cargo.toml
+index 2378b0a315..0b5979ed62 100644
+--- a/src/libunwind/Cargo.toml
++++ b/src/libunwind/Cargo.toml
+@@ -16,3 +16,6 @@ doc = false
+ core = { path = "../libcore" }
+ libc = { version = "0.2.43", features = ['rustc-dep-of-std'], default-features = false }
+ compiler_builtins = "0.1.0"
++
++[features]
++sjlj_eh = []
+diff --git a/src/libunwind/libunwind.rs b/src/libunwind/libunwind.rs
+index 339b554ed6..ec2f93ed60 100644
+--- a/src/libunwind/libunwind.rs
++++ b/src/libunwind/libunwind.rs
+@@ -1,10 +1,5 @@
+ #![allow(nonstandard_style)]
+
+-macro_rules! cfg_if {
+- ( $( if #[cfg( $meta:meta )] { $($it1:item)* } else { $($it2:item)* } )* ) =>
+- ( $( $( #[cfg($meta)] $it1)* $( #[cfg(not($meta))] $it2)* )* )
+-}
+-
+ use libc::{c_int, c_void, uintptr_t};
+
+ #[repr(C)]
+@@ -73,8 +68,8 @@ pub enum _Unwind_Context {}
+ pub type _Unwind_Exception_Cleanup_Fn = extern "C" fn(unwind_code: _Unwind_Reason_Code,
+ exception: *mut _Unwind_Exception);
+ extern "C" {
+- #[unwind(allowed)]
+- pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
++ #[cfg_attr(stage0, unwind)]
++ #[cfg_attr(not(stage0), unwind(allowed))]
+ pub fn _Unwind_DeleteException(exception: *mut _Unwind_Exception);
+ pub fn _Unwind_GetLanguageSpecificData(ctx: *mut _Unwind_Context) -> *mut c_void;
+ pub fn _Unwind_GetRegionStart(ctx: *mut _Unwind_Context) -> _Unwind_Ptr;
+@@ -206,26 +201,52 @@ if #[cfg(all(any(target_os = "ios", target_os = "netbsd", not(target_arch = "arm
+ pc
+ }
+ }
++} // cfg_if!
+
+-if #[cfg(not(all(target_os = "ios", target_arch = "arm")))] {
+- // Not 32-bit iOS
++cfg_if! {
++if #[cfg(all(target_os = "ios", target_arch = "arm"))] {
++ // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
+ extern "C" {
+- #[unwind(allowed)]
+- pub fn _Unwind_RaiseException(exception: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
++ #[cfg_attr(stage0, unwind)]
++ #[cfg_attr(not(stage0), unwind(allowed))]
++ pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
++ pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
++ }
++
++ #[inline]
++ pub unsafe fn _Unwind_RaiseException(exc: *mut _Unwind_Exception) -> _Unwind_Reason_Code {
++ _Unwind_SjLj_RaiseException(exc)
++ }
++
++} else if #[cfg(feature = "sjlj_eh")] {
++ extern "C" {
++ #[cfg_attr(stage0, unwind)]
++ #[cfg_attr(not(stage0), unwind(allowed))]
++ pub fn _Unwind_SjLj_Resume(e: *mut _Unwind_Exception) -> !;
++ pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
+ pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
+ trace_argument: *mut c_void)
+ -> _Unwind_Reason_Code;
+ }
+-} else {
+- // 32-bit iOS uses SjLj and does not provide _Unwind_Backtrace()
+- extern "C" {
+- #[unwind(allowed)]
+- pub fn _Unwind_SjLj_RaiseException(e: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
++
++ #[inline]
++ pub unsafe fn _Unwind_Resume(exc: *mut _Unwind_Exception) -> ! {
++ _Unwind_SjLj_Resume(exc)
+ }
+
+ #[inline]
+ pub unsafe fn _Unwind_RaiseException(exc: *mut _Unwind_Exception) -> _Unwind_Reason_Code {
+ _Unwind_SjLj_RaiseException(exc)
+ }
++} else {
++ extern "C" {
++ #[cfg_attr(stage0, unwind)]
++ #[cfg_attr(not(stage0), unwind(allowed))]
++ pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !;
++ pub fn _Unwind_RaiseException(exception: *mut _Unwind_Exception) -> _Unwind_Reason_Code;
++ pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
++ trace_argument: *mut c_void)
++ -> _Unwind_Reason_Code;
++ }
+ }
+ } // cfg_if!
+--
+2.23.0.rc0
+
1
0
commit 11848e8c48eb9617ef197b82d16875d925eeb3e1
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Jul 8 12:12:53 2020 +0000
Translations update
---
chrome/locale/ar/torbutton.properties | 8 ++---
chrome/locale/bn-BD/torbutton.properties | 26 +++++++-------
chrome/locale/fr/aboutTor.dtd | 2 +-
chrome/locale/fr/brand.dtd | 2 +-
chrome/locale/fr/brand.properties | 2 +-
chrome/locale/fr/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/fr/torbutton.properties | 2 +-
chrome/locale/ja/aboutDialog.dtd | 2 +-
chrome/locale/ja/torbutton.properties | 28 +++++++--------
chrome/locale/pl/torbutton.properties | 46 ++++++++++++-------------
10 files changed, 60 insertions(+), 60 deletions(-)
diff --git a/chrome/locale/ar/torbutton.properties b/chrome/locale/ar/torbutton.properties
index 23b34ec5..60cbd6b7 100644
--- a/chrome/locale/ar/torbutton.properties
+++ b/chrome/locale/ar/torbutton.properties
@@ -60,7 +60,7 @@ updateDownloadingPanelUILabel=جاري تحميل S% من التحديث
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=الاتصال معمى (خدمة بصلة، %1$S، مفاتيح %2$S بتة، %3$S)
pageInfo_OnionEncryption=الاتصال معمى (خدمة بصلة)
-pageInfo_OnionName=Onion Name:
+pageInfo_OnionName=موقع أونيون
# Onion services strings. Strings are kept here for ease of translation.
onionServices.learnMore=تعرف على المزيد
@@ -71,8 +71,8 @@ onionServices.errorPage.onionSite=موقع Onion
# an error code, e.g., 0xF3.
# Tor SOCKS error 0xF0:
onionServices.descNotFound.pageTitle=حدثت مشكلة أثناء تحميل موقع Onion
-onionServices.descNotFound.header=Onionsite Not Found
-onionServices.descNotFound=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
+onionServices.descNotFound.header=لم يتم العثور على موقع Onion
+onionServices.descNotFound=على الأغلب أن موقع onion غير متصل.تواصل مع مديرها.
onionServices.descNotFound.longDescription=Details: %S — The requested onion service descriptor can't be found on the hashring and therefore the service is not reachable by the client.
# Tor SOCKS error 0xF1:
onionServices.descInvalid.pageTitle=حدثت مشكلة أثناء تحميل موقع Onion
@@ -82,7 +82,7 @@ onionServices.descInvalid.longDescription=Details: %S — The requested onion se
# Tor SOCKS error 0xF2:
onionServices.introFailed.pageTitle=حدثت مشكلة أثناء تحميل موقع Onion
onionServices.introFailed.header=موقع Onion قطع الاتصال.
-onionServices.introFailed=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
+onionServices.introFailed=على الأغلب أن موقع onion غير متصل.تواصل مع مديرها .
onionServices.introFailed.longDescription=Details: %S — Introduction failed, which means that the descriptor was found but the service is no longer connected to the introduction point. It is likely that the service has changed its descriptor or that it is not running.
# Tor SOCKS error 0xF3:
onionServices.rendezvousFailed.pageTitle=حدثت مشكلة أثناء تحميل موقع Onion
diff --git a/chrome/locale/bn-BD/torbutton.properties b/chrome/locale/bn-BD/torbutton.properties
index fb43f5c0..e3e0e1cf 100644
--- a/chrome/locale/bn-BD/torbutton.properties
+++ b/chrome/locale/bn-BD/torbutton.properties
@@ -1,4 +1,4 @@
-torbutton.circuit_display.internet = ইন্টারনেটের
+torbutton.circuit_display.internet = ইন্টারনেট
torbutton.circuit_display.ip_unknown = আইপি অজানা
torbutton.circuit_display.onion_site = অনিওন সাইট
torbutton.circuit_display.this_browser = এই ব্রাউজার
@@ -8,8 +8,8 @@ torbutton.circuit_display.unknown_country = অজানা দেশ
torbutton.circuit_display.guard = গার্ড
torbutton.circuit_display.guard_note = আপনার [গার্ড] নোড পরিবর্তন হতে পারে না।
torbutton.circuit_display.learn_more = আরও জানুন
-torbutton.circuit_display.click_to_copy = Click to Copy
-torbutton.circuit_display.copied = Copied!
+torbutton.circuit_display.click_to_copy = অনুলিপি করতে ক্লিক করো
+torbutton.circuit_display.copied = অনুলিপিত!
torbutton.content_sizer.margin_tooltip = টর ব্রাউজার আপনার উইন্ডো প্রস্থ এবং উচ্চতা নিখুঁত করতে এই মার্জিন যোগ করে, এবং এইভাবে মানুষ আপনাকে অনলাইন ট্র্যাক করার ক্ষমতা হ্রাস করে।
torbutton.panel.tooltip.disabled = টর সক্রিয় করতে ক্লিক করুন
torbutton.panel.tooltip.enabled = টর অক্ষম করতে ক্লিক করুন
@@ -60,32 +60,32 @@ updateDownloadingPanelUILabel=ডাউনলোড হচ্ছে %S আধু
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=সংযোগ এনক্রিপ্ট (Onion Service, %1$S, %2$S bit keys, %3$S)
pageInfo_OnionEncryption=সংযোগ এনক্রিপ্ট (Onion Service)
-pageInfo_OnionName=Onion Name:
+pageInfo_OnionName=অনিওন নাম
# Onion services strings. Strings are kept here for ease of translation.
onionServices.learnMore=আরও জানুন
onionServices.errorPage.browser=ব্রাউজার
onionServices.errorPage.network=নেটওয়ার্ক
-onionServices.errorPage.onionSite=Onionsite
+onionServices.errorPage.onionSite=অনিওনসাইট
# LOCALIZATION NOTE: In the longDescription strings, %S will be replaced with
# an error code, e.g., 0xF3.
# Tor SOCKS error 0xF0:
-onionServices.descNotFound.pageTitle=Problem Loading Onionsite
-onionServices.descNotFound.header=Onionsite Not Found
+onionServices.descNotFound.pageTitle=অনিওনসাইট লোড করতে সমস্যা
+onionServices.descNotFound.header=অনিওনসাইট পাওয়া যায় নি
onionServices.descNotFound=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
onionServices.descNotFound.longDescription=Details: %S — The requested onion service descriptor can't be found on the hashring and therefore the service is not reachable by the client.
# Tor SOCKS error 0xF1:
-onionServices.descInvalid.pageTitle=Problem Loading Onionsite
+onionServices.descInvalid.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.descInvalid.header=Onionsite Cannot Be Reached
onionServices.descInvalid=The onionsite is unreachable due an internal error.
onionServices.descInvalid.longDescription=Details: %S — The requested onion service descriptor can't be parsed or signature validation failed.
# Tor SOCKS error 0xF2:
-onionServices.introFailed.pageTitle=Problem Loading Onionsite
+onionServices.introFailed.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.introFailed.header=Onionsite Has Disconnected
onionServices.introFailed=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
onionServices.introFailed.longDescription=Details: %S — Introduction failed, which means that the descriptor was found but the service is no longer connected to the introduction point. It is likely that the service has changed its descriptor or that it is not running.
# Tor SOCKS error 0xF3:
-onionServices.rendezvousFailed.pageTitle=Problem Loading Onionsite
+onionServices.rendezvousFailed.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.rendezvousFailed.header=Unable to Connect to Onionsite
onionServices.rendezvousFailed=The onionsite is busy or the Tor network is overloaded. Try again later.
onionServices.rendezvousFailed.longDescription=Details: %S — The client failed to rendezvous with the service, which means that the client was unable to finalize the connection.
@@ -100,12 +100,12 @@ onionServices.clientAuthIncorrect.header=Onionsite Authentication Failed
onionServices.clientAuthIncorrect=The provided key is incorrect or has been revoked. Contact the onionsite administrator.
onionServices.clientAuthIncorrect.longDescription=Details: %S — The client was able to download the requested onion service descriptor but was unable to decrypt its content using the provided client authorization information. This may mean that access has been revoked.
# Tor SOCKS error 0xF6:
-onionServices.badAddress.pageTitle=Problem Loading Onionsite
+onionServices.badAddress.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.badAddress.header=Invalid Onionsite Address
onionServices.badAddress=The provided onionsite address is invalid. Please check that you entered it correctly.
onionServices.badAddress.longDescription=Details: %S — The provided .onion address is invalid. This error is returned due to one of the following reasons: the address checksum doesn't match, the ed25519 public key is invalid, or the encoding is invalid.
# Tor SOCKS error 0xF7:
-onionServices.introTimedOut.pageTitle=Problem Loading Onionsite
+onionServices.introTimedOut.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.introTimedOut.header=Onionsite Circuit Creation Timed Out
onionServices.introTimedOut=Failed to connect to the onionsite, possibly due to a poor network connection.
onionServices.introTimedOut.longDescription=Details: %S — The connection to the requested onion service timed out while trying to build the rendezvous circuit.
@@ -122,7 +122,7 @@ onionServices.authPreferences.overview=Some onion services require that you iden
onionServices.authPreferences.savedKeys=Saved Keys…
onionServices.authPreferences.dialogTitle=Onion Service Keys
onionServices.authPreferences.dialogIntro=Keys for the following onionsites are stored on your computer
-onionServices.authPreferences.onionSite=Onionsite
+onionServices.authPreferences.onionSite=অনিওনসাইট
onionServices.authPreferences.onionKey=কি
onionServices.authPreferences.remove=অপসারণ
onionServices.authPreferences.removeAll=Remove All
diff --git a/chrome/locale/fr/aboutTor.dtd b/chrome/locale/fr/aboutTor.dtd
index e48a8fff..0356e3d8 100644
--- a/chrome/locale/fr/aboutTor.dtd
+++ b/chrome/locale/fr/aboutTor.dtd
@@ -22,7 +22,7 @@
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "G">
<!ENTITY aboutTor.torbrowser_user_manual.label "Guide d’utilisation du Navigateur Tor">
-<!ENTITY aboutTor.tor_mission.label "Le Projet Tor est un organisme sans but lucratif US 501(c)(3) qui fait progresser les droits de la personne et les libertés en créant et en déployant des technologies gratuites d’anonymat et de protection de la vie privée et des données personnelles, à code source ouvert. Nous soutenons leur disponibilité et leur utilisation sans restriction, et promouvons une meilleure compréhension scientifique et populaire.">
+<!ENTITY aboutTor.tor_mission.label "Le Projet Tor est un organisme sans but lucratif US 501(c)(3) qui fait progresser les droits de la personne et les libertés en créant et en déployant des technologies gratuites d’anonymat et de protection de la vie privée et des données personnelles, à code source ouvert. Nous soutenons leur disponibilité et leur utilisation sans restriction, et promouvons une meilleure compréhension scientifique et populaire.">
<!ENTITY aboutTor.getInvolved.label "Impliquez-vous »">
<!ENTITY aboutTor.newsletter.tagline "Obtenez les dernières nouvelles au sujet de Tor directement dans votre boîte de réception.">
diff --git a/chrome/locale/fr/brand.dtd b/chrome/locale/fr/brand.dtd
index cee7ce86..96443d6a 100644
--- a/chrome/locale/fr/brand.dtd
+++ b/chrome/locale/fr/brand.dtd
@@ -5,7 +5,7 @@
<!ENTITY brandShorterName "Le Navigateur Tor">
<!ENTITY brandShortName "Le Navigateur Tor">
<!ENTITY brandFullName "Le Navigateur Tor">
-<!ENTITY vendorShortName "Le Projet Tor">
+<!ENTITY vendorShortName "Le Projet Tor">
<!ENTITY trademarkInfo.part1 "« Tor » et le « logo Onion » sont des marques de commerce de « The Projet Tor, Inc. »">
<!-- LOCALIZATION NOTE (brandProductName):
This brand name can be used in messages where the product name needs to
diff --git a/chrome/locale/fr/brand.properties b/chrome/locale/fr/brand.properties
index 3b9d6d91..0a8582ae 100644
--- a/chrome/locale/fr/brand.properties
+++ b/chrome/locale/fr/brand.properties
@@ -9,7 +9,7 @@ brandFullName=Le Navigateur Tor
# This brand name can be used in messages where the product name needs to
# remain unchanged across different versions (Nightly, Beta, etc.).
brandProductName=Navigateur Tor
-vendorShortName=Le Projet Tor
+vendorShortName=Le Projet Tor
homePageSingleStartMain=Firefox Start, une page d’accueil rapide avec recherche intégrée
homePageImport=Importez votre page d’accueil à partir de %S
diff --git a/chrome/locale/fr/branding/tor-browser-brand.ftl b/chrome/locale/fr/branding/tor-browser-brand.ftl
index 88f33470..7c7adc87 100644
--- a/chrome/locale/fr/branding/tor-browser-brand.ftl
+++ b/chrome/locale/fr/branding/tor-browser-brand.ftl
@@ -8,5 +8,5 @@
# 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 = Navigateur Tor
--vendor-short-name = Le Projet Tor
+-vendor-short-name = Le Projet Tor
trademarkInfo = « Tor » et le « logo Onion » sont des marques de commerce de « The Projet Tor, Inc. »
diff --git a/chrome/locale/fr/torbutton.properties b/chrome/locale/fr/torbutton.properties
index 80aa4ebf..18edd134 100644
--- a/chrome/locale/fr/torbutton.properties
+++ b/chrome/locale/fr/torbutton.properties
@@ -87,7 +87,7 @@ onionServices.introFailed.longDescription=Détails : %S – Échec de présenta
# Tor SOCKS error 0xF3:
onionServices.rendezvousFailed.pageTitle=Problème de chargement du site onion
onionServices.rendezvousFailed.header=Impossible de se connecter au site onion
-onionServices.rendezvousFailed=Le site onion est occupé ou le réseau Tor est surchargé. Veuillez ressayer ultérieurement.
+onionServices.rendezvousFailed=Le site onion est occupé ou le réseau Tor est surchargé. Veuillez ressayer plus tard.
onionServices.rendezvousFailed.longDescription=Détails : %S – Échec de rencontre du client avec le service, ce qui signifie que le client n’a pas réussi à finaliser la connexion.
# Tor SOCKS error 0xF4:
onionServices.clientAuthMissing.pageTitle=Une autorisation est exigée
diff --git a/chrome/locale/ja/aboutDialog.dtd b/chrome/locale/ja/aboutDialog.dtd
index 53c012c0..f85fea1b 100644
--- a/chrome/locale/ja/aboutDialog.dtd
+++ b/chrome/locale/ja/aboutDialog.dtd
@@ -3,7 +3,7 @@
<!ENTITY project.tpoLink "&vendorShortName; によって開発されました。">
<!ENTITY project.end "あなたのオンラインでのプライバシーと自由を守る非営利団体です。">
-<!ENTITY help.start "支援に興味がありますか?">
+<!ENTITY help.start "支援しますか?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
<!ENTITY help.donateLink "寄付">
<!ENTITY help.or "や">
diff --git a/chrome/locale/ja/torbutton.properties b/chrome/locale/ja/torbutton.properties
index 5ebc1dbd..cc36ba78 100644
--- a/chrome/locale/ja/torbutton.properties
+++ b/chrome/locale/ja/torbutton.properties
@@ -1,7 +1,7 @@
torbutton.circuit_display.internet = インターネット
-torbutton.circuit_display.ip_unknown = 不明なIP
+torbutton.circuit_display.ip_unknown = 不明な IP
torbutton.circuit_display.onion_site = Onion サイト
-torbutton.circuit_display.this_browser = このブラウザー
+torbutton.circuit_display.this_browser = このブラウザ
torbutton.circuit_display.relay = リレー
torbutton.circuit_display.tor_bridge = ブリッジ
torbutton.circuit_display.unknown_country = 不明な国
@@ -11,12 +11,12 @@ torbutton.circuit_display.learn_more = 詳細情報
torbutton.circuit_display.click_to_copy = クリックしてコピー
torbutton.circuit_display.copied = コピーされました
torbutton.content_sizer.margin_tooltip = Tor Browser はウィンドウのサイズを平凡にするためにこのマージンを追加します。これにより、あなたのことをオンラインで追跡しにくくします。
-torbutton.panel.tooltip.disabled = クリックしてTorを有効にする
-torbutton.panel.tooltip.enabled = クリックしてTorを無効にする
+torbutton.panel.tooltip.disabled = クリックして Tor を有効にする
+torbutton.panel.tooltip.enabled = クリックして Tor を無効にする
torbutton.panel.label.disabled = Tor 無効
torbutton.panel.label.enabled = Tor 有効
-extensions.torbutton(a)torproject.org.description = TorbuttonはTorの設定を構成し、素早くかつ容易にプライベートな閲覧データをクリアするボタンを提供します。
-torbutton.popup.external.title = 外部ファイル種別をダウンロードしますか
+extensions.torbutton(a)torproject.org.description = Torbutton は Tor の設定を構成し、素早くかつ容易にプライベートな閲覧データをクリアするボタンを提供します。
+torbutton.popup.external.title = 外部ファイル種別をダウンロードしますか?
torbutton.popup.external.app = Tor Browser はこのファイルを表示できません。別のアプリケーションで開く必要があります。\n
torbutton.popup.external.note = ファイルのタイプの中に、アプリケーションが Tor を使用せずインターネットに接続する原因となる可能性があるものがあります。\n
torbutton.popup.external.suggest = 安全であるためには、オフラインの時のみダウンロードしたファイルを開くか、 Tails のような Tor のライブ CD を使用すべきです。\n
@@ -25,18 +25,18 @@ torbutton.popup.cancel = キャンセル
torbutton.popup.dontask = 今からファイルを自動的にダウンロードする
torbutton.popup.no_newnym = Tor コントロールポートにアクセスできませんでした。 Torbutton は新しい接続経路を安全に用意することができません。\n\nTor Browser バンドルを起動していますか?
torbutton.security_settings.menu.title = セキュリティ設定
-torbutton.title.prompt_torbrowser = 重要なTorbuttonの情報
-torbutton.popup.prompt_torbrowser = Torbuttonは現在別様に動作しています。もう止めることはできません。\n\n私たちは、非Torブラウジングのためにも使われているブラウザでのTorbuttonの使用が安全ではないため、この変更を行いました。 他の方法で修正することができないバグも多すぎました。\n\n正常にFirefoxを使用したい場合は、Torbuttonをアンインストールして、Tor Browser Bundleをダウンロードすべきです。 Tor Browserのプライバシー特性はFirefoxがTorbuttonと使われている時でも、通常のFirefoxのそれよりも優勢です。\n\nTorbuttonを削除するには、ツール->アドオン->エクステンションに行き、それからTorbuttonの隣の削除ボタンをクリックしてください。
-torbutton.popup.short_torbrowser = 重要なTorbuttonの情報!\n\nTorbuttonは現在常に有効です。\n\n詳細はTorbuttonをクリックしてください。
+torbutton.title.prompt_torbrowser = Torbutton の重要な情報
+torbutton.popup.prompt_torbrowser = Torbutton は現在別様に動作しています。もう止めることはできません。\n\n私たちは、非 Tor ブラウジングのためにも使われているブラウザでの Torbutton の使用が安全ではないため、この変更を行いました。 他の方法で修正することができないバグも多すぎました。\n\n正常にFirefoxを使用したい場合は、Torbutton をアンインストールして、Tor Browser バンドルをダウンロードすべきです。 Tor Browser のプライバシー特性は Firefox が Torbutton と使われている時でも、通常の Firefox のそれよりも優勢です。\n\nTorbutton を削除するには、ツール->アドオン->エクステンションに行き、それから Torbutton の隣の削除ボタンをクリックしてください。
+torbutton.popup.short_torbrowser = Torbutton の重要な情報\n\nTorbutton は現在常に有効です。\n\n詳細は Torbutton をクリックしてください。
-torbutton.popup.confirm_plugins = Flashなどのプラグインはあなたのプライバシーや匿名性を損なう恐れがあります。 \n\nそれらはTorを迂回しあなたの現在の位置やIPアドレスを漏らしてしまう恐れがあります。\n\n本当にプラグインを有効にしますか?\n\n
+torbutton.popup.confirm_plugins = Flash などのプラグインはあなたのプライバシーや匿名性を損なう恐れがあります。 \n\nそれらは Tor を迂回しあなたの現在の位置や IP アドレスを漏らしてしまう恐れがあります。\n\n本当にプラグインを有効にしますか?\n\n
torbutton.popup.never_ask_again = 次からはたずねない
torbutton.popup.confirm_newnym = Tor Browser は全てのウィンドウとタブを閉じようとしています。全てのセッションは失われます。\n\nあなたの情報をリセットするために Tor Browser を再起動しますか?\n\n
-torbutton.maximize_warning = Tor Browser を最大化すると、Webサイトはあなたのモニターサイズを利用して追跡できるようになります。Tor Browser のウィンドウのサイズは初期状態のままにしておくことをおすすめします。
+torbutton.maximize_warning = Tor Browser を最大化すると、ウェブサイトはあなたのモニターサイズを利用して追跡できるようになります。Tor Browser のウィンドウのサイズは初期状態のままにしておくことをおすすめします。
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=このWebサイト(%S)がHTML5 canvas画像を使用しようとしています。これはあなたのコンピューターを識別するために使われる可能性があります。\n\nTor ブラウザーにHTML5 canvas画像の使用を許可しますか?
+canvas.siteprompt=このウェブサイト(%S)が HTML5 canvas 画像を使用しようとしています。これはあなたのコンピューターを識別するために使われる可能性があります。\n\nTor Browser に HTML5 canvas 画像の使用を許可しますか?
canvas.notNow=今は許可しない
canvas.notNowAccessKey=N
canvas.allow=許可する
@@ -126,8 +126,8 @@ onionServices.authPreferences.onionSite=Onion サイト
onionServices.authPreferences.onionKey=鍵
onionServices.authPreferences.remove=解除
onionServices.authPreferences.removeAll=すべて削除
-onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
-onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+onionServices.authPreferences.failedToGetKeys=Tor から鍵を取得できません
+onionServices.authPreferences.failedToRemoveKey=鍵を削除できません
# Onion-Location strings.
onionLocation.alwaysPrioritize=常に Onion を優先する
diff --git a/chrome/locale/pl/torbutton.properties b/chrome/locale/pl/torbutton.properties
index efa3a8a7..e1563298 100644
--- a/chrome/locale/pl/torbutton.properties
+++ b/chrome/locale/pl/torbutton.properties
@@ -60,7 +60,7 @@ updateDownloadingPanelUILabel=Pobieranie aktualizacji %S
# .Onion Page Info prompt. Strings are kept here for ease of translation.
pageInfo_OnionEncryptionWithBitsAndProtocol=Połączenie zaszyfrowane (usługa Onion, %1$S, %2$S klucze bitowe, %3$S)
pageInfo_OnionEncryption=Połączenie zaszyfrowane (usługa Onion)
-pageInfo_OnionName=Onion Name:
+pageInfo_OnionName=Nazwa Cebuli:
# Onion services strings. Strings are kept here for ease of translation.
onionServices.learnMore=Dowiedz się więcej
@@ -71,18 +71,18 @@ onionServices.errorPage.onionSite=Strona cebulowa
# an error code, e.g., 0xF3.
# Tor SOCKS error 0xF0:
onionServices.descNotFound.pageTitle=Problem z ładowaniem strony Onionsite
-onionServices.descNotFound.header=Onionsite Not Found
-onionServices.descNotFound=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
+onionServices.descNotFound.header=Nie znaleziono strony cebuli
+onionServices.descNotFound=Najbardziej prawdopodobną przyczyną jest to, że strona cebuli jest offline. Skontaktuj się z administratorem strony cebuli.
onionServices.descNotFound.longDescription=Details: %S — The requested onion service descriptor can't be found on the hashring and therefore the service is not reachable by the client.
# Tor SOCKS error 0xF1:
onionServices.descInvalid.pageTitle=Problem z ładowaniem strony Onionsite
-onionServices.descInvalid.header=Onionsite Cannot Be Reached
-onionServices.descInvalid=The onionsite is unreachable due an internal error.
-onionServices.descInvalid.longDescription=Details: %S — The requested onion service descriptor can't be parsed or signature validation failed.
+onionServices.descInvalid.header=Nie można dotrzeć do strony cebuli
+onionServices.descInvalid=Strona cebuli jest nieosiągalna z powodu błędu wewnętrznego.
+onionServices.descInvalid.longDescription=Szczegóły: %S — Żądany deskryptor usługi cebulowej nie może zostać przeanalizowany lub sprawdzenie poprawności podpisu nie powiodło się.
# Tor SOCKS error 0xF2:
onionServices.introFailed.pageTitle=Problem z ładowaniem strony Onionsite
-onionServices.introFailed.header=Onionsite Has Disconnected
-onionServices.introFailed=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
+onionServices.introFailed.header=Strona cebuli została rozłączona
+onionServices.introFailed=Najbardziej prawdopodobną przyczyną jest to, że strona cebuli jest offline. Skontaktuj się z administratorem strony cebuli.
onionServices.introFailed.longDescription=Szczegóły: %S - Wprowadzenie nie powiodło się, co oznacza, że znaleziono deskryptor, ale usługa nie jest już połączona z punktem wprowadzenia. Prawdopodobnie usługa zmieniła swój deskryptor lub nie jest uruchomiona.
# Tor SOCKS error 0xF3:
onionServices.rendezvousFailed.pageTitle=Problem z ładowaniem strony Onionsite
@@ -93,35 +93,35 @@ onionServices.rendezvousFailed.longDescription=Szczegóły: %S — Klient nie m
onionServices.clientAuthMissing.pageTitle=Wymagana Autoryzacja
onionServices.clientAuthMissing.header=Strona Onionsite wymaga uwierzytelnienia
onionServices.clientAuthMissing=Dostęp do onionite wymaga klucza, ale żaden nie został dostarczony.
-onionServices.clientAuthMissing.longDescription=Details: %S — The client downloaded the requested onion service descriptor but was unable to decrypt its content because client authorization information is missing.
+onionServices.clientAuthMissing.longDescription=Szczegóły: %S — Klient pobrał żądany deskryptor usługi cebulowej, ale nie mógł odszyfrować jego zawartości, ponieważ brakuje informacji autoryzacyjnych klienta.
# Tor SOCKS error 0xF5:
onionServices.clientAuthIncorrect.pageTitle=Błąd Autoryzacji
onionServices.clientAuthIncorrect.header=Uwierzytelnianie strony Onionsite nie powiodło się
onionServices.clientAuthIncorrect=Podany klucz jest niepoprawny lub został odwołany. Skontaktuj się z administratorem strony onionsite.
-onionServices.clientAuthIncorrect.longDescription=Details: %S — The client was able to download the requested onion service descriptor but was unable to decrypt its content using the provided client authorization information. This may mean that access has been revoked.
+onionServices.clientAuthIncorrect.longDescription=Szczegóły: %S — Klient mógł pobrać żądany deskryptor usługi cebulowej, ale nie był w stanie odszyfrować jego zawartości przy użyciu podanych informacji autoryzacyjnych klienta. Może to oznaczać, że dostęp został cofnięty.
# Tor SOCKS error 0xF6:
onionServices.badAddress.pageTitle=Problem z ładowaniem strony Onionsite
-onionServices.badAddress.header=Invalid Onionsite Address
-onionServices.badAddress=The provided onionsite address is invalid. Please check that you entered it correctly.
-onionServices.badAddress.longDescription=Details: %S — The provided .onion address is invalid. This error is returned due to one of the following reasons: the address checksum doesn't match, the ed25519 public key is invalid, or the encoding is invalid.
+onionServices.badAddress.header=Nieprawidłowy adres strony cebuli
+onionServices.badAddress=Podany adres strony cebulowej jest nieprawidłowy. Sprawdź, czy wpisałeś go poprawnie.
+onionServices.badAddress.longDescription=Szczegóły: %S — Podany adres .onion jest nieprawidłowy. Ten błąd jest zwracany z jednego z następujących powodów: suma kontrolna adresu nie jest zgodna, klucz publiczny ed25519 jest nieprawidłowy lub kodowanie jest nieprawidłowe.
# Tor SOCKS error 0xF7:
onionServices.introTimedOut.pageTitle=Problem z ładowaniem strony Onionsite
-onionServices.introTimedOut.header=Onionsite Circuit Creation Timed Out
-onionServices.introTimedOut=Failed to connect to the onionsite, possibly due to a poor network connection.
-onionServices.introTimedOut.longDescription=Details: %S — The connection to the requested onion service timed out while trying to build the rendezvous circuit.
+onionServices.introTimedOut.header=Limit czasu tworzenia obwodu cebuli
+onionServices.introTimedOut=Nie udało się połączyć z witryną cebuli, prawdopodobnie z powodu słabego połączenia sieciowego.
+onionServices.introTimedOut.longDescription=Szczegóły: %S — Upłynął limit czasu połączenia z żądaną usługą cebulową podczas próby zbudowania obwodu spotkania.
#
# LOCALIZATION NOTE: %S will be replaced with the .onion address.
-onionServices.authPrompt.description2=%S is requesting that you authenticate.
+onionServices.authPrompt.description2=%S żąda uwierzytelnienia.
onionServices.authPrompt.keyPlaceholder=Wprowadź swój klucz prywatny dla tej usługi cebulowej
onionServices.authPrompt.done=Skończone
onionServices.authPrompt.doneAccessKey=d
-onionServices.authPrompt.invalidKey=Please enter a valid key (52 base32 characters or 44 base64 characters)
+onionServices.authPrompt.invalidKey=Wprowadź poprawny klucz (52 znaki baza32 lub 44 znaki baza64)
onionServices.authPrompt.failedToSetKey=Konfiguracja Tor przy użyciu twojego klucza nie powiodła się
-onionServices.authPreferences.header=Onion Services Authentication
-onionServices.authPreferences.overview=Some onion services require that you identify yourself with a key (a kind of password) before you can access them.
+onionServices.authPreferences.header=Uwierzytelnianie usług cebulowych
+onionServices.authPreferences.overview=Niektóre usługi cebulowe wymagają identyfikacji za pomocą klucza (rodzaj hasła) przed uzyskaniem dostępu do nich.
onionServices.authPreferences.savedKeys=Zapisane klucze...
onionServices.authPreferences.dialogTitle=Klucze Usługi Cebulowej
-onionServices.authPreferences.dialogIntro=Keys for the following onionsites are stored on your computer
+onionServices.authPreferences.dialogIntro=Klucze następujących stron cebuli są przechowywane na twoim komputerze
onionServices.authPreferences.onionSite=Strona cebulowa
onionServices.authPreferences.onionKey=Klucz
onionServices.authPreferences.remove=Usuń
@@ -130,12 +130,12 @@ onionServices.authPreferences.failedToGetKeys=Nie można odebrać kluczy z Tor
onionServices.authPreferences.failedToRemoveKey=Usunięcie klucza nie powiodło się
# Onion-Location strings.
-onionLocation.alwaysPrioritize=Always Prioritize Onions
+onionLocation.alwaysPrioritize=Zawsze ustalaj priorytet cebuli
onionLocation.alwaysPrioritizeAccessKey=u
onionLocation.notNow=Nie teraz
onionLocation.notNowAccessKey=n
onionLocation.description=Bezpieczniejsza wersja tej strony jest dostępna jako usługa cebulowa. Usługi cebulowe pomagają twórcom witryn internetowych oraz odwiedzającym je bronić się przed monitorowaniem ruchu i cenzurą.
-onionLocation.tryThis=Try Onion Services
+onionLocation.tryThis=Wypróbuj Usługi Cebulowe
onionLocation.onionAvailable=.onion dostępna
onionLocation.learnMore=Dowiedz się więcej...
onionLocation.always=Zawsze
1
0
[torbutton/master] Bug 40001: Generate tor-browser-brand.ftl when importing translations
by gk@torproject.org 08 Jul '20
by gk@torproject.org 08 Jul '20
08 Jul '20
commit e486ef2454a7a9b3751407e3f5d532f939610a5d
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Apr 15 16:16:42 2020 +0200
Bug 40001: Generate tor-browser-brand.ftl when importing translations
---
chrome/locale/ar/branding/tor-browser-brand.ftl | 4 +--
chrome/locale/cs/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/da/branding/tor-browser-brand.ftl | 4 +--
chrome/locale/es-ES/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/fa/branding/tor-browser-brand.ftl | 8 ++---
chrome/locale/fr/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/hu/branding/tor-browser-brand.ftl | 8 ++---
chrome/locale/id/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/lt/branding/tor-browser-brand.ftl | 12 +++----
chrome/locale/ms/branding/tor-browser-brand.ftl | 12 +++----
chrome/locale/nb-NO/branding/tor-browser-brand.ftl | 4 +--
chrome/locale/nl/branding/tor-browser-brand.ftl | 10 +++---
chrome/locale/ru/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/sv-SE/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/th/branding/tor-browser-brand.ftl | 4 +--
chrome/locale/tr/branding/tor-browser-brand.ftl | 2 +-
chrome/locale/zh-CN/branding/tor-browser-brand.ftl | 8 ++---
chrome/locale/zh-TW/branding/tor-browser-brand.ftl | 4 +--
import-translations.sh | 37 ++++++++++++++++++++++
19 files changed, 83 insertions(+), 46 deletions(-)
diff --git a/chrome/locale/ar/branding/tor-browser-brand.ftl b/chrome/locale/ar/branding/tor-browser-brand.ftl
index 9595f702..1bcc7d0a 100644
--- a/chrome/locale/ar/branding/tor-browser-brand.ftl
+++ b/chrome/locale/ar/branding/tor-browser-brand.ftl
@@ -7,6 +7,6 @@
-brand-full-name = متصفح تور
# 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 = متصفح تور
+-brand-product-name = متصفح Tor
-vendor-short-name = مشروع تور
-trademarkInfo = "تور" و "شعار البصلة" علامات تجارية مسجلة باسم شركة مشروع تور المحدودة
+trademarkInfo = 'تور' و 'شعار البصلة' علامات تجارية مسجلة باسم شركة مشروع تور المحدودة
diff --git a/chrome/locale/cs/branding/tor-browser-brand.ftl b/chrome/locale/cs/branding/tor-browser-brand.ftl
index 61719fb2..604c023d 100644
--- a/chrome/locale/cs/branding/tor-browser-brand.ftl
+++ b/chrome/locale/cs/branding/tor-browser-brand.ftl
@@ -9,4 +9,4 @@
# remain unchanged across different versions (Nightly, Beta, etc.).
-brand-product-name = Prohlížeč Tor
-vendor-short-name = Tor Project
-trademarkInfo = "Tor" a "Onion logo" jsou registrované ochranné známky společnosti Tor Project, Inc.
+trademarkInfo = Tor a logo Onion jsou ochrannými známkami společnosti Tor Project, Inc.
diff --git a/chrome/locale/da/branding/tor-browser-brand.ftl b/chrome/locale/da/branding/tor-browser-brand.ftl
index c8554742..65c61062 100644
--- a/chrome/locale/da/branding/tor-browser-brand.ftl
+++ b/chrome/locale/da/branding/tor-browser-brand.ftl
@@ -8,5 +8,5 @@
# 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
--vendor-short-name = Tor-projektet
-trademarkInfo = "Tor" og "løg-logoet" er registrerede varemærker tilhørende Tor Project, Inc.
+-vendor-short-name = Tor-projekt
+trademarkInfo = 'Tor' og 'løg-logoet' er registrerede varemærker tilhørende Tor Project, Inc.
diff --git a/chrome/locale/es-ES/branding/tor-browser-brand.ftl b/chrome/locale/es-ES/branding/tor-browser-brand.ftl
index 7c301ac8..6c35c786 100644
--- a/chrome/locale/es-ES/branding/tor-browser-brand.ftl
+++ b/chrome/locale/es-ES/branding/tor-browser-brand.ftl
@@ -7,6 +7,6 @@
-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
+-brand-product-name = Navegador Tor
-vendor-short-name = Proyecto Tor
trademarkInfo = 'Tor' y el 'Onion Logo' (logo de la cebolla) son marcas registradas de la Tor Project, Inc.
diff --git a/chrome/locale/fa/branding/tor-browser-brand.ftl b/chrome/locale/fa/branding/tor-browser-brand.ftl
index 11b305c4..67f426de 100644
--- a/chrome/locale/fa/branding/tor-browser-brand.ftl
+++ b/chrome/locale/fa/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = مرورگر تور
--brand-short-name = مرورگر تور
--brand-full-name = مرورگر تور
+-brand-shorter-name = مرورگر Tor
+-brand-short-name = مرورگر Tor
+-brand-full-name = مرورگر Tor
# 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 = مرورگر تور
--vendor-short-name = پروژهٔ تور
+-vendor-short-name = پروژه Tor
trademarkInfo = 'Tor' و 'Onion Logo' علامت های تجاری ثبت شده از پروژه Tor هستند
diff --git a/chrome/locale/fr/branding/tor-browser-brand.ftl b/chrome/locale/fr/branding/tor-browser-brand.ftl
index 293fa032..88f33470 100644
--- a/chrome/locale/fr/branding/tor-browser-brand.ftl
+++ b/chrome/locale/fr/branding/tor-browser-brand.ftl
@@ -7,6 +7,6 @@
-brand-full-name = Le Navigateur Tor
# 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 = Le Navigateur Tor
+-brand-product-name = Navigateur Tor
-vendor-short-name = Le Projet Tor
trademarkInfo = « Tor » et le « logo Onion » sont des marques de commerce de « The Projet Tor, Inc. »
diff --git a/chrome/locale/hu/branding/tor-browser-brand.ftl b/chrome/locale/hu/branding/tor-browser-brand.ftl
index ab8ff46d..399c1231 100644
--- a/chrome/locale/hu/branding/tor-browser-brand.ftl
+++ b/chrome/locale/hu/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = Tor Browser
--brand-short-name = Tor Browser
--brand-full-name = Tor Browser
+-brand-shorter-name = Tor Böngésző
+-brand-short-name = Tor Böngésző
+-brand-full-name = Tor Böngésző
# 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
+-brand-product-name = Tor Böngésző
-vendor-short-name = Tor Project
trademarkInfo = A 'Tor' és az 'Onion Logo' a Tor Project, Inc. bejegyzett védjegyei.
diff --git a/chrome/locale/id/branding/tor-browser-brand.ftl b/chrome/locale/id/branding/tor-browser-brand.ftl
index b220851c..1724e411 100644
--- a/chrome/locale/id/branding/tor-browser-brand.ftl
+++ b/chrome/locale/id/branding/tor-browser-brand.ftl
@@ -7,6 +7,6 @@
-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
+-brand-product-name = Peramban Tor
-vendor-short-name = Proyek Tor
trademarkInfo = 'Tor' dan 'Logo Onion' adalah merek dagang terdaftar Tor Project, Inc.
diff --git a/chrome/locale/lt/branding/tor-browser-brand.ftl b/chrome/locale/lt/branding/tor-browser-brand.ftl
index af1fd648..aeebaec4 100644
--- a/chrome/locale/lt/branding/tor-browser-brand.ftl
+++ b/chrome/locale/lt/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = Tor Browser
--brand-short-name = Tor Browser
--brand-full-name = Tor Browser
+-brand-shorter-name = Tor Naršyklė
+-brand-short-name = Tor Naršyklė
+-brand-full-name = Tor Naršyklė
# 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
--vendor-short-name = Tor Project
-trademarkInfo = 'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.
+-brand-product-name = Tor Naršyklė
+-vendor-short-name = Tor projektas
+trademarkInfo = 'Tor' ir 'Onion logotipas' yra registruoti Tor Project, Inc. prekių ženklai.
diff --git a/chrome/locale/ms/branding/tor-browser-brand.ftl b/chrome/locale/ms/branding/tor-browser-brand.ftl
index af1fd648..058e7c9a 100644
--- a/chrome/locale/ms/branding/tor-browser-brand.ftl
+++ b/chrome/locale/ms/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = Tor Browser
--brand-short-name = Tor Browser
--brand-full-name = Tor Browser
+-brand-shorter-name = Pelayar Tor
+-brand-short-name = Pelayar Tor
+-brand-full-name = Pelayar Tor
# 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
--vendor-short-name = Tor Project
-trademarkInfo = 'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.
+-brand-product-name = Pelayar Tor
+-vendor-short-name = Projek Tor
+trademarkInfo = 'Tor' dan 'Logo Onion' adalah cap dagangan berdaftar bagi Projek Tor, Inc.
diff --git a/chrome/locale/nb-NO/branding/tor-browser-brand.ftl b/chrome/locale/nb-NO/branding/tor-browser-brand.ftl
index b09f8a20..8f5ec614 100644
--- a/chrome/locale/nb-NO/branding/tor-browser-brand.ftl
+++ b/chrome/locale/nb-NO/branding/tor-browser-brand.ftl
@@ -7,6 +7,6 @@
-brand-full-name = Tor-nettleseren
# 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-nettleseren
+-brand-product-name = Tor Browser
-vendor-short-name = Tor Project
-trademarkInfo = "Tor" og "Løk-logoen" er registrerte varemerker tilhørende the Tor Project, Inc.
+trademarkInfo = 'Tor' og 'Løk-logoen' er registrerte varemerker tilhørende the Tor Project, Inc.
diff --git a/chrome/locale/nl/branding/tor-browser-brand.ftl b/chrome/locale/nl/branding/tor-browser-brand.ftl
index 8ae5a2c6..77d51761 100644
--- a/chrome/locale/nl/branding/tor-browser-brand.ftl
+++ b/chrome/locale/nl/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = Tor Browser
--brand-short-name = Tor Browser
--brand-full-name = Tor Browser
+-brand-shorter-name = Tor-browser
+-brand-short-name = Tor-browser
+-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
--vendor-short-name = Tor Project
-trademarkInfo = ‘Tor’ en het ‘Onion-logo’ zijn geregistreerde handelsmerken van het Tor Project, Inc.
+-vendor-short-name = Tor-project
+trademarkInfo = ‘Tor’ en het ‘Onion-logo’ zijn geregistreerde handelsmerken van Tor Project, Inc.
diff --git a/chrome/locale/ru/branding/tor-browser-brand.ftl b/chrome/locale/ru/branding/tor-browser-brand.ftl
index 44a1226e..c712a1b7 100644
--- a/chrome/locale/ru/branding/tor-browser-brand.ftl
+++ b/chrome/locale/ru/branding/tor-browser-brand.ftl
@@ -8,5 +8,5 @@
# 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
--vendor-short-name = Проект Tor
+-vendor-short-name = Tor Project
trademarkInfo = 'Tor' и логотип 'Onion' являются зарегистрированными торговыми марками Tor Project, Inc.
diff --git a/chrome/locale/sv-SE/branding/tor-browser-brand.ftl b/chrome/locale/sv-SE/branding/tor-browser-brand.ftl
index a7f08cfc..56cdff04 100644
--- a/chrome/locale/sv-SE/branding/tor-browser-brand.ftl
+++ b/chrome/locale/sv-SE/branding/tor-browser-brand.ftl
@@ -9,4 +9,4 @@
# remain unchanged across different versions (Nightly, Beta, etc.).
-brand-product-name = Tor Browser
-vendor-short-name = Tor-projektet
-trademarkInfo = 'Tor' och 'Onion Logotypen' är registerade varumärken av Tor Project, Inc.
+trademarkInfo = 'Tor' och 'Onion-logotypen' är registerade varumärken av Tor Project, Inc.
diff --git a/chrome/locale/th/branding/tor-browser-brand.ftl b/chrome/locale/th/branding/tor-browser-brand.ftl
index af1fd648..b1812e82 100644
--- a/chrome/locale/th/branding/tor-browser-brand.ftl
+++ b/chrome/locale/th/branding/tor-browser-brand.ftl
@@ -8,5 +8,5 @@
# 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
--vendor-short-name = Tor Project
-trademarkInfo = 'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.
+-vendor-short-name = โครงการ Tor
+trademarkInfo = 'Tor 'และ' Onion Logo 'เป็นเครื่องหมายการค้าจดทะเบียนของโครงการ Tor Project, Inc.
diff --git a/chrome/locale/tr/branding/tor-browser-brand.ftl b/chrome/locale/tr/branding/tor-browser-brand.ftl
index 606a088b..d77b5427 100644
--- a/chrome/locale/tr/branding/tor-browser-brand.ftl
+++ b/chrome/locale/tr/branding/tor-browser-brand.ftl
@@ -9,4 +9,4 @@
# remain unchanged across different versions (Nightly, Beta, etc.).
-brand-product-name = Tor Browser
-vendor-short-name = Tor Projesi
-trademarkInfo = 'Tor' ve 'Onion Logo' Tor Project, Inc. tarafından tescillenmiş markalardır.
+trademarkInfo = 'Tor' ve 'Onion Logo' Tor Project, Inc. tarafından tescil edilmiş markalardır.
diff --git a/chrome/locale/zh-CN/branding/tor-browser-brand.ftl b/chrome/locale/zh-CN/branding/tor-browser-brand.ftl
index acaab16c..bd16e2af 100644
--- a/chrome/locale/zh-CN/branding/tor-browser-brand.ftl
+++ b/chrome/locale/zh-CN/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = Tor Browser
--brand-short-name = Tor Browser
--brand-full-name = Tor Browser
+-brand-shorter-name = Tor 浏览器
+-brand-short-name = Tor 浏览器
+-brand-full-name = Tor 浏览器
# 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
+-brand-product-name = Tor 浏览器
-vendor-short-name = Tor Project
trademarkInfo = “Tor”和“Onion Logo”是 Tor Project, Inc 的注册商标。
diff --git a/chrome/locale/zh-TW/branding/tor-browser-brand.ftl b/chrome/locale/zh-TW/branding/tor-browser-brand.ftl
index 67938d57..eca78d7c 100644
--- a/chrome/locale/zh-TW/branding/tor-browser-brand.ftl
+++ b/chrome/locale/zh-TW/branding/tor-browser-brand.ftl
@@ -7,6 +7,6 @@
-brand-full-name = 洋蔥路由瀏覽器
# 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 = 洋蔥路由瀏覽器
--vendor-short-name = 洋蔥路由專案
+-brand-product-name = Tor 瀏覽器
+-vendor-short-name = Tor 計畫
trademarkInfo = 「Tor」和「Onion Logo」皆是 Tor Project, Inc 的註冊商標。
diff --git a/import-translations.sh b/import-translations.sh
index 06060a3c..78b4b8b9 100755
--- a/import-translations.sh
+++ b/import-translations.sh
@@ -64,6 +64,7 @@ else
fi
# Update each translated file for each locale.
+(
echo "Locales: $BUNDLE_LOCALES"
cd translation
for KEYVAL in "${FILEMAP[@]}"; do
@@ -87,3 +88,39 @@ for KEYVAL in "${FILEMAP[@]}"; do
$i/"$SRCFILE" > ../$LOCALE_DIR/$i/"$DEST_FILE"
done
done
+)
+
+# Autogenerate tor-browser-brand.ftl based on brand.properties
+# and brand.dtd.
+REGEX_ENTITY='<!ENTITY +([^" ]+) +"(.+)">';
+for LOCALE in $BUNDLE_LOCALES;
+do
+ BRAND_PATH="$LOCALE_DIR/$LOCALE/brand.properties"
+ BRAND_DTD_PATH="$LOCALE_DIR/$LOCALE/brand.dtd"
+ TOR_BRAND_PATH="$(dirname "$BRAND_PATH")/branding/tor-browser-brand.ftl"
+
+ BRAND_SHORTER_NAME="$(sed -n -e '/^brandShorterName/p' $BRAND_PATH | cut -d= -f2)"
+ BRAND_SHORT_NAME="$(sed -n -e '/^brandShortName/p' $BRAND_PATH | cut -d= -f2)"
+ BRAND_FULL_NAME="$(sed -n -e '/^brandFullName/p' $BRAND_PATH | cut -d= -f2)"
+ BRAND_PRODUCT_NAME="$(sed -n -e '/^brandProductName/p' $BRAND_PATH | cut -d= -f2)"
+ VENDOR_SHORT_NAME="$(sed -n -e '/^vendorShortName/p' $BRAND_PATH | cut -d= -f2)"
+ TRADEMARK_INFO='{ " " }'
+ if [[ "$(sed -n -e '/trademarkInfo/p' $BRAND_DTD_PATH)" =~ $REGEX_ENTITY ]]
+ then
+ # Replace some HTML entities (now just ") for tor-browser-brand.ftl.
+ TRADEMARK_INFO="${BASH_REMATCH[2]//"/\'}"
+ fi
+
+ echo "# For Tor Browser, we use a new file (different than the brand.ftl file" > $TOR_BRAND_PATH
+ echo "# that is used by Firefox) to avoid picking up the -brand-short-name values" >> $TOR_BRAND_PATH
+ echo "# that Mozilla includes in the Firefox language packs." >> $TOR_BRAND_PATH
+ echo "" >> $TOR_BRAND_PATH
+ echo "-brand-shorter-name = $BRAND_SHORTER_NAME" >> $TOR_BRAND_PATH
+ echo "-brand-short-name = $BRAND_SHORT_NAME" >> $TOR_BRAND_PATH
+ echo "-brand-full-name = $BRAND_FULL_NAME" >> $TOR_BRAND_PATH
+ echo "# This brand name can be used in messages where the product name needs to" >> $TOR_BRAND_PATH
+ echo "# remain unchanged across different versions (Nightly, Beta, etc.)." >> $TOR_BRAND_PATH
+ echo "-brand-product-name = $BRAND_PRODUCT_NAME" >> $TOR_BRAND_PATH
+ echo "-vendor-short-name = $VENDOR_SHORT_NAME" >> $TOR_BRAND_PATH
+ echo "trademarkInfo = $TRADEMARK_INFO" >> $TOR_BRAND_PATH
+done
1
0
06 Jul '20
commit ca6280fe98cb140f05f397ce2bb99e0c41b90902
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Tue Jul 7 03:16:13 2020 +0000
Release preparations for 10.0a3
Changelog update and versions bump
---
projects/firefox/config | 2 +-
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 4 ++++
rbm.conf | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 019dfc1..7c700a8 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -8,7 +8,7 @@ git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 68.10.0
+ firefox_platform_version: 68.10.1
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 10.0
branding_directory: '[% IF c("var/android") %]mobile/android[% ELSE %]browser[% END %]/branding/alpha'
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index fd03cd1..a6b6408 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,7 @@
+Tor Browser 10.0a3 -- July 7 2020
+ * Android
+ * Update Firefox to 68.10.1esr
+
Tor Browser 10.0a2 -- June 30 2020
* All Platforms
* Update Firefox to 68.10.0esr
diff --git a/rbm.conf b/rbm.conf
index 0ccfc9d..92c3293 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -24,7 +24,7 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '10.0a2'
+ torbrowser_version: '10.0a3'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- 10.0a1
1
0
06 Jul '20
commit b5fb6a531f4723c63eea4ff4ea58d56377578cb4
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jul 6 19:46:17 2020 +0000
Release preparations for 9.5.2
Changelog update and versions bump
---
projects/firefox/config | 4 ++--
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 4 ++++
rbm.conf | 4 ++--
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 1398149..414097f 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,14 +1,14 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 68.10.0
+ firefox_platform_version: 68.10.1
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 9.5
branding_directory: '[% IF c("var/android") %]mobile/android[% ELSE %]browser[% END %]/branding/alpha'
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index c204a38..bd49a23 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,7 @@
+Tor Browser 9.5.2 -- July 7 2020
+ * Android
+ * Update Firefox to 68.10.1esr
+
Tor Browser 9.5.1 -- June 30 2020
* All Platforms
* Update Firefox to 68.10.0esr
diff --git a/rbm.conf b/rbm.conf
index c65d3a8..05ffcf2 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -24,8 +24,8 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '9.5.1'
- torbrowser_build: 'build2'
+ torbrowser_version: '9.5.2'
+ torbrowser_build: 'build1'
torbrowser_incremental_from:
- 9.5
project_name: tor-browser
1
0
[tor-browser-build/maint-9.5] Bug 40012: Add build target for all Android arches
by gk@torproject.org 06 Jul '20
by gk@torproject.org 06 Jul '20
06 Jul '20
commit aca5c381638beacf86d2660d3d6e94f4e5996acf
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jul 6 18:39:31 2020 +0000
Bug 40012: Add build target for all Android arches
---
Makefile | 12 ++++++++++++
projects/release/config | 7 +++++++
2 files changed, 19 insertions(+)
diff --git a/Makefile b/Makefile
index 6d82f93..cb7edc5 100644
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,9 @@ all: release
release: submodule-update
$(rbm) build release --target release --target torbrowser-all
+release-android: submodule-update
+ $(rbm) build release --target release --target torbrowser-all-android
+
release-android-armv7: submodule-update
$(rbm) build release --target release --target torbrowser-android-armv7
@@ -41,6 +44,9 @@ release-src: submodule-update
alpha: submodule-update
$(rbm) build release --target alpha --target torbrowser-all
+alpha-android: submodule-update
+ $(rbm) build release --target alpha --target torbrowser-all-android
+
alpha-android-armv7: submodule-update
$(rbm) build release --target alpha --target torbrowser-android-armv7
@@ -77,6 +83,9 @@ alpha-src: submodule-update
nightly: submodule-update
$(rbm) build release --target nightly --target torbrowser-all
+nightly-android: submodule-update
+ $(rbm) build release --target nightly --target torbrowser-all-android
+
nightly-android-armv7: submodule-update
$(rbm) build release --target nightly --target torbrowser-android-armv7
@@ -113,6 +122,9 @@ nightly-src: submodule-update
testbuild: submodule-update
$(rbm) build release --target testbuild --target torbrowser-all
+testbuild-android: submodule-update
+ $(rbm) build release --target testbuild --target torbrowser-all-android
+
testbuild-android-armv7: submodule-update
$(rbm) build release --target testbuild --target torbrowser-android-armv7
diff --git a/projects/release/config b/projects/release/config
index 17db3d0..c6e883b 100644
--- a/projects/release/config
+++ b/projects/release/config
@@ -19,6 +19,12 @@ targets:
- torbrowser-android-x86_64
- torbrowser-android-aarch64
- torbrowser-src
+ torbrowser-all-android:
+ - torbrowser-android-armv7
+ - torbrowser-android-x86
+ - torbrowser-android-x86_64
+ - torbrowser-android-aarch64
+ - torbrowser-src
torbrowser-android-armv7:
var:
torbrowser-android-armv7: 1
@@ -60,6 +66,7 @@ targets:
notarget:
- release
- torbrowser-all
+ - torbrowser-all-android
noversiondir:
var:
1
0
[tor-browser-build/master] Bug 40012: Add build target for all Android arches
by gk@torproject.org 06 Jul '20
by gk@torproject.org 06 Jul '20
06 Jul '20
commit 83846ea03d86523f9f74505e34bb2d073487e3b8
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jul 6 18:39:31 2020 +0000
Bug 40012: Add build target for all Android arches
---
Makefile | 12 ++++++++++++
projects/release/config | 7 +++++++
2 files changed, 19 insertions(+)
diff --git a/Makefile b/Makefile
index 6d82f93..cb7edc5 100644
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,9 @@ all: release
release: submodule-update
$(rbm) build release --target release --target torbrowser-all
+release-android: submodule-update
+ $(rbm) build release --target release --target torbrowser-all-android
+
release-android-armv7: submodule-update
$(rbm) build release --target release --target torbrowser-android-armv7
@@ -41,6 +44,9 @@ release-src: submodule-update
alpha: submodule-update
$(rbm) build release --target alpha --target torbrowser-all
+alpha-android: submodule-update
+ $(rbm) build release --target alpha --target torbrowser-all-android
+
alpha-android-armv7: submodule-update
$(rbm) build release --target alpha --target torbrowser-android-armv7
@@ -77,6 +83,9 @@ alpha-src: submodule-update
nightly: submodule-update
$(rbm) build release --target nightly --target torbrowser-all
+nightly-android: submodule-update
+ $(rbm) build release --target nightly --target torbrowser-all-android
+
nightly-android-armv7: submodule-update
$(rbm) build release --target nightly --target torbrowser-android-armv7
@@ -113,6 +122,9 @@ nightly-src: submodule-update
testbuild: submodule-update
$(rbm) build release --target testbuild --target torbrowser-all
+testbuild-android: submodule-update
+ $(rbm) build release --target testbuild --target torbrowser-all-android
+
testbuild-android-armv7: submodule-update
$(rbm) build release --target testbuild --target torbrowser-android-armv7
diff --git a/projects/release/config b/projects/release/config
index 17db3d0..c6e883b 100644
--- a/projects/release/config
+++ b/projects/release/config
@@ -19,6 +19,12 @@ targets:
- torbrowser-android-x86_64
- torbrowser-android-aarch64
- torbrowser-src
+ torbrowser-all-android:
+ - torbrowser-android-armv7
+ - torbrowser-android-x86
+ - torbrowser-android-x86_64
+ - torbrowser-android-aarch64
+ - torbrowser-src
torbrowser-android-armv7:
var:
torbrowser-android-armv7: 1
@@ -60,6 +66,7 @@ targets:
notarget:
- release
- torbrowser-all
+ - torbrowser-all-android
noversiondir:
var:
1
0
06 Jul '20
commit f857ef5ae6c8af955198bd28c7b54bf7df624b53
Author: Alex Catarineu <acat(a)torproject.org>
Date: Mon Jun 22 18:17:44 2020 +0200
Bug 40001: Add rebasing process document
---
processes/Rebasing | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 161 insertions(+)
diff --git a/processes/Rebasing b/processes/Rebasing
new file mode 100644
index 0000000..144f5ab
--- /dev/null
+++ b/processes/Rebasing
@@ -0,0 +1,161 @@
+Rebasing Tor Browser patches on top of a new Firefox version
+============================================================
+
+These instructions assume branches of Tor Browser code are maintained with git,
+and consist of a sequence of patches (commits) applied on top of some commit
+from the https://github.com/mozilla/gecko-dev.git mirror of the Mercurial
+Gecko repositories.
+
+1) Rebase
+---------
+
+This consists of applying the Tor Browser patches (commits) from some branch on
+top of a newer Firefox branch, and fixing up possible conflicts. There should be
+a helper script that automates as much of this process as possible:
+
+Steps:
+
+- Move to the branch that contains the patches to be rebased and create a new
+ one, since it will be modified during the rebasing process:
+ `git checkout [current_tor_browser_branch] -b [new_rebased_branch_name]`
+- Execute the rebase helper script: `./git-tbrebase [target_firefox_branch]`.
+ Responsibilities of the script:
+ - Get the list of Tor Browser patches from `current_tor_browser_branch`.
+ - Check whether some of the patches are already in `target_firefox_branch`
+ (e.g. backports) and mark them to be skipped in that case.
+ - Move to `target_firefox_branch` (e.g.
+ `git reset --hard [target_firefox_branch]`) and apply patches.
+ - Keep a log of all the process in a way that it can be used as a "rebase
+ report" for the reviewer.
+ - This should include, among other things, the time needed for resolving
+ patch conflicts.
+ - For each conflict, show the bugzilla tickets responsible for it, based on
+ `git blame` on the conflicting lines.
+ - After resolving a patch conflict, ask the rebaser whether comments need to
+ be added, and make sure these are included in the "rebase report".
+ - If there are patches that require manual steps when rebasing (e.g. copying
+ nightly branding folder to alpha, etc.), stop and warn about it.
+ - There could be instructions encoded in the commit message using some
+ convention.
+ - Or maybe run some script automatically, similarly to git hooks.
+- In case of conflict:
+ - Resolve manually.
+ - Check whether the commit message needs to be changed due to the conflict
+ resolution (e.g. a partially uplifted patch), and do so if needed.
+ - Run `./git-tbrebase --continue` to continue with the process (or `--skip` or
+ `--abort`, similarly to `git rebase`).
+
+2) Build
+--------
+
+Ideally, we should do a full tor-browser-build here. But:
+
+- These can take quite long, and are not incremental.
+- The `tor-browser-build` toolchains might need changes for newer Firefox
+ versions.
+
+At this stage, it should be fine to do a local build and use a `repackage_tb`
+script which takes the latest linux64 Tor Browser build and repackages it with
+the locally built Tor Browser from `obj-x86_64-pc-linux-gnu`.
+
+Steps:
+
+- Copy `tor-launcher` master to `browser/extensions`.
+- Make sure `torbutton` submodule is correctly loaded:
+ `git submodule update --init`
+- Edit `.mozconfig` to set
+ - `ac_add_options --enable-tests`
+ - `ac_add_options --enable-debug`
+ - `ac_add_options --enable-tor-launcher`
+ - `ac_add_options --enable-tor-browser-update`
+- Optionally, add
+ `ac_add_options --with-ccache=/home/user/.mozbuild/sccache/sccache` to use
+ `sccache` for speeding up subsequent builds.
+- `./mach build && ./mach package`
+- `./repackage_tb`
+
+At the end, there should be a `tor-browser-linux64-version_en-US.tar.xz`
+artifact, which is the repackaged Tor Browser.
+
+3) Manual testing
+-----------------
+
+This should ideally not be needed, but until everything is covered by automated
+testing we can do a quick manual test to catch the most obvious breakage:
+
+- Launch the repackaged browser and check:
+ - Tor is launched correctly.
+ - `about:tor` is displayed with no errors
+ - `about:preferences` is not broken.
+ - It's possible to navigate to some website (e.g. duckduckgo search)
+ - The circuit display is working and displayed correctly.
+
+4) Automated testing
+--------------------
+
+There should be a single script that runs all tests, but for now let's
+list the individual commands:
+
+- `./run-tbb-tests` should run the Tor Browser unit tests locally.
+-
+ `./tor-browser-bundle-testsuite/tbb-testsuite --no-xdummy tor-browser-linux64-version_en-US.tar.xz`
+ should run the Tor Browser testsuite.
+- `./mach lint` should check for linting errors.
+
+5) Debug/Fix
+------------
+
+For each issue found while running tests, debug and/or fix it, then iterate 2-5
+until no more test failures are found.
+
+For fixing up a commit, a script `./git-tbedit [commit]` should be used, so that
+the time spent editing the patch is tracked and included in the rebase report.
+
+6) Push for review
+------------------
+
+In the ticket for the rebase work, the rebaser should add a reference to the
+rebased branch that has to be reviewed, and a rebase report, which should
+contain, for every Tor Browser commit in the original branch:
+
+```
+[SKIPPED|PICKED|CONFLICT][original_hash][commit_summary]
+ (optional) Total time editing commit:
+ (optional) Comments:
+ Some comments relevant for the reviewer.
+ (optional) Conflicts:
+ List of conflicting files.
+```
+
+Other
+-----
+
+- Picking Tor Browser patches and changes that landed after the rebase started.
+
+The rebasing and reviewing process can last long enough for newer patches and
+changes to have landed after the process started.
+
+Doing a full rebase with a later tor-browser branch would be too costly, so we
+need to identify the changes that landed between the branch that was originally
+rebased and the newer Tor Browser branch and only apply those.
+
+Until this is properly automated, a suggested manual approach is to do:
+
+`git range-diff original_starting_commit~1..original_ending_commit new_starting_commit~1..new_ending_commit`,
+so basically doing a range-diff between the original set of patches that were
+rebased, and a more up-to-date set of patches. Then, we should manually be able
+to pick the missing changes, as fixup or squash commits.
+
+- Reordering/squashing patches
+
+We should not mix rebasing changes + fixing conflicts with patch reordering and
+squashing. More concretely, it should be possible to check with
+`git diff original_tb_branch..reordered_and_squashed_tb_branch` that the
+reordered branch contents are equivalent to the previous branch.
+
+- Double-checking that no patch was accidentally lost in the process
+
+While this should not be possible if most of the process is properly automated,
+it should not be very costly to double-check it. For this, there could be a
+script that compares the current rebased branch with the latest tor-browser
+branch, and shows the differences (comparing the set of commit messages).
1
0