diff --git a/README.md b/README.md
index 20b693b..db9873a 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ Once a new package is added, it takes priority over the original one from Ubuntu
so they never enter into the repo from upstream and need to be
compiled with this helpers and pushed into reprepro.
-To add a package to the list, follow the [CONTRIBUTING](https://gitlab.trisquel.org/trisquel/package-helpers/blob/nabia/CONTRIBUTING.md) guidelines.
+To add a package to the list, follow the [CONTRIBUTING](CONTRIBUTING.md) guidelines.
## Steps
@@ -39,7 +39,7 @@ Those are the steps done by the helpers:
* You don't need to use sudo in order to run those scripts, but some extra packages are needed:
- `sudo apt-get install cdbs devscripts dpkg-dev git gnupg gnupg2 patch python2 quilt rename rpl sed python3-jsonschema`
+ `sudo apt-get install cdbs devscripts dpkg-dev git gnupg gnupg2 patch quilt rename rpl sed python3-jsonschema`
* Take care to use the right sourcePackageName, many source packages produce
several binary packages. `apt-cache showsrc binary-package` can help you.
diff --git a/helpers/DATA/7zip/000_remove-non-free-suggestions-from-control-file.patch b/helpers/DATA/7zip/000_remove-non-free-suggestions-from-control-file.patch
new file mode 100644
index 0000000..366de26
--- /dev/null
+++ b/helpers/DATA/7zip/000_remove-non-free-suggestions-from-control-file.patch
@@ -0,0 +1,32 @@
+diff --git a/debian/control b/debian/control
+index b4734c95..e0aa528c 100644
+--- a/debian/control
++++ b/debian/control
+@@ -13,7 +13,7 @@ Vcs-Browser: https://salsa.debian.org/debian/7zip
+ Package: 7zip
+ Architecture: any
+ Depends: ${misc:Depends}, ${shlibs:Depends}
+-Suggests: 7zip-standalone, 7zip-rar
++Suggests: 7zip-standalone
+ Breaks: p7zip-full (<= 16.02+dfsg-8), p7zip (<= 16.02+dfsg-8)
+ Replaces: p7zip-full (<= 16.02+dfsg-8), p7zip (<= 16.02+dfsg-8)
+ Provides: p7zip-full, p7zip
+@@ -37,7 +37,6 @@ Description: 7-Zip file archiver with a high compression ratio
+ * /usr/bin/7zr: LZMA (.7z, .lzma, .xz) only. Minimal executable.
+ .
+ Note: The unRAR code was dropped to keep compatible with DFSG.
+- Install 7zip-rar package in non-free section to use RAR files.
+
+ Package: 7zip-standalone
+ Architecture: any
+@@ -49,8 +48,8 @@ Description: 7-Zip file archiver with a high compression ratio (standalone)
+ .
+ "7zip-standalone" provides:
+ * /usr/bin/7zz: Full featured except plugins, standalone executable.
+- This means 7zz can't work with unRAR plugin that provided by 7zip-rar
+- package. Use 7zip package for unRAR plugin.
++ This means 7zz can't work with the non-free unRAR plugin not
++ available at Trisquel repo.
+ .
+ Note: If you want to create SFX archive, you also needs 7zip package for SFX
+ stub module.
diff --git a/helpers/DATA/akregator/trisquel_feeds.patch b/helpers/DATA/akregator/trisquel_feeds.patch
index 7d54c10..cc88808 100644
--- a/helpers/DATA/akregator/trisquel_feeds.patch
+++ b/helpers/DATA/akregator/trisquel_feeds.patch
@@ -1,5 +1,5 @@
---- src/akregator_part.cpp 2020-06-05 11:41:23.000000000 -0500
-+++ src/akregator_part_trisquel.cpp 2020-06-05 12:46:05.914051386 -0500
+--- a/src/akregator_part.cpp 2020-06-05 11:41:23.000000000 -0500
++++ b/src/akregator_part.cpp 2020-06-05 12:46:05.914051386 -0500
@@ -189,6 +189,61 @@
wire.setAttribute(QStringLiteral("xmlUrl"), QStringLiteral("http://wire.kubuntu.org/?feed=rss2"));
kubuntuFolder.appendChild(wire);
diff --git a/helpers/DATA/anarchism/patch_changes/000-replace_adobe_promotion_on_earlier_release.patch b/helpers/DATA/anarchism/patch_changes/000-replace_adobe_promotion_on_earlier_release.patch
new file mode 100644
index 0000000..9849089
--- /dev/null
+++ b/helpers/DATA/anarchism/patch_changes/000-replace_adobe_promotion_on_earlier_release.patch
@@ -0,0 +1,32 @@
+diff --git a/html/pdf.html b/html/pdf.html
+index 2e4143fa..9f58faa9 100644
+--- a/html/pdf.html
++++ b/html/pdf.html
+@@ -7,7 +7,7 @@
+
+
+
"An Anarchist FAQ" in pdf format
+-
To view and print out the file you will need to have Adobe Document Reader on your computer. This is free software that now comes on many computers and with many CD's. If you do not already have it you can download it from the Adobe site. [or click here for a faster text only page ]
++
To view or print this file, you will need a PDF reader installed on your computer. Many PDF readers are free software and are available on most systems. If you don't already have one, you can browse a list of options at pdfreaders.org , or install a PDF reader from your operating system's software repository.
+
An Anarchist FAQ
+
+
+diff --git a/markdown/pdf.md b/markdown/pdf.md
+index 0375b395..5994bd6f 100644
+--- a/markdown/pdf.md
++++ b/markdown/pdf.md
+@@ -1,9 +1,10 @@
+ # "An Anarchist FAQ" in pdf format
+
+-To view and print out the file you will need to have Adobe Document Reader on
+-your computer. This is free software that now comes on many computers and with
+-many CD's. If you do not already have it you can [ download it from the Adobe
+-for a faster text only
++To view or print this file, you will need a PDF reader installed on your
++computer. Many PDF readers are free software and are available on most
++systems. If you don't already have one, you can browse a list of options at
++pdfreaders.org, or install a PDF reader from your operating system's software
++repository
+
+ ## _An Anarchist FAQ
+ _
diff --git a/helpers/DATA/apparmor-profiles-extra/patch_changes/000-70aed868a4ed76d74eecf3b210ce7bf3098ffab4.patch b/helpers/DATA/apparmor-profiles-extra/patch_changes/000-70aed868a4ed76d74eecf3b210ce7bf3098ffab4.patch
new file mode 100644
index 0000000..4db9062
--- /dev/null
+++ b/helpers/DATA/apparmor-profiles-extra/patch_changes/000-70aed868a4ed76d74eecf3b210ce7bf3098ffab4.patch
@@ -0,0 +1,37 @@
+From 70aed868a4ed76d74eecf3b210ce7bf3098ffab4 Mon Sep 17 00:00:00 2001
+From: Jacob K
+Date: Wed, 12 Feb 2025 12:19:24 -0600
+Subject: [PATCH] Add some lines from Atril's profile to fix the screen reader
+
+---
+ profiles/usr.bin.pidgin | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/profiles/usr.bin.pidgin b/profiles/usr.bin.pidgin
+index 5e18702..085301c 100644
+--- a/profiles/usr.bin.pidgin
++++ b/profiles/usr.bin.pidgin
+@@ -8,6 +8,7 @@
+ #include
+ #include
+ #include
++ #include
+ #include
+ #include
+ #include
+@@ -82,6 +83,13 @@
+ owner @{PROC}/@{pid}/auxv r,
+ owner @{PROC}/@{pid}/fd/ r,
+
++ # These lines were copied from Atril's profile to make the screen reader functional
++ owner /{,var/}run/user/*/at-spi2-*/ rw,
++ owner /{,var/}run/user/*/at-spi2-*/** rw,
++ # Allow access to the non-abstract D-Bus socket used by at-spi > 2.42.0
++ # https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/43
++ owner /{,var/}run/user/*/at-spi/bus* rw,
++
+ # Site-specific additions and overrides. See local/README for details.
+ #include
+ }
+--
+2.25.1
diff --git a/helpers/DATA/apparmor-profiles-extra/patch_changes/001_enable-restricted-dbus-update.patch b/helpers/DATA/apparmor-profiles-extra/patch_changes/001_enable-restricted-dbus-update.patch
new file mode 100644
index 0000000..696d5c5
--- /dev/null
+++ b/helpers/DATA/apparmor-profiles-extra/patch_changes/001_enable-restricted-dbus-update.patch
@@ -0,0 +1,15 @@
+Enable restricted dbus configuration usage by pidgin to fix MATE on Noble (Ecne) orca access.
+
+diff --git a/profiles/usr.bin.pidgin b/profiles/usr.bin.pidgin
+index 085301c6..78338084 100644
+--- a/profiles/usr.bin.pidgin
++++ b/profiles/usr.bin.pidgin
+@@ -49,7 +49,7 @@
+ # Uncomment the two following lines if you want to allow Pidgin to update
+ # any DConf setting:
+ # owner @{HOME}/.{cache,config}/dconf/user rw,
+- # owner /{,var/}run/user/[0-9]*/dconf/user rwk,
++ owner /{,var/}run/user/[0-9]*/dconf/user rwk,
+
+ /{usr/,}bin/dash rix,
+ /{usr/,}bin/which rix,
diff --git a/helpers/DATA/apparmor-profiles-extra/patch_changes/002-add_allow_pidgin_ibus_socket_access.patch b/helpers/DATA/apparmor-profiles-extra/patch_changes/002-add_allow_pidgin_ibus_socket_access.patch
new file mode 100644
index 0000000..5c23e69
--- /dev/null
+++ b/helpers/DATA/apparmor-profiles-extra/patch_changes/002-add_allow_pidgin_ibus_socket_access.patch
@@ -0,0 +1,15 @@
+diff --git a/profiles/usr.bin.pidgin b/profiles/usr.bin.pidgin
+index 78338084..6d18657d 100644
+--- a/profiles/usr.bin.pidgin
++++ b/profiles/usr.bin.pidgin
+@@ -90,6 +90,10 @@
+ # https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/43
+ owner /{,var/}run/user/*/at-spi/bus* rw,
+
++ # Allow IBus private socket under HOME cache (used by some IBus setups)
++ owner @{HOME}/.cache/ibus/ r,
++ owner @{HOME}/.cache/ibus/* rw,
++
+ # Site-specific additions and overrides. See local/README for details.
+ #include
+ }
diff --git a/helpers/DATA/apparmor/002-add-unconfined-profile-firefox-icedove-icecat.patch b/helpers/DATA/apparmor/002-add-unconfined-profile-firefox-icedove-icecat.patch
new file mode 100644
index 0000000..a48c7ff
--- /dev/null
+++ b/helpers/DATA/apparmor/002-add-unconfined-profile-firefox-icedove-icecat.patch
@@ -0,0 +1,70 @@
+diff --git a/profiles/apparmor.d/abrowser b/profiles/apparmor.d/abrowser
+index c4b6337f..8a3ac9ec 100644
+--- a/profiles/apparmor.d/abrowser
++++ b/profiles/apparmor.d/abrowser
+@@ -4,9 +4,9 @@
+ abi ,
+ include
+
+-profile firefox /{usr/lib/firefox{,-esr,-beta,-devedition,-nightly},opt/firefox}/firefox{,-esr,-bin} flags=(unconfined) {
++profile abrowser /{usr/lib/abrowser{,-esr,-beta,-devedition,-nightly},opt/abrowser}/abrowser{,-esr,-bin} flags=(unconfined) {
+ userns,
+
+ # Site-specific additions and overrides. See local/README for details.
+- include if exists
++ include if exists
+ }
+diff --git a/profiles/apparmor.d/icedove b/profiles/apparmor.d/icedove
+index 060eb24d..667b1674 100644
+--- a/profiles/apparmor.d/icedove
++++ b/profiles/apparmor.d/icedove
+@@ -4,9 +4,9 @@
+ abi ,
+ include
+
+-profile thunderbird /usr/bin/thunderbird flags=(unconfined) {
++profile icedove /usr/bin/icedove flags=(unconfined) {
+ userns,
+
+ # Site-specific additions and overrides. See local/README for details.
+- include if exists
++ include if exists
+ }
+diff --git a/profiles/apparmor.d/icecat b/profiles/apparmor.d/icecat
+index 4071c345..148e445e 100644
+--- a/profiles/apparmor.d/icecat
++++ b/profiles/apparmor.d/icecat
+@@ -4,9 +4,9 @@
+ abi ,
+ include
+
+-profile firefox /{usr/lib/firefox{,-esr,-beta,-devedition,-nightly},opt/firefox}/firefox{,-esr,-bin} flags=(unconfined) {
++profile icecat /{usr/lib/icecat{,-esr,-beta,-devedition,-nightly},opt/icecat}/icecat{,-esr,-bin} flags=(unconfined) {
+ userns,
+
+ # Site-specific additions and overrides. See local/README for details.
+- include if exists
++ include if exists
+ }
+diff --git a/debian/apparmor.install b/debian/apparmor.install
+index 9cdaa3a2..d9ee697c 100644
+--- a/debian/apparmor.install
++++ b/debian/apparmor.install
+@@ -68,6 +68,7 @@ etc/apparmor.d/sbuild-update
+ etc/apparmor.d/sbuild-upgrade
+ etc/apparmor.d/slirp4netns
+ etc/apparmor.d/stress-ng
++etc/apparmor.d/icedove
+ etc/apparmor.d/thunderbird
+ etc/apparmor.d/toybox
+ etc/apparmor.d/trinity
+@@ -83,7 +84,9 @@ etc/apparmor.d/1password
+ etc/apparmor.d/Discord
+ etc/apparmor.d/MongoDB_Compass
+ etc/apparmor.d/code
++etc/apparmor.d/abrowser
+ etc/apparmor.d/firefox
++etc/apparmor.d/icecat
+ etc/apparmor.d/github-desktop
+ etc/apparmor.d/obsidian
+ etc/apparmor.d/opera
diff --git a/helpers/DATA/apparmor/003-add-extra-profile-for-abrowser-icecat.patch b/helpers/DATA/apparmor/003-add-extra-profile-for-abrowser-icecat.patch
new file mode 100644
index 0000000..d156906
--- /dev/null
+++ b/helpers/DATA/apparmor/003-add-extra-profile-for-abrowser-icecat.patch
@@ -0,0 +1,173 @@
+diff --git a/profiles/apparmor/profiles/extras/icecat b/profiles/apparmor/profiles/extras/icecat
+index cbe1aa80..71813e99 100644
+--- a/profiles/apparmor/profiles/extras/icecat
++++ b/profiles/apparmor/profiles/extras/icecat
+@@ -14,7 +14,7 @@ abi ,
+ include
+
+ # Declare some variables to help with variants
+-@{MOZ_APP_NAME}=firefox{,-esr}
++@{MOZ_APP_NAME}=icecat{,-esr}
+ @{MOZ_LIBDIR}=/usr/lib/@{MOZ_APP_NAME}{,-[0-9]*}
+ @{MOZ_ADDONDIR}=/usr/lib/{@{MOZ_APP_NAME},xulrunner}-addons
+
+@@ -22,7 +22,7 @@ include
+ # /usr/lib/firefox-4.0b8/firefox
+ # but not:
+ # /usr/lib/firefox-4.0b8/firefox.sh
+-profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
++profile icecat @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ include
+ include
+ include
+@@ -144,8 +144,8 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ /etc/wildmidi/wildmidi.cfg r,
+
+ # firefox specific
+- /etc/firefox*/ r,
+- /etc/firefox*/** r,
++ /etc/icecat*/ r,
++ /etc/icecat*/** r,
+ /etc/xul-ext/** r,
+ /etc/xulrunner{,-[0-9]*}/ r,
+ /etc/xulrunner{,-[0-9]*}/** r,
+@@ -234,12 +234,12 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ owner @{HOME}/.thumbnails/*/*.png r,
+
+ # per-user firefox configuration
+- owner @{HOME}/.{firefox,mozilla}/ rw,
+- owner @{HOME}/.{firefox,mozilla}/** rw,
+- owner @{HOME}/.{firefox,mozilla}/**/*.{db,parentlock,sqlite}* k,
+- owner @{HOME}/.{firefox,mozilla}/plugins/** rm,
+- owner @{HOME}/.{firefox,mozilla}/**/plugins/** rm,
+- owner @{HOME}/.gnome2/firefox* rwk,
++ owner @{HOME}/.{icecat,mozilla}/ rw,
++ owner @{HOME}/.{icecat,mozilla}/** rw,
++ owner @{HOME}/.{icecat,mozilla}/**/*.{db,parentlock,sqlite}* k,
++ owner @{HOME}/.{icecat,mozilla}/plugins/** rm,
++ owner @{HOME}/.{icecat,mozilla}/**/plugins/** rm,
++ owner @{HOME}/.gnome2/icecat* rwk,
+ owner @{HOME}/.cache/mozilla/{,@{MOZ_APP_NAME}/} rw,
+ owner @{HOME}/.cache/mozilla/@{MOZ_APP_NAME}/** rw,
+ owner @{HOME}/.cache/mozilla/@{MOZ_APP_NAME}/**/*.sqlite{,-shm} k,
+@@ -440,7 +440,7 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ owner @{HOME}/.mozilla/**/extensions/** mixr,
+
+ # Widevine CDM plugin (LP: #1777070)
+- owner @{HOME}/.mozilla/firefox/*/gmp-widevinecdm/*/libwidevinecdm.so m,
++ owner @{HOME}/.mozilla/icecat/*/gmp-widevinecdm/*/libwidevinecdm.so m,
+
+ deny @{MOZ_LIBDIR}/update.test w,
+ deny /usr/lib/mozilla/extensions/**/ w,
+@@ -458,7 +458,7 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+
+ /usr/bin/lsb_release Pxr -> lsb_release,
+
+- # These should be started outside of Firefox
++ # These should be started outside of icecat
+ deny /usr/bin/dbus-launch x,
+ deny /usr/bin/speech-dispatcher x,
+
+@@ -466,6 +466,6 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ include if exists
+
+ # Site-specific additions and overrides. See local/README for details.
+- include if exists
+- include if exists
++ include if exists
++ include if exists
+ }
+diff --git a/profiles/apparmor/profiles/extras/firefox b/profiles/apparmor/profiles/extras/abrowser
+index cbe1aa80..2fb77651 100644
+--- a/profiles/apparmor/profiles/extras/firefox
++++ b/profiles/apparmor/profiles/extras/abrowser
+@@ -14,7 +14,7 @@ abi ,
+ include
+
+ # Declare some variables to help with variants
+-@{MOZ_APP_NAME}=firefox{,-esr}
++@{MOZ_APP_NAME}=abrowser{,-esr}
+ @{MOZ_LIBDIR}=/usr/lib/@{MOZ_APP_NAME}{,-[0-9]*}
+ @{MOZ_ADDONDIR}=/usr/lib/{@{MOZ_APP_NAME},xulrunner}-addons
+
+@@ -22,7 +22,7 @@ include
+ # /usr/lib/firefox-4.0b8/firefox
+ # but not:
+ # /usr/lib/firefox-4.0b8/firefox.sh
+-profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
++profile abrowser @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ include
+ include
+ include
+@@ -144,8 +144,8 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ /etc/wildmidi/wildmidi.cfg r,
+
+ # firefox specific
+- /etc/firefox*/ r,
+- /etc/firefox*/** r,
++ /etc/abrowser*/ r,
++ /etc/abrowser*/** r,
+ /etc/xul-ext/** r,
+ /etc/xulrunner{,-[0-9]*}/ r,
+ /etc/xulrunner{,-[0-9]*}/** r,
+@@ -234,12 +234,12 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ owner @{HOME}/.thumbnails/*/*.png r,
+
+ # per-user firefox configuration
+- owner @{HOME}/.{firefox,mozilla}/ rw,
+- owner @{HOME}/.{firefox,mozilla}/** rw,
+- owner @{HOME}/.{firefox,mozilla}/**/*.{db,parentlock,sqlite}* k,
+- owner @{HOME}/.{firefox,mozilla}/plugins/** rm,
+- owner @{HOME}/.{firefox,mozilla}/**/plugins/** rm,
+- owner @{HOME}/.gnome2/firefox* rwk,
++ owner @{HOME}/.{abrowser,mozilla}/ rw,
++ owner @{HOME}/.{abrowser,mozilla}/** rw,
++ owner @{HOME}/.{abrowser,mozilla}/**/*.{db,parentlock,sqlite}* k,
++ owner @{HOME}/.{abrowser,mozilla}/plugins/** rm,
++ owner @{HOME}/.{abrowser,mozilla}/**/plugins/** rm,
++ owner @{HOME}/.gnome2/abrowser* rwk,
+ owner @{HOME}/.cache/mozilla/{,@{MOZ_APP_NAME}/} rw,
+ owner @{HOME}/.cache/mozilla/@{MOZ_APP_NAME}/** rw,
+ owner @{HOME}/.cache/mozilla/@{MOZ_APP_NAME}/**/*.sqlite{,-shm} k,
+@@ -440,7 +440,7 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ owner @{HOME}/.mozilla/**/extensions/** mixr,
+
+ # Widevine CDM plugin (LP: #1777070)
+- owner @{HOME}/.mozilla/firefox/*/gmp-widevinecdm/*/libwidevinecdm.so m,
++ owner @{HOME}/.mozilla/abrowser/*/gmp-widevinecdm/*/libwidevinecdm.so m,
+
+ deny @{MOZ_LIBDIR}/update.test w,
+ deny /usr/lib/mozilla/extensions/**/ w,
+@@ -458,7 +458,7 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+
+ /usr/bin/lsb_release Pxr -> lsb_release,
+
+- # These should be started outside of Firefox
++ # These should be started outside of abrowser
+ deny /usr/bin/dbus-launch x,
+ deny /usr/bin/speech-dispatcher x,
+
+@@ -466,6 +466,6 @@ profile firefox @{MOZ_LIBDIR}/@{MOZ_APP_NAME}{,*[^s][^h]} {
+ include if exists
+
+ # Site-specific additions and overrides. See local/README for details.
+- include if exists
+- include if exists
++ include if exists
++ include if exists
+ }
+diff --git a/debian/apparmor-profiles.install b/debian/apparmor-profiles.install
+index 5cecd9dd..62531edb 100644
+--- a/debian/apparmor-profiles.install
++++ b/debian/apparmor-profiles.install
+@@ -88,8 +88,10 @@ usr/share/apparmor/extra-profiles/usr.lib.GConf.2.gconfd-2
+ usr/share/apparmor/extra-profiles/usr.lib.RealPlayer10.realplay
+ usr/share/apparmor/extra-profiles/usr.lib.bonobo.bonobo-activation-server
+ usr/share/apparmor/extra-profiles/usr.lib.evolution-data-server.evolution-data-server-1.10
++usr/share/apparmor/extra-profiles/abrowser
+ usr/share/apparmor/extra-profiles/firefox
+ usr/share/apparmor/extra-profiles/firefox.sh
++usr/share/apparmor/extra-profiles/icecat
+ usr/share/apparmor/extra-profiles/usr.lib.firefox.mozilla-xremote-client
+ usr/share/apparmor/extra-profiles/usr.lib.man-db.man
+ usr/share/apparmor/extra-profiles/postfix-anvil
diff --git a/helpers/DATA/apparmor/004-update-profile-extra-firefox-sh.patch b/helpers/DATA/apparmor/004-update-profile-extra-firefox-sh.patch
new file mode 100644
index 0000000..839d606
--- /dev/null
+++ b/helpers/DATA/apparmor/004-update-profile-extra-firefox-sh.patch
@@ -0,0 +1,46 @@
+diff --git a/profiles/apparmor/profiles/extras/firefox.sh b/profiles/apparmor/profiles/extras/firefox.sh
+index fb75c5b6..7b23cd83 100644
+--- a/profiles/apparmor/profiles/extras/firefox.sh
++++ b/profiles/apparmor/profiles/extras/firefox.sh
+@@ -22,3 +22,41 @@ profile firefox.sh /usr/lib/firefox/firefox.sh {
+ # Site-specific additions and overrides. See local/README for details.
+ include if exists
+ }
++
++profile firefox.sh /usr/lib/abrowser/firefox.sh {
++ include
++ include
++ include
++
++ deny capability sys_ptrace,
++
++ /{usr/,}bin/basename rix,
++ /{usr/,}bin/bash rix,
++ /{usr/,}bin/grep rix,
++ /etc/magic r,
++ /usr/bin/file rix,
++ /usr/lib/abrowser/abrowser px,
++ /usr/share/misc/magic.mgc r,
++
++ # Site-specific additions and overrides. See local/README for details.
++ include if exists
++}
++
++profile firefox.sh /usr/lib/icecat/firefox.sh {
++ include
++ include
++ include
++
++ deny capability sys_ptrace,
++
++ /{usr/,}bin/basename rix,
++ /{usr/,}bin/bash rix,
++ /{usr/,}bin/grep rix,
++ /etc/magic r,
++ /usr/bin/file rix,
++ /usr/lib/icecat/icecat px,
++ /usr/share/misc/magic.mgc r,
++
++ # Site-specific additions and overrides. See local/README for details.
++ include if exists
++}
diff --git a/helpers/DATA/apparmor/005-update_trasnmission_profile_for_daemon_service_fix.patch b/helpers/DATA/apparmor/005-update_trasnmission_profile_for_daemon_service_fix.patch
new file mode 100644
index 0000000..6bb7294
--- /dev/null
+++ b/helpers/DATA/apparmor/005-update_trasnmission_profile_for_daemon_service_fix.patch
@@ -0,0 +1,54 @@
+diff --git a/profiles/apparmor.d/transmission b/profiles/apparmor.d/transmission
+index 6cd67adf..6aa4214a 100644
+--- a/profiles/apparmor.d/transmission
++++ b/profiles/apparmor.d/transmission
+@@ -5,7 +5,7 @@ abi ,
+
+ include
+
+-profile transmission-daemon /usr/bin/transmission-daemon flags=(complain) {
++profile transmission-daemon /usr/bin/transmission-daemon flags=(complain,attach_disconnected) {
+ # Don't use abstractions/transmission-common here, as the
+ # access needed is narrower than the user applications
+ include
+@@ -17,6 +17,8 @@ profile transmission-daemon /usr/bin/transmission-daemon flags=(complain) {
+ network inet stream,
+ network inet6 stream,
+
++ /usr/bin/transmission-daemon mr,
++
+ owner @{PROC}/@{pid}/mounts r,
+ @{PROC}/sys/kernel/random/uuid r,
+
+@@ -42,17 +44,21 @@ profile transmission-cli /usr/bin/transmission-cli flags=(complain) {
+ include
+ include
+
++ /usr/bin/transmission-cli mr,
++
+ # Site-specific additions and overrides. See local/README for details.
+ include if exists
+ include if exists
+ }
+
+-profile transmission-gtk /usr/bin/transmission-gtk flags=(complain) {
++profile transmission-gtk /usr/bin/transmission-gtk flags=(complain,attach_disconnected) {
+ include
+ include
+ include
+ include
+
++ /usr/bin/transmission-gtk mr,
++
+ owner @{run}/user/*/dconf/user w,
+
+ # Site-specific additions and overrides. See local/README for details.
+@@ -70,6 +76,8 @@ profile transmission-qt /usr/bin/transmission-qt flags=(complain) {
+ include
+ include
+
++ /usr/bin/transmission-qt mr,
++
+ # Site-specific additions and overrides. See local/README for details.
+ include if exists
+ include if exists
diff --git a/helpers/DATA/apparmor/b5a7641dd3502fcfb897d3b96e197628b674ce3c.patch b/helpers/DATA/apparmor/b5a7641dd3502fcfb897d3b96e197628b674ce3c.patch
deleted file mode 100644
index 2a2194f..0000000
--- a/helpers/DATA/apparmor/b5a7641dd3502fcfb897d3b96e197628b674ce3c.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From b5a7641dd3502fcfb897d3b96e197628b674ce3c Mon Sep 17 00:00:00 2001
-From: Adrian Heine
-Date: Mon, 23 Jan 2023 20:35:29 +0100
-Subject: [PATCH] Add pipewire client.conf to audio abstractions
-
-Fixes: https://bugs.launchpad.net/bugs/2003702
----
- profiles/apparmor.d/abstractions/audio | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/profiles/apparmor.d/abstractions/audio b/profiles/apparmor.d/abstractions/audio
-index 01493260d..dd783992d 100644
---- a/profiles/apparmor.d/abstractions/audio
-+++ b/profiles/apparmor.d/abstractions/audio
-@@ -85,5 +85,8 @@ owner @{HOME}/.local/share/openal/hrtf/{,**} r,
- # wildmidi
- /etc/wildmidi/wildmidi.cfg r,
-
-+# pipewire
-+/usr/share/pipewire/client.conf r,
-+
- # Include additions to the abstraction
- include if exists
---
-GitLab
-
diff --git a/helpers/DATA/apt-setup/50mirror.trisquel b/helpers/DATA/apt-setup/50mirror.trisquel
new file mode 100755
index 0000000..28d603d
--- /dev/null
+++ b/helpers/DATA/apt-setup/50mirror.trisquel
@@ -0,0 +1,122 @@
+#!/bin/sh
+set -e
+
+. /usr/share/debconf/confmodule
+
+file="$1"
+
+log() {
+ logger -t apt-setup "$@"
+}
+warning() {
+ log "warning: $@"
+}
+
+# Ask if a mirror should be used if the base system can be installed from CD
+if [ -e /cdrom/.disk/base_installable ] || [ "$OVERRIDE_BASE_INSTALLABLE" ]; then
+ if ! search-path choose-mirror; then
+ warning "choose-mirror is not available; cannot offer network mirror"
+ exit 1
+ fi
+
+ # Default to false if no network selected in netcfg
+ if db_get netcfg/dhcp_options && \
+ [ "$RET" = "Do not configure the network at this time" ]; then
+ use_mirror=false
+ fi
+
+ # Set default if no value (see Debian mirror generator)
+ db_get apt-setup/use_mirror
+ [ "$RET" ] || db_set apt-setup/use_mirror true
+
+ # Text is variable for Debian
+ db_metaget apt-mirror/use/netinst_old description
+ db_subst apt-setup/use_mirror EXPLANATION "$RET"
+
+ db_input medium apt-setup/use_mirror || [ $? -eq 30 ]
+ db_go # or exit 10
+
+ db_get apt-setup/use_mirror
+ if [ "$RET" = false ]; then
+ exit 1
+ fi
+
+ if db_get cdrom/codename && [ "$RET" ]; then
+ db_set mirror/codename $RET
+ fi
+ if db_get cdrom/suite && [ "$RET" ]; then
+ db_set mirror/suite $RET
+ fi
+ choose-mirror -n # no progress bar
+fi
+
+db_input low apt-setup/backports || true
+
+dists="main"
+
+db_get mirror/protocol
+protocol="$RET"
+db_get mirror/codename
+codename="$RET"
+db_get mirror/$protocol/hostname
+hostname="$RET"
+db_get mirror/$protocol/directory
+directory="/${RET#/}"
+
+if [ "$protocol" = http ]; then
+ db_get mirror/$protocol/proxy
+ proxy="$RET"
+ if [ -n "$proxy" ]; then
+ if ! grep -iq "Acquire::$protocol::Proxy" $ROOT/etc/apt/apt.conf.new; then
+ echo "Acquire::$protocol::Proxy \"$proxy\";" >> $ROOT/etc/apt/apt.conf.new
+ fi
+ fi
+fi
+
+# Trisquel: Deb822-first, keep legacy clean
+: "${ROOT:=/target}"
+SD="$ROOT/etc/apt/sources.list.d"
+SF="$SD/trisquel.sources"
+mkdir -p "$SD"
+
+# Use keyring in /usr/share/keyrings
+SIGNED_BY="/usr/share/keyrings/trisquel-archive-keyring.gpg"
+
+# Canonical URI for Deb822 (trailing slash)
+uri="$protocol://$hostname$directory"
+case "$uri" in */) : ;; *) uri="$uri/";; esac
+
+# Write Deb822 sources file in the requested structure
+cat << EOF > "$SF"
+# Trisquel repositories for supported software and updates
+Types: deb
+URIs: ${uri}
+Suites: ${codename} ${codename}-updates ${codename}-security
+Components: main
+Signed-By: ${SIGNED_BY}
+
+# Source package repositories
+Types: deb-src
+URIs: ${uri}
+Suites: ${codename} ${codename}-updates ${codename}-security
+Components: main
+Signed-By: ${SIGNED_BY}
+
+# Optional backports repository
+Enabled: no
+Types: deb deb-src
+URIs: ${uri}
+Suites: ${codename}-backports
+Components: main
+Signed-By: ${SIGNED_BY}
+EOF
+
+# Set legacy format for apt-setup to apply updates correctly.
+{
+ echo "deb ${uri} ${codename} main"
+ echo "deb ${uri} ${codename}-updates main"
+ echo "deb ${uri} ${codename}-security main"
+} >> "$file"
+
+exit 0
+
diff --git a/helpers/DATA/apt-setup/93trisquel-sources-clean b/helpers/DATA/apt-setup/93trisquel-sources-clean
new file mode 100755
index 0000000..6dab379
--- /dev/null
+++ b/helpers/DATA/apt-setup/93trisquel-sources-clean
@@ -0,0 +1,11 @@
+#!/bin/sh
+set -e
+
+LEGACY=/target/etc/apt/sources.list
+SD=/target/etc/apt/sources.list.d
+
+if ls "$SD"/*.sources >/dev/null 2>&1; then
+ MSG="# Trisquel sources have moved to /etc/apt/sources.list.d/trisquel.sources"
+ printf '%s\n' "$MSG" > "$LEGACY"
+fi
+exit 0
diff --git a/helpers/DATA/apt-setup/99deb822-breadcrumb b/helpers/DATA/apt-setup/99deb822-breadcrumb
new file mode 100755
index 0000000..efc34c3
--- /dev/null
+++ b/helpers/DATA/apt-setup/99deb822-breadcrumb
@@ -0,0 +1,18 @@
+#!/bin/sh
+set -e
+. /usr/share/debconf/confmodule
+
+file="$1"
+ROOT="${ROOT:-/target}"
+LEGACY="$ROOT/etc/apt/sources.list"
+SD="$ROOT/etc/apt/sources.list.d"
+SAVETO="$ROOT/etc/apt/sources.list.new"
+
+# If .sources exist, leave sources.list reduced only as a breadcrumb
+if ls "$SD"/*.sources >/dev/null 2>&1; then
+ MSG="# Trisquel sources have moved to /etc/apt/sources.list.d/trisquel.sources"
+ : > "$SAVETO"
+ printf '%s\n' "$MSG" > "$file"
+fi
+
+exit 0
diff --git a/helpers/DATA/apt-setup/patch_changes/001-remove_non-free_firmware_contrib_mirror_setup.patch b/helpers/DATA/apt-setup/patch_changes/001-remove_non-free_firmware_contrib_mirror_setup.patch
new file mode 100644
index 0000000..7278679
--- /dev/null
+++ b/helpers/DATA/apt-setup/patch_changes/001-remove_non-free_firmware_contrib_mirror_setup.patch
@@ -0,0 +1,50 @@
+diff --git a/debian/apt-mirror-setup.templates b/debian/apt-mirror-setup.templates
+index 85baf176..6b330b32 100644
+--- a/debian/apt-mirror-setup.templates
++++ b/debian/apt-mirror-setup.templates
+@@ -3,45 +3,7 @@ Type: text
+ # :sl1:
+ _Description: Scanning the mirror...
+
+-Template: apt-setup/non-free-firmware
+-Type: boolean
+-Default: false
+-# :sl5:
+-_Description: Use non-free firmware?
+- Firmware is a kind of software providing low-level control of certain
+- hardware components (such as Wi-Fi cards or audio chipsets), which may not
+- function fully or at all without it.
+- .
+- Although not at all part of Debian, some non-free firmware has been made to
+- work with Debian. This firmware has varying licenses which restrict your
+- freedoms to use, modify, or share the software, and generally does not have
+- source forms that you may study.
+- .
+- Please choose whether you want to have it available anyway.
+
+-Template: apt-setup/non-free
+-Type: boolean
+-Default: false
+-# :sl1:
+-_Description: Use non-free software?
+- Some non-free software has been made to work with Debian. Though this
+- software is not at all a part of Debian, standard Debian tools can be used
+- to install it. This software has varying licenses which may prevent you
+- from using, modifying, or sharing it.
+- .
+- Please choose whether you want to have it available anyway.
+-
+-Template: apt-setup/contrib
+-Type: boolean
+-Default: false
+-# :sl1:
+-_Description: Use contrib software?
+- Some additional software has been made to work with Debian. Though this
+- software is free, it depends on non-free software for its operation. This
+- software is not a part of Debian, but standard Debian tools can be
+- used to install it.
+- .
+- Please choose whether you want this software to be made available to you.
+
+ Template: apt-setup/mirror/error
+ Type: select
diff --git a/helpers/DATA/apt/trisquel/apt-vendor.ent b/helpers/DATA/apt/trisquel/apt-vendor.ent
index c443816..e61a665 100644
--- a/helpers/DATA/apt/trisquel/apt-vendor.ent
+++ b/helpers/DATA/apt/trisquel/apt-vendor.ent
@@ -6,15 +6,11 @@
-
+
+Signed-By: /usr/share/keyrings/trisquel-archive-keyring.gpg">
diff --git a/helpers/DATA/apt/trisquel/sources.list.in b/helpers/DATA/apt/trisquel/sources.list.in
deleted file mode 100644
index 9c530ba..0000000
--- a/helpers/DATA/apt/trisquel/sources.list.in
+++ /dev/null
@@ -1,10 +0,0 @@
-# See sources.list(5) manpage for more information
-# Remember that CD-ROMs, DVDs and such are managed through the apt-cdrom tool.
-deb http://archive.trisquel.org/trisquel &trisquel-codename; main
-deb-src http://archive.trisquel.org/trisquel &trisquel-codename; main
-
-deb http://archive.trisquel.org/trisquel &trisquel-codename;-security main
-deb-src http://archive.trisquel.org/trisquel &trisquel-codename;-security main
-
-deb http://archive.trisquel.org/trisquel &trisquel-codename;-updates main
-deb-src http://archive.trisquel.org/trisquel &trisquel-codename;-updates main
diff --git a/helpers/DATA/apt/trisquel/trisquel.sources.in b/helpers/DATA/apt/trisquel/trisquel.sources.in
new file mode 100644
index 0000000..32f8209
--- /dev/null
+++ b/helpers/DATA/apt/trisquel/trisquel.sources.in
@@ -0,0 +1,40 @@
+## Trisquel distribution repository
+##
+## The following settings can be adjusted to configure which packages to use from Trisquel.
+## Mirror your choices (except for URIs and Suites) in the security section below to
+## ensure timely security updates.
+##
+## Types: Append deb-src to enable the fetching of source package.
+## URIs: A URL to the repository (you may add multiple URLs)
+## Suites: The following additional suites can be configured
+## -updates - Major bug fix updates produced after the final release of the
+## distribution.
+## -backports - software from this repository may not have been tested as
+## extensively as that contained in the main release, although it includes
+## newer versions of some applications which may provide useful features.
+## Also, please note that software in backports WILL NOT receive any review
+## or updates from the Trisquel security team.
+##
+## See the sources.list(5) manual page for further settings.
+
+# Trisquel repositories for supported software and updates
+Types: deb
+URIs: http://archive.trisquel.org/trisquel/
+Suites: &trisquel-codename; &trisquel-codename;-updates &trisquel-codename;-security
+Components: main
+Signed-By: /usr/share/keyrings/trisquel-archive-keyring.gpg
+
+# Uncomment to enable source package repositories
+Types: deb-src
+URIs: http://archive.trisquel.org/trisquel/
+Suites: &trisquel-codename; &trisquel-codename;-updates &trisquel-codename;-security
+Components: main
+Signed-By: /usr/share/keyrings/trisquel-archive-keyring.gpg
+
+# Uncomment to enable optional backports repository
+Enabled: no
+Types: deb deb-src
+URIs: http://archive.trisquel.org/trisquel/
+Suites: &trisquel-codename;-backports
+Components: main
+Signed-By: /usr/share/keyrings/trisquel-archive-keyring.gpg
diff --git a/helpers/DATA/asunder/asunder_2.9.5-acc.patch b/helpers/DATA/asunder/asunder_2.9.5-acc.patch
index 8b8a1f6..d75eba4 100644
--- a/helpers/DATA/asunder/asunder_2.9.5-acc.patch
+++ b/helpers/DATA/asunder/asunder_2.9.5-acc.patch
@@ -171,11 +171,10 @@ diff -ruN a/src/interface.h b/src/interface.h
diff -ruN a/src/prefs.c b/src/prefs.c
--- a/src/prefs.c 2019-08-29 00:18:58.000000000 -0500
+++ b/src/prefs.c 2021-06-27 16:07:27.299217038 -0500
-@@ -127,8 +127,6 @@
+@@ -127,7 +127,6 @@
p->wavpack_bitrate = 3;
p->rip_monkey = 0;
p->monkey_compression = 2;
-- p->rip_aac = 0;
- p->aac_quality = 60;
p->rip_musepack = 0;
p->musepack_bitrate = 2;
diff --git a/helpers/DATA/atril/apparmor-profile b/helpers/DATA/atril/apparmor-profile
new file mode 100644
index 0000000..6cbe53e
--- /dev/null
+++ b/helpers/DATA/atril/apparmor-profile
@@ -0,0 +1,350 @@
+# vim:syntax=apparmor
+
+# evince is not written with application confinement in mind and is designed to
+# operate within a trusted desktop session where anything running within the
+# user's session is trusted. That said, evince will often process untrusted
+# input (PDFs, images, etc). Ideally evince would be written in such a way that
+# image processing is separate from the main process and that processing
+# happens in a restrictive sandbox, but unfortunately that is not currently the
+# case. Because evince will process untrusted input, this profile aims to
+# provide some hardening, but considering evince's design and other factors such
+# as X, gsettings, accessibility, translations, DBus session and system
+# services, etc, complete confinement is not possible.
+
+#include
+
+/usr/bin/atril {
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ # allow atril to spawn browsers distributed as snaps (LP: #1794064)
+ #include
+
+ # For now, let atril talk to any session services over dbus. We can
+ # blacklist any problematic ones (but note, evince uses libsecret :\)
+ #include
+
+ #include
+ dbus (receive) bus=system,
+ # Allow getting information from various system services
+ dbus (send)
+ bus=system
+ member="Get*"
+ peer=(label=unconfined),
+ # Allow talking to avahi with whatever polkit allows
+ dbus (send)
+ bus=system
+ interface="org.freedesktop.Avahi{,.*}",
+ # Allow talking to colord with whatever polkit allows
+ dbus (send)
+ bus=system
+ interface="org.freedesktop.ColorManager{,.*}",
+
+ # Terminals for using console applications. These abstractions should ideally
+ # have 'ix' to restrict access to what only atril is allowed to do
+ #include
+
+ # By default, we won't support launching a terminal program in Xterm or
+ # KDE's konsole. It opens up too many unnecessary files for most users.
+ # People who need this functionality can uncomment the following:
+ ##include
+ ##include
+
+ /usr/bin/atril rmPx,
+ /usr/bin/atril-previewer Px,
+ /usr/bin/yelp Cx -> sanitized_helper,
+ /usr/bin/bug-buddy px,
+ # 'Show Containing Folder' (LP: #1022962)
+ /usr/bin/nautilus Cx -> sanitized_helper, # Gnome
+ /usr/bin/pcmanfm Cx -> sanitized_helper, # LXDE
+ /usr/bin/krusader Cx -> sanitized_helper, # KDE
+ /usr/bin/thunar Cx -> sanitized_helper, # XFCE
+
+ # Print Dialog
+ /usr/lib/@{multiarch}/libproxy/*/pxgsettings Cx -> sanitized_helper,
+
+ # For Xubuntu to launch the browser
+ #include
+
+ # For text attachments
+ /usr/bin/gedit ixr,
+
+ # For Send to
+ /usr/bin/nautilus-sendto Cx -> sanitized_helper,
+
+ # GLib desktop launch helper (used under the hood by g_app_info_launch)
+ /usr/lib/@{multiarch}/glib-[0-9]*/gio-launch-desktop rmix,
+ /usr/bin/env ixr,
+
+ # allow directory listings (ie 'r' on directories) so browsing via the file
+ # dialog works
+ / r,
+ /**/ r,
+
+ # This is need for saving files in your home directory without an extension.
+ # Changing this to '@{HOME}/** r' makes it require an extension and more
+ # secure (but with 'rw', we still have abstractions/private-files-strict in
+ # effect).
+ owner @{HOME}/** rw,
+ owner /media/** rw,
+ owner @{HOME}/.local/share/gvfs-metadata/** l,
+ owner /{,var/}run/user/*/gvfs-metadata/** l,
+
+ # Maybe add to an abstraction?
+ /etc/dconf/** r,
+ owner @{HOME}/.cache/dconf/user rw,
+ owner @{HOME}/.config/dconf/user r,
+ owner @{HOME}/.config/enchant/* rk,
+ owner /{,var/}run/user/*/dconf/ w,
+ owner /{,var/}run/user/*/dconf/user rw,
+ owner /{,var/}run/user/*/dconf-service/keyfile/ w,
+ owner /{,var/}run/user/*/dconf-service/keyfile/user rw,
+
+ owner /{,var/}run/user/*/at-spi2-*/ rw,
+ owner /{,var/}run/user/*/at-spi2-*/** rw,
+
+ # Allow access to the non-abstract D-Bus socket used by at-spi > 2.42.0
+ # https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/43
+ owner /{,var/}run/user/*/at-spi/bus* rw,
+
+ # from http://live.gnome.org/Evince/SupportedDocumentFormats. Allow
+ # read and write for all supported file formats
+ /**.[aA][iI] rw,
+ /**.[bB][mM][pP] rw,
+ /**.[dD][jJ][vV][uU] rw,
+ /**.[dD][vV][iI] rw,
+ /**.[gG][iI][fF] rw,
+ /**.[jJ][pP][gG] rw,
+ /**.[jJ][pP][eE][gG] rw,
+ /**.[oO][dD][pP] rw,
+ /**.[fFpP][dD][fF] rw,
+ /**.[pP][nN][mM] rw,
+ /**.[pP][nN][gG] rw,
+ /**.[pP][sS] rw,
+ /**.[eE][pP][sS] rw,
+ /**.[tT][iI][fF] rw,
+ /**.[tT][iI][fF][fF] rw,
+ /**.[xX][pP][mM] rw,
+ /**.[gG][zZ] rw,
+ /**.[bB][zZ]2 rw,
+ /**.[cC][bB][rRzZ7] rw,
+ /**.[xX][zZ] rw,
+
+ # atril creates a temporary stream file like '.goutputstream-XXXXXX' in the
+ # directory a file is saved. This allows that behavior.
+ owner /**/.goutputstream-* w,
+
+ # allow atril to spawn browsers distributed as snaps (LP: #1794064)
+ /{,snap/core/[0-9]*/,snap/snapd/[0-9]*/}usr/bin/snap mrCx -> snap_browsers,
+}
+
+/usr/bin/atril-previewer {
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ # For now, let atril talk to any session services over dbus. We can
+ # blacklist any problematic ones (but note, evince uses libsecret :\)
+ #include
+
+ #include
+ dbus (receive) bus=system,
+ # Allow getting information from various system services
+ dbus (send)
+ bus=system
+ member="Get*"
+ peer=(label=unconfined),
+ # Allow talking to avahi with whatever polkit allows
+ dbus (send)
+ bus=system
+ interface="org.freedesktop.Avahi{,.*}",
+ # Allow talking to colord with whatever polkit allows
+ dbus (send)
+ bus=system
+ interface="org.freedesktop.ColorManager{,.*}",
+
+
+ # Terminals for using console applications. These abstractions should ideally
+ # have 'ix' to restrict access to what only atril is allowed to do
+ #include
+
+ # By default, we won't support launching a terminal program in Xterm or
+ # KDE's konsole. It opens up too many unnecessary files for most users.
+ # People who need this functionality can uncomment the following:
+ ##include
+
+ /usr/bin/atril-previewer mr,
+ /usr/bin/yelp Cx -> sanitized_helper,
+ /usr/bin/bug-buddy px,
+
+ # Lenient, but remember we still have abstractions/private-files-strict in
+ # effect). Write is needed for 'print to file' from the previewer.
+ @{HOME}/ r,
+ @{HOME}/** rw,
+
+ # Maybe add to an abstraction?
+ owner /{,var/}run/user/*/dconf/ w,
+ owner /{,var/}run/user/*/dconf/user rw,
+}
+
+/usr/bin/atril-thumbnailer {
+ #include
+ #include
+
+ #include
+ deny @{HOME}/.{,cache/}fontconfig/** wl,
+ deny @{HOME}/missfont.log wl,
+
+ #include
+ dbus (receive) bus=session,
+ dbus (send)
+ bus=session
+ path="/org/gtk/vfs/mounttracker"
+ interface="org.gtk.vfs.MountTracker"
+ member="ListMountableInfo"
+ peer=(label=unconfined),
+
+ # updating gvfs-metadata for thumbnails is unneeded, so explicitly deny it
+ deny dbus (send)
+ bus=session
+ path="/org/gtk/vfs/metadata"
+ interface="org.gtk.vfs.Metadata"
+ member="GetTreeFromDevice"
+ peer=(label=unconfined),
+ deny @{HOME}/.local/share/gvfs-metadata/* r,
+
+ dbus (send)
+ bus=session
+ path="/org/gtk/vfs/Daemon"
+ interface="org.gtk.vfs.Daemon"
+ member="List*"
+ peer=(label=unconfined),
+
+ # The thumbnailer doesn't need access to everything in the nameservice
+ # abstraction. Allow reading of /etc/passwd and /etc/group, but suppress
+ # logging denial of nsswitch.conf.
+ /etc/passwd r,
+ /etc/group r,
+ deny /etc/nsswitch.conf r,
+
+ # TCP/UDP network access for NFS
+ network inet stream,
+ network inet6 stream,
+ network inet dgram,
+ network inet6 dgram,
+
+ /etc/papersize r,
+
+ /usr/bin/atril-thumbnailer mr,
+
+ /etc/texmf/ r,
+ /etc/texmf/** r,
+ /etc/xpdf/* r,
+
+ /usr/bin/gs-esp ixr,
+ # Silence these denials since 'no new privs' drops transitions to
+ # sanitized_helper, we don't want all those perms in the thumbnailer
+ # and the thumbnailer generates thumbnails without these just fine.
+ deny /usr/bin/mktexpk x,
+ deny /usr/bin/mktextfm x,
+ deny /usr/bin/dvipdfm x,
+ deny /usr/bin/dvipdfmx x,
+ deny /usr/bin/mkofm x,
+
+ # supported archivers
+ /{usr/,}bin/gzip ixr,
+ /{usr/,}bin/bzip2 ixr,
+ /usr/bin/unrar* ixr,
+ /usr/bin/unzip ixr,
+ /usr/bin/7zr ixr,
+ /usr/lib/p7zip/7zr ixr,
+ /usr/bin/7za ixr,
+ /usr/lib/p7zip/7za ixr,
+ /usr/bin/zipnote ixr,
+ /{usr/,}bin/tar ixr,
+ /usr/bin/xz ixr,
+
+ # miscellaneous access for the above
+ owner @{PROC}/@{pid}/fd/ r,
+ owner @{PROC}/@{pid}/mountinfo r,
+ /sys/devices/system/cpu/ r,
+
+ # allow read access to anything in /usr/share, for plugins and input methods
+ /usr/local/share/** r,
+ /usr/share/** r,
+ /usr/lib/ghostscript/** mr,
+ /var/lib/ghostscript/** r,
+ /var/lib/texmf/** r,
+
+ # from http://live.gnome.org/Evince/SupportedDocumentFormats. Allow
+ # read for all supported file formats
+ /**.[bB][mM][pP] r,
+ /**.[dD][jJ][vV][uU] r,
+ /**.[dD][vV][iI] r,
+ /**.[gG][iI][fF] r,
+ /**.[jJ][pP][gG] r,
+ /**.[jJ][pP][eE][gG] r,
+ /**.[oO][dD][pP] r,
+ /**.[fFpP][dD][fF] r,
+ /**.[pP][nN][mM] r,
+ /**.[pP][nN][gG] r,
+ /**.[pP][sS] r,
+ /**.[eE][pP][sS] r,
+ /**.[eE][pP][sS][fFiI23] r,
+ /**.[tT][iI][fF] r,
+ /**.[tT][iI][fF][fF] r,
+ /**.[xX][pP][mM] r,
+ /**.[gG][zZ] r,
+ /**.[bB][zZ]2 r,
+ /**.[cC][bB][rRzZ7] r,
+ /**.[xX][zZ] r,
+
+ owner @{HOME}/.texlive*/** r,
+ owner @{HOME}/.texmf*/** r,
+ owner @{HOME}/.local/share/{,flatpak/exports/share/}mime/** r,
+ owner @{HOME}/.local/share/{,flatpak/exports/share/}mime/** r,
+
+ # With the network rules above, this allows data exfiltration for files
+ # not covered by private-files-strict.
+ @{HOME}/ r,
+ owner @{HOME}/[^.]** r,
+ owner /media/** r,
+
+ owner /tmp/.gnome_desktop_thumbnail* w,
+ owner /tmp/gnome-desktop-* rw,
+ owner /tmp/atril-thumbnailer*/{,**} rw,
+
+ # these happen post pivot_root
+ / r,
+ deny /missfont.log w,
+
+ # Add apparmor rule for mate's caja - LP#1798091
+ owner /tmp/.mate_desktop_thumbnail* w,
+ owner /tmp/mate-desktop-thumbnailer* w,
+
+ # Fix thumbnail issue #915024
+ owner @{HOME}/.cache/thumbnails/** rw,
+ owner /tmp/atril-thumbnailer* rw,
+
+}
diff --git a/helpers/DATA/atril/apparmor-profile.abstraction b/helpers/DATA/atril/apparmor-profile.abstraction
new file mode 100644
index 0000000..d2b8858
--- /dev/null
+++ b/helpers/DATA/atril/apparmor-profile.abstraction
@@ -0,0 +1,127 @@
+# vim:syntax=apparmor
+#
+# abstraction used by atril binaries
+#
+
+ #include
+ #include
+ #include
+
+ @{PROC}/[0-9]*/fd/ r,
+ @{PROC}/[0-9]*/mountinfo r,
+ owner @{PROC}/[0-9]*/auxv r,
+ owner @{PROC}/[0-9]*/status r,
+
+ # Doesn't seem to be required, but noisy. Maybe allow 'r' for 'b*' if needed.
+ # Possibly move to an abstraction if anything else needs it.
+ deny /run/udev/data/** r,
+
+ # move out to the gnome abstraction if anyone else needs these
+ /etc/udev/udev.conf r,
+ /sys/devices/**/block/**/uevent r,
+
+ # apport
+ /etc/default/apport r,
+
+ # XFCE
+ /etc/xfce4/defaults.list r,
+
+ # Lubuntu
+ /etc/xdg/lubuntu/applications/defaults.list r,
+
+ # atril specific
+ /etc/ r,
+ /etc/fstab r,
+ /etc/texmf/ r,
+ /etc/texmf/** r,
+ /etc/xpdf/* r,
+ owner @{HOME}/.config/atril/ rw,
+ owner @{HOME}/.config/atril/** rwkl,
+
+ /usr/bin/gs-esp ixr,
+ /usr/bin/mktexpk Cx -> sanitized_helper,
+ /usr/bin/mktextfm Cx -> sanitized_helper,
+ /usr/bin/dvipdfm Cx -> sanitized_helper,
+ /usr/bin/dvipdfmx Cx -> sanitized_helper,
+
+ # gio-launch-desktop was replaced by a very small shell script
+ /{usr/,}bin/{dash,bash} ixr,
+
+ # supported archivers
+ /{usr/,}bin/gzip ixr,
+ /{usr/,}bin/bzip2 ixr,
+ /usr/bin/unrar* ixr,
+ /usr/bin/unzip ixr,
+ /usr/bin/7zr ixr,
+ /usr/lib/p7zip/7zr ixr,
+ /usr/bin/7za ixr,
+ /usr/lib/p7zip/7za ixr,
+ /usr/bin/zipnote ixr,
+ /{usr/,}bin/tar ixr,
+ /usr/bin/xz ixr,
+
+ # allow read access to anything in /usr/share, for plugins and input methods
+ /usr/local/share/** r,
+ /usr/share/** r,
+ /usr/lib/ghostscript/** mr,
+ /var/lib/ghostscript/** r,
+ /var/lib/texmf/{,**} r,
+
+ # from http://live.gnome.org/Evince/SupportedDocumentFormats. Allow
+ # read for all supported file formats
+ /**.[aA][iI] r,
+ /**.[bB][mM][pP] r,
+ /**.[dD][jJ][vV][uU] r,
+ /**.[dD][vV][iI] r,
+ /**.[gG][iI][fF] r,
+ /**.[jJ][pP][gG] r,
+ /**.[jJ][pP][eE][gG] r,
+ /**.[oO][dD][pP] r,
+ /**.[fFpP][dD][fF] r,
+ /**.[pP][nN][mM] r,
+ /**.[pP][nN][gG] r,
+ /**.[pP][sS] r,
+ /**.[eE][pP][sS] r,
+ /**.[eE][pP][sS][fFiI23] r,
+ /**.[tT][iI][fF] r,
+ /**.[tT][iI][fF][fF] r,
+ /**.[xX][pP][mM] r,
+ /**.[gG][zZ] r,
+ /**.[bB][zZ]2 r,
+ /**.[cC][bB][rRzZ7] r,
+ /**.[xX][zZ] r,
+
+ # Use abstractions/private-files instead of abstractions/private-files-strict
+ # and add the sensitive files manually to work around LP: #451422. The goal
+ # is to disallow access to the .mozilla folder in general, but to allow
+ # access to the Cache directory, which the browser may tell atril to open
+ # from directly.
+
+ #include
+ audit deny @{HOME}/.gnupg/{,**} mrwkl,
+ audit deny @{HOME}/.ssh/{,**} mrwkl,
+ audit deny @{HOME}/.gnome2_private/{,**} mrwkl,
+ audit deny @{HOME}/.gnome2/ w,
+ audit deny @{HOME}/.gnome2/keyrings/{,**} mrwkl,
+ audit deny @{HOME}/.kde/{,share/,share/apps/} w,
+ audit deny @{HOME}/.kde/share/apps/kwallet/{,**} mrwkl,
+ audit deny @{HOME}/.pki/{,nssdb/} w,
+ audit deny @{HOME}/.pki/nssdb/{,**} wl,
+
+ audit deny @{HOME}/.mozilla/{,**/} w,
+ audit deny @{HOME}/.mozilla/*/*/* mrwkl,
+ audit deny @{HOME}/.mozilla/**/bookmarkbackups/{,**} mrwkl,
+ audit deny @{HOME}/.mozilla/**/chrome/{,**} mrwkl,
+ audit deny @{HOME}/.mozilla/**/extensions/{,**} mrwkl,
+ audit deny @{HOME}/.mozilla/**/gm_scripts/{,**} mrwkl,
+
+ audit deny @{HOME}/.config/ w,
+ audit deny @{HOME}/.config/chromium/{,**} mrwkl,
+ audit deny @{HOME}/.config/evolution/{,**} mrwkl,
+ audit deny @{HOME}/.evolution/{,**} mrwkl,
+ audit deny @{HOME}/.kde/{,share/,share/apps/} w,
+ audit deny @{HOME}/.kde/share/config/{,**} mrwkl,
+ audit deny @{HOME}/.kde/share/apps/kmail/{,**} mrwkl,
+ audit deny @{HOME}/.{,mozilla-}thunderbird/{,**/} w,
+ audit deny @{HOME}/.{,mozilla-}thunderbird/*/* mrwkl,
+ audit deny @{HOME}/.{,mozilla-}thunderbird/*/[^C][^a][^c][^h][^e]*/{,**} mrwkl,
diff --git a/helpers/DATA/atril/atril.apport b/helpers/DATA/atril/atril.apport
new file mode 100644
index 0000000..2ef92e2
--- /dev/null
+++ b/helpers/DATA/atril/atril.apport
@@ -0,0 +1,21 @@
+'''apport package hook for atril
+
+(c) 2024 Luis Guzmán
+Author:
+Luis Guzmán
+based on evince's hook
+
+'''
+
+from apport.hookutils import *
+from os import path
+import re
+
+def add_info(report):
+ attach_conffiles(report, 'atril')
+ attach_related_packages(report, ['apparmor', 'libapparmor1',
+ 'libapparmor-perl', 'apparmor-utils', 'auditd', 'libaudit1'])
+
+ attach_mac_events(report, ['/usr/bin/atril',
+ '/usr/bin/atril-previewer',
+ '/usr/bin/atril-thumbnailer'])
diff --git a/helpers/DATA/atril/patches/add_install_profiles_rules.patch b/helpers/DATA/atril/patches/add_install_profiles_rules.patch
new file mode 100644
index 0000000..60745dd
--- /dev/null
+++ b/helpers/DATA/atril/patches/add_install_profiles_rules.patch
@@ -0,0 +1,29 @@
+diff --git a/debian/rules b/debian/rules
+old mode 100755
+new mode 100644
+index 8a7ff87..655c574
+--- a/debian/rules
++++ b/debian/rules
+@@ -52,3 +52,9 @@ override_dh_auto_configure:
+
+ get-orig-source:
+ uscan --noconf --force-download --rename --download-current-version --destdir=..
++
++execute_after_dh_install:
++ install -m 0644 -D debian/apparmor-profile debian/atril/etc/apparmor.d/usr.bin.atril
++ install -m 0644 -D debian/apparmor-profile.abstraction debian/atril/etc/apparmor.d/abstractions/atril
++ install -m 0644 -D debian/atril.apport debian/atril/usr/share/apport/package-hooks/source_atril.py
++ dh_apparmor --profile-name=usr.bin.atril -patril
+
+diff --git a/debian/control b/debian/control
+index f5bda53..6d72cc9 100644
+--- a/debian/control
++++ b/debian/control
+@@ -9,6 +9,7 @@ Uploaders: Mike Gabriel ,
+ Vangelis Mouhtsis ,
+ Martin Wimpress ,
+ Build-Depends: debhelper-compat (= 13),
++ dh-apparmor,
+ dpkg-dev (>= 1.16.1.1),
+ gobject-introspection,
+ intltool,
diff --git a/helpers/DATA/ayatana-indicator-sound/fix_volume_change_notification.patch b/helpers/DATA/ayatana-indicator-sound/fix_volume_change_notification.patch
deleted file mode 100644
index 92b6259..0000000
--- a/helpers/DATA/ayatana-indicator-sound/fix_volume_change_notification.patch
+++ /dev/null
@@ -1,214 +0,0 @@
-Patch based on https://github.com/AyatanaIndicators/ayatana-indicator-sound/pull/92
-For Trisquel 11.0, Aramo - ayatana-indicator-sound - 22.2.0-2
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index ac370b2..095c953 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,5 +1,5 @@
--project(ayatana-indicator-sound C CXX)
--cmake_minimum_required(VERSION 3.13)
-+cmake_minimum_required (VERSION 3.13)
-+project (ayatana-indicator-sound VERSION 22.2.0 LANGUAGES C CXX)
-
- if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
- SET(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "..." FORCE)
-@@ -7,8 +7,6 @@ endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
-
- set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")
-
--set(PACKAGE ${CMAKE_PROJECT_NAME})
--set(PROJECT_VERSION 22.2.0)
- find_package(PkgConfig REQUIRED)
- include(GNUInstallDirs)
- include(UseVala)
-diff --git a/src/info-notification.vala b/src/info-notification.vala
-index ce92a2a..3a36e52 100644
---- a/src/info-notification.vala
-+++ b/src/info-notification.vala
-@@ -1,6 +1,6 @@
- /*
- * Copyright 2015 Canonical Ltd.
-- * Copyright 2021 Robert Tari
-+ * Copyright 2021-2023 Robert Tari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
-@@ -30,22 +30,26 @@ public class IndicatorSound.InfoNotification: Notification
- public void show (VolumeControl.ActiveOutput active_output,
- double volume,
- bool is_high_volume) {
-- if (!notify_server_supports ("x-canonical-private-synchronous"))
-- return;
-
- /* Determine Label */
-- unowned string volume_label = get_notification_label (active_output);
-+ string volume_label = get_notification_label (active_output);
-
- /* Choose an icon */
- unowned string icon = get_volume_notification_icon (active_output, volume, is_high_volume);
-
- /* Reset the notification */
- var n = _notification;
-+
-+ uint nChars = ((int32)((volume * 20) + 0.5)).clamp(0, 20);
-+ volume_label += "\n";
-+
-+ for (uint nChar = 0; nChar < nChars; nChar++)
-+ {
-+ volume_label += "◼";
-+ }
-+
- n.update (_("Volume"), volume_label, icon);
- n.clear_hints();
-- n.set_hint ("x-lomiri-non-shaped-icon", "true");
-- n.set_hint ("x-canonical-private-synchronous", "true");
-- n.set_hint ("x-lomiri-value-bar-tint", is_high_volume ? "true" : "false");
- n.set_hint ("value", ((int32)((volume * 100.0) + 0.5)).clamp(0, 100));
- show_notification ();
- }
-diff --git a/src/warn-notification.vala b/src/warn-notification.vala
-index 6a08431..203758e 100644
---- a/src/warn-notification.vala
-+++ b/src/warn-notification.vala
-@@ -1,5 +1,6 @@
- /*
- * Copyright 2015 Canonical Ltd.
-+ * Copyright 2021-2023 Robert Tari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
-@@ -15,6 +16,7 @@
- *
- * Authors:
- * Charles Kerr
-+ * Robert Tari
- */
-
- public class IndicatorSound.WarnNotification: Notification
-@@ -31,9 +33,6 @@ public class IndicatorSound.WarnNotification: Notification
- _("Volume"),
- _("Allow volume above safe level?\nHigh volume can damage your hearing."),
- "audio-volume-high");
-- n.set_hint ("x-lomiri-non-shaped-icon", "true");
-- n.set_hint ("x-lomiri-snap-decisions", "true");
-- n.set_hint ("x-lomiri-private-affirmative-tint", "true");
- n.closed.connect ((n) => {
- n.clear_actions ();
- });
-diff --git a/tests/integration/indicator-sound-test-base.cpp b/tests/integration/indicator-sound-test-base.cpp
-index 3ecd856..eb4ee8c 100644
---- a/tests/integration/indicator-sound-test-base.cpp
-+++ b/tests/integration/indicator-sound-test-base.cpp
-@@ -1,6 +1,6 @@
- /*
- * Copyright 2015 Canonical Ltd.
-- * Copyright 2021 Robert Tari
-+ * Copyright 2021-2023 Robert Tari
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as published
-@@ -72,7 +72,7 @@ void IndicatorSoundTestBase::SetUp()
- "GetCapabilities",
- "",
- "as",
-- "ret = ['actions', 'body', 'body-markup', 'icon-static', 'image/svg+xml', 'x-canonical-private-synchronous', 'x-canonical-append', 'x-canonical-private-icon-only', 'x-canonical-truncation', 'private-synchronous', 'append', 'private-icon-only', 'truncation']"
-+ "ret = ['actions', 'body', 'body-markup', 'icon-static', 'image/svg+xml', 'private-synchronous', 'append', 'private-icon-only', 'truncation']"
- ).waitForFinished();
-
- int waitedTime = 0;
-@@ -647,14 +647,8 @@ void IndicatorSoundTestBase::checkVolumeNotification(double volume, QString cons
- QVariantMap hints;
- ASSERT_TRUE(qDBusArgumentToMap(args.at(6), hints));
- ASSERT_TRUE(hints.contains("value"));
-- ASSERT_TRUE(hints.contains("x-lomiri-non-shaped-icon"));
-- ASSERT_TRUE(hints.contains("x-lomiri-value-bar-tint"));
-- ASSERT_TRUE(hints.contains("x-canonical-private-synchronous"));
-
- EXPECT_EQ(volume*100, hints["value"]);
-- EXPECT_EQ(true, hints["x-lomiri-non-shaped-icon"]);
-- EXPECT_EQ(isLoud, hints["x-lomiri-value-bar-tint"]);
-- EXPECT_EQ(true, hints["x-canonical-private-synchronous"]);
- }
-
- void IndicatorSoundTestBase::checkHighVolumeNotification(QVariantList call)
-diff --git a/tests/notifications-mock.h b/tests/notifications-mock.h
-index 49b2e66..3ae8da5 100644
---- a/tests/notifications-mock.h
-+++ b/tests/notifications-mock.h
-@@ -1,6 +1,6 @@
- /*
- * Copyright 2015 Canonical Ltd.
-- * Copyright 2021 Robert Tari
-+ * Copyright 2021-2023 Robert Tari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
-@@ -31,7 +31,7 @@ class NotificationsMock
- DbusTestDbusMockObject * baseobj = nullptr;
-
- public:
-- NotificationsMock (const std::vector& capabilities = {"actions", "body", "body-markup", "icon-static", "image/svg+xml", "x-canonical-private-synchronous", "x-canonical-append", "x-canonical-private-icon-only", "x-canonical-truncation", "private-synchronous", "append", "private-icon-only", "truncation"}) {
-+ NotificationsMock (const std::vector& capabilities = {"actions", "body", "body-markup", "icon-static", "image/svg+xml", "private-synchronous", "append", "private-icon-only", "truncation"}) {
- mock = dbus_test_dbus_mock_new("org.freedesktop.Notifications");
- dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION);
- dbus_test_task_set_name(DBUS_TEST_TASK(mock), "Notify");
-diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc
-index a9fa55d..92f4672 100644
---- a/tests/notifications-test.cc
-+++ b/tests/notifications-test.cc
-@@ -1,6 +1,6 @@
- /*
- * Copyright 2015-2016 Canonical Ltd.
-- * Copyright 2021 Robert Tari
-+ * Copyright 2021-2023 Robert Tari
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
-@@ -259,7 +259,6 @@ TEST_F(NotificationsTest, VolumeChanges) {
- EXPECT_EQ("ayatana-indicator-sound", notev[0].app_name);
- EXPECT_EQ("Volume", notev[0].summary);
- EXPECT_EQ(0, notev[0].actions.size());
-- EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-private-synchronous"]);
- EXPECT_GVARIANT_EQ("@i 50", notev[0].hints["value"]);
-
- /* Set a different volume */
-@@ -432,7 +431,6 @@ TEST_F(NotificationsTest, DISABLED_HighVolume) {
- ASSERT_EQ(1, notev.size());
- EXPECT_EQ("Volume", notev[0].summary);
- EXPECT_EQ("Speakers", notev[0].body);
-- EXPECT_GVARIANT_EQ("@s 'false'", notev[0].hints["x-lomiri-value-bar-tint"]);
-
- /* Set high volume with volume change */
- notifications->clearNotifications();
-@@ -443,7 +441,6 @@ TEST_F(NotificationsTest, DISABLED_HighVolume) {
- ASSERT_LT(0, notev.size()); /* This passes with one or two since it would just be an update to the first if a second was sent */
- EXPECT_EQ("Volume", notev[0].summary);
- EXPECT_EQ("Speakers", notev[0].body);
-- EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-lomiri-value-bar-tint"]);
-
- /* Move it back */
- volume_warning_mock_set_high_volume(VOLUME_WARNING_MOCK(volumeWarning.get()), false);
-@@ -513,7 +510,6 @@ TEST_F(NotificationsTest, DISABLED_ExtendendVolumeNotification) {
- EXPECT_EQ("ayatana-indicator-sound", notev[0].app_name);
- EXPECT_EQ("Volume", notev[0].summary);
- EXPECT_EQ(0, notev[0].actions.size());
-- EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-private-synchronous"]);
- EXPECT_GVARIANT_EQ("@i 50", notev[0].hints["value"]);
-
- /* Allow an amplified volume */
-@@ -628,14 +624,10 @@ TEST_F(NotificationsTest, DISABLED_TriggerWarning) {
- if (warning_expected) {
- EXPECT_TRUE(volume_warning_get_active(volumeWarning.get()));
- ASSERT_EQ(1, notev.size());
-- EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-lomiri-snap-decisions"]);
-- EXPECT_GVARIANT_EQ(nullptr, notev[0].hints["x-canonical-private-synchronous"]);
- }
- else {
- EXPECT_FALSE(volume_warning_get_active(volumeWarning.get()));
- ASSERT_EQ(1, notev.size());
-- EXPECT_GVARIANT_EQ(nullptr, notev[0].hints["x-lomiri-snap-decisions"]);
-- EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-private-synchronous"]);
- }
-
- } // multimedia_active
diff --git a/helpers/DATA/base-installer/archs/amd64.sh b/helpers/DATA/base-installer/archs/amd64.sh
index be52108..7a416d7 100644
--- a/helpers/DATA/base-installer/archs/amd64.sh
+++ b/helpers/DATA/base-installer/archs/amd64.sh
@@ -3,7 +3,7 @@ arch_get_kernel_flavour () {
}
arch_check_usable_kernel () {
- if echo "$1" | grep -q -e "signed" -e "edge" -e "hwe-16.04"; then return 1; fi
+ if echo "$1" | grep -q -e "signed" -e "edge" -e "hwe-@REVISION@"; then return 1; fi
if echo "$1" | grep -Eq -- "-(server|generic|virtual|xen|preempt|rt)(-.*)?$"; then return 0; fi
return 1
@@ -14,24 +14,24 @@ arch_get_kernel () {
echo "linux-generic"
echo "linux-image-generic"
- echo "linux-generic-hwe-20.04"
- echo "linux-image-generic-hwe-20.04"
+ echo "linux-generic-hwe-@REVISION@"
+ echo "linux-image-generic-hwe-@REVISION@"
echo "linux-lowlatency"
echo "linux-image-lowlatency"
- echo "linux-lowlatency-hwe-20.04"
- echo "linux-image-lowlatency-hwe-20.04"
+ echo "linux-lowlatency-hwe-@REVISION@"
+ echo "linux-image-lowlatency-hwe-@REVISION@"
- echo "linux-oem-20.04"
- echo "linux-image-oem-20.04"
+ echo "linux-oem-@REVISION@"
+ echo "linux-image-oem-@REVISION@"
echo "linux-virtual"
echo "linux-image-virtual"
echo "linux-image-extra-virtual"
- echo "linux-virtual-hwe-20.04"
+ echo "linux-virtual-hwe-@REVISION@"
- echo "linux-image-virtual-hwe-20.04"
- echo "linux-image-extra-virtual-hwe-20.04"
+ echo "linux-image-virtual-hwe-@REVISION@"
+ echo "linux-image-extra-virtual-hwe-@REVISION@"
}
diff --git a/helpers/DATA/base-installer/kernel_update_list.patch b/helpers/DATA/base-installer/patch_changes/000-kernel_update_list.patch
similarity index 89%
rename from helpers/DATA/base-installer/kernel_update_list.patch
rename to helpers/DATA/base-installer/patch_changes/000-kernel_update_list.patch
index 76d4175..309ee77 100644
--- a/helpers/DATA/base-installer/kernel_update_list.patch
+++ b/helpers/DATA/base-installer/patch_changes/000-kernel_update_list.patch
@@ -1,5 +1,5 @@
---- source/library.sh 2022-07-14 15:09:08.482389439 -0500
-+++ source/library.sh_upd 2022-07-14 15:19:40.056073944 -0500
+--- a/library.sh 2022-07-14 15:09:08.482389439 -0500
++++ b/library.sh 2022-07-14 15:19:40.056073944 -0500
@@ -345,9 +345,15 @@
kernel_update_list () {
diff --git a/helpers/DATA/base-installer/patch_changes/001-set_generic_kernel_flavour_as_upstream.patch b/helpers/DATA/base-installer/patch_changes/001-set_generic_kernel_flavour_as_upstream.patch
new file mode 100644
index 0000000..a4cceb9
--- /dev/null
+++ b/helpers/DATA/base-installer/patch_changes/001-set_generic_kernel_flavour_as_upstream.patch
@@ -0,0 +1,108 @@
+diff --git a/kernel/arm64.sh b/kernel/arm64.sh
+index a5a5ec4a..9d5e07b4 100644
+--- a/kernel/arm64.sh
++++ b/kernel/arm64.sh
+@@ -1,5 +1,8 @@
++# Adjusted for Trisquel: use 'generic' flavour on all supported architectures,
++# matching Ubuntu's kernel packaging.
++
+ arch_get_kernel_flavour () {
+- echo "arm64"
++ echo "generic"
+ return 0
+ }
+
+@@ -15,5 +18,5 @@ arch_check_usable_kernel () {
+ }
+
+ arch_get_kernel () {
+- echo "linux-image-arm64"
++ echo "linux-image-generic"
+ }
+diff --git a/kernel/armhf.sh b/kernel/armhf.sh
+index 389a416d..b998770e 100644
+--- a/kernel/armhf.sh
++++ b/kernel/armhf.sh
+@@ -1,3 +1,6 @@
++# Adjusted for Trisquel: use 'generic' flavour on all supported architectures,
++# matching Ubuntu's kernel packaging.
++
+ arch_has_lpae () {
+ if grep -q '^Features.*\blpae\b' "$CPUINFO"; then
+ echo y
+@@ -8,16 +11,13 @@ arch_has_lpae () {
+
+ arch_get_kernel_flavour () {
+ case "$SUBARCH" in
+- omap|mx5|vexpress)
+- echo "$SUBARCH armmp"
+- return 0 ;;
+ generic|efi)
+ case `arch_has_lpae` in
+ y)
+- echo "armmp-lpae armmp"
++ echo "generic-lpae generic"
+ ;;
+ n)
+- echo "armmp"
++ echo "generic"
+ ;;
+ esac
+ return 0 ;;
+diff --git a/kernel/ppc64el.sh b/kernel/ppc64el.sh
+index f21bdab2..2a5a0c5a 100644
+--- a/kernel/ppc64el.sh
++++ b/kernel/ppc64el.sh
+@@ -1,5 +1,8 @@
++# Adjusted for Trisquel: use 'generic' flavour on all supported architectures,
++# matching Ubuntu's kernel packaging.
++
+ arch_get_kernel_flavour () {
+- echo powerpc64le
++ echo generic
+ return 0
+ }
+
+@@ -8,5 +11,5 @@ arch_check_usable_kernel () {
+ }
+
+ arch_get_kernel () {
+- echo "linux-image-powerpc64le"
++ echo "linux-image-generic"
+ }
+diff --git a/kernel/riscv64.sh b/kernel/riscv64.sh
+index 9fa410e0..982555ef 100644
+--- a/kernel/riscv64.sh
++++ b/kernel/riscv64.sh
+@@ -4,10 +4,13 @@
+
+ # The riscv64 architecture has only a single unified multiplatform kernel
+ # (which uses "riscv64" as its flavour name). Therefore we don't need to
+-# differentiate between multiple flavours here.
++# differentiate between multiple flavours here. (Debian)
++
++## Adjusted for Trisquel: use 'generic' flavour on all supported architectures,
++## matching Ubuntu's kernel packaging.
+
+ arch_get_kernel_flavour () {
+- echo riscv64
++ echo generic
+ }
+
+ arch_check_usable_kernel () {
+@@ -17,7 +20,7 @@ arch_check_usable_kernel () {
+ # Don't show debug packages in the kernel selection list.
+ return 1
+ ;;
+- *-riscv64 | *-riscv64-*)
++ *-generic | *-generic-*)
+ return 0
+ ;;
+ *)
+@@ -28,5 +31,5 @@ arch_check_usable_kernel () {
+
+ arch_get_kernel () {
+ # parameters: $1=flavour
+- echo "linux-image-riscv64"
++ echo "linux-image-generic"
+ }
diff --git a/helpers/DATA/base-installer/patch_changes/002-patch_flavor_tests_arm64.patch b/helpers/DATA/base-installer/patch_changes/002-patch_flavor_tests_arm64.patch
new file mode 100644
index 0000000..212a0c1
--- /dev/null
+++ b/helpers/DATA/base-installer/patch_changes/002-patch_flavor_tests_arm64.patch
@@ -0,0 +1,66 @@
+diff --git a/kernel/tests/arm64/foundation.test b/kernel/tests/arm64/foundation.test
+index 30027845..882eb192 100644
+--- a/kernel/tests/arm64/foundation.test
++++ b/kernel/tests/arm64/foundation.test
+@@ -1,12 +1,12 @@
+ subarch generic
+ cpuinfo foundation.cpuinfo
+-flavour arm64
++flavour generic
+ majors 3.10
+ machine aarch64
+ kernel-3.10 \
+- linux-image-arm64
++ linux-image-generic
+ usable \
+- linux-image-arm64 \
+- linux-image-3.14-1-arm64
++ linux-image-generic \
++ linux-image-3.14-1-generic
+ unusable \
+- linux-image-3.14-1-arm64-dbg
++ linux-image-3.14-1-generic-dbg
+diff --git a/kernel/tests/arm64/mustang.test b/kernel/tests/arm64/mustang.test
+index 80ab19f7..e58c06aa 100644
+--- a/kernel/tests/arm64/mustang.test
++++ b/kernel/tests/arm64/mustang.test
+@@ -1,12 +1,12 @@
+ subarch generic
+ cpuinfo mustang.cpuinfo
+-flavour arm64
++flavour generic
+ majors 3.10
+ machine aarch64
+ kernel-3.10 \
+- linux-image-arm64
++ linux-image-generic
+ usable \
+- linux-image-arm64 \
+- linux-image-3.14-1-arm64
++ linux-image-generic \
++ linux-image-3.14-1-generic
+ unusable \
+- linux-image-3.14-1-arm64-dbg
++ linux-image-3.14-1-generic-dbg
+diff --git a/kernel/tests/arm64/qemu-virt.test b/kernel/tests/arm64/qemu-virt.test
+index 87c39c47..2d880f5c 100644
+--- a/kernel/tests/arm64/qemu-virt.test
++++ b/kernel/tests/arm64/qemu-virt.test
+@@ -1,12 +1,12 @@
+ subarch generic
+ cpuinfo qemu-virt.cpuinfo
+-flavour arm64
++flavour generic
+ majors 3.10
+ machine aarch64
+ kernel-3.10 \
+- linux-image-arm64
++ linux-image-generic
+ usable \
+- linux-image-arm64 \
+- linux-image-3.14-1-arm64
++ linux-image-generic \
++ linux-image-3.14-1-generic
+ unusable \
+- linux-image-3.14-1-arm64-dbg
++ linux-image-3.14-1-generic-dbg
diff --git a/helpers/DATA/base-installer/patch_changes/003-patch_flavor_tests_armhf.patch b/helpers/DATA/base-installer/patch_changes/003-patch_flavor_tests_armhf.patch
new file mode 100644
index 0000000..a3090b9
--- /dev/null
+++ b/helpers/DATA/base-installer/patch_changes/003-patch_flavor_tests_armhf.patch
@@ -0,0 +1,143 @@
+diff --git a/kernel/tests/armhf/efikamx.test b/kernel/tests/armhf/efikamx.test
+deleted file mode 100644
+index 3fa4eeef..00000000
+--- a/kernel/tests/armhf/efikamx.test
++++ /dev/null
+@@ -1,19 +0,0 @@
+-subarch mx5
+-cpuinfo efikamx.cpuinfo
+-majors 5.7
+-flavour mx5 armmp
+-kernel-5.7 linux-image-mx5 linux-image-armmp
+-usable \
+- linux-image-mx5 \
+- linux-image-5.7.0-1-mx5 \
+- linux-image-armmp \
+- linux-image-5.7.0-1-armmp
+-unusable \
+- linux-image-armmp-lpae \
+- linux-image-netwinder \
+- linux-image-orion5x \
+- linux-image-rpc \
+- linux-image-s3c2410 \
+- linux-image-kirkwood \
+- linux-image-vexpress \
+- linux-image-5.7.0-1-armmp-dbg
+diff --git a/kernel/tests/armhf/highbank.test b/kernel/tests/armhf/highbank.test
+index 1f68d466..37a42821 100644
+--- a/kernel/tests/armhf/highbank.test
++++ b/kernel/tests/armhf/highbank.test
+@@ -1,14 +1,14 @@
+ subarch generic
+ cpuinfo highbank.cpuinfo
+ majors 5.7
+-flavour armmp
++flavour generic
+ kernel-5.7 \
+- linux-image-armmp
++ linux-image-generic
+ usable \
+- linux-image-armmp \
+- linux-image-5.7.0-1-armmp
++ linux-image-generic \
++ linux-image-5.7.0-1-generic
+ unusable \
+- linux-image-armmp-lpae \
++ linux-image-generic-lpae \
+ linux-image-netwinder \
+ linux-image-orion5x \
+ linux-image-rpc \
+@@ -16,4 +16,4 @@ unusable \
+ linux-image-kirkwood \
+ linux-image-mx5 \
+ linux-image-vexpress \
+- linux-image-5.7.0-1-armmp-dbg
++ linux-image-5.7.0-1-generic-dbg
+diff --git a/kernel/tests/armhf/midway-no-lpae.test b/kernel/tests/armhf/midway-no-lpae.test
+index 04db5356..056ff08f 100644
+--- a/kernel/tests/armhf/midway-no-lpae.test
++++ b/kernel/tests/armhf/midway-no-lpae.test
+@@ -1,14 +1,14 @@
+ subarch generic
+ cpuinfo midway-no-lpae.cpuinfo
+ majors 5.7
+-flavour armmp
++flavour generic
+ kernel-5.7 \
+- linux-image-armmp
++ linux-image-generic
+ usable \
+- linux-image-armmp \
+- linux-image-5.7.0-1-armmp
++ linux-image-generic \
++ linux-image-5.7.0-1-generic
+ unusable \
+- linux-image-armmp-lpae \
++ linux-image-generic-lpae \
+ linux-image-netwinder \
+ linux-image-orion5x \
+ linux-image-rpc \
+@@ -16,4 +16,4 @@ unusable \
+ linux-image-kirkwood \
+ linux-image-mx5 \
+ linux-image-vexpress \
+- linux-image-5.7.0-1-armmp-dbg
++ linux-image-5.7.0-1-generic-dbg
+diff --git a/kernel/tests/armhf/midway.test b/kernel/tests/armhf/midway.test
+index 6a789a1b..a5213a4a 100644
+--- a/kernel/tests/armhf/midway.test
++++ b/kernel/tests/armhf/midway.test
+@@ -1,15 +1,15 @@
+ subarch generic
+ cpuinfo midway.cpuinfo
+ majors 5.7
+-flavour armmp-lpae armmp
++flavour generic-lpae generic
+ kernel-5.7 \
+- linux-image-armmp-lpae \
+- linux-image-armmp
++ linux-image-generic-lpae \
++ linux-image-generic
+ usable \
+- linux-image-armmp \
+- linux-image-5.7.0-1-armmp \
+- linux-image-armmp-lpae \
+- linux-image-5.7.0-1-armmp-lpae
++ linux-image-generic \
++ linux-image-5.7.0-1-generic \
++ linux-image-generic-lpae \
++ linux-image-5.7.0-1-generic-lpae
+ unusable \
+ linux-image-netwinder \
+ linux-image-orion5x \
+@@ -18,4 +18,4 @@ unusable \
+ linux-image-kirkwood \
+ linux-image-mx5 \
+ linux-image-vexpress \
+- linux-image-5.7.0-1-armmp-dbg
++ linux-image-5.7.0-1-generic-dbg
+diff --git a/kernel/tests/armhf/vexpress.test b/kernel/tests/armhf/vexpress.test
+deleted file mode 100644
+index 19d38dd4..00000000
+--- a/kernel/tests/armhf/vexpress.test
++++ /dev/null
+@@ -1,19 +0,0 @@
+-subarch vexpress
+-cpuinfo vexpress.cpuinfo
+-majors 5.7
+-flavour vexpress armmp
+-kernel-5.7 linux-image-vexpress linux-image-armmp
+-usable \
+- linux-image-vexpress \
+- linux-image-3.2.0-4-vexpress \
+- linux-image-armmp \
+- linux-image-5.7.0-1-armmp
+-unusable \
+- linux-image-armmp-lpae \
+- linux-image-netwinder \
+- linux-image-orion5x \
+- linux-image-rpc \
+- linux-image-s3c2410 \
+- linux-image-kirkwood \
+- linux-image-mx5 \
+- linux-image-5.7.0-1-armmp-dbg
diff --git a/helpers/DATA/base-installer/patch_changes/004-patch_flavor_tests_ppc64el.patch b/helpers/DATA/base-installer/patch_changes/004-patch_flavor_tests_ppc64el.patch
new file mode 100644
index 0000000..b66c5bb
--- /dev/null
+++ b/helpers/DATA/base-installer/patch_changes/004-patch_flavor_tests_ppc64el.patch
@@ -0,0 +1,36 @@
+diff --git a/kernel/tests/ppc64el/postal.test b/kernel/tests/ppc64el/postal.test
+index 9878d14f..33f7c0e3 100644
+--- a/kernel/tests/ppc64el/postal.test
++++ b/kernel/tests/ppc64el/postal.test
+@@ -1,9 +1,9 @@
+ subarch chrp_ibm
+ cpuinfo postal.cpuinfo
+ majors 5.7
+-flavour powerpc64le
++flavour generic
+ kernel-5.7 \
+- linux-image-powerpc64le
++ linux-image-generic
+ usable \
+- linux-image-powerpc64le \
+- linux-image-3.14-1-powerpc64le
++ linux-image-generic \
++ linux-image-3.14-1-generic
+diff --git a/kernel/tests/ppc64el/powernv.test b/kernel/tests/ppc64el/powernv.test
+index 3e7d2250..77b5505a 100644
+--- a/kernel/tests/ppc64el/powernv.test
++++ b/kernel/tests/ppc64el/powernv.test
+@@ -1,9 +1,9 @@
+ subarch chrp_ibm
+ cpuinfo powernv.cpuinfo
+ majors 5.7
+-flavour powerpc64le
++flavour generic
+ kernel-5.7 \
+- linux-image-powerpc64le
++ linux-image-generic
+ usable \
+- linux-image-powerpc64le \
+- linux-image-3.14-1-powerpc64le
++ linux-image-generic \
++ linux-image-3.14-1-generic
diff --git a/helpers/DATA/birdtray/birdtray.ico b/helpers/DATA/birdtray/birdtray.ico
deleted file mode 100644
index 28cc2fe..0000000
Binary files a/helpers/DATA/birdtray/birdtray.ico and /dev/null differ
diff --git a/helpers/DATA/birdtray/icons/128/com.ulduzsoft.Birdtray.png b/helpers/DATA/birdtray/icons/128/com.ulduzsoft.Birdtray.png
deleted file mode 100644
index 313a770..0000000
Binary files a/helpers/DATA/birdtray/icons/128/com.ulduzsoft.Birdtray.png and /dev/null differ
diff --git a/helpers/DATA/birdtray/icons/32/com.ulduzsoft.Birdtray.png b/helpers/DATA/birdtray/icons/32/com.ulduzsoft.Birdtray.png
deleted file mode 100644
index 1dfe7a4..0000000
Binary files a/helpers/DATA/birdtray/icons/32/com.ulduzsoft.Birdtray.png and /dev/null differ
diff --git a/helpers/DATA/birdtray/icons/48/com.ulduzsoft.Birdtray.png b/helpers/DATA/birdtray/icons/48/com.ulduzsoft.Birdtray.png
deleted file mode 100644
index 5acf48a..0000000
Binary files a/helpers/DATA/birdtray/icons/48/com.ulduzsoft.Birdtray.png and /dev/null differ
diff --git a/helpers/DATA/birdtray/icons/64/com.ulduzsoft.Birdtray.png b/helpers/DATA/birdtray/icons/64/com.ulduzsoft.Birdtray.png
deleted file mode 100644
index 28510f2..0000000
Binary files a/helpers/DATA/birdtray/icons/64/com.ulduzsoft.Birdtray.png and /dev/null differ
diff --git a/helpers/DATA/birdtray/thunderbird.png b/helpers/DATA/birdtray/thunderbird.png
deleted file mode 100644
index ee32dde..0000000
Binary files a/helpers/DATA/birdtray/thunderbird.png and /dev/null differ
diff --git a/helpers/DATA/bleachbit/bleachbit-FSDG.patch b/helpers/DATA/bleachbit/bleachbit-FSDG.patch
index 631be03..cdbf76f 100644
--- a/helpers/DATA/bleachbit/bleachbit-FSDG.patch
+++ b/helpers/DATA/bleachbit/bleachbit-FSDG.patch
@@ -66,16 +66,6 @@ diff -ru a/doc/cleaner_markup_language.xsd b/doc/cleaner_markup_language.xsd
-diff -ru source/PKG-INFO source_fix/PKG-INFO
---- a/PKG-INFO 2021-11-13 15:05:48.000000000 -0600
-+++ b/PKG-INFO 2022-04-10 16:28:47.450145458 -0500
-@@ -7,5 +7,5 @@
- Author-email: andrew@bleachbit.org
- License: GPLv3
- Download-URL: https://www.bleachbit.org/download
--Description: BleachBit frees space and maintains privacy by quickly wiping files you don't need and didn't know you had. Supported applications include Edge, Firefox, Google Chrome, VLC, and many others.
-+Description: BleachBit frees space and maintains privacy by quickly wiping files you don't need and didn't know you had. Supported applications include Firefox, VLC, and many others.
- Platform: Linux and Windows; Python v2.6 and 2.7; GTK v3.12+
diff -ru source/setup.py source_fix/setup.py
--- a/setup.py 2021-11-13 15:05:47.000000000 -0600
+++ b/setup.py 2022-04-10 16:34:51.418739031 -0500
@@ -88,3 +78,14 @@ diff -ru source/setup.py source_fix/setup.py
#
# begin win32com.shell workaround for py2exe
+diff --git a/PKG-INFO b/PKG-INFO
+index e7605a5c..1cb44f88 100644
+--- a/PKG-INFO
++++ b/PKG-INFO
+@@ -10,5 +10,5 @@ Download-URL: https://www.bleachbit.org/download
+ Platform: Linux and Windows; Python v2.6 and 2.7; GTK v3.12+
+ License-File: COPYING
+
+-BleachBit frees space and maintains privacy by quickly wiping files you don't need and didn't know you had. Supported applications include Edge, Firefox, Google Chrome, VLC, and many others.
++BleachBit frees space and maintains privacy by quickly wiping files you don't need and didn't know you had. Supported applications include Abrowser, VLC, and many others.
+
diff --git a/helpers/DATA/caja/patch_changes/001-fallback_fast-content-type_if_content-type_is_not_set.patch b/helpers/DATA/caja/patch_changes/001-fallback_fast-content-type_if_content-type_is_not_set.patch
new file mode 100644
index 0000000..b444c13
--- /dev/null
+++ b/helpers/DATA/caja/patch_changes/001-fallback_fast-content-type_if_content-type_is_not_set.patch
@@ -0,0 +1,34 @@
+From 16145e6d4e86f0c6fc58a0e3ceec6ba16a84d900 Mon Sep 17 00:00:00 2001
+From: Ondrej Holy
+Date: Tue, 31 Mar 2020 15:55:56 +0200
+Subject: [PATCH] file: Fallback to fast-content-type if content-type is not
+ set
+
+The G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE attribute doesn't have to be
+always set. See https://gitlab.gnome.org/GNOME/gvfs/-/merge_requests/68
+for more details. In that case, Caja fallbacks to the
+"application/octet-stream" type, which causes issues when opening the
+files. Let's fallback to the "standard::fast-content-type" attribute
+instead to fix issues when opening such files.
+
+Imported from Nautilus commit: https://gitlab.gnome.org/GNOME/nautilus/-/commit/0e5978035b0fc87c91d7b93ed79c64d51b6d6825
+
+Fixes #1840.
+---
+ libcaja-private/caja-file.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/libcaja-private/caja-file.c b/libcaja-private/caja-file.c
+index faa7bb50e..faea79932 100644
+--- a/libcaja-private/caja-file.c
++++ b/libcaja-private/caja-file.c
+@@ -2460,6 +2460,9 @@ update_info_internal (CajaFile *file,
+ }
+
+ mime_type = g_file_info_get_content_type (info);
++ if (mime_type == NULL) {
++ mime_type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE);
++ }
+ if (eel_strcmp (file->details->mime_type, mime_type) != 0) {
+ changed = TRUE;
+ g_clear_pointer (&file->details->mime_type, g_ref_string_release);
diff --git a/helpers/DATA/casper/36apparmor_live b/helpers/DATA/casper/36apparmor_live
new file mode 100644
index 0000000..094a847
--- /dev/null
+++ b/helpers/DATA/casper/36apparmor_live
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+PREREQ=""
+DESCRIPTION="Enabling Live apparmor profiles..."
+
+prereqs()
+{
+ echo "$PREREQ"
+}
+
+case $1 in
+# get pre-requisites
+prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+. /scripts/casper-functions
+
+log_begin_msg "$DESCRIPTION"
+
+RC_EXIST=0
+
+if [ ! -e /root/etc/rc.local ]; then
+ umask 022
+ mkdir -p /root/etc
+ cat << 'EOF' > /root/etc/rc.local
+#!/bin/sh
+exit 0
+EOF
+ chmod 755 /root/etc/rc.local
+ RC_EXIST=1
+fi
+
+if [ "$RC_EXIST" -eq 0 ]; then
+ head -n1 /root/etc/rc.local | grep -q '^#!' || sed -i '1s|^|#!/bin/sh\n|' /root/etc/rc.local
+ sed -i 's/\r$//' /root/etc/rc.local
+ chmod 755 /root/etc/rc.local
+fi
+
+if ! grep -q 'BEGIN trisquel-live-apparmor' /root/etc/rc.local 2>/dev/null; then
+ sed -i '/^exit 0$/d' /root/etc/rc.local
+ cat << 'EOF' >> /root/etc/rc.local
+# --- BEGIN trisquel-live-apparmor ---
+if [ -d /rofs ]; then
+ /usr/lib/casper/casper-apparmor-live || true
+fi
+# --- END trisquel-live-apparmor ---
+EOF
+ echo 'exit 0' >> /root/etc/rc.local
+fi
+
+mkdir -p /root/etc/apt/apt.conf.d
+cat << 'APT' > /root/etc/apt/apt.conf.d/99-apparmor-live-hook
+# /etc/apt/apt.conf.d/99-apparmor-live-hook
+DPkg::Post-Invoke { "sh -c '[ -d /rofs ] && /usr/lib/casper/casper-apparmor-live || true'"; };
+APT
+chmod 644 /root/etc/apt/apt.conf.d/99-apparmor-live-hook
+
+log_end_msg
diff --git a/helpers/DATA/casper/set_trisquel_iso_suggestion.patch b/helpers/DATA/casper/patch_changes/000-set_trisquel_iso_suggestion.patch
similarity index 74%
rename from helpers/DATA/casper/set_trisquel_iso_suggestion.patch
rename to helpers/DATA/casper/patch_changes/000-set_trisquel_iso_suggestion.patch
index 116f99c..f7b369f 100644
--- a/helpers/DATA/casper/set_trisquel_iso_suggestion.patch
+++ b/helpers/DATA/casper/patch_changes/000-set_trisquel_iso_suggestion.patch
@@ -1,6 +1,8 @@
---- a/scripts/casper 2023-02-13 23:53:18.908768968 -0600
-+++ b/scripts/casper 2023-02-21 03:28:55.176581755 -0600
-@@ -376,18 +376,18 @@
+diff --git a/scripts/casper b/scripts/casper
+index 36a724d2..1b9a6faf 100644
+--- a/scripts/casper
++++ b/scripts/casper
+@@ -379,18 +379,18 @@ do_interactive_netmount() {
# maybe make livecd-rootfs embed something in the casper initrd?
case $PRETTY_NAME in
*development*)
@@ -12,14 +14,14 @@
*)
case $DPKG_ARCH in
amd64)
-- server_url=https://releases.ubuntu.com/$UBUNTU_CODENAME/ubuntu-$VERSION_ID-live-server-$DPKG_ARCH.iso
-- desktop_url=https://releases.ubuntu.com/$UBUNTU_CODENAME/ubuntu-$VERSION_ID-desktop-$DPKG_ARCH.iso
+- server_url=https://releases.ubuntu.com/$UBUNTU_CODENAME/ubuntu-$VERSION_ID-latest-live-server-$DPKG_ARCH.iso
+- desktop_url=https://releases.ubuntu.com/$UBUNTU_CODENAME/ubuntu-$VERSION_ID-latest-desktop-$DPKG_ARCH.iso
+ server_url=http://cdimage.trisquel.org/trisquel-images/${ID}-netinst_${VERSION_ID}_${DPKG_ARCH}.iso
+ desktop_url=http://cdimage.trisquel.org/trisquel-images/${ID}_${VERSION_ID}_${DPKG_ARCH}.iso
;;
*)
-- server_url=http://cdimage.ubuntu.com/releases/$UBUNTU_CODENAME/release/ubuntu-$VERSION_ID-live-server-$DPKG_ARCH.iso
-- desktop_url=http://cdimage.ubuntu.com/releases/$UBUNTU_CODENAME/release/ubuntu-$VERSION_ID-desktop-$DPKG_ARCH.iso
+- server_url=http://cdimage.ubuntu.com/releases/$UBUNTU_CODENAME/release/ubuntu-$VERSION_ID-latest-live-server-$DPKG_ARCH.iso
+- desktop_url=http://cdimage.ubuntu.com/releases/$UBUNTU_CODENAME/release/ubuntu-$VERSION_ID-latest-desktop-$DPKG_ARCH.iso
+ server_url=http://cdimage.trisquel.org/trisquel-images/${ID}-netinst_${VERSION_ID}_${DPKG_ARCH}.iso
+ desktop_url=http://cdimage.trisquel.org/trisquel-images/${ID}_${VERSION_ID}_${DPKG_ARCH}.iso
;;
diff --git a/helpers/DATA/casper/patch_changes/001-fix_disable_kde_services_triskel_live.patch b/helpers/DATA/casper/patch_changes/001-fix_disable_kde_services_triskel_live.patch
new file mode 100644
index 0000000..f0e0dff
--- /dev/null
+++ b/helpers/DATA/casper/patch_changes/001-fix_disable_kde_services_triskel_live.patch
@@ -0,0 +1,13 @@
+diff --git a/scripts/casper-bottom/34disable_kde_services b/scripts/casper-bottom/34disable_kde_services
+index f368ec2e..caa76986 100755
+--- a/scripts/casper-bottom/34disable_kde_services
++++ b/scripts/casper-bottom/34disable_kde_services
+@@ -20,7 +20,7 @@ esac
+
+ log_begin_msg "$DESCRIPTION"
+
+-for pkg in kubuntu-default-settings ubuntustudio; do
++for pkg in triskel-default-settings kubuntu-default-settings ubuntustudio; do
+ settingsdir="/root/usr/share/$pkg/kf5-settings"
+ [ -d "$settingsdir" ] || continue
+ printf "[Daemon]\nTimeout=0\nAutolock=false\nLockOnResume=false\n" >> "$settingsdir"/kscreenlockerrc
diff --git a/helpers/DATA/casper/patch_changes/002-setup_apparmor_live_reload.patch b/helpers/DATA/casper/patch_changes/002-setup_apparmor_live_reload.patch
new file mode 100644
index 0000000..d78ec82
--- /dev/null
+++ b/helpers/DATA/casper/patch_changes/002-setup_apparmor_live_reload.patch
@@ -0,0 +1,29 @@
+diff --git a/debian/casper.install b/debian/casper.install
+index 5eb58de8..248d17d0 100644
+--- a/debian/casper.install
++++ b/debian/casper.install
+@@ -10,4 +10,5 @@ bin/casper-update-initramfs usr/share/casper
+ hooks usr/share/initramfs-tools
+ scripts usr/share/initramfs-tools
+ casper-md5check/casper-md5check usr/lib/casper
++extra/casper-apparmor-live usr/lib/casper
+ casper.conf etc
+diff --git a/extra/casper-apparmor-live b/extra/casper-apparmor-live
+new file mode 100755
+index 00000000..c11b80ad
+--- /dev/null
++++ b/extra/casper-apparmor-live
+@@ -0,0 +1,13 @@
++#!/bin/sh
++# /usr/lib/casper/casper-apparmor-live
++[ -d /rofs ] || exit 0
++find /etc/apparmor.d -type f \
++ ! -path "/etc/apparmor.d/abstractions/*" \
++ ! -path "/etc/apparmor.d/tunables/*" \
++ ! -path "/etc/apparmor.d/local/*" \
++ ! -path "/etc/apparmor.d/disable/*" \
++ ! -path "/etc/apparmor.d/rsyslog.d/*" \
++ ! -path "/etc/apparmor.d/force-complain/*" \
++ ! -path "/etc/apparmor.d/apache2.d/*" \
++ ! -path "/etc/apparmor.d/abi/*" \
++ -print0 | xargs -0 -r -n1 apparmor_parser -r -T -W || true
diff --git a/helpers/DATA/casper/patch_changes/003-reenable_checksum_plymouth.patch b/helpers/DATA/casper/patch_changes/003-reenable_checksum_plymouth.patch
new file mode 100644
index 0000000..3fee96d
--- /dev/null
+++ b/helpers/DATA/casper/patch_changes/003-reenable_checksum_plymouth.patch
@@ -0,0 +1,175 @@
+diff --git a/casper-md5check/casper-md5check.c b/casper-md5check/casper-md5check.c
+index a1e4f753..5213fd3d 100644
+--- a/casper-md5check/casper-md5check.c
++++ b/casper-md5check/casper-md5check.c
+@@ -39,6 +39,10 @@
+
+ #define MD5_LEN 16
+
++/* Show a human-friendly percent message every N percent points.
++ * Script themes like trisquel-logo display messages but ignore fsck: status updates. */
++#define PLYMOUTH_PERCENT_STEP 1
++
+ #define RESULT_FILE "/run/casper-md5check.json"
+ #define BROKEN_FILE " \"checksum_missmatch\": [ "
+ #define RESULT_PASS " \"result\": \"pass\"\n}\n"
+@@ -215,14 +219,36 @@ void plymouth_success(ply_boot_client_t *client, char *format, ...) {
+ }
+
+ void plymouth_progress(ply_boot_client_t *client, int progress, char *checkfile) {
+- static int prevprogress = -1;
+- char *s;
++ static int prev_bucket = -1;
++ int bucket = progress / PLYMOUTH_PERCENT_STEP;
++ char *s = NULL;
++ char *m = NULL;
+
+- if (progress == prevprogress)
++ if (bucket == prev_bucket)
+ return;
+- prevprogress = progress;
++ prev_bucket = bucket;
+
+ if (got_plymouth) {
++ /* Always emit a visible message with percent; trisquel-logo shows this. */
++ const char *name = checkfile;
++ if (name) {
++ const char *slash = strrchr(name, '/');
++ if (slash && slash[1])
++ name = slash + 1;
++ }
++ if (name)
++ asprintf(&m, "Checking integrity: %03d%% (%s)", progress, name);
++ else
++ asprintf(&m, "Checking integrity: %03d%%", progress);
++
++ if (m) {
++ ply_boot_client_tell_daemon_to_display_message(client, m,
++ plymouth_response,
++ plymouth_response, NULL);
++ ply_boot_client_flush(client);
++ free(m);
++ }
++
+ if (checkfile) {
+ if (spinner_theme)
+ asprintf(&s, "fsckd:1:%d:Checking %s", progress, checkfile);
+@@ -260,10 +260,12 @@ void plymouth_progress(ply_boot_client_t *client, int progress, char *checkfile)
+ else
+ asprintf(&s, "fsck:md5sums:%d", progress);
+ }
+- ply_boot_client_update_daemon(client, s, plymouth_response,
+- plymouth_response, NULL);
+- ply_boot_client_flush(client);
+- free(s);
++ if (s) {
++ ply_boot_client_update_daemon(client, s, plymouth_response,
++ plymouth_response, NULL);
++ ply_boot_client_flush(client);
++ free(s);
++ }
+ } else {
+ printf(".");
+ fflush(stdout);
+@@ -304,7 +304,7 @@ int main(int argc, char **argv) {
+
+ parse_cmdline();
+
+- //client = ply_boot_client_new();
++ client = ply_boot_client_new();
+ if (client)
+ ply_event_loop = ply_event_loop_new();
+ if (ply_event_loop)
+@@ -445,6 +445,7 @@ cmdline_skip:
+ if (skip_and_exit) {
+ result = RESULT_SKIP;
+ plymouth_urgent(client, "Check skipped.");
++ sleep(3);
+ } else if (failed) {
+ result = RESULT_FAIL;
+ plymouth_urgent(client, "Check finished: errors found in %d files! You might encounter errors.", failed);
+@@ -452,9 +453,11 @@ cmdline_skip:
+ } else {
+ result = RESULT_PASS;
+ plymouth_urgent(client, "Check finished: no errors found.");
++ sleep(3);
+ }
++
+ fprintf(result_file, "%s", result);
+ fclose(result_file);
+ plymouth_urgent(client, "");
+ return 0;
+ }
+
+diff --git a/debian/casper.casper-md5check.service b/debian/casper.casper-md5check.service
+index 0af66ec2..6a5860fa 100644
+--- a/debian/casper.casper-md5check.service
++++ b/debian/casper.casper-md5check.service
+@@ -1,12 +1,26 @@
+ [Unit]
+ Description=casper-md5check Verify Live ISO checksums
+-After=multi-user.target
++ConditionKernelCommandLine=integrity-check
++After=local-fs.target plymouth-start.service
++Before=multi-user.target plymouth-quit.service plymouth-quit-wait.service display-manager.service graphical.target
+
+ [Service]
+ Type=oneshot
++
++# /cdrom is typically mounted by casper/initramfs (not systemd), and cdrom.mount may be masked.
++# So we wait until /cdrom is mounted and md5sum.txt exists instead of RequiresMountsFor=/cdrom.
++ExecStartPre=/bin/sh -c 'i=0; while [ "$i" -lt 200 ]; do grep -qs " /cdrom " /proc/mounts && [ -f /cdrom/md5sum.txt ] && exit 0; i=$((i+1)); sleep 0.1; done; echo "casper-md5check: /cdrom no listo" >&2; exit 1'
++
+ ExecStart=/usr/lib/casper/casper-md5check /cdrom /cdrom/md5sum.txt
+-Nice=19
+ RemainAfterExit=yes
++StandardOutput=journal+console
++StandardError=journal+console
++
++# casper-md5check uses libplymouth; give it a controlling TTY or it may abort.
++StandardInput=tty
++TTYPath=/dev/console
++
++Nice=19
+ IOSchedulingClass=idle
+ IOSchedulingPriority=7
+
+diff --git a/bin/casper-stop b/bin/casper-stop
+index 56174681..5fab7c36 100755
+--- a/bin/casper-stop
++++ b/bin/casper-stop
+@@ -100,31 +100,9 @@ do_stop ()
+ return 0
+ fi
+
+- # XXX - i18n
+- MSG="Please remove the installation medium, then press ENTER: "
+- MSG_FALLBACK="Please remove the installation medium, then reboot."
+-
+- if [ "$prompt" ]; then
+- if [ -x /bin/plymouth ] && plymouth --ping; then
+- chvt 63
+- plymouth message --text="$MSG"
+- clear > /dev/tty1
+- echo $MSG_FALLBACK > /dev/tty1
+- else
+- stty sane < /dev/console
+- echo $MSG > /dev/console
+- fi
+- fi
+-
+- eject -p -m $device >/dev/null 2>&1
+-
+- [ "$prompt" ] || return 0
+-
+- if [ -x /bin/plymouth ] && plymouth --ping; then
+- plymouth watch-keystroke > /dev/null
+- else
+- read x < /dev/console
+- fi
++ # Trisquel: We no longer block shutdown/reboot waiting for user input.
++ eject -p -m "$device" >/dev/null 2>&1 || true
++ return 0
+ }
+
+ do_stop
diff --git a/helpers/DATA/casper/set_liveuser_uid_1000.patch b/helpers/DATA/casper/set_liveuser_uid_1000.patch
deleted file mode 100644
index 511fe5c..0000000
--- a/helpers/DATA/casper/set_liveuser_uid_1000.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-diff --git a/bin/casper-snapshot b/bin/casper-snapshot
-index ab075292..33243f63 100755
---- a/bin/casper-snapshot
-+++ b/bin/casper-snapshot
-@@ -33,7 +33,7 @@ VERSION=0.0.1
- if [ -e /etc/casper.conf ]; then
- . /etc/casper.conf
- else
-- USERNAME=$(cat /etc/passwd | grep "999" | cut -f1 -d ':')
-+ USERNAME=$(cat /etc/passwd | grep "1000" | cut -f1 -d ':')
- HOSTNAME=$(hostname)
- BUILD_SYSTEM="Debian"
- fi
-diff --git a/scripts/casper-bottom/15autologin b/scripts/casper-bottom/15autologin
-index d6c75e66..c80e2058 100755
---- a/scripts/casper-bottom/15autologin
-+++ b/scripts/casper-bottom/15autologin
-@@ -90,9 +90,6 @@ if [ -f /root/usr/bin/sddm ]; then
- sddm_session=QLubuntu.desktop
- fi
- cat >>/root/etc/sddm.conf < /dev/null
- if [ ! -f /root/usr/bin/sddm ]; then
-@@ -93,11 +94,6 @@ for file in /usr/share/applications/ubiquity.desktop /usr/share/applications/kde
- fi
- done
-
--# GDM
--if [ -d /root/etc/gdm3 ]; then
-- sed -i '/^[UG]ID_MIN/s/\<1000$/ 999/' /root/etc/login.defs
--fi
--
- # Kubuntu
- if [ -f "/root/usr/bin/plasma-desktop" ]; then
- if [ -f "/root/usr/share/kde4/apps/khelpcenter/plugins/kubuntu/a_welcome.desktop" ]; then
diff --git a/helpers/DATA/cdebconf/new-default-color-palet-usage.patch b/helpers/DATA/cdebconf/new-default-color-palet-usage.patch
new file mode 100644
index 0000000..a41807a
--- /dev/null
+++ b/helpers/DATA/cdebconf/new-default-color-palet-usage.patch
@@ -0,0 +1,96 @@
+diff --git a/src/modules/frontend/newt/newt.c b/src/modules/frontend/newt/newt.c
+index 838ff2f..ee754a2 100644
+--- a/src/modules/frontend/newt/newt.c
++++ b/src/modules/frontend/newt/newt.c
+@@ -72,6 +72,47 @@ struct newt_data {
+ struct question *scale_info;
+ };
+
++struct newtColors newtAltColorPalette = {
++ /*"white", "blue",*/ /* root fg, bg */
++ "white", "black", /* root fg, bg */
++ /*"black", "lightgray",*/ /* border fg, bg */
++ "white", "black", /* border fg, bg */
++ /*"black", "lightgray",*/ /* window fg, bg */
++ "white", "black", /* window fg, bg */
++ /*"white", "black",*/ /* shadow fg, bg */
++ "white", "black", /* shadow fg, bg */
++ /*"red", "lightgray",*/ /* title fg, bg */
++ "yellow", "black", /* title fg, bg */
++ /*"brightred", "gray",*/ /* button fg, bg */
++ "black", "lightgray", /* button fg, bg */
++ "gray", "brightred", /* active button fg, bg */
++ "white", "gray", /* checkbox fg, bg */
++ /*"yellow", "brown",*/ /* active checkbox fg, bg */
++ "black", "lightgray", /* active checkbox fg, bg */
++ /*"yellow", "blue",*/ /* entry box fg, bg */
++ "white", "black", /* entry box fg, bg */
++ /*"blue", "lightgray",*/ /* label fg, bg */
++ "brightred", "black", /* label fg, bg */
++ /*"black", "lightgray",*/ /* listbox fg, bg */
++ "white", "black", /* listbox fg, bg */
++ "yellow", "blue", /* active listbox fg, bg */
++ /*"black", "lightgray",*/ /* textbox fg, bg */
++ "white", "black", /* textbox fg, bg */
++ "lightgray", "black", /* active textbox fg, bg */
++ /*"white", "blue",*/ /* help line */
++ "white", "black", /* help line */
++ "yellow", "blue", /* root text */
++ /*"blue",*/ /* scale full */
++ "black", /* scale full */
++ /*"red",*/ /* scale empty */
++ "blue", /* scale empty */
++ "blue", "lightgray", /* disabled entry fg, bg */
++ /*"black", "lightgray",*/ /* compact button fg, bg */
++ "white", "black", /* compact button fg, bg */
++ "black", "lightgray", /* active & sel listbox */
++ "black", "brown" /* selected listbox */
++};
++
+ typedef int (newt_handler)(struct frontend *obj, struct question *q);
+
+ struct newt_help_callback_data {
+@@ -153,6 +194,7 @@ cdebconf_newt_setup(void)
+ {
+ SLang_init_tty(0, 1, 0); /* disable flow control */
+ newtInit();
++ newtSetColors(newtAltColorPalette);
+ newtCls();
+ }
+
+@@ -1078,7 +1120,7 @@ newt_handler_error(struct frontend *obj, struct question *q)
+ {
+ char *oldrootBg, *oldshadowBg, *oldhelpLineFg, *oldhelpLineBg;
+ int ret;
+- struct newtColors palette = newtDefaultColorPalette;
++ struct newtColors palette = newtAltColorPalette;
+
+ oldrootBg = palette.rootBg;
+ oldshadowBg = palette.shadowBg;
+@@ -1148,22 +1190,15 @@ newt_initialize(struct frontend *obj, struct configuration *conf)
+ {
+ int width = 80, height = 24;
+ const char *palette;
+- const char *base = "/etc/newt/palette";
+- char *path;
+
+ obj->interactive = 1;
+ obj->data = calloc(1, sizeof(struct newt_data));
+ SLang_init_tty(0, 1, 0); /* disable flow control */
+- palette = getenv("FRONTEND_BACKGROUND");
+- if (palette != NULL && asprintf(&path, "%s.%s", base, palette) >= 0) {
+- /* Establish a symlink from /etc/newt/palette to
+- * /etc/newt/palette.$FRONTEND_BACKGROUND
+- */
+- unlink(base);
+- link(path, base);
+- free(path);
+- }
+ newtInit();
++ palette = getenv("FRONTEND_BACKGROUND");
++ if (palette == NULL || strcmp(palette, "dark") != 0)
++ newtAltColorPalette = newtDefaultColorPalette;
++ newtSetColors(newtAltColorPalette);
+ newtGetScreenSize(&width, &height);
+ newtFinished();
+ return DC_OK;
diff --git a/helpers/DATA/cdebconf/restore-udeb-build-w_o-profile.patch b/helpers/DATA/cdebconf/restore-udeb-build-w_o-profile.patch
new file mode 100644
index 0000000..3da51ef
--- /dev/null
+++ b/helpers/DATA/cdebconf/restore-udeb-build-w_o-profile.patch
@@ -0,0 +1,96 @@
+diff --git a/debian/control b/debian/control
+index 0b67d83..de3d32e 100644
+--- a/debian/control
++++ b/debian/control
+@@ -83,7 +82,6 @@ Priority: standard
+ Depends: ${shlibs:Depends}, ${misc:Depends}
+ Provides: debconf-2.0
+ Package-Type: udeb
+-Build-Profiles:
+ Description: Debian Configuration Management System (C-implementation)
+ Debconf is a configuration management system for Debian packages. It is
+ used by some packages to prompt you for information before they are
+@@ -99,7 +97,6 @@ Section: debian-installer
+ Priority: standard
+ Depends: cdebconf-udeb, ${misc:Depends}
+ Package-Type: udeb
+-Build-Profiles:
+ XB-Installer-Menu-Item: 93000
+ Description: Change debconf priority
+ This is a udeb that allows you to change the priority limit for the
+@@ -110,7 +107,6 @@ Architecture: any
+ Section: debian-installer
+ Depends: ${shlibs:Depends}, ${misc:Depends}, cdebconf-udeb
+ Package-Type: udeb
+-Build-Profiles:
+ Description: Debian Configuration Management System (C-implementation)
+ Debconf is a configuration management system for Debian packages. It is
+ used by some packages to prompt you for information before they are
+@@ -124,7 +120,6 @@ Architecture: any
+ Section: debian-installer
+ Depends: cdebconf-udeb, ${shlibs:Depends}, ${misc:Depends}
+ Package-Type: udeb
+-Build-Profiles:
+ Description: Plain text frontend for Debian Configuration Management System
+ Debconf is a configuration management system for Debian packages. It is
+ used by some packages to prompt you for information before they are
+@@ -139,7 +134,6 @@ Architecture: any
+ Section: debian-installer
+ Depends: cdebconf-udeb, di-utils-terminfo, ${shlibs:Depends}, ${misc:Depends}
+ Package-Type: udeb
+-Build-Profiles:
+ Description: Newt frontend for Debian Configuration Management System
+ Debconf is a configuration management system for Debian packages. It is
+ used by some packages to prompt you for information before they are
+@@ -154,7 +148,7 @@ Architecture: any
+ Section: debian-installer
+ Depends: cdebconf-udeb, ${shlibs:Depends}, ${misc:Depends}, rootskel-gtk [!s390 !s390x]
+ Package-Type: udeb
+-Build-Profiles:
++Build-Profiles:
+ Description: Gtk+ frontend for Debian Configuration Management System
+ Debconf is a configuration management system for Debian packages. It is
+ used by some packages to prompt you for information before they are
+diff --git a/debian/rules b/debian/rules
+index 3ee2ec0..a66e684 100755
+--- a/debian/rules
++++ b/debian/rules
+@@ -12,10 +12,6 @@ udebbuild=debian/build-udeb
+
+ include /usr/share/dpkg/architecture.mk
+
+-ifeq (,$(filter noudeb, $(DEB_BUILD_PROFILES)))
+- with_udeb = yes
+-endif
+-
+ CONFFILE=/etc/cdebconf.conf
+
+ #package names
+@@ -46,7 +42,7 @@ ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
+ DEBUG_CONFIGURE_OPT=--with-debug=yes
+ endif
+
+-build: build-deb $(if $(with_udeb),build-udeb)
++build: build-deb build-udeb
+
+ build-arch: build
+ build-indep: build
+@@ -108,9 +104,7 @@ install-arch: build
+ dh_testroot
+ dh_prep
+ $(MAKE) -C $(debbuild) install DESTDIR=$(CURDIR)/debian/tmp/deb
+-ifeq ($(with_udeb),yes)
+ $(MAKE) -C $(udebbuild) install DESTDIR=$(CURDIR)/debian/tmp/udeb
+-endif
+ dh_install -a
+
+ install-indep:
+@@ -152,7 +146,7 @@ endif
+ dh_strip -a
+ dh_compress -a
+ dh_fixperms -a
+- dh_makeshlibs -a $(if $(with_udeb),--add-udeb=libdebconfclient0-udeb)
++ dh_makeshlibs -a --add-udeb=libdebconfclient0-udeb
+ dh_installdeb -a
+ dh_shlibdeps -a
+ dh_gencontrol -a
diff --git a/helpers/DATA/choose-mirror/Makefile_mirrors-masterlist.patch b/helpers/DATA/choose-mirror/Makefile_mirrors-masterlist.patch
new file mode 100644
index 0000000..920acc3
--- /dev/null
+++ b/helpers/DATA/choose-mirror/Makefile_mirrors-masterlist.patch
@@ -0,0 +1,15 @@
+diff --git a/Makefile b/Makefile
+index f8bf521f..61d51be1 100644
+--- a/Makefile
++++ b/Makefile
+@@ -34,8 +34,8 @@ LIBS=-ldebconfclient -ldebian-installer
+ STRIP=strip
+
+ # Derivative distributions may want to change these.
+-MIRRORLISTURL=https://mirror-master.debian.org/status/Mirrors.masterlist
+-MASTERLIST=Mirrors.masterlist
++MIRRORLISTURL=https://gitlab.trisquel.org/trisquel/trisquel-packages/-/raw/master/extra/mirrors/Mirrors.masterlist
++MASTERLIST=Mirrors.masterlist.trisquel
+
+ ifdef DEBUG
+ CFLAGS:=$(CFLAGS) -DDODEBUG
diff --git a/helpers/DATA/choose-mirror/rev_choose-mirror-bin.templates-in.patch b/helpers/DATA/choose-mirror/choose-mirror-bin.templates-in.patch
similarity index 51%
rename from helpers/DATA/choose-mirror/rev_choose-mirror-bin.templates-in.patch
rename to helpers/DATA/choose-mirror/choose-mirror-bin.templates-in.patch
index 8976574..fd77a84 100644
--- a/helpers/DATA/choose-mirror/rev_choose-mirror-bin.templates-in.patch
+++ b/helpers/DATA/choose-mirror/choose-mirror-bin.templates-in.patch
@@ -1,22 +1,22 @@
diff -ru choose-mirror-2.78ubuntu7+10.0trisquel3/debian/choose-mirror-bin.templates-in choose-mirror-2.111/debian/choose-mirror-bin.templates-in
--- choose-mirror-2.78ubuntu7+10.0trisquel3/debian/choose-mirror-bin.templates-in 2021-02-26 15:22:56.000000000 -0600
+++ choose-mirror-2.111/debian/choose-mirror-bin.templates-in 2021-02-08 06:52:03.000000000 -0600
-@@ -12,10 +12,14 @@
+@@ -12,14 +12,10 @@
Type: select
Choices-C: ${CHOICES-C}
Choices: ${CHOICES}
--Default: _CODENAME_
--Description: Trisquel version to install:
-- In Trisquel, this question is never asked, and is only for preseeding.
-- Caveat emptor.
-+# :sl2:
-+_Description: Debian version to install:
-+ Debian comes in several flavors. Stable is well-tested and rarely changes.
-+ Unstable is untested and frequently changing. Testing is a middle ground,
-+ that receives many of the new versions from unstable if they are not too
-+ buggy.
-+ .
-+ Only flavors available on the selected mirror are listed.
++Default: _CODENAME_
++Description: Trisquel version to install:
++ In Trisquel, this question is never asked, and is only for preseeding.
++ Caveat emptor.
+-# :sl2:
+-_Description: Debian version to install:
+- Debian comes in several flavors. Stable is well-tested and rarely changes.
+- Unstable is untested and frequently changing. Testing is a middle ground,
+- that receives many of the new versions from unstable if they are not too
+- buggy.
+- .
+- Only flavors available on the selected mirror are listed.
Template: mirror/codename
Type: string
diff --git a/helpers/DATA/choose-mirror/rev_Makefile.patch b/helpers/DATA/choose-mirror/rev_Makefile.patch
deleted file mode 100644
index eab1a6d..0000000
--- a/helpers/DATA/choose-mirror/rev_Makefile.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -ru choose-mirror-2.78ubuntu7+10.0trisquel3/Makefile choose-mirror-2.111/Makefile
---- choose-mirror-2.78ubuntu7+10.0trisquel3/Makefile 2021-02-26 15:22:56.000000000 -0600
-+++ choose-mirror-2.111/Makefile 2021-06-04 12:09:55.000000000 -0500
-@@ -33,8 +33,8 @@
- STRIP=strip
-
- # Derivative distributions may want to change these.
--#MIRRORLISTURL=https://anonscm.debian.org/git/mirror/mirror-masterlist.git/plain/Mirrors.masterlist
--MASTERLIST=Mirrors.masterlist.trisquel
-+MIRRORLISTURL=https://salsa.debian.org/mirror-team/masterlist/raw/master/Mirrors.masterlist
-+MASTERLIST=Mirrors.masterlist
-
- ifdef DEBUG
- CFLAGS:=$(CFLAGS) -DDODEBUG
diff --git a/helpers/DATA/cron/license-info-fix.patch b/helpers/DATA/cron/license-info-fix.patch
new file mode 100644
index 0000000..b6221bd
--- /dev/null
+++ b/helpers/DATA/cron/license-info-fix.patch
@@ -0,0 +1,37 @@
+diff --git a/debian/copyright b/debian/copyright
+index 3c8824f..c6ec81a 100644
+--- a/debian/copyright
++++ b/debian/copyright
+@@ -38,7 +38,7 @@ License: GPL-2+
+
+ Files: debian/examples/crontab2english.pl
+ Copyright: 2001, Sean M. Burke
+-License: Artistic
++License: GPL-1+ or Artistic
+
+ License: Paul-Vixie's-license
+ Distribute freely, except: don't remove my name from the source or
+@@ -67,6 +67,23 @@ License: GPL-2+
+ On Debian systems, the complete text of the GNU General
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
+
++License: GPL-1+
++ This package is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 1 of the License, or
++ (at your option) any later version.
++ .
++ This package is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++ .
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see
++ .
++ On Debian systems, the complete text of the GNU General
++ Public License version 1 can be found in "/usr/share/common-licenses/GPL-1".
++
+ License: Artistic
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the "Artistic License" which comes with Debian.
diff --git a/helpers/DATA/cwidget/0002-Fix-cwidget-and-aptitude-FTBFS.patch b/helpers/DATA/cwidget/0002-Fix-cwidget-and-aptitude-FTBFS.patch
deleted file mode 100644
index 7614cb8..0000000
--- a/helpers/DATA/cwidget/0002-Fix-cwidget-and-aptitude-FTBFS.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Description: Fix FTBFS in cwidget as well as in aptitude due to missing #include
-Author: Paul Wise
-Reviewed-By: Axel Beckert
-Bug-Debian: https://bugs.debian.org/1015925
-Bug: https://bugs.debian.org/1015925
-
---- a/src/cwidget/generic/threads/threads.h
-+++ b/src/cwidget/generic/threads/threads.h
-@@ -26,6 +26,7 @@
- #define THREADS_H
-
- #include
-+#include
- #include
-
- namespace cwidget
diff --git a/helpers/DATA/debconf-kde/patch_changes/000-fix_TPH_212_LP_1851573.patch b/helpers/DATA/debconf-kde/patch_changes/000-fix_TPH_212_LP_1851573.patch
new file mode 100644
index 0000000..0727b46
--- /dev/null
+++ b/helpers/DATA/debconf-kde/patch_changes/000-fix_TPH_212_LP_1851573.patch
@@ -0,0 +1,33 @@
+diff --git a/tools/main.cpp b/tools/main.cpp
+index 813aba5a..5f91e057 100644
+--- a/tools/main.cpp
++++ b/tools/main.cpp
+@@ -37,6 +37,8 @@
+
+ #include
+
++#include
++
+ using namespace DebconfKde;
+
+ // Handle SIGQUIT. Clients (e.g. packagekit) may use QUIT which would otherwise
+@@ -73,6 +76,19 @@ static void setupQuitHandler() {
+
+ int main(int argc, char **argv)
+ {
++ /* TPH: #212 | LP: #1851573 — When the helper is started through pkexec/aptdaemon
++ * the environment may arrive without $HOME. Without HOME, KConfig writes
++ * to "//.config/..." and shows a "not writable" dialog for every debconf
++ * question. Substitute the passwd entry’s home directory.
++ */
++ const char *homeEnv = getenv("HOME");
++ if (!homeEnv || homeEnv[0] == '\0') {
++ struct passwd *pw = getpwuid(getuid());
++ if (pw && pw->pw_dir) {
++ setenv("HOME", pw->pw_dir, /* overwrite = */ 1);
++ }
++ }
++
+ QApplication app(argc, argv);
+ setupQuitHandler();
+
diff --git a/helpers/DATA/debconf/patch_changes/000-add_Template_undef_guard.patch b/helpers/DATA/debconf/patch_changes/000-add_Template_undef_guard.patch
new file mode 100644
index 0000000..e30df28
--- /dev/null
+++ b/helpers/DATA/debconf/patch_changes/000-add_Template_undef_guard.patch
@@ -0,0 +1,12 @@
+diff --git a/Debconf/Template.pm b/Debconf/Template.pm
+index 9ab4833d..c3649929 100644
+--- a/Debconf/Template.pm
++++ b/Debconf/Template.pm
+@@ -140,6 +140,7 @@ Get an existing template (it may be pulled out of the database, etc).
+ sub get {
+ my Debconf::Template $this=shift;
+ my $template=shift;
++ return unless defined $template && length $template;
+ return $template{$template} if exists $template{$template};
+ if ($Debconf::Db::templates->exists($template)) {
+ $this = fields::new($this);
diff --git a/helpers/DATA/debconf/patch_changes/001-add_DbDriver_Cache_undef_guard.patch b/helpers/DATA/debconf/patch_changes/001-add_DbDriver_Cache_undef_guard.patch
new file mode 100644
index 0000000..8f3b8ba
--- /dev/null
+++ b/helpers/DATA/debconf/patch_changes/001-add_DbDriver_Cache_undef_guard.patch
@@ -0,0 +1,12 @@
+diff --git a/Debconf/DbDriver/Cache.pm b/Debconf/DbDriver/Cache.pm
+index 1b0e36fb..2e80d3bb 100644
+--- a/Debconf/DbDriver/Cache.pm
++++ b/Debconf/DbDriver/Cache.pm
+@@ -122,6 +122,7 @@ undef -- marked as deleted in the cache, so does not exist
+ sub exists {
+ my $this=shift;
+ my $item=shift;
++ return 0 unless defined $item && length $item;
+
+ return $this->{cache}->{$item}
+ if exists $this->{cache}->{$item};
diff --git a/helpers/DATA/debian-installer/001_remove-proposed-updates.patch b/helpers/DATA/debian-installer/001_remove-proposed-updates.patch
new file mode 100644
index 0000000..4dc8a0d
--- /dev/null
+++ b/helpers/DATA/debian-installer/001_remove-proposed-updates.patch
@@ -0,0 +1,25 @@
+diff --git a/build/Makefile b/build/Makefile
+index 0aeccf2a..17cf6a43 100644
+--- a/build/Makefile
++++ b/build/Makefile
+@@ -673,7 +673,7 @@ sources.list.udeb:
+ echo "deb $(MIRROR) unreleased $(UDEB_COMPONENTS)"; \
+ fi \
+ else \
+- gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" $(USE_UDEBS_FROM) "$(UDEB_COMPONENTS)" $(USE_PROPOSED_UPDATES); \
++ gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" $(USE_UDEBS_FROM) "$(UDEB_COMPONENTS)"; \
+ if [ "$(USE_UNRELEASED)" = 1 ]; then \
+ gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" unreleased "$(UDEB_COMPONENTS)"; \
+ fi \
+diff --git a/debian/rules b/debian/rules
+index 371e8b57..6caa6641 100755
+--- a/debian/rules
++++ b/debian/rules
+@@ -13,7 +13,6 @@ TRANSSTATUS=
+ BOOTMENU_BEEP=n
+ else
+ USE_UDEBS_FROM=trixie
+-USE_PROPOSED_UPDATES=1
+ TRANSSTATUS=translation-status
+ BOOTMENU_BEEP=y
+ endif
diff --git a/helpers/DATA/debian-installer/chmod_755_ld-linux2.patch b/helpers/DATA/debian-installer/002_chmod_755_ld-linux2.patch
similarity index 80%
rename from helpers/DATA/debian-installer/chmod_755_ld-linux2.patch
rename to helpers/DATA/debian-installer/002_chmod_755_ld-linux2.patch
index d1f7ed7..763e442 100644
--- a/helpers/DATA/debian-installer/chmod_755_ld-linux2.patch
+++ b/helpers/DATA/debian-installer/002_chmod_755_ld-linux2.patch
@@ -1,17 +1,18 @@
diff --git a/build/Makefile b/build/Makefile
-index c073a32..cace03d 100644
+index d45f982c..353e516e 100644
--- a/build/Makefile
+++ b/build/Makefile
-@@ -431,6 +431,12 @@ endif
+@@ -458,6 +458,13 @@ ifneq (,$(filter $(ARCH),amd64 arm64 i386))
+ fi
+ endif
- ifeq ($(DEB_HOST_ARCH_OS),linux)
- ifdef KERNELVERSION
+ifneq ($(DEB_HOST_ARCH),ppc64el)
+ find $(TREE)/lib/$(DEB_HOST_MULTIARCH)/ -name "ld-linux*" | xargs -r chmod 755
+endif
+ifeq ($(DEB_HOST_ARCH),ppc64el)
+ chmod 755 $(TREE)/lib/$(DEB_HOST_MULTIARCH)/ld*.so*
+endif
++
# Set up modules.dep, ensure there is at least one standard dir (kernel
# in this case), so depmod will use its prune list for archs with no
# modules.
diff --git a/helpers/DATA/debian-installer/medium_supported.patch b/helpers/DATA/debian-installer/003_medium_supported.patch
similarity index 99%
rename from helpers/DATA/debian-installer/medium_supported.patch
rename to helpers/DATA/debian-installer/003_medium_supported.patch
index 735a84a..8393a24 100644
--- a/helpers/DATA/debian-installer/medium_supported.patch
+++ b/helpers/DATA/debian-installer/003_medium_supported.patch
@@ -11,7 +11,7 @@ diff -Nru debian-installer-20210731+deb11u8+11.0trisquel13/build/config/arm64.cf
--- debian-installer-20210731+deb11u8+11.0trisquel13/build/config/arm64.cfg 2023-05-12 13:48:56.073639701 -0600
+++ debian-installer-20210731+deb11u8+11.0trisquel13_/build/config/arm64.cfg 2023-05-12 14:00:45.351718688 -0600
@@ -1,4 +1,4 @@
--MEDIUM_SUPPORTED = cdrom netboot netboot-gtk device-tree u-boot
+-MEDIUM_SUPPORTED = cdrom netboot netboot-gtk device-tree u-boot hd-media
+MEDIUM_SUPPORTED = cdrom netboot device-tree u-boot
KERNELMAJOR = 2.6
diff --git a/helpers/DATA/debian-installer/004_set-kernel-on-control-file.patch b/helpers/DATA/debian-installer/004_set-kernel-on-control-file.patch
new file mode 100644
index 0000000..c1471bb
--- /dev/null
+++ b/helpers/DATA/debian-installer/004_set-kernel-on-control-file.patch
@@ -0,0 +1,15 @@
+diff --git a/debian/control b/debian/control
+index c56adcf9..d45d50c4 100644
+--- a/debian/control
++++ b/debian/control
+@@ -168,8 +168,8 @@ Build-Depends:
+ # when creating ISO hybrid images on amd64 and i386 systems.
+ fontconfig,
+ # Used to generate a font cache through fc-cache, for gtk flavours
+- linux-image-@@DEBIAN_KERNEL@@-amd64 [amd64],
+- linux-image-@@DEBIAN_KERNEL@@-arm64 [arm64],
++ linux-image-@@DEBIAN_KERNEL@@-generic [amd64],
++ linux-image-@@DEBIAN_KERNEL@@-generic [arm64],
+ # Ship some more drm modules, without waiting on fb-modules (#1036019)
+
+ Package: debian-installer
diff --git a/helpers/DATA/debian-installer/006_prevent_error_unversioned_kernel_usage.patch b/helpers/DATA/debian-installer/006_prevent_error_unversioned_kernel_usage.patch
new file mode 100644
index 0000000..d24378b
--- /dev/null
+++ b/helpers/DATA/debian-installer/006_prevent_error_unversioned_kernel_usage.patch
@@ -0,0 +1,17 @@
+diff --git a/build/Makefile b/build/Makefile
+index 8a4717cb..c1c1c239 100644
+--- a/build/Makefile
++++ b/build/Makefile
+@@ -428,8 +428,12 @@ ifeq ($(filter $(DEB_HOST_ARCH),mips64el hppa sh4),)
+ # though (see KERNELNAME variable).
+ VMLINUXZ=`find $(TREE)/boot/ -name 'vmlinu[xz]-*'`; \
+ if [ `echo "$$VMLINUXZ" | wc -w` != 1 ]; then \
++ if [ ! -e $(TREE)/boot/vmlinuz ] && [ ! -e $(TREE)/boot/vmlinux ]; then \
+ echo "E: unexpected number of vmlinu[xz]-* in tree: $$VMLINUXZ (expected: 1)" >&2; \
+ exit 1; \
++ else \
++ echo "W: skipping unversioning; vmlinuz/vmlinux already exists" >&2; \
++ fi; \
+ else \
+ echo "I: unversioning vmlinu[xz]" >&2; \
+ mv -v $$VMLINUXZ $(TREE)/boot/`basename $$VMLINUXZ|sed 's/-.*//'`; \
diff --git a/helpers/DATA/debian-installer/di_focal/1422_1421.diff b/helpers/DATA/debian-installer/di_focal/1422_1421.diff
index f62a271..9176f78 100644
--- a/helpers/DATA/debian-installer/di_focal/1422_1421.diff
+++ b/helpers/DATA/debian-installer/di_focal/1422_1421.diff
@@ -1,6 +1,6 @@
=== modified file 'build/Makefile'
---- build/Makefile 2010-11-05 16:34:29 +0000
-+++ build/Makefile 2011-03-01 11:42:39 +0000
+--- a/build/Makefile 2010-11-05 16:34:29 +0000
++++ b/build/Makefile 2011-03-01 11:42:39 +0000
@@ -294,6 +294,7 @@
rm -rf $(TREE)
# Set up the basic files [u]dpkg needs.
@@ -19,8 +19,8 @@
ifdef EXTRADRIVERS
#=== modified file 'debian/changelog'
-#--- debian/changelog 2011-03-01 10:36:50 +0000
-#+++ debian/changelog 2011-03-01 11:42:39 +0000
+#--- a/debian/changelog 2011-03-01 10:36:50 +0000
+#+++ b/debian/changelog 2011-03-01 11:42:39 +0000
#@@ -1,3 +1,10 @@
#+debian-installer (20101020ubuntu21) UNRELEASED; urgency=low
#+
diff --git a/helpers/DATA/debian-installer/di_focal/1677_1676.diff b/helpers/DATA/debian-installer/di_focal/1677_1676.diff
index 8a497ec..bb0afae 100644
--- a/helpers/DATA/debian-installer/di_focal/1677_1676.diff
+++ b/helpers/DATA/debian-installer/di_focal/1677_1676.diff
@@ -1,6 +1,6 @@
=== modified file 'build/Makefile'
-#--- build/Makefile 2011-12-15 15:35:38 +0000
-#+++ build/Makefile 2012-04-18 05:24:59 +0000
+#--- a/build/Makefile 2011-12-15 15:35:38 +0000
+#+++ b/build/Makefile 2012-04-18 05:24:59 +0000
#@@ -493,6 +493,12 @@
# `find $(TEMP) -type f -a \( -perm +0111 -o -name '*.so' -o -name '*.so.*' \) | \
# grep -v udeblibs | grep -v 'usr/lib/xorg/modules/.*\.so'`
@@ -16,8 +16,8 @@
# # have the ld.so symlink as the interpreter. Ideally mklibs should
#
=== modified file 'build/config/armhf.cfg'
---- build/config/armhf.cfg 2012-04-11 08:52:18 +0000
-+++ build/config/armhf.cfg 2012-04-18 05:24:59 +0000
+--- a/build/config/armhf.cfg 2012-04-11 08:52:18 +0000
++++ b/build/config/armhf.cfg 2012-04-18 05:24:59 +0000
@@ -1,5 +1,7 @@
SUBARCH_SUPPORTED = omap omap4 armadaxp
@@ -28,8 +28,8 @@
KERNEL_FLAVOUR = di
#=== modified file 'debian/changelog'
-#--- debian/changelog 2012-04-13 13:14:35 +0000
-#+++ debian/changelog 2012-04-18 05:24:59 +0000
+#--- a/debian/changelog 2012-04-13 13:14:35 +0000
+#+++ b/debian/changelog 2012-04-18 05:24:59 +0000
#@@ -1,3 +1,12 @@
#+debian-installer (20101020ubuntu134) precise; urgency=low
#+
diff --git a/helpers/DATA/debian-installer/di_focal/2057_2056.diff b/helpers/DATA/debian-installer/di_focal/2057_2056.diff
index 9e81bc2..3bbb2d0 100644
--- a/helpers/DATA/debian-installer/di_focal/2057_2056.diff
+++ b/helpers/DATA/debian-installer/di_focal/2057_2056.diff
@@ -1,6 +1,6 @@
=== modified file 'build/Makefile'
---- build/Makefile 2015-01-22 12:10:03 +0000
-+++ build/Makefile 2015-03-17 21:09:21 +0000
+--- a/build/Makefile 2015-01-22 12:10:03 +0000
++++ b/build/Makefile 2015-03-17 21:09:21 +0000
@@ -414,6 +414,14 @@
# These files are used to build special kernel images for some
@@ -46,8 +46,8 @@
# install -m 644 -D $(TEMP_BOOT)$(GZIPPED) $@
#=== added file 'build/boot/README.device-tree'
-#--- build/boot/README.device-tree 1970-01-01 00:00:00 +0000
-#+++ build/boot/README.device-tree 2015-02-13 23:50:29 +0000
+#--- a/build/boot/README.device-tree 1970-01-01 00:00:00 +0000
+#+++ b/build/boot/README.device-tree 2015-02-13 23:50:29 +0000
#@@ -0,0 +1,2 @@
#+This directory contains all of the device-tree files shipped by the Ubuntu
#+kernel package.
@@ -63,8 +63,8 @@
#+
#=== modified file 'build/config/arm64.cfg'
-#--- build/config/arm64.cfg 2015-05-09 07:52:07 +0000
-#+++ build/config/arm64.cfg 2015-05-12 16:01:14 +0000
+#--- a/build/config/arm64.cfg 2015-05-09 07:52:07 +0000
+#+++ b/build/config/arm64.cfg 2015-05-12 16:01:14 +0000
#@@ -1,14 +1,98 @@
#-SUBARCH_SUPPORTED = generic
#-
@@ -173,16 +173,16 @@
=== added directory 'build/config/arm64/cdrom'
=== added file 'build/config/arm64/cdrom.cfg'
-#--- build/config/arm64/cdrom.cfg 1970-01-01 00:00:00 +0000
-#+++ build/config/arm64/cdrom.cfg 2015-02-24 05:14:26 +0000
+#--- a/build/config/arm64/cdrom.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/config/arm64/cdrom.cfg 2015-02-24 05:14:26 +0000
#@@ -0,0 +1,3 @@
#+FLAVOUR_SUPPORTED = grub
#+
#+MEDIA_TYPE = CD-ROM
=== added file 'build/config/arm64/cdrom/grub.cfg'
-#--- build/config/arm64/cdrom/grub.cfg 1970-01-01 00:00:00 +0000
-#+++ build/config/arm64/cdrom/grub.cfg 2015-02-24 05:14:26 +0000
+#--- a/build/config/arm64/cdrom/grub.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/config/arm64/cdrom/grub.cfg 2015-02-24 05:14:26 +0000
#@@ -0,0 +1,8 @@
#+MEDIA_TYPE = CD-ROM
#+TARGET = $(INITRD) $(KERNEL) $(DEBIAN_CD_INFO)
@@ -194,8 +194,8 @@
#+TYPE = cdrom/grub
#=== added file 'build/config/arm64/device-tree.cfg'
-#--- build/config/arm64/device-tree.cfg 1970-01-01 00:00:00 +0000
-#+++ build/config/arm64/device-tree.cfg 2015-02-13 23:51:06 +0000
+#--- a/build/config/arm64/device-tree.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/config/arm64/device-tree.cfg 2015-02-13 23:51:06 +0000
#@@ -0,0 +1,4 @@
#+MEDIA_TYPE = device-tree blobs
#+
@@ -203,8 +203,8 @@
#+EXTRANAME = $(MEDIUM)/
#=== removed file 'build/config/arm64/generic.cfg'
-#--- build/config/arm64/generic.cfg 2014-01-27 14:09:42 +0000
-#+++ build/config/arm64/generic.cfg 1970-01-01 00:00:00 +0000
+#--- a/build/config/arm64/generic.cfg 2014-01-27 14:09:42 +0000
+#+++ b/build/config/arm64/generic.cfg 1970-01-01 00:00:00 +0000
#@@ -1,7 +0,0 @@
#-MEDIUM_SUPPORTED = netboot
#-
@@ -215,8 +215,8 @@
#-VERSIONED_SYSTEM_MAP =
#=== removed file 'build/config/arm64/generic/netboot.cfg'
-#--- build/config/arm64/generic/netboot.cfg 2015-02-27 10:58:49 +0000
-#+++ build/config/arm64/generic/netboot.cfg 1970-01-01 00:00:00 +0000
+#--- a/build/config/arm64/generic/netboot.cfg 2015-02-27 10:58:49 +0000
+#+++ b/build/config/arm64/generic/netboot.cfg 1970-01-01 00:00:00 +0000
#@@ -1,33 +0,0 @@
#-MEDIA_TYPE = netboot image
#-TARGET = $(TEMP_INITRD) $(TEMP_KERNEL) all-generic
@@ -253,8 +253,8 @@
#-all-generic: generic xgene
=== added file 'build/config/arm64/netboot.cfg'
-#--- build/config/arm64/netboot.cfg 1970-01-01 00:00:00 +0000
-#+++ build/config/arm64/netboot.cfg 2015-02-24 05:45:09 +0000
+#--- a/build/config/arm64/netboot.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/config/arm64/netboot.cfg 2015-02-24 05:45:09 +0000
#@@ -0,0 +1,37 @@
#+MEDIA_TYPE = netboot image
#+
@@ -295,8 +295,8 @@
#+ mkimage -A arm -O linux -T ramdisk -C none -a 0x0 -e 0x0 -n "debian-installer ramdisk" -d $(TEMP_INITRD) $(XU_INSTALL_PATH)/uInitrd
#=== modified file 'build/config/dir'
-#--- build/config/dir 2010-08-25 22:06:28 +0000
-#+++ build/config/dir 2015-02-13 23:50:29 +0000
+#--- a/build/config/dir 2010-08-25 22:06:28 +0000
+#+++ b/build/config/dir 2015-02-13 23:50:29 +0000
#@@ -62,6 +62,7 @@
# # The files we may want to have in dest/
# INITRD = $(SOME_DEST)/$(EXTRANAME)initrd.gz
@@ -315,8 +315,8 @@
# TEMP_MINIISO = $(TEMP)/mini.iso
#=== added file 'build/pkg-lists/cdrom/arm64.cfg'
-#--- build/pkg-lists/cdrom/arm64.cfg 1970-01-01 00:00:00 +0000
-#+++ build/pkg-lists/cdrom/arm64.cfg 2015-02-24 05:14:26 +0000
+#--- a/build/pkg-lists/cdrom/arm64.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/pkg-lists/cdrom/arm64.cfg 2015-02-24 05:14:26 +0000
#@@ -0,0 +1,11 @@
#+fat-modules-${kernel:Version}
#+storage-core-modules-${kernel:Version}
@@ -332,15 +332,15 @@
#=== added directory 'build/pkg-lists/cdrom/grub'
#=== added file 'build/pkg-lists/cdrom/grub/arm64.cfg'
-#--- build/pkg-lists/cdrom/grub/arm64.cfg 1970-01-01 00:00:00 +0000
-#+++ build/pkg-lists/cdrom/grub/arm64.cfg 2015-02-24 05:14:26 +0000
+#--- a/build/pkg-lists/cdrom/grub/arm64.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/pkg-lists/cdrom/grub/arm64.cfg 2015-02-24 05:14:26 +0000
#@@ -0,0 +1,2 @@
#+# This image is based on the regular cdrom image, and gets all the packages
#+# from that one too.
#=== added file 'build/pkg-lists/cdrom/grub/common'
-#--- build/pkg-lists/cdrom/grub/common 1970-01-01 00:00:00 +0000
-#+++ build/pkg-lists/cdrom/grub/common 2015-03-17 21:09:21 +0000
+#--- a/build/pkg-lists/cdrom/grub/common 1970-01-01 00:00:00 +0000
+#+++ b/build/pkg-lists/cdrom/grub/common 2015-03-17 21:09:21 +0000
#@@ -0,0 +1,3 @@
#+# This image is based on the regular cdrom image, and gets all the packages
#+# from that one too.
@@ -348,20 +348,20 @@
=== added directory 'build/pkg-lists/device-tree'
#=== added file 'build/pkg-lists/device-tree/arm64.cfg'
-#--- build/pkg-lists/device-tree/arm64.cfg 1970-01-01 00:00:00 +0000
-#+++ build/pkg-lists/device-tree/arm64.cfg 2015-02-13 23:51:06 +0000
+#--- a/build/pkg-lists/device-tree/arm64.cfg 1970-01-01 00:00:00 +0000
+#+++ b/build/pkg-lists/device-tree/arm64.cfg 2015-02-13 23:51:06 +0000
#@@ -0,0 +1,1 @@
#+# Empty
=== added file 'build/pkg-lists/device-tree/common'
-#--- build/pkg-lists/device-tree/common 1970-01-01 00:00:00 +0000
-#+++ build/pkg-lists/device-tree/common 2015-02-13 23:50:29 +0000
+#--- a/build/pkg-lists/device-tree/common 1970-01-01 00:00:00 +0000
+#+++ b/build/pkg-lists/device-tree/common 2015-02-13 23:50:29 +0000
#@@ -0,0 +1,1 @@
#+#include "kernel"
#=== modified file 'build/util/efi-image'
-#--- build/util/efi-image 2012-10-15 20:03:40 +0000
-#+++ build/util/efi-image 2015-02-24 04:58:57 +0000
+#--- a/build/util/efi-image 2012-10-15 20:03:40 +0000
+#+++ b/build/util/efi-image 2015-02-24 04:58:57 +0000
#@@ -22,13 +22,14 @@
# # it exists.
#
@@ -392,8 +392,8 @@
# size=$(( $(stat -c %s "$workdir/boot$efi_name.efi") / 1024 ))
#=== added file 'build/util/grub-gencfg'
-#--- build/util/grub-gencfg 1970-01-01 00:00:00 +0000
-#+++ build/util/grub-gencfg 2015-03-23 23:27:39 +0000
+#--- a/build/util/grub-gencfg 1970-01-01 00:00:00 +0000
+#+++ b/build/util/grub-gencfg 2015-03-23 23:27:39 +0000
#@@ -0,0 +1,210 @@
#+#!/usr/bin/perl
#+
@@ -607,8 +607,8 @@
#+menuentry('Install with speech synthesis', Graphical => $graphical, Speach => 1);
#=== modified file 'debian/changelog'
-#--- debian/changelog 2015-05-09 07:52:07 +0000
-#+++ debian/changelog 2015-05-14 14:24:09 +0000
+#--- a/debian/changelog 2015-05-09 07:52:07 +0000
+#+++ b/debian/changelog 2015-05-14 14:24:09 +0000
#@@ -1,3 +1,25 @@
#+debian-installer (20101020ubuntu379) UNRELEASED; urgency=medium
#+
@@ -637,8 +637,8 @@
# * Move master kernels to 3.19.0-17.
#=== modified file 'debian/control'
-#--- debian/control 2014-10-30 08:19:25 +0000
-#+++ debian/control 2015-04-03 21:16:40 +0000
+#--- a/debian/control 2014-10-30 08:19:25 +0000
+#+++ b/debian/control 2015-04-03 21:16:40 +0000
#@@ -9,7 +9,7 @@
# Vcs-Bzr: http://bazaar.launchpad.net/~ubuntu-core-dev/debian-installer/ubuntu
# Build-Conflicts: libnewt-pic [mipsel]
diff --git a/helpers/DATA/debian-installer/di_focal/2144_2143.diff b/helpers/DATA/debian-installer/di_focal/2144_2143.diff
index 3ce1be3..5bc9f23 100644
--- a/helpers/DATA/debian-installer/di_focal/2144_2143.diff
+++ b/helpers/DATA/debian-installer/di_focal/2144_2143.diff
@@ -1,6 +1,6 @@
=== modified file 'build/Makefile'
-#--- build/Makefile 2015-12-09 17:32:28 +0000
-#+++ build/Makefile 2016-04-16 19:45:21 +0000
+#--- a/build/Makefile 2015-12-09 17:32:28 +0000
+#+++ b/build/Makefile 2016-04-16 19:45:21 +0000
#@@ -525,12 +525,6 @@
# `find $(TEMP) -type f -a \( -perm /0111 -o -name '*.so' -o -name '*.so.*' \) | \
# grep -v udeblibs | grep -v 'usr/lib/xorg/modules/.*\.so'`
@@ -16,8 +16,8 @@
# # have the ld.so symlink as the interpreter. Ideally mklibs should
#
#=== modified file 'build/config/amd64.cfg'
-#--- build/config/amd64.cfg 2016-04-08 14:58:47 +0000
-#+++ build/config/amd64.cfg 2016-04-16 19:45:21 +0000
+#--- a/build/config/amd64.cfg 2016-04-08 14:58:47 +0000
+#+++ b/build/config/amd64.cfg 2016-04-16 19:45:21 +0000
#@@ -1,8 +1,6 @@
# MEDIUM_SUPPORTED = cdrom cdrom-xen netboot netboot-xen hd-media # netboot-gtk
# MEDIUM_SUPPORTED_EXTRA = monolithic
@@ -29,8 +29,8 @@
# KERNELVERSION = $(BASEVERSION)-generic
#=== modified file 'build/config/amd64/netboot.cfg'
-#--- build/config/amd64/netboot.cfg 2016-03-27 03:15:58 +0000
-#+++ build/config/amd64/netboot.cfg 2016-04-16 19:45:21 +0000
+#--- a/build/config/amd64/netboot.cfg 2016-03-27 03:15:58 +0000
+#+++ b/build/config/amd64/netboot.cfg 2016-04-16 19:45:21 +0000
#@@ -1,7 +1,7 @@
# MEDIA_TYPE = netboot image
#
@@ -42,8 +42,8 @@
=== modified file 'build/config/armhf.cfg'
---- build/config/armhf.cfg 2016-04-08 14:58:47 +0000
-+++ build/config/armhf.cfg 2016-04-16 19:45:21 +0000
+--- a/build/config/armhf.cfg 2016-04-08 14:58:47 +0000
++++ b/build/config/armhf.cfg 2016-04-16 19:45:21 +0000
@@ -1,6 +1,6 @@
SUBARCH_SUPPORTED = generic-lpae generic
@@ -54,8 +54,8 @@
KERNELVERSION = 4.4.0-18
#=== modified file 'build/config/common'
-#--- build/config/common 2015-11-12 19:14:48 +0000
-#+++ build/config/common 2016-04-16 19:45:21 +0000
+#--- a/build/config/common 2015-11-12 19:14:48 +0000
+#+++ b/build/config/common 2016-04-16 19:45:21 +0000
#@@ -24,7 +24,7 @@
#
# # The library reducer to use. Set to mklibs (to build with library reduction)
@@ -67,8 +67,8 @@
# # "normal" sources.list. However, you can specify a mirror here to override
#=== modified file 'build/config/i386/netboot.cfg'
-#--- build/config/i386/netboot.cfg 2016-03-22 04:37:29 +0000
-#+++ build/config/i386/netboot.cfg 2016-04-16 19:45:21 +0000
+#--- a/build/config/i386/netboot.cfg 2016-03-22 04:37:29 +0000
+#+++ b/build/config/i386/netboot.cfg 2016-04-16 19:45:21 +0000
#@@ -3,7 +3,7 @@
# MEDIA_TYPE = netboot image
#
@@ -80,8 +80,8 @@
#=== modified file 'build/config/powerpc/powerpc/netboot.cfg'
-#--- build/config/powerpc/powerpc/netboot.cfg 2016-03-22 05:15:29 +0000
-#+++ build/config/powerpc/powerpc/netboot.cfg 2016-04-16 19:45:21 +0000
+#--- a/build/config/powerpc/powerpc/netboot.cfg 2016-03-22 05:15:29 +0000
+#+++ b/build/config/powerpc/powerpc/netboot.cfg 2016-04-16 19:45:21 +0000
#@@ -1,7 +1,7 @@
# MEDIA_TYPE = netboot image
#
@@ -93,8 +93,8 @@
#=== modified file 'build/config/ppc64el.cfg'
-#--- build/config/ppc64el.cfg 2016-04-08 14:58:47 +0000
-#+++ build/config/ppc64el.cfg 2016-04-16 19:45:21 +0000
+#--- a/build/config/ppc64el.cfg 2016-04-08 14:58:47 +0000
+#+++ b/build/config/ppc64el.cfg 2016-04-16 19:45:21 +0000
#@@ -1,7 +1,5 @@
# MEDIUM_SUPPORTED = netboot cdrom
#
@@ -105,8 +105,8 @@
# KERNELVERSION = $(BASEVERSION)-generic
#=== modified file 'build/pkg-lists/base'
-#--- build/pkg-lists/base 2015-09-22 18:31:39 +0000
-#+++ build/pkg-lists/base 2016-04-16 19:45:21 +0000
+#--- a/build/pkg-lists/base 2015-09-22 18:31:39 +0000
+#+++ b/build/pkg-lists/base 2016-04-16 19:45:21 +0000
#@@ -10,7 +10,6 @@
# di-utils-shell
# libdebconfclient0-udeb
@@ -117,8 +117,8 @@
# main-menu
#=== modified file 'build/pkg-lists/exclude'
-#--- build/pkg-lists/exclude 2010-05-24 15:01:07 +0000
-#+++ build/pkg-lists/exclude 2016-04-16 19:45:21 +0000
+#--- a/build/pkg-lists/exclude 2010-05-24 15:01:07 +0000
+#+++ b/build/pkg-lists/exclude 2016-04-16 19:45:21 +0000
#@@ -2,15 +2,6 @@
# # they are currently provided not in udeb form but by the library
# # reduction step.
@@ -137,8 +137,8 @@
# # and newt
#=== modified file 'build/pkg-lists/gtk-common'
-#--- build/pkg-lists/gtk-common 2015-05-14 17:55:41 +0000
-#+++ build/pkg-lists/gtk-common 2016-04-16 19:45:21 +0000
+#--- a/build/pkg-lists/gtk-common 2015-05-14 17:55:41 +0000
+#+++ b/build/pkg-lists/gtk-common 2016-04-16 19:45:21 +0000
#@@ -1,5 +1,4 @@
# # udebs needed for graphical installer
#-libnss-files-udeb
@@ -147,8 +147,8 @@
# cdebconf-gtk-terminal
#=== modified file 'build/pkg-lists/network-console'
-#--- build/pkg-lists/network-console 2004-06-29 08:17:34 +0000
-#+++ build/pkg-lists/network-console 2016-04-16 19:45:21 +0000
+#--- a/build/pkg-lists/network-console 2004-06-29 08:17:34 +0000
+#+++ b/build/pkg-lists/network-console 2016-04-16 19:45:21 +0000
#@@ -1,4 +1,3 @@
# openssh-server-udeb
#-libnss-files-udeb
@@ -156,8 +156,8 @@
#=== modified file 'debian/changelog'
-#--- debian/changelog 2016-04-13 12:07:03 +0000
-#+++ debian/changelog 2016-04-16 19:45:21 +0000
+#--- a/debian/changelog 2016-04-13 12:07:03 +0000
+#+++ b/debian/changelog 2016-04-16 19:45:21 +0000
#@@ -1,3 +1,16 @@
#+debian-installer (20101020ubuntu448) xenial; urgency=medium
#+
@@ -177,8 +177,8 @@
# * Rebuild with updated udebs for s390x.
=== modified file 'debian/control'
-#--- debian/control 2016-02-19 17:00:28 +0000
-#+++ debian/control 2016-04-16 19:45:21 +0000
+#--- a/debian/control 2016-02-19 17:00:28 +0000
+#+++ b/debian/control 2016-04-16 19:45:21 +0000
#@@ -9,7 +9,7 @@
# Vcs-Bzr: http://bazaar.launchpad.net/~ubuntu-core-dev/debian-installer/ubuntu
# Build-Conflicts: libnewt-pic [mipsel]
@@ -207,8 +207,8 @@
# # - genisoimage (>= 9:1.1.10-1ubuntu2) [!s390 !s390x]
# # For making mini isos.
##Ark74's fix
---- debian/control 2023-05-10 08:36:56.311243556 -0600
-+++ debian/control 2023-05-10 12:00:07.617639516 -0600
+--- a/debian/control 2023-05-10 08:36:56.311243556 -0600
++++ b/debian/control 2023-05-10 12:00:07.617639516 -0600
@@ -45,6 +45,7 @@
# them.
# Lintian: Yes, we know it's essential. We prefer not to
diff --git a/helpers/DATA/debian-installer/di_focal/2273_2272.diff b/helpers/DATA/debian-installer/di_focal/2273_2272.diff
index 5012ced..9cc5b24 100644
--- a/helpers/DATA/debian-installer/di_focal/2273_2272.diff
+++ b/helpers/DATA/debian-installer/di_focal/2273_2272.diff
@@ -1,6 +1,6 @@
=== modified file 'build/Makefile'
---- build/Makefile 2018-02-15 11:44:41 +0000
-+++ build/Makefile 2018-07-22 10:55:51 +0000
+--- a/build/Makefile 2018-02-15 11:44:41 +0000
++++ b/build/Makefile 2018-07-22 10:55:51 +0000
@@ -782,6 +782,8 @@
update-manifest $@ $(MANIFEST-BOOT) $(UDEB_LISTS)
@@ -12,8 +12,8 @@
#=== modified file 'debian/changelog'
-#--- debian/changelog 2018-06-14 10:36:23 +0000
-#+++ debian/changelog 2018-07-22 10:55:51 +0000
+#--- a/debian/changelog 2018-06-14 10:36:23 +0000
+#+++ b/debian/changelog 2018-07-22 10:55:51 +0000
#@@ -1,3 +1,9 @@
#+debian-installer (20101020ubuntu547) UNRELEASED; urgency=medium
#+
diff --git a/helpers/DATA/debian-installer/patch_changes/007-remove_graphical_options_from_netinstall.patch b/helpers/DATA/debian-installer/patch_changes/007-remove_graphical_options_from_netinstall.patch
new file mode 100644
index 0000000..895e9a1
--- /dev/null
+++ b/helpers/DATA/debian-installer/patch_changes/007-remove_graphical_options_from_netinstall.patch
@@ -0,0 +1,59 @@
+diff --git a/build/util/grub-gencfg b/build/util/grub-gencfg
+index 6b38cd88..f5df37a5 100755
+--- a/build/util/grub-gencfg
++++ b/build/util/grub-gencfg
+@@ -208,54 +208,18 @@ menuentry("Install");
+ menuentry("Graphical install", Graphical => 1);
+
+ start_submenu("Advanced options ...", Hotkey => 'a'); {
+- menuentry("... Graphical expert install", Graphical => 1, Expert => 1);
+- menuentry("... Graphical rescue mode", Graphical => 1, Rescue => 1);
+- menuentry("... Graphical automated install", Graphical => 1, Auto => 1);
+ menuentry("... Expert install", Expert => 1);
+ menuentry("... Rescue mode", Rescue => 1);
+ menuentry("... Automated install", Auto => 1);
+ menuentry("... Expert install with speech synthesis", Expert => 1, Speech => 1, Hotkey => 'x');
+ menuentry("... Rescue mode with speech synthesis", Rescue => 1, Speech => 1, Hotkey => 'r');
+ menuentry("... Automated install with speech synthesis", Auto => 1, Speech => 1, Hotkey => 'a');
+-
+- start_submenu("... Desktop environment menu ..."); {
+-
+- foreach ( ["GNOME", "gnome"], ["KDE Plasma", "kde"], ["LXDE", "lxde"] ) {
+- my ($desktop,$opt) = @{$_};
+-
+- my $one = sub { my ($title, %xargs) = @_;
+- $xargs{Desktop} = $opt;
+- menuentry($title, %xargs);
+- };
+- start_submenu("... $desktop desktop boot menu ..."); {
+- $one->("... Install");
+- $one->("... Graphical install", Graphical => 1);
+-
+- start_submenu("... $desktop advanced options ..."); {
+- $one->("... Graphical expert install", Graphical => 1, Expert => 1);
+- $one->("... Graphical automated install", Graphical => 1, Auto => 1);
+- $one->("... Expert install", Expert => 1);
+- $one->("... Automated install", Auto => 1);
+- $one->("... Expert install with speech synthesis", Expert => 1, Speech => 1, Hotkey => 'x');
+- $one->("... Automated install with speech synthesis", Auto => 1, Speech => 1, Hotkey => 'a');
+- } end_submenu(); # $desktop advanced
+-
+- $one->("... Install with speech synthesis", Graphical => 1, Speech => 1, Hotkey => 's');
+- $one->("... 32 bit speech install", ThirtyTwo => 1, Graphical => 1, Speech => 1)
+- if $thirtytwo;
+- } end_submenu(); # $desktop submenu
+- } # Desktop loop
+- } end_submenu(); # Desktop submenu
+ } end_submenu(); # Advanced
+
+ start_submenu("Accessible dark contrast installer menu ...", Hotkey => 'd', Dark => 1); {
+ menuentry("... Install", Dark => 1);
+- menuentry("... Graphical install", Graphical => 1, Dark => 1);
+
+ start_submenu("... Advanced options ...", Hotkey => 'a', Dark => 1); {
+- menuentry("... Graphical expert install", Graphical => 1, Expert => 1, Dark => 1);
+- menuentry("... Graphical rescue mode", Graphical => 1, Rescue => 1, Dark => 1);
+- menuentry("... Graphical automated install", Graphical => 1, Auto => 1, Dark => 1);
+ menuentry("... Expert install", Expert => 1, Dark => 1);
+ menuentry("... Rescue mode", Rescue => 1, Dark => 1);
+ menuentry("... Automated install", Auto => 1, Dark => 1);
diff --git a/helpers/DATA/debian-installer/patch_changes/008-re-enable_dpkg_force-overwrite.patch b/helpers/DATA/debian-installer/patch_changes/008-re-enable_dpkg_force-overwrite.patch
new file mode 100644
index 0000000..872c735
--- /dev/null
+++ b/helpers/DATA/debian-installer/patch_changes/008-re-enable_dpkg_force-overwrite.patch
@@ -0,0 +1,16 @@
+We'll remove the force-overwrite flag once we conclude the riscv rework on the kernel and new arch implementation.
+-- ark74 - Mon, 07 Jul 2025 23:27:26 -0600
+
+diff --git a/build/config/common b/build/config/common
+index 6e58ca8f..5953b26f 100644
+--- a/build/config/common
++++ b/build/config/common
+@@ -41,7 +41,7 @@ PRESEED =
+ # Options to pass to dpkg when it is unpacking the udebs to create the
+ # image. None should be needed, but --force-overwrite might need to be
+ # enabled from time to time if udebs have conflicting files.
+-DPKG_UNPACK_OPTIONS =
++DPKG_UNPACK_OPTIONS = --force-overwrite
+
+ # The codename of the Trisquel release that should be installed by default.
+ TRISQUEL_RELEASE = ecne
diff --git a/helpers/DATA/debian-installer/remove-proposed-updates.patch b/helpers/DATA/debian-installer/remove-proposed-updates.patch
deleted file mode 100644
index b6a8b96..0000000
--- a/helpers/DATA/debian-installer/remove-proposed-updates.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-diff -Nru source/build/Makefile source_no_proposed/build/Makefile
---- source/build/Makefile 2022-10-20 08:22:18.334230755 -0500
-+++ source_no_proposed/build/Makefile 2022-10-20 08:25:19.346634640 -0500
-@@ -636,7 +636,7 @@
- echo "deb $(MIRROR) unreleased $(UDEB_COMPONENTS)"; \
- fi \
- else \
-- gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" $(USE_UDEBS_FROM) $(UDEB_COMPONENTS) $(USE_PROPOSED_UPDATES); \
-+ gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" $(USE_UDEBS_FROM) $(UDEB_COMPONENTS); \
- if [ "$(USE_UNRELEASED)" = 1 ]; then \
- gen-sources.list.udeb "$(SYSTEM_SOURCES_LIST)" unreleased $(UDEB_COMPONENTS); \
- fi \
-@@ -648,10 +648,6 @@
- echo "Using generated $@:"; \
- sed -n "/^[^#]/ s/^/ /p" $@; \
- fi
-- @if [ "$(USE_PROPOSED_UPDATES)" = 1 ] && ! grep -q proposed-updates $@; then \
-- echo "ERROR: no valid source for $(USE_UDEBS_FROM)-proposed-updates"; \
-- exit 1; \
-- fi
-
- # Font generation.
- #
-diff -Nru source/build/util/gen-sources.list.udeb source_no_proposed/build/util/gen-sources.list.udeb
---- source/build/util/gen-sources.list.udeb 2022-09-06 15:55:12.000000000 -0500
-+++ source_no_proposed/build/util/gen-sources.list.udeb 2022-10-20 08:26:32.538801725 -0500
-@@ -8,7 +8,6 @@
- SOURCES_LIST=$1
- SUITE=$2
- UDEB_COMPONENTS=$3
--USE_PROPOSED_UPDATES=$4 # optional
-
- # Set to 1 or 2 to see increasing debug info about mirror tests
- # Use 0 for quiet (normal) operation
-@@ -84,16 +83,8 @@
- else
- echo "WARNING: mirror '$tmirror' appears to be invalid; skipping" >&2
- fi
-- if [ "$USE_PROPOSED_UPDATES" = 1 ] &&
-- test_url $tmirror/dists/$SUITE-proposed-updates/Release; then
-- echo "$mirror $SUITE-proposed-updates $UDEB_COMPONENTS"
-- echo "INFO: using '$tmirror' for $SUITE-proposed-updates" >&2
-- fi
- else
- echo "$mirror $SUITE $UDEB_COMPONENTS"
-- if [ "$USE_PROPOSED_UPDATES" = 1 ]; then
-- echo "$mirror $SUITE-proposed-updates $UDEB_COMPONENTS"
-- fi
- fi
-
- done | perl -ne 'print unless $seen{$_}; $seen{$_}=1'
-diff -Nru source/debian/rules source_no_proposed/debian/rules
---- source/debian/rules 2022-10-20 08:22:18.318230720 -0500
-+++ source_no_proposed/debian/rules 2022-10-20 08:26:53.702850378 -0500
-@@ -13,7 +13,6 @@
- BOOTMENU_BEEP=n
- else
- USE_UDEBS_FROM=aramo
--USE_PROPOSED_UPDATES=1
- TRANSSTATUS=translation-status
- BOOTMENU_BEEP=y
- endif
diff --git a/helpers/DATA/debootstrap/ecne b/helpers/DATA/debootstrap/ecne
new file mode 120000
index 0000000..fe1d521
--- /dev/null
+++ b/helpers/DATA/debootstrap/ecne
@@ -0,0 +1 @@
+trisquel
\ No newline at end of file
diff --git a/helpers/DATA/depthcharge-tools/patch_changes/001_prevent-error-when-using-versionless-vmlinuz-in-netinstall.patch b/helpers/DATA/depthcharge-tools/patch_changes/001_prevent-error-when-using-versionless-vmlinuz-in-netinstall.patch
new file mode 100644
index 0000000..56492c6
--- /dev/null
+++ b/helpers/DATA/depthcharge-tools/patch_changes/001_prevent-error-when-using-versionless-vmlinuz-in-netinstall.patch
@@ -0,0 +1,39 @@
+diff --git a/depthcharge_tools/depthchargectl/_build.py b/depthcharge_tools/depthchargectl/_build.py
+index a605b83c..746e8a51 100644
+--- a/depthcharge_tools/depthchargectl/_build.py
++++ b/depthcharge_tools/depthchargectl/_build.py
+@@ -157,11 +157,12 @@ class depthchargectl_build(
+ @Argument("--kernel-release", nargs=1)
+ def kernel_release(self, name=None):
+ """Release name for the kernel used in image name"""
+- if name is None and self.kernel_version is not None:
+- if self.kernel == self.kernel_version.kernel:
+- name = self.kernel_version.release
+-
+- return name
++ # Trisquel customization: skip autodetection and honor empty values.
++ if name is not None:
++ return name
++ if self.kernel_version is not None and self.kernel == self.kernel_version.kernel:
++ return self.kernel_version.release
++ return ""
+
+ @custom_kernel_options.add
+ @Argument("--kernel", nargs=1)
+diff --git a/depthcharge_tools/depthchargectl/_build.py b/depthcharge_tools/depthchargectl/_build.py
+index 746e8a51..45e0c02c 100644
+--- a/depthcharge_tools/depthchargectl/_build.py
++++ b/depthcharge_tools/depthchargectl/_build.py
+@@ -82,6 +82,12 @@ class depthchargectl_build(
+ @Argument
+ def kernel_version(self, kernel_version=None):
+ """Installed kernel version to build an image for."""
++
++ # Trisquel customization: If --kernel is set but --kernel-version is
++ # not, skip autodetection and return None early
++ if kernel_version is None and self.kernel is not None:
++ return None
++
+ if isinstance(kernel_version, KernelEntry):
+ return kernel_version
+
diff --git a/helpers/DATA/dia/patch_changes/000-apply_current_dia_mr_114.patch b/helpers/DATA/dia/patch_changes/000-apply_current_dia_mr_114.patch
new file mode 100644
index 0000000..80b30cf
--- /dev/null
+++ b/helpers/DATA/dia/patch_changes/000-apply_current_dia_mr_114.patch
@@ -0,0 +1,1324 @@
+From 6d7a3b627566ff2201292a45ed35a5ab3e425c13 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Sun, 15 Oct 2023 22:26:17 -0400
+Subject: [PATCH 1/4] objects: disable Tab in multi-line entry widgets
+
+This becomes a 'black hole' for focus, making it hard to navigate by
+keyboard. This is both annoying, and also an accessibility problem.
+---
+ lib/prop_text.c | 1 +
+ objects/UML/class_attributes_dialog.c | 1 +
+ objects/UML/class_dialog.c | 1 +
+ objects/UML/class_operations_dialog.c | 2 ++
+ 4 files changed, 5 insertions(+)
+
+diff --git a/lib/prop_text.c b/lib/prop_text.c
+index 4ff98f60d..8e1e9fcf7 100644
+--- a/lib/prop_text.c
++++ b/lib/prop_text.c
+@@ -125,6 +125,7 @@ multistringprop_get_widget(StringProperty *prop, PropDialog *dialog)
+ GtkWidget *ret = gtk_text_view_new();
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ret));
+ GtkWidget *frame = gtk_frame_new(NULL);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (ret), FALSE);
+ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+ gtk_container_add(GTK_CONTAINER(frame), ret);
+ g_signal_connect(G_OBJECT(ret), "key-release-event",
+diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c
+index 2722a2a03..085624e31 100644
+--- a/objects/UML/class_attributes_dialog.c
++++ b/objects/UML/class_attributes_dialog.c
+@@ -729,6 +729,7 @@ _attributes_create_page (GtkNotebook *notebook, UMLClass *umlclass)
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (entry), TRUE);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+ gtk_widget_show (entry);
+ #if 0 /* while the GtkEntry has a "activate" signal, GtkTextView does not.
+ * Maybe we should connect to "set-focus-child" instead?
+diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c
+index 8867ae9ac..163cc2949 100644
+--- a/objects/UML/class_dialog.c
++++ b/objects/UML/class_dialog.c
+@@ -382,6 +382,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass)
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
+ GTK_SHADOW_IN);
+ entry = gtk_text_view_new ();
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+ prop_dialog->comment = GTK_TEXT_VIEW(entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+
+diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c
+index a530337a9..936a8b575 100644
+--- a/objects/UML/class_operations_dialog.c
++++ b/objects/UML/class_operations_dialog.c
+@@ -982,6 +982,7 @@ operations_data_create_hbox (UMLClass *umlclass)
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (entry),TRUE);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+
+
+ gtk_grid_attach (GTK_GRID (grid), label, 4, 0, 1, 1);
+@@ -1340,6 +1341,7 @@ operations_parameters_data_create_vbox (UMLClass *umlclass)
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (entry),TRUE);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1);
+--
+GitLab
+
+
+From b5dc904ed58ea026898fbc7bf6940de97a6e4e15 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Mon, 16 Oct 2023 15:34:23 -0400
+Subject: [PATCH 2/4] font: don't store the height internally
+
+We now solely rely on the PangoFontDescription, which is more flexible and
+less prone to mistakes.
+---
+ lib/font.c | 85 ++++++++++++++++++++++----------------------------
+ lib/font.h | 2 ++
+ lib/libdia.def | 1 +
+ 3 files changed, 41 insertions(+), 47 deletions(-)
+
+diff --git a/lib/font.c b/lib/font.c
+index 1a321c462..6dec80bb1 100644
+--- a/lib/font.c
++++ b/lib/font.c
+@@ -39,6 +39,7 @@
+ #include "font.h"
+ #include "message.h"
+ #include "textline.h"
++#include "units.h"
+
+ static PangoContext *pango_context = NULL;
+
+@@ -53,13 +54,6 @@ struct _DiaFont {
+ PangoFontDescription *pfd;
+ /* mutable */ char *legacy_name;
+
+- /* there is a difference between Pango's font size and Dia's font height */
+- /* Calculated font_size is to make 'font_height = ascent + descent */
+- /* The font_height is used as default line height, there used to be a hard-coded size = 0.7 * height */
+- /* before using pango_set_absolute_size() to overcome font size differences between renderers */
+- double height;
+- /* Need to load a font to query it's metrics */
+- PangoFont *loaded;
+ PangoFontMetrics *metrics;
+ };
+
+@@ -136,8 +130,6 @@ dia_font_finalize (GObject *object)
+ g_clear_pointer (&font->pfd, pango_font_description_free);
+ g_clear_pointer (&font->metrics, pango_font_metrics_unref);
+
+- g_clear_object (&font->loaded);
+-
+ G_OBJECT_CLASS (dia_font_parent_class)->finalize (object);
+ }
+
+@@ -166,33 +158,17 @@ dia_pfd_set_height(PangoFontDescription *pfd, double height)
+ }
+
+
+-/*!
+- * In Dia a font is usually referred to by it's (line-) height, not it's size.
+- *
+- * This methods "calculates" the latter from the former. This used to be some magic factor of 0.7 which did not
+- * solve the resolution dependencance of the former calculation. In fact there is new magic factor now because
+- * really calculating the font size from the height would involve two font loads which seem to be two expensive.
+- */
+ static void
+-_dia_font_adjust_size (DiaFont *font, double height, gboolean recalc_alwways)
++dia_font_update_metrics (DiaFont *font)
+ {
++ PangoFont *loaded;
+
+- if (font->height != height || !font->metrics || recalc_alwways) {
+- PangoFont *loaded;
+-
+- dia_pfd_set_height (font->pfd, height);
+- /* need to load a font to get it's metrics */
+- loaded = font->loaded;
+- font->loaded = pango_context_load_font (dia_font_get_context (), font->pfd);
+-
+- g_clear_object (&loaded);
+-
+- g_clear_pointer (&font->metrics, pango_font_metrics_unref);
++ g_clear_pointer (&font->metrics, pango_font_metrics_unref);
+
+- /* caching metrics */
+- font->metrics = pango_font_get_metrics (font->loaded, NULL);
+- font->height = height;
+- }
++ /* need to load a font to get its metrics */
++ loaded = pango_context_load_font (dia_font_get_context (), font->pfd);
++ font->metrics = pango_font_get_metrics (loaded, NULL);
++ g_clear_object (&loaded);
+ }
+
+
+@@ -205,15 +181,8 @@ DiaFont *
+ dia_font_new (const char *family, DiaFontStyle style, double height)
+ {
+ DiaFont* font = dia_font_new_from_style(style, height);
+- gboolean changed;
+-
+- changed = family != NULL && g_strcmp0 (pango_font_description_get_family (font->pfd), family) != 0;
+ pango_font_description_set_family(font->pfd, family);
+
+- if (changed) {
+- _dia_font_adjust_size (font, font->height, TRUE);
+- }
+-
+ return font;
+ }
+
+@@ -316,9 +285,10 @@ dia_font_new_from_style (DiaFontStyle style, double height)
+
+ retval = g_object_new (DIA_TYPE_FONT, NULL);
+ retval->pfd = pfd;
+- _dia_font_adjust_size (retval, height, FALSE);
+ retval->legacy_name = NULL;
+
++ dia_font_update_metrics (retval);
++
+ return retval;
+ }
+
+@@ -407,8 +377,9 @@ double
+ dia_font_get_height (DiaFont *font)
+ {
+ g_return_val_if_fail (font != NULL, 0.0);
++ g_return_val_if_fail (pango_font_description_get_size_is_absolute (font->pfd), 0.0);
+
+- return font->height;
++ return pdu_to_dcm(pango_font_description_get_size(font->pfd)) / 0.8;
+ }
+
+
+@@ -430,6 +401,23 @@ dia_font_get_size (DiaFont *font)
+ }
+
+
++/**
++ * dia_font_set_size:
++ * @font: The font to modify.
++ * @size: The new size in centimetres.
++ *
++ * Sets the size of font to the provided (positive) size.
++ */
++void
++dia_font_set_size (DiaFont *font, double size)
++{
++ g_return_if_fail (size >= 0);
++
++ pango_font_description_set_absolute_size (font->pfd, dcm_to_pdu (size));
++ dia_font_update_metrics (font);
++}
++
++
+ /**
+ * dia_font_set_height:
+ *
+@@ -438,7 +426,8 @@ dia_font_get_size (DiaFont *font)
+ void
+ dia_font_set_height (DiaFont* font, double height)
+ {
+- _dia_font_adjust_size (font, height, FALSE);
++ /* FIXME For now, assume height is 80% of size. */
++ dia_font_set_size (font, height / 0.8);
+ }
+
+
+@@ -493,7 +482,7 @@ dia_font_set_any_family (DiaFont *font, const char *family)
+ pango_font_description_set_family (font->pfd, family);
+ if (changed) {
+ /* force recalculation on name change */
+- _dia_font_adjust_size (font, font->height, TRUE);
++ dia_font_update_metrics (font);
+ }
+
+ g_clear_pointer (&font->legacy_name, g_free);
+@@ -531,7 +520,7 @@ dia_font_set_weight (DiaFont *font, DiaFontWeight weight)
+ dia_pfd_set_weight(font->pfd,weight);
+
+ if (old_weight != weight) {
+- _dia_font_adjust_size (font, font->height, TRUE);
++ dia_font_update_metrics (font);
+ }
+ }
+
+@@ -548,7 +537,7 @@ dia_font_set_slant (DiaFont *font, DiaFontSlant slant)
+ g_return_if_fail(font != NULL);
+ dia_pfd_set_slant(font->pfd,slant);
+ if (slant != old_slant)
+- _dia_font_adjust_size (font, font->height, TRUE);
++ dia_font_update_metrics (font);
+ }
+
+
+@@ -702,7 +691,8 @@ dia_font_ascent (const char *string, DiaFont *font, double height)
+ {
+ if (font->metrics) {
+ double ascent = pdu_to_dcm (pango_font_metrics_get_ascent (font->metrics));
+- return ascent * (height / font->height);
++ double factor = height / dia_font_get_height (font);
++ return ascent * factor;
+ } else {
+ /* previous, _expensive_ but string specific way */
+ TextLine *text_line = text_line_new (string, font, height);
+@@ -723,7 +713,8 @@ dia_font_descent (const char *string, DiaFont *font, double height)
+ {
+ if (font->metrics) {
+ double descent = pdu_to_dcm (pango_font_metrics_get_descent (font->metrics));
+- return descent * (height / font->height);
++ double factor = height / dia_font_get_height (font);
++ return descent * factor;
+ } else {
+ /* previous, _expensive_ but string specific way */
+ TextLine *text_line = text_line_new (string, font, height);
+diff --git a/lib/font.h b/lib/font.h
+index aaf19ef6d..bd6868cb3 100644
+--- a/lib/font.h
++++ b/lib/font.h
+@@ -103,6 +103,8 @@ const PangoFontDescription *dia_font_get_description (DiaFont *f
+ double dia_font_get_height (DiaFont *font);
+ void dia_font_set_height (DiaFont *font,
+ double height);
++void dia_font_set_size (DiaFont *font,
++ double size);
+ double dia_font_get_size (DiaFont *font);
+ void dia_font_set_slant (DiaFont *font,
+ DiaFontSlant slant);
+diff --git a/lib/libdia.def b/lib/libdia.def
+index d7f579479..1218a20c9 100644
+--- a/lib/libdia.def
++++ b/lib/libdia.def
+@@ -243,6 +243,7 @@ EXPORTS
+ dia_font_new_from_style
+ dia_font_set_any_family
+ dia_font_set_height
++ dia_font_set_size
+ dia_font_set_slant
+ dia_font_set_slant_from_string
+ dia_font_set_weight
+--
+GitLab
+
+
+From da5b8963d3bd8f80a50b3bf81ec5d7a59bdbe8a7 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Fri, 20 Oct 2023 17:29:48 -0400
+Subject: [PATCH 3/4] font: add dia_font_new_from_description
+
+Since we no longer need to keep track of font heights in DiaFont, it
+basically wraps descriptions. As such, allow creating fonts from a
+string Pango description.
+
+This uses a string to try and avoid a public dependency on Pango. We
+still have public dependencies elsewhere, but it means shifting to
+alternative libraries, or incompatible versions (like Pango2, which
+appears at least on hold) should be easier. It also doesn't really
+add much friction with GTK.
+---
+ lib/font.c | 21 +++++++++++++++++++++
+ lib/font.h | 1 +
+ lib/libdia.def | 1 +
+ 3 files changed, 23 insertions(+)
+
+diff --git a/lib/font.c b/lib/font.c
+index 6dec80bb1..ca3953f28 100644
+--- a/lib/font.c
++++ b/lib/font.c
+@@ -293,6 +293,27 @@ dia_font_new_from_style (DiaFontStyle style, double height)
+ }
+
+
++DiaFont *
++dia_font_new_from_description (const char *desc)
++{
++ DiaFont *retval;
++ PangoFontDescription *pfd = pango_font_description_from_string (desc);
++
++ if (!pango_font_description_get_size_is_absolute (pfd)) {
++ double size = pango_font_description_get_size (pfd);
++ pango_font_description_set_absolute_size(pfd, size * global_zoom_factor * 72.0);
++ }
++
++ retval = g_object_new (DIA_TYPE_FONT, NULL);
++ retval->pfd = pfd;
++ retval->legacy_name = NULL;
++
++ dia_font_update_metrics (retval);
++
++ return retval;
++}
++
++
+ DiaFont *
+ dia_font_copy (DiaFont *font)
+ {
+diff --git a/lib/font.h b/lib/font.h
+index bd6868cb3..cc1260815 100644
+--- a/lib/font.h
++++ b/lib/font.h
+@@ -95,6 +95,7 @@ DiaFont *dia_font_new (const char *f
+ DiaFont *dia_font_new_from_style (DiaFontStyle style,
+ double height);
+ DiaFont *dia_font_new_from_legacy_name (const char *name);
++DiaFont *dia_font_new_from_description (const char *description);
+ const char *dia_font_get_legacy_name (DiaFont *font);
+ DiaFont *dia_font_copy (DiaFont *font);
+ DiaFontStyle dia_font_get_style (DiaFont *font);
+diff --git a/lib/libdia.def b/lib/libdia.def
+index 1218a20c9..db1c4ad7a 100644
+--- a/lib/libdia.def
++++ b/lib/libdia.def
+@@ -241,6 +241,7 @@ EXPORTS
+ dia_font_new
+ dia_font_new_from_legacy_name
+ dia_font_new_from_style
++ dia_font_new_from_description
+ dia_font_set_any_family
+ dia_font_set_height
+ dia_font_set_size
+--
+GitLab
+
+
+From 48c9b9b81d347d3f3c6df4df9c7456f2b74919c8 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Fri, 20 Oct 2023 17:31:58 -0400
+Subject: [PATCH 4/4] lib: remove DiaFontSelector
+
+We can now use GtkFontButton, which (a) allows removing ~700 lines of code,
+and (b) doesn't lock up whenever a property dialog is opened.
+
+Currently, we don't allow configuring size in the dialog, since the size
+of a DiaFont isn't really used. Further refactoring should let us use it
+instead of separate spin buttons.
+---
+ lib/dia-font-selector.c | 646 -------------------------------------
+ lib/dia-font-selector.h | 37 ---
+ lib/libdia.def | 5 -
+ lib/meson.build | 2 -
+ lib/prop_attr.c | 17 +-
+ objects/UML/class_dialog.c | 54 +++-
+ objects/UML/class_dialog.h | 13 +-
+ 7 files changed, 56 insertions(+), 718 deletions(-)
+ delete mode 100644 lib/dia-font-selector.c
+ delete mode 100644 lib/dia-font-selector.h
+
+diff --git a/lib/dia-font-selector.c b/lib/dia-font-selector.c
+deleted file mode 100644
+index fb59d6c98..000000000
+--- a/lib/dia-font-selector.c
++++ /dev/null
+@@ -1,646 +0,0 @@
+-/* Dia -- an diagram creation/manipulation program
+- * Copyright (C) 1998 Alexander Larsson
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#include "config.h"
+-
+-#include
+-#include
+-
+-#include
+-#include
+-
+-#include "dia-font-selector.h"
+-#include "font.h"
+-#include "persistence.h"
+-
+-#define PERSIST_NAME "font-menu"
+-
+-struct _DiaFontSelector {
+- GtkBox hbox;
+-};
+-
+-
+-typedef struct _DiaFontSelectorPrivate DiaFontSelectorPrivate;
+-struct _DiaFontSelectorPrivate {
+- GtkWidget *fonts;
+- GtkTreeStore *fonts_store;
+- GtkTreeIter fonts_default_end;
+- GtkTreeIter fonts_custom_end;
+- GtkTreeIter fonts_other;
+- GtkTreeIter fonts_reset;
+-
+- const char *looking_for;
+-
+- GtkWidget *styles;
+- GtkListStore *styles_store;
+-
+- char *current;
+- int current_style;
+-};
+-
+-G_DEFINE_TYPE_WITH_PRIVATE (DiaFontSelector, dia_font_selector, GTK_TYPE_BOX)
+-
+-enum {
+- VALUE_CHANGED,
+- LAST_SIGNAL
+-};
+-
+-static guint signals[LAST_SIGNAL] = { 0 };
+-
+-
+-/* New and improved font selector: Contains the three standard fonts
+- * and an 'Other fonts...' entry that opens the font dialog. The fonts
+- * selected in the font dialog are persistently added to the menu.
+- *
+- * +----------------+
+- * | Sans |
+- * | Serif |
+- * | Monospace |
+- * | -------------- |
+- * | Bodini |
+- * | CurlyGothic |
+- * | OldWestern |
+- * | -------------- |
+- * | Other fonts... |
+- * +----------------+
+- */
+-
+-enum {
+- STYLE_COL_LABEL,
+- STYLE_COL_ID,
+- STYLE_N_COL,
+-};
+-
+-
+-enum {
+- FONT_COL_FAMILY,
+- FONT_N_COL,
+-};
+-
+-
+-static void
+-dia_font_selector_finalize (GObject *object)
+-{
+- DiaFontSelector *self = DIA_FONT_SELECTOR (object);
+- DiaFontSelectorPrivate *priv = dia_font_selector_get_instance_private (self);
+-
+- g_clear_object (&priv->fonts_store);
+- g_clear_object (&priv->styles_store);
+-
+- g_clear_pointer (&priv->current, g_free);
+-
+- G_OBJECT_CLASS (dia_font_selector_parent_class)->finalize (object);
+-}
+-
+-
+-static void
+-dia_font_selector_class_init (DiaFontSelectorClass *klass)
+-{
+- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+-
+- object_class->finalize = dia_font_selector_finalize;
+-
+- signals[VALUE_CHANGED] = g_signal_new ("value-changed",
+- G_TYPE_FROM_CLASS (klass),
+- G_SIGNAL_RUN_FIRST,
+- 0, NULL, NULL,
+- g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE, 0);
+-}
+-
+-
+-static int
+-sort_fonts (const void *p1, const void *p2)
+-{
+- const gchar *n1 = pango_font_family_get_name (PANGO_FONT_FAMILY (*(void**)p1));
+- const gchar *n2 = pango_font_family_get_name (PANGO_FONT_FAMILY (*(void**)p2));
+- return g_ascii_strcasecmp (n1, n2);
+-}
+-
+-
+-static char *style_labels[] = {
+- "Normal",
+- "Oblique",
+- "Italic",
+- "Ultralight",
+- "Ultralight-Oblique",
+- "Ultralight-Italic",
+- "Light",
+- "Light-Oblique",
+- "Light-Italic",
+- "Medium",
+- "Medium-Oblique",
+- "Medium-Italic",
+- "Demibold",
+- "Demibold-Oblique",
+- "Demibold-Italic",
+- "Bold",
+- "Bold-Oblique",
+- "Bold-Italic",
+- "Ultrabold",
+- "Ultrabold-Oblique",
+- "Ultrabold-Italic",
+- "Heavy",
+- "Heavy-Oblique",
+- "Heavy-Italic"
+-};
+-
+-
+-static PangoFontFamily *
+-get_family_from_name (GtkWidget *widget, const gchar *fontname)
+-{
+- PangoFontFamily **families;
+- int n_families, i;
+-
+- pango_context_list_families (dia_font_get_context(),
+- &families, &n_families);
+- /* Doing it the slow way until I find a better way */
+- for (i = 0; i < n_families; i++) {
+- if (!(g_ascii_strcasecmp (pango_font_family_get_name (families[i]), fontname))) {
+- PangoFontFamily *fam = families[i];
+- g_clear_pointer (&families, g_free);
+- return fam;
+- }
+- }
+- g_warning (_("Couldn't find font family for %s\n"), fontname);
+- g_clear_pointer (&families, g_free);
+- return NULL;
+-}
+-
+-
+-static void
+-set_styles (DiaFontSelector *fs,
+- const gchar *name,
+- DiaFontStyle dia_style)
+-{
+- PangoFontFamily *pff;
+- DiaFontSelectorPrivate *priv;
+- PangoFontFace **faces = NULL;
+- int nfaces = 0;
+- int i = 0;
+- long stylebits = 0;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (fs));
+-
+- priv = dia_font_selector_get_instance_private (fs);
+-
+- pff = get_family_from_name (GTK_WIDGET (fs), name);
+-
+- pango_font_family_list_faces (pff, &faces, &nfaces);
+-
+- for (i = 0; i < nfaces; i++) {
+- PangoFontDescription *pfd = pango_font_face_describe (faces[i]);
+- PangoStyle style = pango_font_description_get_style (pfd);
+- PangoWeight weight = pango_font_description_get_weight (pfd);
+- /*
+- * This is a quick and dirty way to pick the styles present,
+- * sort them and avoid duplicates.
+- * We set a bit for each style present, bit (weight*3+style)
+- * From style_labels, we pick #(weight*3+style)
+- * where weight and style are the Dia types.
+- */
+- /* Account for DIA_WEIGHT_NORMAL hack */
+- int weightnr = (weight-200)/100;
+- if (weightnr < 2) weightnr ++;
+- else if (weightnr == 2) weightnr = 0;
+- stylebits |= 1 << (3*weightnr + style);
+- pango_font_description_free (pfd);
+- }
+-
+- g_clear_pointer (&faces, g_free);
+-
+- if (stylebits == 0) {
+- g_warning ("'%s' has no style!",
+- pango_font_family_get_name (pff) ? pango_font_family_get_name (pff) : "(null font)");
+- }
+-
+- gtk_list_store_clear (priv->styles_store);
+-
+- for (i = DIA_FONT_NORMAL; i <= (DIA_FONT_HEAVY | DIA_FONT_ITALIC); i+=4) {
+- GtkTreeIter iter;
+-
+- /*
+- * bad hack continued ...
+- */
+- int weight = DIA_FONT_STYLE_GET_WEIGHT (i) >> 4;
+- int slant = DIA_FONT_STYLE_GET_SLANT (i) >> 2;
+-
+- if (DIA_FONT_STYLE_GET_SLANT (i) > DIA_FONT_ITALIC) {
+- continue;
+- }
+-
+- if (!(stylebits & (1 << (3 * weight + slant)))) {
+- continue;
+- }
+-
+- gtk_list_store_append (priv->styles_store, &iter);
+- gtk_list_store_set (priv->styles_store,
+- &iter,
+- STYLE_COL_LABEL, style_labels[3 * weight + slant],
+- STYLE_COL_ID, i,
+- -1);
+-
+- if (dia_style == i || (i == DIA_FONT_NORMAL && dia_style == -1)) {
+- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->styles), &iter);
+- }
+- }
+-
+- gtk_widget_set_sensitive (GTK_WIDGET (priv->styles),
+- gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->styles_store), NULL) > 1);
+-}
+-
+-
+-static void
+-font_changed (GtkComboBox *widget,
+- DiaFontSelector *self)
+-{
+- DiaFontSelectorPrivate *priv;
+- GtkTreeIter active;
+- GtkTreePath *active_path;
+- GtkTreePath *path;
+- char *family = NULL;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (self));
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- gtk_combo_box_get_active_iter (widget, &active);
+-
+- active_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &active);
+- path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_reset);
+-
+- if (gtk_tree_path_compare (path, active_path) == 0) {
+- GtkTreeIter iter;
+- GtkTreePath *end_path;
+- DiaFont *font;
+-
+- persistent_list_clear (PERSIST_NAME);
+-
+- path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_default_end);
+-
+- // Move over the separator
+- gtk_tree_path_next (path);
+- gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->fonts_store), &iter, path);
+-
+- end_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_custom_end);
+-
+- while (gtk_tree_path_compare (path, end_path) != 0) {
+- gtk_tree_store_remove (priv->fonts_store, &iter);
+-
+- gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->fonts_store), &iter, path);
+-
+- gtk_tree_path_free (end_path);
+- end_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_custom_end);
+- }
+-
+- gtk_tree_path_free (path);
+- gtk_tree_path_free (end_path);
+- gtk_tree_path_free (active_path);
+-
+- if (priv->current) {
+- font = dia_font_new (priv->current, priv->current_style, 1.0);
+- dia_font_selector_set_font (self, font);
+- g_clear_object (&font);
+- } else {
+- gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->fonts_store), &iter);
+- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->fonts), &iter);
+- }
+-
+- return;
+- }
+-
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->fonts_store),
+- &active,
+- FONT_COL_FAMILY, &family,
+- -1);
+-
+- g_clear_pointer (&priv->current, g_free);
+- priv->current = g_strdup (family);
+-
+- set_styles (self, family, -1);
+- g_signal_emit (G_OBJECT (self), signals[VALUE_CHANGED], 0);
+-
+- if (g_strcmp0 (family, "sans") != 0 &&
+- g_strcmp0 (family, "serif") != 0 &&
+- g_strcmp0 (family, "monospace") != 0 &&
+- !persistent_list_add (PERSIST_NAME, family)) {
+- GtkTreeIter iter;
+-
+- gtk_tree_store_insert_before (priv->fonts_store,
+- &iter,
+- NULL,
+- &priv->fonts_custom_end);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, family,
+- -1);
+-
+- gtk_combo_box_set_active_iter (widget, &iter);
+- }
+-
+- gtk_tree_path_free (path);
+- gtk_tree_path_free (active_path);
+- g_clear_pointer (&family, g_free);
+-}
+-
+-
+-static gboolean
+-is_separator (GtkTreeModel *model,
+- GtkTreeIter *iter,
+- gpointer data)
+-{
+- gboolean result;
+- char *family;
+-
+- gtk_tree_model_get (model, iter, FONT_COL_FAMILY, &family, -1);
+-
+- result = g_strcmp0 (family, "separator") == 0;
+-
+- g_clear_pointer (&family, g_free);
+-
+- return result;
+-}
+-
+-
+-static void
+-is_sensitive (GtkCellLayout *cell_layout,
+- GtkCellRenderer *cell,
+- GtkTreeModel *tree_model,
+- GtkTreeIter *iter,
+- gpointer data)
+-{
+- gboolean sensitive;
+-
+- sensitive = !gtk_tree_model_iter_has_child (tree_model, iter);
+-
+- g_object_set (cell, "sensitive", sensitive, NULL);
+-}
+-
+-
+-static void
+-style_changed (GtkComboBox *widget,
+- DiaFontSelector *self)
+-{
+- DiaFontSelectorPrivate *priv;
+- GtkTreeIter active;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (self));
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->styles), &active)) {
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->styles_store),
+- &active,
+- STYLE_COL_ID, &priv->current_style,
+- -1);
+- } else {
+- priv->current_style = 0;
+- }
+-
+- g_signal_emit (G_OBJECT (self), signals[VALUE_CHANGED], 0);
+-}
+-
+-
+-static void
+-dia_font_selector_init (DiaFontSelector *fs)
+-{
+- DiaFontSelectorPrivate *priv;
+- PangoFontFamily **families;
+- int n_families,i;
+- GtkCellRenderer *renderer;
+- GtkTreeIter iter;
+- GList *tmplist;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (fs));
+-
+- priv = dia_font_selector_get_instance_private (fs);
+-
+- priv->fonts_store = gtk_tree_store_new (FONT_N_COL, G_TYPE_STRING);
+-
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, "sans",
+- -1);
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, "serif",
+- -1);
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, "monospace",
+- -1);
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_default_end, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_default_end,
+- FONT_COL_FAMILY, "separator",
+- -1);
+-
+- persistence_register_list (PERSIST_NAME);
+-
+- for (tmplist = persistent_list_get_glist (PERSIST_NAME);
+- tmplist != NULL; tmplist = g_list_next (tmplist)) {
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, tmplist->data,
+- -1);
+- }
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_custom_end, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_custom_end,
+- FONT_COL_FAMILY, "separator",
+- -1);
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_other, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_other,
+- FONT_COL_FAMILY, _("Other Fonts"),
+- -1);
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_reset, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_reset,
+- FONT_COL_FAMILY, _("Reset Menu"),
+- -1);
+-
+- priv->fonts = gtk_combo_box_new_with_model (GTK_TREE_MODEL (priv->fonts_store));
+- gtk_widget_set_hexpand (priv->fonts, TRUE);
+- gtk_widget_show (priv->fonts);
+-
+- g_signal_connect (priv->fonts,
+- "changed",
+- G_CALLBACK (font_changed),
+- fs);
+-
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->fonts), renderer, TRUE);
+- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (priv->fonts), renderer,
+- "text", FONT_COL_FAMILY,
+- "family", FONT_COL_FAMILY,
+- NULL);
+-
+- gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (priv->fonts),
+- is_separator, NULL, NULL);
+- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (priv->fonts),
+- renderer,
+- is_sensitive,
+- NULL, NULL);
+-
+- priv->styles_store = gtk_list_store_new (STYLE_N_COL,
+- G_TYPE_STRING,
+- G_TYPE_INT);
+- priv->styles = gtk_combo_box_new_with_model (GTK_TREE_MODEL (priv->styles_store));
+- gtk_widget_show (priv->styles);
+-
+- g_signal_connect (priv->styles,
+- "changed",
+- G_CALLBACK (style_changed),
+- fs);
+-
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->styles), renderer, TRUE);
+- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (priv->styles), renderer,
+- "text", STYLE_COL_LABEL,
+- NULL);
+-
+- pango_context_list_families (dia_font_get_context (),
+- &families,
+- &n_families);
+-
+- qsort (families,
+- n_families,
+- sizeof (PangoFontFamily *),
+- sort_fonts);
+-
+- /* Doing it the slow way until I find a better way */
+- for (i = 0; i < n_families; i++) {
+- gtk_tree_store_append (priv->fonts_store,
+- &iter,
+- &priv->fonts_other);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, pango_font_family_get_name (families[i]),
+- -1);
+- }
+- g_clear_pointer (&families, g_free);
+-
+- gtk_box_pack_start (GTK_BOX (fs), GTK_WIDGET (priv->fonts), FALSE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (fs), GTK_WIDGET (priv->styles), FALSE, TRUE, 0);
+-}
+-
+-
+-GtkWidget *
+-dia_font_selector_new (void)
+-{
+- return g_object_new (DIA_TYPE_FONT_SELECTOR, NULL);
+-}
+-
+-
+-static gboolean
+-set_font (GtkTreeModel *model,
+- GtkTreePath *path,
+- GtkTreeIter *iter,
+- gpointer data)
+-{
+- DiaFontSelector *self = DIA_FONT_SELECTOR (data);
+- DiaFontSelectorPrivate *priv = dia_font_selector_get_instance_private (self);
+- char *font;
+- gboolean res = FALSE;
+-
+- gtk_tree_model_get (model,
+- iter,
+- FONT_COL_FAMILY, &font,
+- -1);
+-
+- res = g_strcmp0 (priv->looking_for, font) == 0;
+- if (res) {
+- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->fonts), iter);
+- }
+-
+- g_clear_pointer (&font, g_free);
+-
+- return res;
+-}
+-
+-
+-/**
+- * dia_font_selector_set_font:
+- *
+- * Set the current font to be shown in the font selector.
+- */
+-void
+-dia_font_selector_set_font (DiaFontSelector *self, DiaFont *font)
+-{
+- DiaFontSelectorPrivate *priv;
+- const gchar *fontname = dia_font_get_family (font);
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (self));
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- priv->looking_for = fontname;
+- gtk_tree_model_foreach (GTK_TREE_MODEL (priv->fonts_store), set_font, self);
+- priv->looking_for = NULL;
+-
+- set_styles (self, fontname, dia_font_get_style (font));
+-}
+-
+-
+-DiaFont *
+-dia_font_selector_get_font (DiaFontSelector *self)
+-{
+- DiaFontSelectorPrivate *priv;
+- DiaFontStyle style;
+- DiaFont *font;
+- GtkTreeIter iter;
+- char *fontname = NULL;
+-
+- g_return_val_if_fail (DIA_IS_FONT_SELECTOR (self), NULL);
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->fonts), &iter)) {
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->fonts_store),
+- &iter,
+- FONT_COL_FAMILY, &fontname,
+- -1);
+- } else {
+- g_warning ("No font selected");
+- }
+-
+- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->styles), &iter)) {
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->styles_store),
+- &iter,
+- STYLE_COL_ID, &style,
+- -1);
+- } else {
+- style = 0;
+- }
+-
+- font = dia_font_new (fontname, style, 1.0);
+-
+- g_clear_pointer (&fontname, g_free);
+-
+- return font;
+-}
+-
+diff --git a/lib/dia-font-selector.h b/lib/dia-font-selector.h
+deleted file mode 100644
+index 8ffba0ccb..000000000
+--- a/lib/dia-font-selector.h
++++ /dev/null
+@@ -1,37 +0,0 @@
+-/* Dia -- an diagram creation/manipulation program
+- * Copyright (C) 1998 Alexander Larsson
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- *
+- * SPDX-License-Identifier: GPL-2.0-or-later
+- */
+-
+-#pragma once
+-
+-#include
+-
+-#include "font.h"
+-
+-G_BEGIN_DECLS
+-
+-#define DIA_TYPE_FONT_SELECTOR dia_font_selector_get_type ()
+-G_DECLARE_FINAL_TYPE (DiaFontSelector, dia_font_selector, DIA, FONT_SELECTOR, GtkBox)
+-
+-GtkWidget *dia_font_selector_new (void);
+-void dia_font_selector_set_font (DiaFontSelector *self,
+- DiaFont *font);
+-DiaFont *dia_font_selector_get_font (DiaFontSelector *self);
+-
+-G_END_DECLS
+diff --git a/lib/libdia.def b/lib/libdia.def
+index db1c4ad7a..7f2364ddd 100644
+--- a/lib/libdia.def
++++ b/lib/libdia.def
+@@ -252,11 +252,6 @@ EXPORTS
+ dia_font_copy
+ dia_font_string_width
+
+- dia_font_selector_get_font
+- dia_font_selector_get_type
+- dia_font_selector_new
+- dia_font_selector_set_font
+-
+ dia_guide_new
+ dia_guide_copy
+ dia_guide_free
+diff --git a/lib/meson.build b/lib/meson.build
+index f1ffb9659..7d2058c41 100644
+--- a/lib/meson.build
++++ b/lib/meson.build
+@@ -167,8 +167,6 @@ libdia_sources = stdprop_sources + [
+ 'dia-colour-cell-renderer.h',
+ 'dia-colour-selector.c',
+ 'dia-colour-selector.h',
+- 'dia-font-selector.c',
+- 'dia-font-selector.h',
+ 'dia-graphene.h',
+ 'dia-guide.c',
+ 'dia-guide.h',
+diff --git a/lib/prop_attr.c b/lib/prop_attr.c
+index 18a850a41..2362813a0 100644
+--- a/lib/prop_attr.c
++++ b/lib/prop_attr.c
+@@ -29,11 +29,11 @@
+
+ #include
+ #include "dia_xml.h"
++#include "font.h"
+ #include "properties.h"
+ #include "propinternals.h"
+ #include "dia-arrow-selector.h"
+ #include "dia-colour-selector.h"
+-#include "dia-font-selector.h"
+ #include "dia-line-style-selector.h"
+
+ /***************************/
+@@ -421,22 +421,27 @@ fontprop_copy(FontProperty *src)
+ static WIDGET *
+ fontprop_get_widget(FontProperty *prop, PropDialog *dialog)
+ {
+- GtkWidget *ret = dia_font_selector_new();
+- prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed");
++ GtkWidget *ret = gtk_font_button_new();
++ gtk_font_chooser_set_level (GTK_FONT_CHOOSER (ret), GTK_FONT_CHOOSER_LEVEL_FAMILY | GTK_FONT_CHOOSER_LEVEL_STYLE);
++ prophandler_connect(&prop->common, G_OBJECT(ret), "font-set");
+ return ret;
+ }
+
+ static void
+ fontprop_reset_widget(FontProperty *prop, WIDGET *widget)
+ {
+- dia_font_selector_set_font (DIA_FONT_SELECTOR (widget),
+- prop->font_data);
++ const PangoFontDescription *desc = dia_font_get_description (prop->font_data);
++ gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (widget), desc);
+ }
+
+ static void
+ fontprop_set_from_widget(FontProperty *prop, WIDGET *widget)
+ {
+- prop->font_data = dia_font_selector_get_font (DIA_FONT_SELECTOR (widget));
++ char *desc = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (widget));
++ DiaFont *new_font = dia_font_new_from_description (desc);
++
++ g_clear_pointer (&desc, g_free);
++ g_set_object (&prop->font_data, new_font);
+ }
+
+ static void
+diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c
+index 163cc2949..56af1d84b 100644
+--- a/objects/UML/class_dialog.c
++++ b/objects/UML/class_dialog.c
+@@ -40,6 +40,7 @@
+ #include
+ #include
+
++#include "font.h"
+ #include "object.h"
+ #include "class.h"
+ #include "diaoptionmenu.h"
+@@ -196,6 +197,28 @@ _class_set_comment (GtkTextView *view, gchar *text)
+ }
+
+
++static DiaFont *
++_font_from_button (GtkFontButton *btn)
++{
++ char *font_desc;
++ DiaFont *ret;
++
++ font_desc = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (btn));
++ ret = dia_font_new_from_description (font_desc);
++ g_clear_pointer (&font_desc, g_free);
++
++ return ret;
++}
++
++
++static void
++_set_selector_font (GtkFontButton *btn, DiaFont *font)
++{
++ gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (btn),
++ dia_font_get_description (font));
++}
++
++
+ static void
+ class_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog)
+ {
+@@ -243,12 +266,12 @@ class_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog)
+ dia_colour_selector_get_colour (DIA_COLOUR_SELECTOR (prop_dialog->fill_color),
+ ¨class->fill_color);
+
+- umlclass->normal_font = dia_font_selector_get_font (prop_dialog->normal_font);
+- umlclass->polymorphic_font = dia_font_selector_get_font (prop_dialog->polymorphic_font);
+- umlclass->abstract_font = dia_font_selector_get_font (prop_dialog->abstract_font);
+- umlclass->classname_font = dia_font_selector_get_font (prop_dialog->classname_font);
+- umlclass->abstract_classname_font = dia_font_selector_get_font (prop_dialog->abstract_classname_font);
+- umlclass->comment_font = dia_font_selector_get_font (prop_dialog->comment_font);
++ umlclass->normal_font = _font_from_button(prop_dialog->normal_font);
++ umlclass->polymorphic_font = _font_from_button(prop_dialog->polymorphic_font);
++ umlclass->abstract_font = _font_from_button(prop_dialog->abstract_font);
++ umlclass->classname_font = _font_from_button (prop_dialog->classname_font);
++ umlclass->abstract_classname_font = _font_from_button (prop_dialog->abstract_classname_font);
++ umlclass->comment_font = _font_from_button (prop_dialog->comment_font);
+
+ umlclass->font_height = gtk_spin_button_get_value (prop_dialog->normal_font_height);
+ umlclass->abstract_font_height = gtk_spin_button_get_value (prop_dialog->abstract_font_height);
+@@ -291,12 +314,12 @@ class_fill_in_dialog(UMLClass *umlclass)
+ dia_colour_selector_set_colour (prop_dialog->text_color, ¨class->text_color);
+ dia_colour_selector_set_colour (prop_dialog->line_color, ¨class->line_color);
+ dia_colour_selector_set_colour (prop_dialog->fill_color, ¨class->fill_color);
+- dia_font_selector_set_font (prop_dialog->normal_font, umlclass->normal_font);
+- dia_font_selector_set_font (prop_dialog->polymorphic_font, umlclass->polymorphic_font);
+- dia_font_selector_set_font (prop_dialog->abstract_font, umlclass->abstract_font);
+- dia_font_selector_set_font (prop_dialog->classname_font, umlclass->classname_font);
+- dia_font_selector_set_font (prop_dialog->abstract_classname_font, umlclass->abstract_classname_font);
+- dia_font_selector_set_font (prop_dialog->comment_font, umlclass->comment_font);
++ _set_selector_font (prop_dialog->normal_font, umlclass->normal_font);
++ _set_selector_font (prop_dialog->polymorphic_font, umlclass->polymorphic_font);
++ _set_selector_font (prop_dialog->abstract_font, umlclass->abstract_font);
++ _set_selector_font (prop_dialog->classname_font, umlclass->classname_font);
++ _set_selector_font (prop_dialog->abstract_classname_font, umlclass->abstract_classname_font);
++ _set_selector_font (prop_dialog->comment_font, umlclass->comment_font);
+ gtk_spin_button_set_value (prop_dialog->normal_font_height, umlclass->font_height);
+ gtk_spin_button_set_value (prop_dialog->polymorphic_font_height, umlclass->polymorphic_font_height);
+ gtk_spin_button_set_value (prop_dialog->abstract_font_height, umlclass->abstract_font_height);
+@@ -311,7 +334,7 @@ create_font_props_row (GtkGrid *grid,
+ gint row,
+ DiaFont *font,
+ real height,
+- DiaFontSelector **fontsel,
++ GtkFontButton **fontsel,
+ GtkSpinButton **heightsel)
+ {
+ GtkWidget *label;
+@@ -320,9 +343,10 @@ create_font_props_row (GtkGrid *grid,
+ label = gtk_label_new (kind);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_grid_attach (grid, label, 0, row, 1, 1);
+- *fontsel = DIA_FONT_SELECTOR (dia_font_selector_new ());
++ *fontsel = GTK_FONT_BUTTON (gtk_font_button_new ());
+ gtk_widget_set_hexpand (GTK_WIDGET (*fontsel), TRUE);
+- dia_font_selector_set_font (DIA_FONT_SELECTOR (*fontsel), font);
++ gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (*fontsel), dia_font_get_description (font));
++ gtk_font_chooser_set_level (GTK_FONT_CHOOSER (*fontsel), GTK_FONT_CHOOSER_LEVEL_FAMILY | GTK_FONT_CHOOSER_LEVEL_STYLE);
+ gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET(*fontsel), 1, row, 1, 1);
+
+ adj = GTK_ADJUSTMENT (gtk_adjustment_new (height, 0.1, 10.0, 0.1, 1.0, 0));
+diff --git a/objects/UML/class_dialog.h b/objects/UML/class_dialog.h
+index 6bbb4b404..bf38b5613 100644
+--- a/objects/UML/class_dialog.h
++++ b/objects/UML/class_dialog.h
+@@ -1,7 +1,6 @@
+ #pragma once
+
+ #include "dia-colour-selector.h"
+-#include "dia-font-selector.h"
+
+ G_BEGIN_DECLS
+
+@@ -32,12 +31,12 @@ struct _UMLClassDialog {
+ GtkToggleButton *op_supp;
+ GtkToggleButton *comments_vis;
+ GtkToggleButton *op_wrap;
+- DiaFontSelector *normal_font;
+- DiaFontSelector *abstract_font;
+- DiaFontSelector *polymorphic_font;
+- DiaFontSelector *classname_font;
+- DiaFontSelector *abstract_classname_font;
+- DiaFontSelector *comment_font;
++ GtkFontButton *normal_font;
++ GtkFontButton *abstract_font;
++ GtkFontButton *polymorphic_font;
++ GtkFontButton *classname_font;
++ GtkFontButton *abstract_classname_font;
++ GtkFontButton *comment_font;
+ GtkSpinButton *normal_font_height;
+ GtkSpinButton *abstract_font_height;
+ GtkSpinButton *polymorphic_font_height;
+--
+GitLab
+
diff --git a/helpers/DATA/distro-info-data/README.Debian.patch b/helpers/DATA/distro-info-data/README.Debian.patch
index cc2243b..1d647b5 100644
--- a/helpers/DATA/distro-info-data/README.Debian.patch
+++ b/helpers/DATA/distro-info-data/README.Debian.patch
@@ -1,5 +1,5 @@
---- debian/README.Debian 2019-10-17 15:10:30.000000000 -0500
-+++ debian/README.Debian_trisquel 2021-11-26 13:26:20.362971709 -0600
+--- a/debian/README.Debian 2019-10-17 15:10:30.000000000 -0500
++++ b/debian/README.Debian 2021-11-26 13:26:20.362971709 -0600
@@ -2,7 +2,7 @@
===========
diff --git a/helpers/DATA/distro-info-data/add_trisquel_tools_py.patch b/helpers/DATA/distro-info-data/add_trisquel_tools_py.patch
index 29448c1..1c1e7a4 100644
--- a/helpers/DATA/distro-info-data/add_trisquel_tools_py.patch
+++ b/helpers/DATA/distro-info-data/add_trisquel_tools_py.patch
@@ -1,14 +1,16 @@
---- lib/tools.py 2021-10-15 08:01:00.000000000 -0500
-+++ lib/tools.py 2022-04-06 12:27:07.672427372 -0500
-@@ -37,7 +37,7 @@
+diff --git a/lib/tools.py b/lib/tools.py
+index 2ab74f7f..a3d52620 100644
+--- a/lib/tools.py
++++ b/lib/tools.py
+@@ -49,7 +49,7 @@ def get_csv_dict_reader(filename: str) -> csv.DictReader:
+
def main(validation_function):
"""Main function with command line parameter parsing."""
- script_name = os.path.basename(sys.argv[0])
-- usage = "%s [-h] -d|-u csv-file" % (script_name)
-+ usage = "%s [-h] -d|-u|-t csv-file" % (script_name)
- parser = argparse.ArgumentParser(usage=usage)
+- parser = argparse.ArgumentParser(usage="%(prog)s [-h] -d|-u csv-file")
++ parser = argparse.ArgumentParser(usage="%(prog)s [-h] -d|-u|-t csv-file")
parser.add_argument(
+ "-d",
@@ -56,15 +56,24 @@
default=False,
help="validate an Ubuntu CSV file",
diff --git a/helpers/DATA/distro-info-data/add_trisquel_validate.patch b/helpers/DATA/distro-info-data/add_trisquel_validate.patch
index cfaa25a..09fd9a5 100644
--- a/helpers/DATA/distro-info-data/add_trisquel_validate.patch
+++ b/helpers/DATA/distro-info-data/add_trisquel_validate.patch
@@ -1,5 +1,5 @@
---- validate-csv-data 2021-10-15 08:01:00.000000000 -0500
-+++ validate-csv-data 2022-04-06 12:27:29.004706669 -0500
+--- a/validate-csv-data 2021-10-15 08:01:00.000000000 -0500
++++ b/validate-csv-data 2022-04-06 12:27:29.004706669 -0500
@@ -27,6 +27,13 @@
diff --git a/helpers/DATA/distro-info-data/trisquel.csv b/helpers/DATA/distro-info-data/trisquel.csv
index 3a0cf38..17b54c2 100644
--- a/helpers/DATA/distro-info-data/trisquel.csv
+++ b/helpers/DATA/distro-info-data/trisquel.csv
@@ -12,3 +12,4 @@ version,codename,series,created,release,eol,upstream
9.0 LTS,Etiona,etiona,2017-10-19,2020-10-16,2023-05-31,bionic
10.0 LTS,Nabia,nabia,2019-10-17,2021-12-16,2025-05-29,focal
11.0 LTS,Aramo,aramo,2021-10-14,2023-03-19,2027-06-01,jammy
+12.0 LTS,Ecne,ecne,2023-10-12,2029-05-31,2029-05-31,noble
diff --git a/helpers/DATA/distro-info/distro_info_py.patch b/helpers/DATA/distro-info/distro_info_py.patch
index efd916b..0c91ff1 100644
--- a/helpers/DATA/distro-info/distro_info_py.patch
+++ b/helpers/DATA/distro-info/distro_info_py.patch
@@ -1,5 +1,7 @@
---- source/python/distro_info.py 2021-11-04 15:27:37.000000000 -0600
-+++ source/python/distro_info.py_fix 2022-04-06 10:20:39.217365952 -0500
+diff --git a/python/distro_info.py b/python/distro_info.py
+index c87fbff6..0a624745 100644
+--- a/python/distro_info.py
++++ b/python/distro_info.py
@@ -1,3 +1,4 @@
+# Copyright (C) 2021, Trisquel GNU/Linux developers
# Copyright (C) 2009-2012, Benjamin Drung
@@ -23,7 +25,7 @@
"""
def __init__(self, distro):
-@@ -311,14 +312,14 @@
+@@ -340,16 +340,16 @@ class DebianDistroInfo(DistroInfo):
]
@@ -32,31 +34,35 @@
+class TrisquelDistroInfo(DistroInfo):
+ """provides information about Trisquel's distributions"""
- def __init__(self):
+ def __init__(self) -> None:
- super().__init__("Ubuntu")
+ super().__init__("Trisquel")
- def lts(self, date=None, result="codename"):
+ def lts(
+ self, date: typing.Optional[datetime.date] = None, result: str = "codename"
+ ) -> typing.Union[DistroRelease, str]:
- """Get latest long term support (LTS) Ubuntu distribution based on the
+ """Get latest long term support (LTS) Trisquel distribution based on the
given date."""
if date is None:
date = self._date
-@@ -337,7 +338,7 @@
- return "LTS" in distros[0].version
-
- def supported(self, date=None, result="codename"):
+@@ -372,7 +372,7 @@ class UbuntuDistroInfo(DistroInfo):
+ def supported(
+ self, date: typing.Optional[datetime.date] = None, result: str = "codename"
+ ) -> list[typing.Union[DistroRelease, str]]:
- """Get list of all supported Ubuntu distributions based on the given
+ """Get list of all supported Trisquel distributions based on the given
date."""
if date is None:
date = self._date
-@@ -347,15 +348,3 @@
- if date <= x.eol or (x.eol_server is not None and date <= x.eol_server)
+@@ -382,17 +382,3 @@ class UbuntuDistroInfo(DistroInfo):
+ if (x.eol and date <= x.eol) or (x.eol_server is not None and date <= x.eol_server)
]
return distros
-
-- def supported_esm(self, date=None, result="codename"):
+- def supported_esm(
+- self, date: typing.Optional[datetime.date] = None, result: str = "codename"
+- ) -> list[typing.Union[DistroRelease, str]]:
- """Get list of all ESM supported Ubuntu distributions based on the
- given date."""
- if date is None:
diff --git a/helpers/DATA/distro-info/test_distro_info.py.patch b/helpers/DATA/distro-info/test_distro_info.py.patch
new file mode 100644
index 0000000..1e7d6bf
--- /dev/null
+++ b/helpers/DATA/distro-info/test_distro_info.py.patch
@@ -0,0 +1,152 @@
+diff --git a/python/distro_info_test/test_distro_info.py b/python/distro_info_test/test_distro_info.py
+index b9e1cc13..94474bf5 100644
+--- a/python/distro_info_test/test_distro_info.py
++++ b/python/distro_info_test/test_distro_info.py
+@@ -1,5 +1,6 @@
+ # test_distro_info.py - Test suite for distro_info
+ #
++# Copyright (C) 2024, Trisquel GNU/Linux developers
+ # Copyright (C) 2011, Benjamin Drung
+ #
+ # Permission to use, copy, modify, and/or distribute this software for any
+@@ -19,7 +20,7 @@
+ import datetime
+ import unittest
+
+-from distro_info import DebianDistroInfo, UbuntuDistroInfo
++from distro_info import DebianDistroInfo, TrisquelDistroInfo
+
+
+ class DebianDistroInfoTestCase(unittest.TestCase): # pylint: disable=too-many-public-methods
+@@ -122,91 +123,89 @@ class DebianDistroInfoTestCase(unittest.TestCase): # pylint: disable=too-many-p
+ self.assertEqual(self._distro_info.stable(self._date, result="release"), "5.0")
+
+
+-class UbuntuDistroInfoTestCase(unittest.TestCase): # pylint: disable=too-many-public-methods
+- """TestCase object for distro_info.UbuntuDistroInfo"""
++class TrisquelDistroInfoTestCase(unittest.TestCase): # pylint: disable=too-many-public-methods
++ """TestCase object for distro_info.TrisquelDistroInfo"""
+
+ def setUp(self) -> None: # pylint: disable=invalid-name
+- self._distro_info = UbuntuDistroInfo()
++ self._distro_info = TrisquelDistroInfo()
+ self._date = datetime.date(2011, 1, 10)
+
+ def test_all(self) -> None:
+- """Test: List all known Ubuntu distributions."""
++ """Test: List all known Trisquel distributions."""
+ all_distros = {
+- "warty",
+- "hoary",
+- "breezy",
+- "dapper",
+- "edgy",
+- "feisty",
+- "gutsy",
+- "hardy",
+- "intrepid",
+- "jaunty",
+- "karmic",
+- "lucid",
+- "maverick",
+- "natty",
++ "robur",
++ "dwyn",
++ "awen",
++ "taranis",
++ "slaine",
++ "dagda",
++ "brigantia",
++ "toutanis",
++ "belenos",
++ "flidas",
++ "etiona",
++ "nabia",
+ }
+ self.assertEqual(all_distros - set(self._distro_info.all), set())
+
+ def test_devel(self) -> None:
+- """Test: Get latest development Ubuntu distribution."""
+- self.assertEqual(self._distro_info.devel(self._date), "natty")
++ """Test: Get latest development Trisquel distribution."""
++ self.assertEqual(self._distro_info.devel(self._date), "dagda")
+
+ def test_lts(self) -> None:
+- """Test: Get latest long term support (LTS) Ubuntu distribution."""
+- self.assertEqual(self._distro_info.lts(self._date), "lucid")
++ """Test: Get latest long term support (LTS) Trisquel distribution."""
++ self.assertEqual(self._distro_info.lts(self._date), "taranis")
+
+ def test_stable(self) -> None:
+- """Test: Get latest stable Ubuntu distribution."""
+- self.assertEqual(self._distro_info.stable(self._date), "maverick")
++ """Test: Get latest stable Trisquel distribution."""
++ self.assertEqual(self._distro_info.stable(self._date), "taranis")
+
+ def test_supported(self) -> None:
+- """Test: List all supported Ubuntu distribution."""
+- supported = ["dapper", "hardy", "karmic", "lucid", "maverick", "natty"]
++ """Test: List all supported Trisquel distribution."""
++ supported = ["robur", "awen", "taranis", "slaine", "dagda"]
+ self.assertEqual(self._distro_info.supported(self._date), supported)
+
+ def test_unsupported(self) -> None:
+- """Test: List all unsupported Ubuntu distributions."""
+- unsupported = ["warty", "hoary", "breezy", "edgy", "feisty", "gutsy", "intrepid", "jaunty"]
++ """Test: List all unsupported Trisquel distributions."""
++ unsupported = ["dwyn"]
+ self.assertEqual(self._distro_info.unsupported(self._date), unsupported)
+
+ def test_current_unsupported(self) -> None:
+- """Test: List all unsupported Ubuntu distributions today."""
+- unsupported = {"warty", "hoary", "breezy", "edgy", "feisty", "gutsy", "intrepid", "jaunty"}
++ """Test: List all unsupported Trisquel distributions today."""
++ unsupported = {"robur", "dwyn"}
+ self.assertEqual(unsupported - set(str(d) for d in self._distro_info.unsupported()), set())
+
+ def test_valid(self) -> None:
+- """Test: Check for valid Ubuntu distribution."""
+- self.assertTrue(self._distro_info.valid("lucid"))
++ """Test: Check for valid Trisquel distribution."""
++ self.assertTrue(self._distro_info.valid("taranis"))
+ self.assertFalse(self._distro_info.valid("42"))
+
+ def test_is_lts(self) -> None:
+- """Test: Check if Ubuntu distribution is an LTS."""
+- self.assertTrue(self._distro_info.is_lts("lucid"))
++ """Test: Check if Trisquel distribution is an LTS."""
++ self.assertTrue(self._distro_info.is_lts("taranis"))
+ self.assertFalse(self._distro_info.is_lts("42"))
+ self.assertFalse(self._distro_info.is_lts("warty"))
+
+ def test_codename(self) -> None:
+ """Test: Check result set to codename."""
+- self.assertEqual(self._distro_info.lts(self._date, "codename"), "lucid")
+- self.assertEqual(self._distro_info.devel(self._date, result="codename"), "natty")
++ self.assertEqual(self._distro_info.lts(self._date, "codename"), "taranis")
++ self.assertEqual(self._distro_info.devel(self._date, result="codename"), "dagda")
+
+ def test_version(self) -> None:
+ """Test: Check result set to version."""
+- self.assertEqual(self._distro_info.version("lucid"), "10.04 LTS")
+- self.assertEqual(self._distro_info.version("Maverick Meerkat"), "10.10")
++ self.assertEqual(self._distro_info.version("taranis"), "4.0 LTS")
++ self.assertEqual(self._distro_info.version("Slaine"), "4.5")
+
+ def test_fullname(self) -> None:
+ """Test: Check result set to fullname."""
+ self.assertEqual(
+- self._distro_info.stable(self._date, "fullname"), 'Ubuntu 10.10 "Maverick Meerkat"'
++ self._distro_info.stable(self._date, "fullname"), 'Trisquel 4.0 LTS "Taranis"'
+ )
+ self.assertEqual(
+- self._distro_info.lts(self._date, result="fullname"), 'Ubuntu 10.04 LTS "Lucid Lynx"'
++ self._distro_info.lts(self._date, result="fullname"), 'Trisquel 4.0 LTS "Taranis"'
+ )
+
+ def test_release(self) -> None:
+ """Test: Check result set to release."""
+- self.assertEqual(self._distro_info.devel(self._date, "release"), "11.04")
+- self.assertEqual(self._distro_info.lts(self._date, result="release"), "10.04 LTS")
++ self.assertEqual(self._distro_info.devel(self._date, "release"), "5.0")
++ self.assertEqual(self._distro_info.lts(self._date, result="release"), "4.0 LTS")
diff --git a/helpers/DATA/distro-info/test_distro_info.py b/helpers/DATA/distro-info/test_distro_info.py_legacy
similarity index 98%
rename from helpers/DATA/distro-info/test_distro_info.py
rename to helpers/DATA/distro-info/test_distro_info.py_legacy
index d3a8a77..eebdf32 100644
--- a/helpers/DATA/distro-info/test_distro_info.py
+++ b/helpers/DATA/distro-info/test_distro_info.py_legacy
@@ -1,3 +1,8 @@
+##
+# This file is used for reference when the patch needs updating.
+# only remove it when you no longer need it on the next release
+# e.g. T12 > T13, etc.
+##
# test_distro_info.py - Test suite for distro_info
#
# Copyright (C) 2021, Trisquel GNU/Linux developers
diff --git a/helpers/DATA/dpkg/Trisquel.pm b/helpers/DATA/dpkg/Trisquel.pm
deleted file mode 100644
index 3710ff7..0000000
--- a/helpers/DATA/dpkg/Trisquel.pm
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright © 2008 Ian Jackson
-# Copyright © 2008 Canonical, Ltd.
-# written by Colin Watson
-# Copyright © 2008 James Westby
-# Copyright © 2009 Raphaël Hertzog
-# Copyright © 2022 Ruben Rodriguez
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-package Dpkg::Vendor::Trisquel;
-
-use strict;
-use warnings;
-
-our $VERSION = '0.01';
-
-use Dpkg::ErrorHandling;
-use Dpkg::Gettext;
-use Dpkg::Control::Types;
-
-use parent qw(Dpkg::Vendor::Debian);
-
-=encoding utf8
-
-=head1 NAME
-
-Dpkg::Vendor::Trisquel - Trisquel vendor class
-
-=head1 DESCRIPTION
-
-This vendor class customizes the behaviour of dpkg scripts for Trisquel
-specific behavior and policies.
-
-=cut
-
-sub run_hook {
- my ($self, $hook, @params) = @_;
-
- if ($hook eq 'package-keyrings') {
- return ($self->SUPER::run_hook($hook),
- '/usr/share/keyrings/trisquel-archive-keyring.gpg');
- } elsif ($hook eq 'archive-keyrings') {
- return ($self->SUPER::run_hook($hook),
- '/usr/share/keyrings/trisquel-archive-keyring.gpg');
- } elsif ($hook eq 'archive-keyrings-historic') {
- return ($self->SUPER::run_hook($hook),
- '/usr/share/keyrings/trisquel-archive-removed-keys.gpg');
- } elsif ($hook eq 'update-buildflags') {
- my $flags = shift @params;
-
- # Run the Debian hook to add hardening flags
- $self->SUPER::run_hook($hook, $flags);
-
- require Dpkg::BuildOptions;
-
- my $build_opts = Dpkg::BuildOptions->new();
-
- if (!$build_opts->has('noopt')) {
- require Dpkg::Arch;
-
- my $arch = Dpkg::Arch::get_host_arch();
- if (Dpkg::Arch::debarch_eq($arch, 'ppc64el')) {
- for my $flag (qw(CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS GCJFLAGS
- FFLAGS FCFLAGS)) {
- my $value = $flags->get($flag);
- $value =~ s/-O[0-9]/-O3/;
- $flags->set($flag, $value);
- }
- }
- }
- # Per https://wiki.ubuntu.com/DistCompilerFlags
- $flags->prepend('LDFLAGS', '-Wl,-Bsymbolic-functions');
- } else {
- return $self->SUPER::run_hook($hook, @params);
- }
-
- # Default return value for unknown/unimplemented hooks
- return;
-}
-
-=head1 CHANGES
-
-=head2 Version 0.xx
-
-This is a private module.
-
-=cut
-
-1;
diff --git a/helpers/DATA/dpkg/patch-Makefile_in_am-to-add-trisquel-options.patch b/helpers/DATA/dpkg/patch-Makefile_in_am-to-add-trisquel-options.patch
new file mode 100644
index 0000000..fb618d4
--- /dev/null
+++ b/helpers/DATA/dpkg/patch-Makefile_in_am-to-add-trisquel-options.patch
@@ -0,0 +1,56 @@
+diff --git a/scripts/Makefile.am b/scripts/Makefile.am
+index 8d39d24..c69d88d 100644
+--- a/scripts/Makefile.am
++++ b/scripts/Makefile.am
+@@ -89,6 +89,7 @@ nobase_dist_perllib_DATA = \
+ Dpkg/Vendor/Default.pm \
+ Dpkg/Vendor/Devuan.pm \
+ Dpkg/Vendor/Ubuntu.pm \
++ Dpkg/Vendor/Trisquel.pm \
+ Dpkg/Version.pm \
+ Dpkg.pm \
+ # EOL
+@@ -237,6 +238,7 @@ test_scripts = \
+ t/Dpkg_BuildEnv.t \
+ t/Dpkg_BuildFlags.t \
+ t/Dpkg_BuildFlags_Ubuntu.t \
++ t/Dpkg_BuildFlags_Trisquel.t
+ t/Dpkg_BuildInfo.t \
+ t/Dpkg_BuildOptions.t \
+ t/Dpkg_BuildProfiles.t \
+@@ -258,6 +260,7 @@ test_scripts = \
+ t/Dpkg_Vendor.t \
+ t/Dpkg_Changelog.t \
+ t/Dpkg_Changelog_Ubuntu.t \
++ t/Dpkg_Changelog_Trisquel.t \
+ t/Dpkg_Control_Fields.t \
+ t/Dpkg_Control.t \
+ t/Dpkg_Control_Tests.t \
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index 8b0a61f..74a035f 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -548,6 +548,7 @@ nobase_dist_perllib_DATA = \
+ Dpkg/Vendor/Default.pm \
+ Dpkg/Vendor/Devuan.pm \
+ Dpkg/Vendor/Ubuntu.pm \
++ Dpkg/Vendor/Trisquel.pm \
+ Dpkg/Version.pm \
+ Dpkg.pm \
+ # EOL
+@@ -644,6 +645,7 @@ test_scripts = \
+ t/Dpkg_BuildEnv.t \
+ t/Dpkg_BuildFlags.t \
+ t/Dpkg_BuildFlags_Ubuntu.t \
++ t/Dpkg_BuildFlags_Trisquel.t \
+ t/Dpkg_BuildInfo.t \
+ t/Dpkg_BuildOptions.t \
+ t/Dpkg_BuildProfiles.t \
+@@ -665,6 +667,7 @@ test_scripts = \
+ t/Dpkg_Vendor.t \
+ t/Dpkg_Changelog.t \
+ t/Dpkg_Changelog_Ubuntu.t \
++ t/Dpkg_Changelog_Trisquel.t \
+ t/Dpkg_Control_Fields.t \
+ t/Dpkg_Control.t \
+ t/Dpkg_Control_Tests.t \
diff --git a/helpers/DATA/dpkg/patch-Trisquel_pm-from-Ubuntu_pm.patch b/helpers/DATA/dpkg/patch-Trisquel_pm-from-Ubuntu_pm.patch
new file mode 100644
index 0000000..75fc55d
--- /dev/null
+++ b/helpers/DATA/dpkg/patch-Trisquel_pm-from-Ubuntu_pm.patch
@@ -0,0 +1,154 @@
+diff --git a/scripts/Dpkg/Vendor/Trisquel.pm b/scripts/Dpkg/Vendor/Trisquel.pm
+index 383d5cc..8b65c43 100644
+--- a/scripts/Dpkg/Vendor/Trisquel.pm
++++ b/scripts/Dpkg/Vendor/Trisquel.pm
+@@ -3,6 +3,8 @@
+ # written by Colin Watson
+ # Copyright © 2008 James Westby
+ # Copyright © 2009 Raphaël Hertzog
++# Copyright © 2022 Ruben Rodriguez
++# Copyright © 2024 Luis Guzman
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+@@ -21,18 +23,18 @@
+
+ =head1 NAME
+
+-Dpkg::Vendor::Ubuntu - Ubuntu vendor class
++Dpkg::Vendor::Trisquel - Trisquel vendor class
+
+ =head1 DESCRIPTION
+
+-This vendor class customizes the behavior of dpkg scripts for Ubuntu
++This vendor class customizes the behavior of dpkg scripts for Trisquel
+ specific behavior and policies.
+
+ B: This is a private module, its API can change at any time.
+
+ =cut
+
+-package Dpkg::Vendor::Ubuntu 0.01;
++package Dpkg::Vendor::Trisquel 0.01;
+
+ use strict;
+ use warnings;
+@@ -48,71 +50,20 @@ use parent qw(Dpkg::Vendor::Debian);
+ sub run_hook {
+ my ($self, $hook, @params) = @_;
+
+- if ($hook eq 'before-source-build') {
+- my $src = shift @params;
+- my $fields = $src->{fields};
+-
+- # check that Maintainer/XSBC-Original-Maintainer comply to
+- # https://wiki.ubuntu.com/DebianMaintainerField
+- if (defined($fields->{'Version'}) and defined($fields->{'Maintainer'}) and
+- $fields->{'Version'} =~ /ubuntu/) {
+- if ($fields->{'Maintainer'} !~ /(?:ubuntu|canonical)/i) {
+- if (length $ENV{DEBEMAIL} and $ENV{DEBEMAIL} =~ /\@(?:ubuntu|canonical)\.com/) {
+- error(g_('Version number suggests Ubuntu changes, but Maintainer: does not have Ubuntu address'));
+- } else {
+- warning(g_('Version number suggests Ubuntu changes, but Maintainer: does not have Ubuntu address'));
+- }
+- }
+- unless ($fields->{'Original-Maintainer'}) {
+- warning(g_('Version number suggests Ubuntu changes, but there is no XSBC-Original-Maintainer field'));
+- }
+- }
+- } elsif ($hook eq 'package-keyrings') {
++ if ($hook eq 'package-keyrings') {
+ return ($self->SUPER::run_hook($hook),
+- '/usr/share/keyrings/ubuntu-archive-keyring.gpg');
++ '/usr/share/keyrings/trisquel-archive-keyring.gpg');
+ } elsif ($hook eq 'archive-keyrings') {
+ return ($self->SUPER::run_hook($hook),
+- '/usr/share/keyrings/ubuntu-archive-keyring.gpg');
++ '/usr/share/keyrings/trisquel-archive-keyring.gpg');
+ } elsif ($hook eq 'archive-keyrings-historic') {
+ return ($self->SUPER::run_hook($hook),
+- '/usr/share/keyrings/ubuntu-archive-removed-keys.gpg');
+- } elsif ($hook eq 'register-custom-fields') {
+- my @field_ops = $self->SUPER::run_hook($hook);
+- push @field_ops, [
+- 'register', 'Launchpad-Bugs-Fixed',
+- CTRL_FILE_CHANGES | CTRL_CHANGELOG,
+- ], [
+- 'insert_after', CTRL_FILE_CHANGES, 'Closes', 'Launchpad-Bugs-Fixed',
+- ], [
+- 'insert_after', CTRL_CHANGELOG, 'Closes', 'Launchpad-Bugs-Fixed',
+- ];
+- return @field_ops;
+- } elsif ($hook eq 'post-process-changelog-entry') {
+- my $fields = shift @params;
+-
+- # Add Launchpad-Bugs-Fixed field
+- my $bugs = find_launchpad_closes($fields->{'Changes'} // '');
+- if (scalar(@$bugs)) {
+- $fields->{'Launchpad-Bugs-Fixed'} = join(' ', @$bugs);
+- }
+- } elsif ($hook eq 'update-buildopts') {
+- my $build_opts = shift @params;
+- require Dpkg::Arch;
+- my $arch = Dpkg::Arch::get_host_arch();
+- if (Dpkg::Arch::debarch_eq($arch, 'riscv64')) {
+- $build_opts->set('nocheck', 1, 'riscv64');
+- }
+- } elsif ($hook eq 'update-buildprofiles') {
+- my $build_profiles_ref = shift @params;
+- unless(grep $_ =~ /^!?noudeb$/, @$build_profiles_ref) {
+- unshift(@$build_profiles_ref, 'noudeb');
+- } else {
+- # Strip otherwise invalid profile name
+- @$build_profiles_ref = grep { $_ ne "!noudeb" } @$build_profiles_ref;
+- }
++ '/usr/share/keyrings/trisquel-archive-removed-keys.gpg');
+ } else {
+ return $self->SUPER::run_hook($hook, @params);
+ }
++ # Default return value for unknown/unimplemented hooks
++ return;
+ }
+
+ sub _lto_disabled {
+@@ -289,39 +240,11 @@ sub add_build_flags {
+ return;
+ }
+
+-=head1 PUBLIC FUNCTIONS
+-
+-=over
+-
+-=item $bugs = Dpkg::Vendor::Ubuntu::find_launchpad_closes($changes)
+-
+-Takes one string as argument and finds "LP: #123456, #654321" statements,
+-which are references to bugs on Launchpad. Returns all closed bug
+-numbers in an array reference.
+-
+-=cut
+-
+-sub find_launchpad_closes {
+- my $changes = shift;
+- my %closes;
+-
+- while ($changes &&
+- ($changes =~ /lp:\s+\#\d+(?:,\s*\#\d+)*/pig)) {
+- $closes{$_} = 1 foreach (${^MATCH} =~ /\#?\s?(\d+)/g);
+- }
+-
+- my @closes = sort { $a <=> $b } keys %closes;
+-
+- return \@closes;
+-}
+-
+-=back
+-
+ =head1 CHANGES
+
+ =head2 Version 0.xx
+
+-This is a semi-private module. Only documented functions are public.
++This is a private module.
+
+ =cut
+
diff --git a/helpers/DATA/electrum/replace_distutils_by_packaging.patch b/helpers/DATA/electrum/replace_distutils_by_packaging.patch
new file mode 100644
index 0000000..01263b5
--- /dev/null
+++ b/helpers/DATA/electrum/replace_distutils_by_packaging.patch
@@ -0,0 +1,43 @@
+diff --git a/electrum/gui/qt/update_checker.py b/electrum/gui/qt/update_checker.py
+index fa3ad989..998e746f 100644
+--- a/electrum/gui/qt/update_checker.py
++++ b/electrum/gui/qt/update_checker.py
+@@ -16,7 +16,7 @@ from electrum.i18n import _
+ from electrum.util import make_aiohttp_session
+ from electrum.logging import Logger
+ from electrum.network import Network
+-from electrum._vendor.distutils.version import StrictVersion
++import packaging.version
+
+
+ class UpdateCheck(QDialog, Logger):
+@@ -76,7 +76,7 @@ class UpdateCheck(QDialog, Logger):
+
+ @staticmethod
+ def is_newer(latest_version):
+- return latest_version > StrictVersion(version.ELECTRUM_VERSION)
++ return latest_version > packaging.version(version.ELECTRUM_VERSION)
+
+ def update_view(self, latest_version=None):
+ if latest_version:
+@@ -129,7 +129,7 @@ class UpdateCheckThread(QThread, Logger):
+ break
+ else:
+ raise Exception('no valid signature for version announcement')
+- return StrictVersion(version_num.strip())
++ return packaging.version(version_num.strip())
+
+ def run(self):
+ if not self.network:
+diff --git a/debian/control b/debian/control
+index 6b24e90c..2a3f3436 100644
+--- a/debian/control
++++ b/debian/control
+@@ -24,6 +24,7 @@ Build-Depends:
+ python3-dnspython (>= 2.0),
+ python3-ecdsa (>= 0.14),
+ python3-kivy,
++ python3-packaging,
+ python3-pbkdf2,
+ python3-protobuf (>= 3.12),
+ python3-pyaes,
diff --git a/helpers/DATA/eom/patch_changes/001-361_add_helper_to_get_content_type.patch b/helpers/DATA/eom/patch_changes/001-361_add_helper_to_get_content_type.patch
new file mode 100644
index 0000000..b25c20d
--- /dev/null
+++ b/helpers/DATA/eom/patch_changes/001-361_add_helper_to_get_content_type.patch
@@ -0,0 +1,406 @@
+From 1dcda49f5ca719dfea822a34ac7925246875240f Mon Sep 17 00:00:00 2001
+From: Victor Kareh
+Date: Thu, 24 Jul 2025 09:23:56 -0400
+Subject: [PATCH 1/2] EomUtil: Add helper to get content type from GFileInfos
+
+This prefers the real content type, but automatically falls back to the
+fast content type the other one isn't set in the GFileInfo.
+
+Backported from https://gitlab.gnome.org/GNOME/eog/-/commit/4f80d090fd8f27c8d430dfe5931ea53446643ec7
+---
+ src/eom-util.c | 18 ++++++++++++++++++
+ src/eom-util.h | 3 +++
+ 2 files changed, 21 insertions(+)
+
+diff --git a/src/eom-util.c b/src/eom-util.c
+index e9142235..a839f6fd 100644
+--- a/src/eom-util.c
++++ b/src/eom-util.c
+@@ -482,3 +482,21 @@ eom_notebook_scroll_event_cb (GtkWidget *widget,
+
+ return TRUE;
+ }
++
++const char*
++eom_util_get_content_type_with_fallback (GFileInfo *file_info)
++{
++ g_return_val_if_fail (file_info != NULL, NULL);
++
++ if (g_file_info_has_attribute (file_info,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE))
++ return g_file_info_get_content_type (file_info);
++ else if (g_file_info_has_attribute (file_info,
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE))
++ return g_file_info_get_attribute_string (file_info,
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE);
++ else
++ g_warn_if_reached ();
++
++ return NULL;
++}
+diff --git a/src/eom-util.h b/src/eom-util.h
+index d08b88ae..9f2c3704 100644
+--- a/src/eom-util.h
++++ b/src/eom-util.h
+@@ -68,6 +68,9 @@ void eom_util_show_file_in_filemanager (GFile *file,
+ gboolean eom_notebook_scroll_event_cb (GtkWidget *notebook,
+ GdkEventScroll *event);
+
++G_GNUC_INTERNAL
++const char *eom_util_get_content_type_with_fallback (GFileInfo *file_info);
++
+ G_END_DECLS
+
+ #endif /* __EOM_UTIL_H__ */
+
+From f1275445e638d3c38c93457227602b7314f59d86 Mon Sep 17 00:00:00 2001
+From: Victor Kareh
+Date: Thu, 24 Jul 2025 09:26:33 -0400
+Subject: [PATCH 2/2] Eom*: Use fast content type as fallback
+
+It turns out that, depending on the responsible GVfs implementation,
+a GFileInfo may not actually set the content type attribute even if
+requested. Since knowing the content type is rather critical for eom
+try to use the fast content type as a fallback in those cases.
+
+The fast content type should be hardly unknown as it is usually just
+based on the file extension.
+
+Fixes #360.
+
+Backported from https://gitlab.gnome.org/GNOME/eog/-/commit/de19faf73c8d8627193320d512c8b97316d9740c
+---
+ src/eom-file-chooser.c | 6 ++++--
+ src/eom-image.c | 8 +++++---
+ src/eom-jobs.c | 7 +++++--
+ src/eom-list-store.c | 18 ++++++++++++------
+ src/eom-metadata-sidebar.c | 5 +++--
+ src/eom-properties-dialog.c | 5 +++--
+ src/eom-thumb-view.c | 6 ++++--
+ src/eom-thumbnail.c | 4 +++-
+ src/eom-window.c | 10 ++++++----
+ 9 files changed, 45 insertions(+), 24 deletions(-)
+
+diff --git a/src/eom-file-chooser.c b/src/eom-file-chooser.c
+index 5d82901d..5c366fae 100644
+--- a/src/eom-file-chooser.c
++++ b/src/eom-file-chooser.c
+@@ -22,6 +22,7 @@
+ #include "eom-file-chooser.h"
+ #include "eom-config-keys.h"
+ #include "eom-pixbuf-util.h"
++#include "eom-util.h"
+
+ #include
+
+@@ -333,7 +334,8 @@ update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
+ G_FILE_ATTRIBUTE_TIME_MODIFIED ","
+ G_FILE_ATTRIBUTE_STANDARD_TYPE ","
+ G_FILE_ATTRIBUTE_STANDARD_SIZE ","
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ g_object_unref (file);
+
+@@ -352,7 +354,7 @@ update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
+ /* read files smaller than 100kb directly */
+
+ gchar *mime_type = g_content_type_get_mime_type (
+- g_file_info_get_content_type (file_info));
++ eom_util_get_content_type_with_fallback (file_info));
+
+ if (G_LIKELY (mime_type)) {
+ gboolean can_thumbnail, has_failed;
+diff --git a/src/eom-image.c b/src/eom-image.c
+index f24b5282..e9741efe 100644
+--- a/src/eom-image.c
++++ b/src/eom-image.c
+@@ -589,7 +589,8 @@ eom_image_get_file_info (EomImage *img,
+
+ file_info = g_file_query_info (img->priv->file,
+ G_FILE_ATTRIBUTE_STANDARD_SIZE ","
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, error);
+
+ if (file_info == NULL) {
+@@ -607,8 +608,9 @@ eom_image_get_file_info (EomImage *img,
+ if (bytes)
+ *bytes = g_file_info_get_size (file_info);
+
+- if (mime_type)
+- *mime_type = g_strdup (g_file_info_get_content_type (file_info));
++ if (mime_type) {
++ *mime_type = g_strdup (eom_util_get_content_type_with_fallback (file_info));
++ }
+ g_object_unref (file_info);
+ }
+ }
+diff --git a/src/eom-jobs.c b/src/eom-jobs.c
+index 71042681..0b518004 100644
+--- a/src/eom-jobs.c
++++ b/src/eom-jobs.c
+@@ -30,6 +30,7 @@
+ #include "eom-list-store.h"
+ #include "eom-thumbnail.h"
+ #include "eom-pixbuf-util.h"
++#include "eom-util.h"
+
+ #include
+
+@@ -385,7 +386,9 @@ filter_files (GSList *files, GList **file_list, GList **error_list)
+
+ if (file != NULL) {
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_TYPE","G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+ type = G_FILE_TYPE_UNKNOWN;
+@@ -397,7 +400,7 @@ filter_files (GSList *files, GList **file_list, GList **error_list)
+ if (G_UNLIKELY (type == G_FILE_TYPE_UNKNOWN)) {
+ const gchar *ctype;
+
+- ctype = g_file_info_get_content_type (file_info);
++ ctype = eom_util_get_content_type_with_fallback (file_info);
+
+ /* If the content type is supported
+ adjust the file_type */
+diff --git a/src/eom-list-store.c b/src/eom-list-store.c
+index 3d1a9c68..9336614b 100644
+--- a/src/eom-list-store.c
++++ b/src/eom-list-store.c
+@@ -26,6 +26,7 @@
+ #include "eom-image.h"
+ #include "eom-job-queue.h"
+ #include "eom-jobs.h"
++#include "eom-util.h"
+
+ #include
+
+@@ -378,12 +379,13 @@ file_monitor_changed_cb (GFileMonitor *monitor,
+ case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE ","
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+ break;
+ }
+- mimetype = g_file_info_get_content_type (file_info);
++ mimetype = eom_util_get_content_type_with_fallback (file_info);
+
+ if (is_file_in_list_store_file (store, file, &iter)) {
+ if (eom_image_is_supported_mime_type (mimetype)) {
+@@ -419,12 +421,13 @@ file_monitor_changed_cb (GFileMonitor *monitor,
+ if (!is_file_in_list_store_file (store, file, NULL)) {
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE ","
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+ break;
+ }
+- mimetype = g_file_info_get_content_type (file_info);
++ mimetype = eom_util_get_content_type_with_fallback (file_info);
+
+ if (eom_image_is_supported_mime_type (mimetype)) {
+ const gchar *caption;
+@@ -437,12 +440,13 @@ file_monitor_changed_cb (GFileMonitor *monitor,
+ break;
+ case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+ break;
+ }
+- mimetype = g_file_info_get_content_type (file_info);
++ mimetype = eom_util_get_content_type_with_fallback (file_info);
+ if (is_file_in_list_store_file (store, file, &iter) &&
+ eom_image_is_supported_mime_type (mimetype)) {
+ eom_list_store_thumbnail_refresh (store, &iter);
+@@ -468,7 +472,7 @@ directory_visit (GFile *directory,
+ gboolean load_uri = FALSE;
+ const char *mime_type, *name;
+
+- mime_type = g_file_info_get_content_type (children_info);
++ mime_type = eom_util_get_content_type_with_fallback (children_info);
+ name = g_file_info_get_name (children_info);
+
+ if (!g_str_has_prefix (name, ".")) {
+@@ -512,6 +516,7 @@ eom_list_store_append_directory (EomListStore *store,
+
+ file_enumerator = g_file_enumerate_children (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE ","
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
+ 0, NULL, NULL);
+@@ -565,6 +570,7 @@ eom_list_store_add_files (EomListStore *store, GList *file_list, gboolean preser
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_TYPE","
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE","
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+@@ -578,7 +584,7 @@ eom_list_store_add_files (EomListStore *store, GList *file_list, gboolean preser
+ if (G_UNLIKELY (file_type == G_FILE_TYPE_UNKNOWN)) {
+ const gchar *ctype;
+
+- ctype = g_file_info_get_content_type (file_info);
++ ctype = eom_util_get_content_type_with_fallback (file_info);
+
+ /* If the content type is supported adjust file_type */
+ if (eom_image_is_supported_mime_type (ctype))
+diff --git a/src/eom-metadata-sidebar.c b/src/eom-metadata-sidebar.c
+index 9b8fc8b8..2dbde74b 100644
+--- a/src/eom-metadata-sidebar.c
++++ b/src/eom-metadata-sidebar.c
+@@ -158,14 +158,15 @@ eom_metadata_sidebar_update_general_section (EomMetadataSidebar *sidebar)
+
+ file = eom_image_get_file (img);
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+ str = g_strdup (_("Unknown"));
+ } else {
+ const gchar *mime_str;
+
+- mime_str = g_file_info_get_content_type (file_info);
++ mime_str = eom_util_get_content_type_with_fallback (file_info);
+ str = g_content_type_get_description (mime_str);
+ g_object_unref (file_info);
+ }
+diff --git a/src/eom-properties-dialog.c b/src/eom-properties-dialog.c
+index 0bad997d..480b3f74 100644
+--- a/src/eom-properties-dialog.c
++++ b/src/eom-properties-dialog.c
+@@ -173,12 +173,13 @@ pd_update_general_tab (EomPropertiesDialog *prop_dlg,
+
+ file = eom_image_get_file (image);
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ if (file_info == NULL) {
+ type_str = g_strdup (_("Unknown"));
+ } else {
+- mime_str = g_file_info_get_content_type (file_info);
++ mime_str = eom_util_get_content_type_with_fallback (file_info);
+ type_str = g_content_type_get_description (mime_str);
+ g_object_unref (file_info);
+ }
+diff --git a/src/eom-thumb-view.c b/src/eom-thumb-view.c
+index 0b28440d..332d180a 100644
+--- a/src/eom-thumb-view.c
++++ b/src/eom-thumb-view.c
+@@ -27,6 +27,7 @@
+ #include "eom-list-store.h"
+ #include "eom-image.h"
+ #include "eom-job-queue.h"
++#include "eom-util.h"
+
+ #ifdef HAVE_EXIF
+ #include "eom-exif-util.h"
+@@ -494,7 +495,8 @@ thumbview_get_tooltip_string (EomImage *image)
+
+ file = eom_image_get_file (image);
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ g_object_unref (file);
+ if (file_info == NULL) {
+@@ -502,7 +504,7 @@ thumbview_get_tooltip_string (EomImage *image)
+ return NULL;
+ }
+
+- mime_str = g_file_info_get_content_type (file_info);
++ mime_str = eom_util_get_content_type_with_fallback (file_info);
+
+ if (G_UNLIKELY (mime_str == NULL)) {
+ g_free (bytes);
+diff --git a/src/eom-thumbnail.c b/src/eom-thumbnail.c
+index 6a278b31..30a5760a 100644
+--- a/src/eom-thumbnail.c
++++ b/src/eom-thumbnail.c
+@@ -36,6 +36,7 @@
+ #include "eom-thumbnail.h"
+ #include "eom-list-store.h"
+ #include "eom-debug.h"
++#include "eom-util.h"
+
+ #define EOM_THUMB_ERROR eom_thumb_error_quark ()
+
+@@ -161,6 +162,7 @@ eom_thumb_data_new (GFile *file, GError **error)
+
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE ","
+ G_FILE_ATTRIBUTE_TIME_MODIFIED ","
+ G_FILE_ATTRIBUTE_THUMBNAIL_PATH ","
+ G_FILE_ATTRIBUTE_THUMBNAILING_FAILED ","
+@@ -176,7 +178,7 @@ eom_thumb_data_new (GFile *file, GError **error)
+ /* if available, copy data */
+ data->mtime = g_file_info_get_attribute_uint64 (file_info,
+ G_FILE_ATTRIBUTE_TIME_MODIFIED);
+- data->mime_type = g_strdup (g_file_info_get_content_type (file_info));
++ data->mime_type = g_strdup (eom_util_get_content_type_with_fallback (file_info));
+
+ data->thumb_exists = (g_file_info_get_attribute_byte_string (file_info,
+ G_FILE_ATTRIBUTE_THUMBNAIL_PATH) != NULL);
+diff --git a/src/eom-window.c b/src/eom-window.c
+index c039d67c..3d572f9d 100644
+--- a/src/eom-window.c
++++ b/src/eom-window.c
+@@ -738,7 +738,8 @@ add_file_to_recent_files (GFile *file)
+ return FALSE;
+
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+ if (file_info == NULL)
+ return FALSE;
+@@ -746,7 +747,7 @@ add_file_to_recent_files (GFile *file)
+ recent_data = g_slice_new (GtkRecentData);
+ recent_data->display_name = NULL;
+ recent_data->description = NULL;
+- recent_data->mime_type = (gchar *) g_file_info_get_content_type (file_info);
++ recent_data->mime_type = (gchar *) eom_util_get_content_type_with_fallback (file_info);
+ recent_data->app_name = EOM_RECENT_FILES_APP_NAME;
+ recent_data->app_exec = g_strjoin(" ", g_get_prgname (), "%u", NULL);
+ recent_data->groups = groups;
+@@ -955,13 +956,14 @@ eom_window_update_openwith_menu (EomWindow *window, EomImage *image)
+
+ file = eom_image_get_file (image);
+ file_info = g_file_query_info (file,
+- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
++ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
++ G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
+ 0, NULL, NULL);
+
+ if (file_info == NULL)
+ return;
+ else {
+- mime_type = g_file_info_get_content_type (file_info);
++ mime_type = eom_util_get_content_type_with_fallback (file_info);
+ }
+
+ if (priv->open_with_menu_id != 0) {
diff --git a/helpers/DATA/epiphany-browser/patch_changes/000-force_disable_gl_tests.patch b/helpers/DATA/epiphany-browser/patch_changes/000-force_disable_gl_tests.patch
new file mode 100644
index 0000000..1590440
--- /dev/null
+++ b/helpers/DATA/epiphany-browser/patch_changes/000-force_disable_gl_tests.patch
@@ -0,0 +1,32 @@
+diff --git a/tests/meson.build b/tests/meson.build
+index 5528a6e4..4b63cb85 100644
+--- a/tests/meson.build
++++ b/tests/meson.build
+@@ -31,16 +31,17 @@ if get_option('unit_tests').enabled()
+ # env: envs
+ # )
+
+- embed_shell_test = executable('test-ephy-embed-shell',
+- 'ephy-embed-shell-test.c',
+- adguard_resources,
+- dependencies: ephymain_dep,
+- c_args: test_cargs + ['-DTEST_DIR="' + meson.current_source_dir() + '"'],
+- )
+- test('Embed shell test',
+- embed_shell_test,
+- env: envs
+- )
++ # TRISQUEL: Disabled test due builds env don't support OpenGL.
++ #embed_shell_test = executable('test-ephy-embed-shell',
++ # 'ephy-embed-shell-test.c',
++ # adguard_resources,
++ # dependencies: ephymain_dep,
++ # c_args: test_cargs + ['-DTEST_DIR="' + meson.current_source_dir() + '"'],
++ #)
++ #test('Embed shell test',
++ # embed_shell_test,
++ # env: envs
++ #)
+
+ embed_utils_test = executable('test-ephy-embed-utils',
+ 'ephy-embed-utils-test.c',
diff --git a/helpers/DATA/finish-install/09trisquel-uefi-splash b/helpers/DATA/finish-install/09trisquel-uefi-splash
new file mode 100755
index 0000000..537e917
--- /dev/null
+++ b/helpers/DATA/finish-install/09trisquel-uefi-splash
@@ -0,0 +1,49 @@
+#!/bin/sh
+# Enable 'splash' only on UEFI desktop installs, and only if Plymouth is present.
+# Runs before 10update-initramfs, so we only call update-grub here.
+#
+
+# Run only on UEFI installs
+[ -d /sys/firmware/efi ] || exit 0
+
+# Require plymouth in the target system (otherwise splash is pointless)
+in-target dpkg -s plymouth >/dev/null 2>&1 || exit 0
+
+# Heuristic “desktop present?” check — avoid debconf; rely on packages/DM.
+if ! in-target sh -c '
+ dpkg -s trisquel-desktop-common >/dev/null 2>&1 ||
+ dpkg -s triskel >/dev/null 2>&1 ||
+ dpkg -s trisquel-gnome >/dev/null 2>&1 ||
+ dpkg -s trisquel-mini >/dev/null 2>&1 ||
+ dpkg -s lightdm >/dev/null 2>&1 ||
+ dpkg -s gdm3 >/dev/null 2>&1 ||
+ dpkg -s sddm >/dev/null 2>&1
+'; then
+# No desktop, then do nothing
+ exit 0
+fi
+
+CFG=/target/etc/default/grub
+[ -f "$CFG" ] || exit 0
+
+# If the key is missing entirely, create it with just "splash"
+grep -q '^GRUB_CMDLINE_LINUX_DEFAULT=' "$CFG" \
+ || echo 'GRUB_CMDLINE_LINUX_DEFAULT="splash"' >> "$CFG"
+
+# Normalize trivial cases:
+# - empty quotes > "splash"
+# - unquoted value > quote it
+sed -i -r \
+ -e 's/^GRUB_CMDLINE_LINUX_DEFAULT=""$/GRUB_CMDLINE_LINUX_DEFAULT="splash"/' \
+ -e 's/^(GRUB_CMDLINE_LINUX_DEFAULT)=([^"].*)$/\1="\2"/' \
+ "$CFG"
+
+# If 'splash' is already present, leave as-is; otherwise append it
+grep -q '^GRUB_CMDLINE_LINUX_DEFAULT=.*\bsplash\b' "$CFG" || \
+ sed -i -r 's/^(GRUB_CMDLINE_LINUX_DEFAULT="[^"]*)"/\1 splash"/' "$CFG"
+
+# Regenerate grub.cfg; never fail finish-install
+in-target update-grub >/dev/null 2>&1 || true
+
+# Always succeed so remaining finish-install hooks run
+exit 0
diff --git a/helpers/DATA/finish-install/fix_keyboard-configure-netinstall.patch b/helpers/DATA/finish-install/fix_keyboard-configure-netinstall.patch
deleted file mode 100644
index 231ab51..0000000
--- a/helpers/DATA/finish-install/fix_keyboard-configure-netinstall.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff -Nru finish-install-2.104+11.0trisquel0/finish-install.d/10update-initramfs finish-install-2.104+11.0trisquel0/finish-install.d/10update-initramfs
---- finish-install-2.104+11.0trisquel0/finish-install.d/10update-initramfs 2018-08-10 14:21:58.000000000 -0500
-+++ finish-install-2.104+11.0trisquel0/finish-install.d/10update-initramfs 2022-12-18 17:56:21.817264252 -0600
-@@ -4,7 +4,11 @@
- # update-initramfs to make sure one can type the passphrase
- # (see #694156, workaround for #696773):
- /bin/in-target \
-- /bin/sh -c "dpkg-query -s cryptsetup >/dev/null 2>&1 && dpkg-query -s console-setup >/dev/null 2>&1"
-+ /bin/sh -c "dpkg-query -s console-setup >/dev/null 2>&1"
-+
-+#Fix bug keyboard not using the selected layout.
-+/bin/in-target \
-+ dpkg-reconfigure -f noninteractive keyboard-configuration
-
- if [ $? = 0 ]; then
- echo "Encrypted LVM detected, refreshing initramfs"
diff --git a/helpers/DATA/finish-install/patch_changes/001-fix_keyboard-configure-netinstall.patch b/helpers/DATA/finish-install/patch_changes/001-fix_keyboard-configure-netinstall.patch
new file mode 100644
index 0000000..0101fe3
--- /dev/null
+++ b/helpers/DATA/finish-install/patch_changes/001-fix_keyboard-configure-netinstall.patch
@@ -0,0 +1,16 @@
+diff --git a/finish-install.d/10update-initramfs b/finish-install.d/10update-initramfs
+index f91557cb..6b35ce25 100755
+--- a/finish-install.d/10update-initramfs
++++ b/finish-install.d/10update-initramfs
+@@ -6,8 +6,10 @@ log() {
+
+ # If both cryptsetup and console-setup are installed, run update-initramfs to
+ # make sure one can type the passphrase (see #694156, workaround for #696773):
+-if /bin/in-target /bin/sh -c "dpkg-query -s cryptsetup >/dev/null 2>&1 && dpkg-query -s console-setup >/dev/null 2>&1"; then
++if /bin/in-target /bin/sh -c "dpkg-query -s console-setup >/dev/null 2>&1"; then
+ log "refresh initramfs for cryptsetup"
++ # Fix bug keyboard not using the selected layout. --Trisquel
++ /bin/in-target /bin/sh -c "dpkg-reconfigure -f noninteractive keyboard-configuration"
+ refresh=yes
+ fi
+
diff --git a/helpers/DATA/firefox/branding/content/about-wordmark.svg b/helpers/DATA/firefox/branding/content/about-wordmark.svg
index 64f0cdb..57404ce 100644
--- a/helpers/DATA/firefox/branding/content/about-wordmark.svg
+++ b/helpers/DATA/firefox/branding/content/about-wordmark.svg
@@ -1,73 +1,11 @@
-
+
image/svg+xml
+ xmlns="http://www.w3.org/2000/svg">
+
diff --git a/helpers/DATA/firefox/branding/content/aboutDialog.css b/helpers/DATA/firefox/branding/content/aboutDialog.css
index 6312a59..4b16868 100644
--- a/helpers/DATA/firefox/branding/content/aboutDialog.css
+++ b/helpers/DATA/firefox/branding/content/aboutDialog.css
@@ -40,8 +40,9 @@
}
#rightBox {
- margin-left: 30px;
- margin-right: 30px;
+ background-size: auto 64px;
+ margin-inline: 30px;
+ padding-top: 64px;
}
#bottomBox {
diff --git a/helpers/DATA/firefox/branding/content/firefox-wordmark.svg b/helpers/DATA/firefox/branding/content/firefox-wordmark.svg
index 3de7bbd..def6e54 100644
--- a/helpers/DATA/firefox/branding/content/firefox-wordmark.svg
+++ b/helpers/DATA/firefox/branding/content/firefox-wordmark.svg
@@ -1,78 +1,10 @@
-
+
image/svg+xml
+ width="232"
+ height="41"
+ viewBox="0 0 232 41"
+ xmlns="http://www.w3.org/2000/svg">
+
diff --git a/helpers/DATA/firefox/default-strict.patch b/helpers/DATA/firefox/default-strict.patch
index 393ea60..488f472 100644
--- a/helpers/DATA/firefox/default-strict.patch
+++ b/helpers/DATA/firefox/default-strict.patch
@@ -1,7 +1,8 @@
-diff -ru firefox-110.0+build1/browser/components/BrowserGlue.sys.mjs firefox-110.0+build1/browser/components/BrowserGlue.sys.mjs_fix
---- firefox-110.0+build1/browser/components/BrowserGlue.sys.mjs 2023-02-07 01:52:32.000000000 -0600
-+++ firefox-110.0+build1/browser/components/BrowserGlue.sys.mjs_fix 2023-02-07 14:52:59.465762604 -0600
-@@ -1637,6 +1637,19 @@
+diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
+index 8fa6f7a..a34ab8b 100644
+--- a/browser/components/BrowserGlue.sys.mjs
++++ b/browser/components/BrowserGlue.sys.mjs
+@@ -1860,6 +1860,19 @@ BrowserGlue.prototype = {
}
});
@@ -18,6 +19,6 @@ diff -ru firefox-110.0+build1/browser/components/BrowserGlue.sys.mjs firefox-110
+ Services.prefs.setStringPref("browser.contentblocking.category", "strict"); this._updateCBCategory;
+ }
+
- // Offer to reset a user's profile if it hasn't been used for 60 days.
- const OFFER_PROFILE_RESET_INTERVAL_MS = 60 * 24 * 60 * 60 * 1000;
- let lastUse = Services.appinfo.replacedLockTime;
+ this._maybeOfferProfileReset();
+
+ this._checkForOldBuildUpdates();
diff --git a/helpers/DATA/firefox/patch_changes/Remove_Android_and_iOS_promotion.patch b/helpers/DATA/firefox/patch_changes/001-Remove_Android_and_iOS_promotion.patch
similarity index 93%
rename from helpers/DATA/firefox/patch_changes/Remove_Android_and_iOS_promotion.patch
rename to helpers/DATA/firefox/patch_changes/001-Remove_Android_and_iOS_promotion.patch
index 74524a7..08bca09 100644
--- a/helpers/DATA/firefox/patch_changes/Remove_Android_and_iOS_promotion.patch
+++ b/helpers/DATA/firefox/patch_changes/001-Remove_Android_and_iOS_promotion.patch
@@ -1,13 +1,14 @@
diff --git a/browser/components/preferences/sync.inc.xhtml b/browser/components/preferences/sync.inc.xhtml
-index 7d37d26..4ebbc06 100644
+index 492491a3..0c8c462a 100644
--- a/browser/components/preferences/sync.inc.xhtml
+++ b/browser/components/preferences/sync.inc.xhtml
-@@ -35,22 +35,6 @@
+@@ -35,24 +35,6 @@
-
-
@@ -15,6 +16,7 @@ index 7d37d26..4ebbc06 100644
- data-l10n-name="android-link"
- class="fxaMobilePromo-android text-link" target="_blank"/>
-
@@ -49,12 +51,12 @@ index 1b29e8d..6f7566c 100644
sync-profile-picture =
.tooltiptext = Change profile picture
diff --git a/browser/components/protections/content/vpn-card.mjs b/browser/components/protections/content/vpn-card.mjs
-index 2417f1a641..698c48ccc3 100644
+index d9fe35c0..1b166048 100644
--- a/browser/components/protections/content/vpn-card.mjs
+++ b/browser/components/protections/content/vpn-card.mjs
-@@ -23,22 +23,6 @@ export default class VPNCard {
+@@ -24,22 +24,6 @@ export default class VPNCard {
vpnLink.addEventListener("click", () => {
- this.doc.sendTelemetryEvent("click", "vpn_card_link");
+ this.doc.sendTelemetryEvent("clickVpnCardLink");
});
- let androidVPNAppLink = document.getElementById(
- "vpn-google-playstore-link"
@@ -63,14 +65,14 @@ index 2417f1a641..698c48ccc3 100644
- "browser.contentblocking.report.vpn-android.url"
- );
- androidVPNAppLink.addEventListener("click", () => {
-- document.sendTelemetryEvent("click", "vpn_app_link_android");
+- document.sendTelemetryEvent("clickVpnAppLinkAndroid");
- });
- let iosVPNAppLink = document.getElementById("vpn-app-store-link");
- iosVPNAppLink.href = RPMGetStringPref(
- "browser.contentblocking.report.vpn-ios.url"
- );
- iosVPNAppLink.addEventListener("click", () => {
-- document.sendTelemetryEvent("click", "vpn_app_link_ios");
+- document.sendTelemetryEvent("clickVpnAppLinkIos");
- });
const vpnBanner = this.doc.querySelector(".vpn-banner");
diff --git a/helpers/DATA/firefox/patch_changes/Remove_moreFromMozilla_Focus_and_Klar.patch b/helpers/DATA/firefox/patch_changes/002-Remove_moreFromMozilla_Focus_and_Klar.patch
similarity index 77%
rename from helpers/DATA/firefox/patch_changes/Remove_moreFromMozilla_Focus_and_Klar.patch
rename to helpers/DATA/firefox/patch_changes/002-Remove_moreFromMozilla_Focus_and_Klar.patch
index 4e47879..3f44f06 100644
--- a/helpers/DATA/firefox/patch_changes/Remove_moreFromMozilla_Focus_and_Klar.patch
+++ b/helpers/DATA/firefox/patch_changes/002-Remove_moreFromMozilla_Focus_and_Klar.patch
@@ -3,44 +3,34 @@ Based on https://git.parabola.nu/abslibre.git/diff/libre/iceweasel/9004-FSDG-mis
- Remove 'More from Mozilla' section in Preferences
- Remove promos of Firefox Focus and Klar from Private Browsing
-diff -Nru a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
---- a/browser/app/profile/firefox.js 2022-05-22 09:35:55.500675021 +0000
-+++ b/browser/app/profile/firefox.js 2022-05-22 21:54:34.961904349 +0000
-@@ -1007,11 +1007,11 @@
- // Toggling Search bar on and off in about:preferences
- pref("browser.preferences.search", true);
- #if defined(NIGHTLY_BUILD)
--pref("browser.preferences.experimental", true);
-+pref("browser.preferences.experimental", false);
- #else
- pref("browser.preferences.experimental", false);
- #endif
+diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
+index c5f7cf3a..f0124235 100644
+--- a/browser/app/profile/firefox.js
++++ b/browser/app/profile/firefox.js
+@@ -1368,9 +1368,9 @@ pref("accessibility.typeaheadfind.linksonly", false);
+ pref("accessibility.typeaheadfind.flashBar", 1);
+
+ // Whether we had to hide the "Firefox Labs" section because it would be empty.
+-pref("browser.preferences.experimental.hidden", false);
++pref("browser.preferences.experimental.hidden", true);
+ // Whether we show the "More from Mozilla" section.
-pref("browser.preferences.moreFromMozilla", true);
+pref("browser.preferences.moreFromMozilla", false);
- pref("browser.preferences.experimental.hidden", false);
- pref("browser.preferences.defaultPerformanceSettings.enabled", true);
-@@ -1907,7 +1907,7 @@
+ // Used by settings to track whether the user customized advanced
+ // performance settings. Not used directly elsewhere.
+@@ -2281,7 +2281,7 @@ pref("browser.contentblocking.report.vpn_regions", "ca,my,nz,sg,gb,gg,im,io,je,u
pref("browser.promo.focus.disallowed_regions", "cn");
// Default to enabling focus promos to be shown where allowed.
-pref("browser.promo.focus.enabled", true);
+pref("browser.promo.focus.enabled", false);
- // Comma separated string of mozilla vpn supported platforms.
- pref("browser.contentblocking.report.vpn_platforms", "win,mac,linux");
+ // Default to enabling pin promos to be shown where allowed.
+ pref("browser.promo.pin.enabled", true);
diff -Nru a/browser/base/content/test/static/browser_all_files_referenced.js b/browser/base/content/test/static/browser_all_files_referenced.js
--- a/browser/base/content/test/static/browser_all_files_referenced.js 2022-05-22 09:35:55.336673325 +0000
+++ b/browser/base/content/test/static/browser_all_files_referenced.js 2022-05-22 21:50:33.783348501 +0000
-@@ -32,8 +32,6 @@
- "chrome://activity-stream/content/data/content/assets/remote/",
- "chrome://browser/content/assets/moz-vpn.svg",
- "chrome://browser/content/assets/vpn-logo.svg",
-- "chrome://browser/content/assets/focus-promo.png",
-- "chrome://browser/content/assets/klar-qr-code.svg",
-
- // These app marketplace icons are referenced based on the user's locale
- // in browser/components/newtab/content-src/aboutwelcome/components/MobileDownloads.jsx
@@ -145,15 +145,6 @@ var whitelist = [
// extensions/pref/autoconfig/src/nsReadConfig.cpp
{ file: "resource://gre/defaults/autoconfig/prefcalls.js" },
@@ -477,80 +467,24 @@ diff -Nru a/browser/components/preferences/jar.mn b/browser/components/preferenc
- content/browser/preferences/more-from-mozilla-qr-code-simple-cn.svg
content/browser/preferences/web-appearance-dark.svg
content/browser/preferences/web-appearance-light.svg
-diff -Nru a/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg b/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg
---- a/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg 2022-05-22 09:35:55.400673986 +0000
-+++ b/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg 1970-01-01 00:00:00.000000000 +0000
+diff --git a/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg b/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg
+index edcad0f3..e69de29b 100644
+--- a/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg
++++ b/browser/components/preferences/more-from-mozilla-qr-code-simple-cn.svg
@@ -1,4 +0,0 @@
-
--
-diff -Nru a/browser/components/preferences/more-from-mozilla-qr-code-simple.svg b/browser/components/preferences/more-from-mozilla-qr-code-simple.svg
---- a/browser/components/preferences/more-from-mozilla-qr-code-simple.svg 2022-05-22 09:35:55.404674027 +0000
-+++ b/browser/components/preferences/more-from-mozilla-qr-code-simple.svg 1970-01-01 00:00:00.000000000 +0000
+-
+diff --git a/browser/components/preferences/more-from-mozilla-qr-code-simple.svg b/browser/components/preferences/more-from-mozilla-qr-code-simple.svg
+index bb847abd..e69de29b 100644
+--- a/browser/components/preferences/more-from-mozilla-qr-code-simple.svg
++++ b/browser/components/preferences/more-from-mozilla-qr-code-simple.svg
@@ -1,4 +0,0 @@
-
--
-\ No newline at end of file
-diff --git a/browser/components/preferences/moreFromMozilla.js b/browser/components/preferences/moreFromMozilla.js
-index bf97580d..31017a6f 100644
---- a/browser/components/preferences/moreFromMozilla.js
-+++ b/browser/components/preferences/moreFromMozilla.js
-@@ -81,51 +81,7 @@ var gMoreFromMozillaPane = {
-
- renderProducts() {
- const isRegionUS = Region.home.toLowerCase() === "us";
-- let products = [
-- {
-- id: "firefox-mobile",
-- title_string_id: "more-from-moz-firefox-mobile-title",
-- description_string_id: "more-from-moz-firefox-mobile-description",
-- region: "global",
-- button: {
-- id: "fxMobile",
-- type: "link",
-- label_string_id: "more-from-moz-learn-more-link",
-- actionURL: AppConstants.isChinaRepack()
-- ? "https://www.firefox.com.cn/browsers/mobile/"
-- : "https://www.mozilla.org/firefox/browsers/mobile/",
-- },
-- qrcode: {
-- title: {
-- string_id: "more-from-moz-qr-code-box-firefox-mobile-title",
-- },
-- image_src_prefix:
-- "chrome://browser/content/preferences/more-from-mozilla-qr-code",
-- button: {
-- id: "qr-code-send-email",
-- label: {
-- string_id: "more-from-moz-qr-code-box-firefox-mobile-button",
-- },
-- actionURL: AppConstants.isChinaRepack()
-- ? "https://www.firefox.com.cn/mobile/get-app/"
-- : "https://www.mozilla.org/firefox/mobile/get-app/?v=mfm",
-- },
-- },
-- },
-- {
-- id: "mozilla-monitor",
-- title_string_id: "more-from-moz-mozilla-monitor-title",
-- description_string_id: isRegionUS
-- ? "more-from-moz-mozilla-monitor-us-description"
-- : "more-from-moz-mozilla-monitor-global-description",
-- region: isRegionUS ? "us" : "global",
-- button: {
-- id: "mozillaMonitor",
-- label_string_id: "more-from-moz-mozilla-monitor-button",
-- actionURL: "https://monitor.mozilla.org/",
-- },
-- },
-- ];
-+ let products = [];
-
- if (BrowserUtils.shouldShowVPNPromo()) {
- const vpn = {
+-
diff -Nru a/browser/components/privatebrowsing/content/assets/focus-qr-code.svg b/browser/components/privatebrowsing/content/assets/focus-qr-code.svg
--- a/browser/components/privatebrowsing/content/assets/focus-qr-code.svg 2022-05-22 09:35:55.412674110 +0000
+++ b/browser/components/privatebrowsing/content/assets/focus-qr-code.svg 1970-01-01 00:00:00.000000000 +0000
@@ -788,3 +722,73 @@ diff -Nru a/browser/components/privatebrowsing/content/assets/klar-qr-code.svg b
-
-
+diff --git a/browser/base/content/test/static/browser_all_files_referenced.js b/browser/base/content/test/static/browser_all_files_referenced.js
+index 3888af10..1d6c606f 100644
+--- a/browser/base/content/test/static/browser_all_files_referenced.js
++++ b/browser/base/content/test/static/browser_all_files_referenced.js
+@@ -41,8 +41,6 @@ var gExceptionPaths = [
+ "chrome://activity-stream/content/data/content/assets/euo-chatbot.svg",
+ "chrome://browser/content/assets/moz-vpn.svg",
+ "chrome://browser/content/assets/vpn-logo.svg",
+- "chrome://browser/content/assets/focus-promo.png",
+- "chrome://browser/content/assets/klar-qr-code.svg",
+ "chrome://browser/content/asrouter/assets/fox-with-box-on-cloud.svg",
+ "chrome://browser/content/asrouter/assets/fox-with-devices.svg",
+ "chrome://browser/content/asrouter/assets/fox-with-locked-box.svg",
+diff --git a/browser/components/preferences/moreFromMozilla.js b/browser/components/preferences/moreFromMozilla.js
+index 8807b5d3..82367922 100644
+--- a/browser/components/preferences/moreFromMozilla.js
++++ b/browser/components/preferences/moreFromMozilla.js
+@@ -81,51 +81,7 @@ var gMoreFromMozillaPane = {
+
+ renderProducts() {
+ const isRegionUS = Region.home.toLowerCase() === "us";
+- let products = [
+- {
+- id: "firefox-mobile",
+- title_string_id: "more-from-moz-firefox-mobile-title",
+- description_string_id: "more-from-moz-firefox-mobile-description",
+- region: "global",
+- button: {
+- id: "fxMobile",
+- type: "link",
+- label_string_id: "more-from-moz-learn-more-link",
+- actionURL: BrowserUtils.isChinaRepack()
+- ? "https://www.firefox.com.cn/browsers/mobile/"
+- : "https://www.mozilla.org/firefox/browsers/mobile/",
+- },
+- qrcode: {
+- title: {
+- string_id: "more-from-moz-qr-code-box-firefox-mobile-title",
+- },
+- image_src_prefix:
+- "chrome://browser/content/preferences/more-from-mozilla-qr-code",
+- button: {
+- id: "qr-code-send-email",
+- label: {
+- string_id: "more-from-moz-qr-code-box-firefox-mobile-button",
+- },
+- actionURL: BrowserUtils.isChinaRepack()
+- ? "https://www.firefox.com.cn/mobile/get-app/"
+- : "https://www.mozilla.org/firefox/mobile/get-app/?v=mfm",
+- },
+- },
+- },
+- {
+- id: "mozilla-monitor",
+- title_string_id: "more-from-moz-mozilla-monitor-title",
+- description_string_id: isRegionUS
+- ? "more-from-moz-mozilla-monitor-us-description"
+- : "more-from-moz-mozilla-monitor-global-description",
+- region: isRegionUS ? "us" : "global",
+- button: {
+- id: "mozillaMonitor",
+- label_string_id: "more-from-moz-mozilla-monitor-button",
+- actionURL: "https://monitor.mozilla.org/",
+- },
+- },
+- ];
++ let products = [];
+
+ if (BrowserUtils.shouldShowVPNPromo()) {
+ const vpn = {
diff --git a/helpers/DATA/firefox/patch_changes/003-disable_sponsored_topsites_and_keep_weather_widget_static.patch b/helpers/DATA/firefox/patch_changes/003-disable_sponsored_topsites_and_keep_weather_widget_static.patch
new file mode 100644
index 0000000..ffa7ea9
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/003-disable_sponsored_topsites_and_keep_weather_widget_static.patch
@@ -0,0 +1,57 @@
+diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
+index 217ed280..d91cde94 100644
+--- a/browser/app/profile/firefox.js
++++ b/browser/app/profile/firefox.js
+@@ -1806,16 +1806,16 @@ pref("browser.topsites.component.enabled", false);
+
+ pref("browser.topsites.useRemoteSetting", true);
+ // Fetch sponsored Top Sites from Mozilla Tiles Service (Contile)
+-pref("browser.topsites.contile.enabled", true);
+-pref("browser.topsites.contile.endpoint", "https://contile.services.mozilla.com/v1/tiles");
++pref("browser.topsites.contile.enabled", false);
++pref("browser.topsites.contile.endpoint", "");
+
+ // The base URL for the Quick Suggest anonymizing proxy. To make a request to
+ // the proxy, include a campaign ID in the path.
+-pref("browser.partnerlink.attributionURL", "https://topsites.services.mozilla.com/cid/");
+-pref("browser.partnerlink.campaign.topsites", "amzn_2020_a1");
++pref("browser.partnerlink.attributionURL", "");
++pref("browser.partnerlink.campaign.topsites", "");
+
+ // Activates preloading of the new tab url.
+-pref("browser.newtab.preload", true);
++pref("browser.newtab.preload", false);
+
+ // Do not enable the preonboarding experience on Linux
+ #ifdef XP_LINUX
+@@ -1856,24 +1856,24 @@ pref("browser.newtabpage.activity-stream.mobileDownloadModal.variant-c", false);
+ pref("browser.newtabpage.activity-stream.discoverystream.refinedCardsLayout.enabled", true);
+
+ // Mozilla Ad Routing Service (MARS) unified ads service
+-pref("browser.newtabpage.activity-stream.unifiedAds.tiles.enabled", true);
+-pref("browser.newtabpage.activity-stream.unifiedAds.spocs.enabled", true);
+-pref("browser.newtabpage.activity-stream.unifiedAds.endpoint", "https://ads.mozilla.org/");
++pref("browser.newtabpage.activity-stream.unifiedAds.tiles.enabled", false);
++pref("browser.newtabpage.activity-stream.unifiedAds.spocs.enabled", false);
++pref("browser.newtabpage.activity-stream.unifiedAds.endpoint", "");
+ pref("browser.newtabpage.activity-stream.unifiedAds.adsFeed.enabled", false);
+ pref("browser.newtabpage.activity-stream.unifiedAds.ohttp.enabled", false);
+
+ // Weather widget for newtab
+-pref("browser.newtabpage.activity-stream.showWeather", true);
++pref("browser.newtabpage.activity-stream.showWeather", false);
+ pref("browser.newtabpage.activity-stream.weather.query", "");
+ pref("browser.newtabpage.activity-stream.weather.display", "simple");
+
+ pref("browser.newtabpage.activity-stream.images.smart", true);
+
+ // enable location search for newtab weather widget
+-pref("browser.newtabpage.activity-stream.weather.locationSearchEnabled", true);
++pref("browser.newtabpage.activity-stream.weather.locationSearchEnabled", false);
+
+ // List of regions that get weather by default.
+-pref("browser.newtabpage.activity-stream.discoverystream.region-weather-config", "US,CA");
++pref("browser.newtabpage.activity-stream.discoverystream.region-weather-config", "");
+
+ // List of locales that weather widget supports.
+ pref("browser.newtabpage.activity-stream.discoverystream.locale-weather-config", "en-US,en-GB,en-CA");
diff --git a/helpers/DATA/firefox/patch_changes/sqlite-ppc.patch b/helpers/DATA/firefox/patch_changes/004-sqlite-ppc.patch
similarity index 100%
rename from helpers/DATA/firefox/patch_changes/sqlite-ppc.patch
rename to helpers/DATA/firefox/patch_changes/004-sqlite-ppc.patch
diff --git a/helpers/DATA/firefox/patch_changes/005-apply_custom_urls.patch b/helpers/DATA/firefox/patch_changes/005-apply_custom_urls.patch
new file mode 100644
index 0000000..059f74c
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/005-apply_custom_urls.patch
@@ -0,0 +1,77 @@
+# WIP - Help needed
+
+URL customizations requires to comprehend the scope to handle the documentation for this
+and other projects heavily customizing and rebranding Firefox like Abrowser does.
+
+This patch documents how to handle custom URLs to point to a desired page (initially).
+
+It replaces,
+
+* is="moz-support-link"
+* support-page="..."
+
+to customize the default URL, making sure there is an id for l10n field,
+
+* data-l10n-id="..."
+
+so the corresponding message is displayed as it seems to be linked on some cases
+with is="" and support-page="..."
+
+Cheers!
+
+diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
+index a9e8501a..02328371 100644
+--- a/browser/components/preferences/privacy.inc.xhtml
++++ b/browser/components/preferences/privacy.inc.xhtml
+@@ -21,13 +21,13 @@
+
+
+
+-
+-
++
++
+
+
+#-
+#+
+#
+#
+#
+# dropped 144
+#diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
+#index 205c0e01..029b9925 100644
+#--- a/browser/components/preferences/privacy.inc.xhtml
+#+++ b/browser/components/preferences/privacy.inc.xhtml
+#@@ -372,10 +372,7 @@
+# support-page="global-privacy-control" />
+#
+#
+#-
+#+
+#
+#
+#
diff --git a/helpers/DATA/firefox/patch_changes/006-remova_mailto_handlers_correctly.patch b/helpers/DATA/firefox/patch_changes/006-remova_mailto_handlers_correctly.patch
new file mode 100644
index 0000000..6cdd873
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/006-remova_mailto_handlers_correctly.patch
@@ -0,0 +1,204 @@
+diff --git a/uriloader/exthandler/HandlerList.sys.mjs b/uriloader/exthandler/HandlerList.sys.mjs
+index e95d627..beef04d 100644
+--- a/uriloader/exthandler/HandlerList.sys.mjs
++++ b/uriloader/exthandler/HandlerList.sys.mjs
+@@ -8,198 +8,7 @@ export const kHandlerList = {
+ default: {
+ schemes: {
+ mailto: {
+- handlers: [
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- cs: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Seznam",
+- uriTemplate: "https://email.seznam.cz/newMessageScreen?mailto=%s",
+- },
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- "es-CL": {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- {
+- name: "Outlook",
+- uriTemplate:
+- "https://outlook.live.com/default.aspx?rru=compose&to=%s",
+- },
+- ],
+- },
+- },
+- },
+- "ja-JP-mac": {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Yahoo!メール",
+- uriTemplate: "https://mail.yahoo.co.jp/compose/?To=%s",
+- },
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- ja: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Yahoo!メール",
+- uriTemplate: "https://mail.yahoo.co.jp/compose/?To=%s",
+- },
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- kk: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Яндекс.Почта",
+- uriTemplate: "https://mail.yandex.ru/compose?mailto=%s",
+- },
+- {
+- name: "Mail.Ru",
+- uriTemplate: "https://e.mail.ru/cgi-bin/sentmsg?mailto=%s",
+- },
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- ltg: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- {
+- name: "inbox.lv mail",
+- uriTemplate: "https://mail.inbox.lv/compose?to=%s",
+- },
+- ],
+- },
+- },
+- },
+- lv: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- {
+- name: "inbox.lv mail",
+- uriTemplate: "https://mail.inbox.lv/compose?to=%s",
+- },
+- ],
+- },
+- },
+- },
+- pl: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Poczta Interia.pl",
+- uriTemplate: "https://poczta.interia.pl/mh/?mailto=%s",
+- },
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- ru: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Яндекс.Почту",
+- uriTemplate: "https://mail.yandex.ru/compose?mailto=%s",
+- },
+- {
+- name: "Mail.Ru",
+- uriTemplate: "https://e.mail.ru/cgi-bin/sentmsg?mailto=%s",
+- },
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- ],
+- },
+- },
+- },
+- uk: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- {
+- name: "Outlook",
+- uriTemplate:
+- "https://outlook.live.com/default.aspx?rru=compose&to=%s",
+- },
+- ],
+- },
+- },
+- },
+- uz: {
+- schemes: {
+- mailto: {
+- handlers: [
+- {
+- name: "Gmail",
+- uriTemplate: "https://mail.google.com/mail/?extsrc=mailto&url=%s",
+- },
+- {
+- name: "Mail.Ru",
+- uriTemplate: "https://e.mail.ru/cgi-bin/sentmsg?mailto=%s",
+- },
+- ],
++ handlers: [],
+ },
+ },
+ },
diff --git a/helpers/DATA/firefox/patch_changes/007-disable_remote_settings_antifeature.patch b/helpers/DATA/firefox/patch_changes/007-disable_remote_settings_antifeature.patch
new file mode 100644
index 0000000..5262b48
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/007-disable_remote_settings_antifeature.patch
@@ -0,0 +1,96 @@
+diff --git a/services/settings/RemoteSettingsClient.sys.mjs b/services/settings/RemoteSettingsClient.sys.mjs
+index 7e98e6d..7716e41 100644
+--- a/services/settings/RemoteSettingsClient.sys.mjs
++++ b/services/settings/RemoteSettingsClient.sys.mjs
+@@ -229,13 +229,8 @@ class AttachmentDownloader extends Downloader {
+ * @see Downloader.download
+ */
+ async download(record, options) {
+- await lazy.UptakeTelemetry.report(
+- TELEMETRY_COMPONENT,
+- lazy.UptakeTelemetry.STATUS.DOWNLOAD_START,
+- {
+- source: this._client.identifier,
+- }
+- );
++ console.warn("Function 'download' disabled in Abrowser due privacy concerns.");
++ return null;
+ try {
+ // Explicitly await here to ensure we catch a network error.
+ return await super.download(record, options);
+diff --git a/services/settings/Utils.sys.mjs b/services/settings/Utils.sys.mjs
+index 12fef6c..c52b65e 100644
+--- a/services/settings/Utils.sys.mjs
++++ b/services/settings/Utils.sys.mjs
+@@ -409,6 +409,8 @@ export var Utils = {
+ * @param {Object} filters
+ */
+ async fetchLatestChanges(serverUrl, options = {}) {
++ console.warn("Function 'fetchLatestChanges' disabled in Abrowser due privacy concerns.");
++ return null;
+ const { expectedTimestamp, lastEtag = "", filters = {} } = options;
+
+ let url = serverUrl + Utils.CHANGES_PATH;
+diff --git a/toolkit/components/telemetry/app/TelemetryUtils.sys.mjs b/toolkit/components/telemetry/app/TelemetryUtils.sys.mjs
+index 803d52a1..1a3ef5ba 100644
+--- a/toolkit/components/telemetry/app/TelemetryUtils.sys.mjs
++++ b/toolkit/components/telemetry/app/TelemetryUtils.sys.mjs
+@@ -124,6 +124,11 @@ export var TelemetryUtils = {
+ * Takes a date and returns it truncated to a date with daily precision.
+ */
+ truncateToDays(date) {
++ console.warn("Function 'truncateToDays' called with:", date);
++ if (!date || !(date instanceof Date)) {
++ console.warn("Function 'truncateToDays' disabled in Abrowser due to privacy concerns. Received invalid or undefined date.");
++ return null; // Retorna null para evitar errores posteriores
++ }
+ return new Date(
+ date.getFullYear(),
+ date.getMonth(),
+@@ -172,6 +172,10 @@ export var TelemetryUtils = {
+ * @return {Object} The Date object representing the next midnight.
+ */
+ getNextMidnight(date) {
++ if (!date || !(date instanceof Date)) {
++ console.warn("Function 'getNextMidnight' disabled in Abrowser due to privacy concerns.");
++ return null;
++ }
+ let nextMidnight = new Date(this.truncateToDays(date));
+ nextMidnight.setDate(nextMidnight.getDate() + 1);
+ return nextMidnight;
+@@ -185,6 +189,10 @@ export var TelemetryUtils = {
+ * is not within the midnight tolerance.
+ */
+ getNearestMidnight(date, tolerance) {
++ if (!date || !(date instanceof Date)) {
++ console.warn("Function 'getNearestMidnight' disabled in Abrowser due to privacy concerns.");
++ return null;
++ }
+ let lastMidnight = this.truncateToDays(date);
+ if (this.areTimesClose(date.getTime(), lastMidnight.getTime(), tolerance)) {
+ return lastMidnight;
+diff --git a/toolkit/components/telemetry/app/TelemetryScheduler.sys.mjs b/toolkit/components/telemetry/app/TelemetryScheduler.sys.mjs
+index 539447a..43d846b 100644
+--- a/toolkit/components/telemetry/app/TelemetryScheduler.sys.mjs
++++ b/toolkit/components/telemetry/app/TelemetryScheduler.sys.mjs
+@@ -183,8 +183,20 @@ export var TelemetryScheduler = {
+ },
+
+ _sentPingToday(pingTime, nowDate) {
++ // Validar 'nowDate' antes de usarlo
++ if (!nowDate || !(nowDate instanceof Date)) {
++ console.warn("Invalid 'nowDate' passed to _sentPingToday. Function disabled in Abrowser due to privacy concerns.");
++ return false; // Devolvemos 'false' para evitar errores
++ }
++
+ // This is today's date and also the previous midnight (0:00).
+ const todayDate = TelemetryUtils.truncateToDays(nowDate);
++
++ if (!todayDate) {
++ console.warn("TelemetryUtils.truncateToDays returned null. Skipping _sentPingToday.");
++ return false;
++ }
++
+ // We consider a ping sent for today if it occured after or at 00:00 today.
+ return pingTime >= todayDate.getTime();
+ },
diff --git a/helpers/DATA/firefox/patch_changes/008-aboutRights_removal_fix.patch b/helpers/DATA/firefox/patch_changes/008-aboutRights_removal_fix.patch
new file mode 100644
index 0000000..e035ce2
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/008-aboutRights_removal_fix.patch
@@ -0,0 +1,26 @@
+diff --git a/browser/base/content/aboutDialog.xhtml b/browser/base/content/aboutDialog.xhtml
+index c6498081..a8db34ad 100644
+--- a/browser/base/content/aboutDialog.xhtml
++++ b/browser/base/content/aboutDialog.xhtml
+@@ -138,7 +138,7 @@
+
+
+
+-
++
+
+
+
+diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp
+index d1fe0148..ce5d1f42 100644
+--- a/browser/components/about/AboutRedirector.cpp
++++ b/browser/components/about/AboutRedirector.cpp
+@@ -90,7 +90,7 @@ static const RedirEntry kRedirMap[] = {
+ {"profiling",
+ "chrome://devtools/content/performance-new/aboutprofiling/index.xhtml",
+ nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::IS_SECURE_CHROME_UI},
+- {"rights", "https://www.mozilla.org/about/legal/terms/firefox/",
++ {"rights", "https://trisquel.info/legal",
+ nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
+ nsIAboutModule::URI_MUST_LOAD_IN_CHILD},
+ {"robots", "chrome://browser/content/aboutRobots.xhtml",
diff --git a/helpers/DATA/firefox/patch_changes/009-remove_ubunfox_suggest_webext-ublock-origin.patch b/helpers/DATA/firefox/patch_changes/009-remove_ubunfox_suggest_webext-ublock-origin.patch
new file mode 100644
index 0000000..d5226c7
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/009-remove_ubunfox_suggest_webext-ublock-origin.patch
@@ -0,0 +1,24 @@
+diff --git a/debian/control.in b/debian/control.in
+index dd3c8daa..911d9667 100644
+--- a/debian/control.in
++++ b/debian/control.in
+@@ -52,8 +52,7 @@ Architecture: any
+ Depends: lsb-release,
+ ${misc:Depends},
+ ${shlibs:Depends}
+-Recommends: xul-ext-ubufox,
+- ${support:Recommends},
++Recommends: ${support:Recommends},
+ libcanberra0,
+ libdbusmenu-glib4,
+ libdbusmenu-gtk3-4
+@@ -61,7 +60,8 @@ Provides: www-browser,
+ iceweasel, firefox,
+ gnome-www-browser,
+ ${app:Provides}
+-Suggests: fonts-lyx,
++Suggests: webext-ublock-origin,
++ fonts-lyx,
+ ${support:Suggests}
+ Breaks: ${transitional:Breaks}
+ Replaces: ${transitional:Replaces}
diff --git a/helpers/DATA/firefox/patch_changes/010-remove_theme_recommendation_and_saas_forge.patch b/helpers/DATA/firefox/patch_changes/010-remove_theme_recommendation_and_saas_forge.patch
new file mode 100644
index 0000000..dd0eb98
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/010-remove_theme_recommendation_and_saas_forge.patch
@@ -0,0 +1,23 @@
+diff --git a/toolkit/mozapps/extensions/content/aboutaddons.html b/toolkit/mozapps/extensions/content/aboutaddons.html
+index 77702576..35cf6593 100644
+--- a/toolkit/mozapps/extensions/content/aboutaddons.html
++++ b/toolkit/mozapps/extensions/content/aboutaddons.html
+@@ -799,18 +799,6 @@
+
+
+
+-
+-
+-
+-
+-
+-
+
+
+ profile) {
+ profile = gAppData->profile;
+ } else {
+- appName = gAppData->name;
++ // For Abrowser compatibility: force use of ~/.mozilla/abrowser
++ appName.AssignLiteral("abrowser");
+ vendor = gAppData->vendor;
+ }
+
diff --git a/helpers/DATA/firefox/patch_changes/013-remove_finish_setup_third_party_services.patch b/helpers/DATA/firefox/patch_changes/013-remove_finish_setup_third_party_services.patch
new file mode 100644
index 0000000..c00136f
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/013-remove_finish_setup_third_party_services.patch
@@ -0,0 +1,98 @@
+diff --git a/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs b/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs
+index ba47adb6..c4b29ec4 100644
+--- a/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs
++++ b/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs
+@@ -704,7 +704,7 @@ const MR_ABOUT_WELCOME_DEFAULT = {
+ action: {
+ type: "OPEN_URL",
+ data: {
+- args: "https://addons.mozilla.org/en-US/firefox/collections/4757633/b4d5649fb087446aa05add5f0258c3/?page=1&collection_sort=-popularity",
++ args: "https://gnuzilla.gnu.org/",
+ where: "tabshifted",
+ },
+ navigate: true,
+@@ -750,49 +750,6 @@ const MR_ABOUT_WELCOME_DEFAULT = {
+ },
+ targeting: "isFxASignedIn",
+ },
+- {
+- id: "AW_ACCOUNT_LOGIN",
+- content: {
+- fullscreen: true,
+- position: "split",
+- split_narrow_bkg_position: "-228px",
+- image_alt_text: {
+- string_id: "mr2022-onboarding-gratitude-image-alt",
+- },
+- background:
+- "url('chrome://activity-stream/content/data/content/assets/fox-doodle-waving-laptop.svg') center center / 80% no-repeat var(--mr-screen-background-color)",
+- progress_bar: true,
+- logo: {},
+- title: {
+- string_id: "onboarding-sign-up-title",
+- },
+- subtitle: {
+- string_id: "onboarding-sign-up-description",
+- },
+- secondary_button: {
+- label: {
+- string_id: "mr2-onboarding-start-browsing-button-label",
+- },
+- style: "secondary",
+- action: {
+- navigate: true,
+- },
+- },
+- primary_button: {
+- label: {
+- string_id: "onboarding-sign-up-button",
+- },
+- action: {
+- data: {
+- entrypoint: "newuser-onboarding-desktop",
+- },
+- type: "FXA_SIGNIN_FLOW",
+- navigate: true,
+- },
+- },
+- },
+- targeting: "!isFxASignedIn",
+- },
+ ],
+ };
+
+diff --git a/browser/components/asrouter/modules/FeatureCalloutMessages.sys.mjs b/browser/components/asrouter/modules/FeatureCalloutMessages.sys.mjs
+index 29d2ca46..41b65ac4 100644
+--- a/browser/components/asrouter/modules/FeatureCalloutMessages.sys.mjs
++++ b/browser/components/asrouter/modules/FeatureCalloutMessages.sys.mjs
+@@ -885,7 +885,7 @@ const MESSAGES = () => {
+ dismiss: true,
+ type: "OPEN_URL",
+ data: {
+- args: "https://addons.mozilla.org/en-US/firefox/collections/4757633/36d285535db74c6986abbeeed3e214/?page=1&collection_sort=added",
++ args: "https://gnuzilla.gnu.org/",
+ where: "tabshifted",
+ },
+ },
+diff --git a/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs b/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs
+index abc6db68..0c86955f 100644
+--- a/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs
++++ b/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs
+@@ -1226,7 +1226,7 @@ const BASE_MESSAGES = () => [
+ {
+ type: "OPEN_URL",
+ data: {
+- args: "https://addons.mozilla.org/en-US/firefox/collections/4757633/b4d5649fb087446aa05add5f0258c3/?page=1&collection_sort=-popularity",
++ args: "https://gnuzilla.gnu.org/",
+ where: "current",
+ },
+ },
+@@ -1430,7 +1430,7 @@ const BASE_MESSAGES = () => [
+ {
+ type: "OPEN_URL",
+ data: {
+- args: "https://addons.mozilla.org/en-US/firefox/collections/4757633/b4d5649fb087446aa05add5f0258c3/?page=1&collection_sort=-popularity",
++ args: "https://gnuzilla.gnu.org/",
+ where: "current",
+ },
+ },
diff --git a/helpers/DATA/firefox/patch_changes/014-remove_support_firefox_mission_on_abrowser.patch b/helpers/DATA/firefox/patch_changes/014-remove_support_firefox_mission_on_abrowser.patch
new file mode 100644
index 0000000..680d38a
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/014-remove_support_firefox_mission_on_abrowser.patch
@@ -0,0 +1,137 @@
+diff --git a/browser/components/preferences/home.inc.xhtml b/browser/components/preferences/home.inc.xhtml
+index c0094fe0..08856c78 100644
+--- a/browser/components/preferences/home.inc.xhtml
++++ b/browser/components/preferences/home.inc.xhtml
+@@ -101,15 +101,6 @@
+
+
+
+-
+-
+-
+-
+-
+-
+-
+
+
+
+diff --git a/browser/extensions/newtab/lib/AboutPreferences.sys.mjs b/browser/extensions/newtab/lib/AboutPreferences.sys.mjs
+index 0d43919b..f2e0fbd0 100644
+--- a/browser/extensions/newtab/lib/AboutPreferences.sys.mjs
++++ b/browser/extensions/newtab/lib/AboutPreferences.sys.mjs
+@@ -88,33 +88,6 @@ const PREFS_FOR_SETTINGS = () => [
+ ),
+ eventSource: "TOP_STORIES",
+ },
+- {
+- id: "support-firefox",
+- pref: {
+- feed: "showSponsoredCheckboxes",
+- titleString: "home-prefs-support-firefox-header",
+- nestedPrefs: [
+- {
+- name: "showSponsoredTopSites",
+- titleString: "home-prefs-shortcuts-by-option-sponsored",
+- eventSource: "SPONSORED_TOP_SITES",
+- },
+- {
+- name: "showSponsored",
+- titleString: "home-prefs-recommended-by-option-sponsored-stories",
+- eventSource: "POCKET_SPOCS",
+- shouldHidePref: !Services.prefs.getBoolPref(
+- "browser.newtabpage.activity-stream.feeds.system.topstories",
+- true
+- ),
+- shouldDisablePref: !Services.prefs.getBoolPref(
+- "browser.newtabpage.activity-stream.feeds.section.topstories",
+- true
+- ),
+- },
+- ],
+- },
+- },
+ ];
+
+ export class AboutPreferences {
+@@ -344,41 +317,9 @@ export class AboutPreferences {
+ }
+ });
+
+- // Special cases to like the nested prefs with another pref,
+- // so we can disable it real time.
+- if (id === "support-firefox") {
+- function setupSupportFirefoxSubCheck(triggerPref, subPref) {
+- const subCheckFullName = `browser.newtabpage.activity-stream.${triggerPref}`;
+- const subCheckPref = Preferences.get(subCheckFullName);
+-
+- subCheckPref?.on("change", () => {
+- const showSponsoredFullName = `browser.newtabpage.activity-stream.${subPref}`;
+- const showSponsoredSubcheck = subChecks.find(
+- subcheck =>
+- subcheck.getAttribute("preference") === showSponsoredFullName
+- );
+- if (showSponsoredSubcheck) {
+- showSponsoredSubcheck.disabled = !Services.prefs.getBoolPref(
+- subCheckFullName,
+- true
+- );
+- }
+- });
+- }
+-
+- setupSupportFirefoxSubCheck("feeds.section.topstories", "showSponsored");
+- setupSupportFirefoxSubCheck("feeds.topsites", "showSponsoredTopSites");
+- }
+
+ pref.on("change", () => {
+ subChecks.forEach(subcheck => {
+- // Update child preferences for the "Support Firefox" checkbox group
+- // so that they're turned on and off at the same time.
+- if (id === "support-firefox") {
+- const subPref = Preferences.get(subcheck.getAttribute("preference"));
+- subPref.value = pref.value;
+- }
+-
+ // Disable any nested checkboxes if the parent pref is not enabled.
+ subcheck.disabled = !pref._value;
+ });
+diff --git a/browser/locales/en-US/browser/preferences/preferences.ftl b/browser/locales/en-US/browser/preferences/preferences.ftl
+index 269eca10..4c35b53f 100644
+--- a/browser/locales/en-US/browser/preferences/preferences.ftl
++++ b/browser/locales/en-US/browser/preferences/preferences.ftl
+@@ -749,11 +749,7 @@ home-prefs-trending-search-header =
+ home-prefs-trending-search-description = Popular and frequently searched topics
+
+ # "Support" here means to help sustain or contribute to something, especially through funding or sponsorship.
+-home-prefs-support-firefox-header =
+- .label = Support { -brand-product-name }
+-
+-home-prefs-mission-message = Our sponsors support our mission to build a better web
+-home-prefs-mission-message-learn-more-link = Find out how
++## Removed by Abrowser customization process.
+
+ # Variables:
+ # $num (number) - Number of rows displayed
+diff --git a/browser/themes/shared/preferences/preferences.css b/browser/themes/shared/preferences/preferences.css
+index 701d29be..769791d7 100644
+--- a/browser/themes/shared/preferences/preferences.css
++++ b/browser/themes/shared/preferences/preferences.css
+@@ -1478,15 +1478,6 @@ setting-group[groupid="home"] {
+ margin: 0;
+ }
+
+-/* Styles for the "sponsors support our mission" message and link on the Home tab */
+-.mission-message {
+- margin-block-start: var(--space-large);
+-
+- > a {
+- font-size: var(--font-size-small);
+- }
+-}
+-
+ #dohProviderSelect {
+ --select-max-width: 235px;
+ }
diff --git a/helpers/DATA/firefox/patch_changes/015-set_higher_priority_than_chromium_based_ones.patch b/helpers/DATA/firefox/patch_changes/015-set_higher_priority_than_chromium_based_ones.patch
new file mode 100644
index 0000000..1a77d79
--- /dev/null
+++ b/helpers/DATA/firefox/patch_changes/015-set_higher_priority_than_chromium_based_ones.patch
@@ -0,0 +1,17 @@
+diff --git a/debian/firefox.postinst.in b/debian/firefox.postinst.in
+index 4cb73f02..44e9261a 100644
+--- a/debian/firefox.postinst.in
++++ b/debian/firefox.postinst.in
+@@ -36,10 +36,10 @@ finish_rm_conffile() {
+
+ if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-remove" ] ; then
+ update-alternatives --install /usr/bin/gnome-www-browser \
+- gnome-www-browser /usr/bin/$MOZ_APP_NAME 40
++ gnome-www-browser /usr/bin/$MOZ_APP_NAME 240
+
+ update-alternatives --install /usr/bin/x-www-browser \
+- x-www-browser /usr/bin/$MOZ_APP_NAME 40
++ x-www-browser /usr/bin/$MOZ_APP_NAME 240
+ fi
+
+ if [ "$1" = "configure" ] ; then
diff --git a/helpers/DATA/firefox/process-json-files.py b/helpers/DATA/firefox/process-json-files.py
index aa7e832..5be4f98 100644
--- a/helpers/DATA/firefox/process-json-files.py
+++ b/helpers/DATA/firefox/process-json-files.py
@@ -1,6 +1,9 @@
#! /usr/bin/python3
-
-# Copyright (C) 2020, 2021 grizzlyuser
+# Copyright (C) 2024 Luis Guzmán
+# Copyright (C) 2020, 2021, 2022, 2023, 2024 grizzlyuser
+# Based on: https://gitlab.trisquel.org/trisquel/wrapage-helpers/-/blob/81881d89b2bf7d502dd14fcccdb471fec6f6b206/helpers/DATA/firefox/reprocess-search-config.py
+# Below is the notice from the original author:
+#
# Copyright (C) 2020, 2021 Ruben Rodriguez
#
# This program is free software; you can redistribute it and/or modify
@@ -23,6 +26,7 @@ import time
import copy
import argparse
import pathlib
+import logging
from collections import namedtuple
from jsonschema import validate
@@ -41,12 +45,42 @@ parser.add_argument(
type=int,
default=2,
help='indent for pretty printing of output files')
+parser.add_argument(
+ '-l',
+ '--loglevel',
+ choices=logging._nameToLevel.keys(),
+ default=logging.INFO,
+ help='logging level')
arguments = parser.parse_args()
+logging.basicConfig(level=arguments.loglevel)
+logger = logging.getLogger(str(pathlib.Path(__file__).name))
+
File = namedtuple('File', ['path', 'content'])
-class RemoteSettings:
+class JsonProcessor:
+ @classmethod
+ def process(cls):
+ parsed_jsons = []
+ for json_path in cls.JSON_PATHS:
+ logger.info('Reading input: ' + str(json_path) + '...')
+ with json_path.open(encoding='utf-8') as file:
+ parsed_jsons.append(File(json_path, json.load(file)))
+
+ parsed_schema = None
+ if hasattr(cls, "SCHEMA_PATH"):
+ logger.info('Reading schema: ' + str(json_path) + '...')
+ with cls.SCHEMA_PATH.open() as file:
+ parsed_schema = json.load(file)
+
+ processed = cls.process_parsed(parsed_jsons, parsed_schema)
+ with processed.path.open('w') as file:
+ json.dump(processed.content, file, indent=arguments.indent)
+ logger.info('Wrote: ' + str(processed.path))
+
+
+class RemoteSettings(JsonProcessor):
DUMPS_PATH_RELATIVE = 'services/settings/dumps'
DUMPS_PATH_ABSOLUTE = arguments.MAIN_PATH / DUMPS_PATH_RELATIVE
@@ -75,11 +109,12 @@ class RemoteSettings:
@classmethod
def now(cls):
- return int(round(time.time() / 10 ** 6))
+ return int(round(time.time() * 1000))
@classmethod
def process_raw(cls, unwrapped_jsons, parsed_schema):
timestamps, result = [], []
+
for collection in unwrapped_jsons:
should_modify_collection = cls.should_modify_collection(collection)
for record in collection.content:
@@ -110,13 +145,23 @@ class RemoteSettings:
return File(cls.OUTPUT_PATH, result)
@classmethod
- def process(cls, parsed_jsons, parsed_schema):
+ def process_parsed(cls, parsed_jsons, parsed_schema):
return cls.wrap(
cls.process_raw(
cls.unwrap(parsed_jsons),
parsed_schema))
+class EmptyRemoteSettings(RemoteSettings):
+ @classmethod
+ def should_drop_record(cls, search_engine):
+ return True
+
+ @classmethod
+ def process_record(cls, record):
+ return record
+
+
class Changes(RemoteSettings):
JSON_PATHS = tuple(RemoteSettings.DUMPS_PATH_ABSOLUTE.glob('*/*.json'))
OUTPUT_PATH = RemoteSettings.DUMPS_PATH_ABSOLUTE / 'monitor/changes'
@@ -132,7 +177,7 @@ class Changes(RemoteSettings):
changes = []
for collection in unwrapped_jsons:
- if collection.path not in (RemoteSettings.DUMPS_PATH_ABSOLUTE / 'main/example.json', RemoteSettings.DUMPS_PATH_ABSOLUTE / 'main/search-config-v2.json'):
+ if collection.path != RemoteSettings.DUMPS_PATH_ABSOLUTE / 'main/example.json':
latest_change = {}
latest_change[cls._LAST_MODIFIED_KEY_NAME] = cls.get_collection_timestamp(
collection)
@@ -145,61 +190,116 @@ class Changes(RemoteSettings):
return File(cls.OUTPUT_PATH, changes)
-class SearchConfig(RemoteSettings):
+class SearchConfigV2(RemoteSettings):
JSON_PATHS = (
RemoteSettings.DUMPS_PATH_ABSOLUTE /
- 'main/search-config.json',
+ 'main/search-config-v2.json',
)
SCHEMA_PATH = arguments.MAIN_PATH / \
- 'toolkit/components/search/schema/search-config-schema.json'
+ 'toolkit/components/search/schema/search-config-v2-schema.json'
OUTPUT_PATH = JSON_PATHS[0]
- _DUCKDUCKGO_SEARCH_ENGINE_ID = 'ddg@search.mozilla.org'
+ _DUCKDUCKGO_SEARCH_ENGINE_IDENTIFIER = 'ddg'
@classmethod
- def should_drop_record(cls, search_engine):
- return search_engine['webExtension']['id'] not in (
- cls._DUCKDUCKGO_SEARCH_ENGINE_ID, 'wikipedia@search.mozilla.org',
- 'trisquel@search.mozilla.org', 'trisquel-packages@@search.mozilla.org',
- 'qwant@search.mozilla.org', 'ecosia@search.mozilla.org')
+ def should_drop_record(cls, record):
+ if record['recordType'] != 'engine':
+ return False
+
+ identifier = record['identifier']
+ excluded_identifiers = ['ecosia', 'qwant', 'trisquel', 'trisquel-packages']
+
+ return (
+ identifier != cls._DUCKDUCKGO_SEARCH_ENGINE_IDENTIFIER and
+ not (identifier.startswith('wikipedia') or identifier in excluded_identifiers)
+ )
@classmethod
- def process_record(cls, search_engine):
- [search_engine.pop(key, None)
- for key in ['extraParams', 'telemetryId']]
+ def process_record(cls, record):
+ if record['recordType'] == 'defaultEngines':
+ return cls.process_default_engines(record)
+ elif record['recordType'] == 'engine':
+ return cls.process_engine(record)
+ elif record['recordType'] == 'engineOrders':
+ return cls.process_engine_orders(record)
+ else:
+ return record
- general_specifier = {}
- for specifier in search_engine['appliesTo'].copy():
- if 'application' in specifier:
- if 'distributions' in specifier['application']:
- search_engine['appliesTo'].remove(specifier)
- continue
- specifier['application'].pop('extraParams', None)
+ @classmethod
+ def process_default_engines(cls, default_engines):
+ default_engines['globalDefault'] = cls._DUCKDUCKGO_SEARCH_ENGINE_IDENTIFIER
+ default_engines['specificDefaults'] = []
+ return default_engines
- if 'included' in specifier and 'everywhere' in specifier[
- 'included'] and specifier['included']['everywhere']:
- if search_engine['webExtension']['id'] == cls._DUCKDUCKGO_SEARCH_ENGINE_ID:
- specifier['default'] = 'yes'
- general_specifier = specifier
+ @classmethod
+ def process_engine(cls, engine):
+ engine['base'].pop('partnerCode', None)
+ engine['base']['urls']['search'].pop('params', None)
- if not general_specifier:
- general_specifier = {'included': {'everywhere': True}}
- search_engine['appliesTo'].insert(0, general_specifier)
- if search_engine['webExtension']['id'] == cls._DUCKDUCKGO_SEARCH_ENGINE_ID:
- general_specifier['default'] = 'yes'
+ if engine['identifier'] == cls._DUCKDUCKGO_SEARCH_ENGINE_IDENTIFIER:
+ engine['base']['name'] += ' HTML'
+ engine['base']['urls']['search']['base'] = 'https://html.duckduckgo.com/html'
- return search_engine
+ allRegions_prefixes = ['ecosia', 'qwant', 'trisquel']
+
+ if any(engine['identifier'].startswith(prefix) for prefix in allRegions_prefixes) or \
+ engine['identifier'] == cls._DUCKDUCKGO_SEARCH_ENGINE_IDENTIFIER:
+ engine['variants'] = [{'environment': {'allRegionsAndLocales': True}}]
+
+ return engine
+
+ @classmethod
+ def process_engine_orders(cls, engine_orders):
+ engine_orders['orders'] = []
+ return engine_orders
+
+class SearchConfigOverridesV2(EmptyRemoteSettings):
+ JSON_PATHS = (
+ RemoteSettings.DUMPS_PATH_ABSOLUTE /
+ 'main/search-config-overrides-v2.json',
+ )
+ SCHEMA_PATH = arguments.MAIN_PATH / \
+ 'toolkit/components/search/schema/search-config-overrides-v2-schema.json'
+ OUTPUT_PATH = JSON_PATHS[0]
-class TippyTopSites:
+class SearchDefaultOverrideAllowlist(EmptyRemoteSettings):
+ JSON_PATHS = (
+ RemoteSettings.DUMPS_PATH_ABSOLUTE /
+ 'main/search-default-override-allowlist.json',
+ )
+ SCHEMA_PATH = arguments.MAIN_PATH / \
+ 'toolkit/components/search/schema/search-default-override-allowlist-schema.json'
+ OUTPUT_PATH = JSON_PATHS[0]
+
+
+class SearchTelemetryV2(EmptyRemoteSettings):
+ JSON_PATHS = (
+ RemoteSettings.DUMPS_PATH_ABSOLUTE /
+ 'main/search-telemetry-v2.json',
+ )
+ SCHEMA_PATH = arguments.MAIN_PATH / \
+ 'browser/components/search/schema/search-telemetry-v2-schema.json'
+ OUTPUT_PATH = JSON_PATHS[0]
+
+
+class UrlClassifierSkipUrls(EmptyRemoteSettings):
+ JSON_PATHS = (
+ RemoteSettings.DUMPS_PATH_ABSOLUTE /
+ 'main/url-classifier-skip-urls.json',
+ )
+ OUTPUT_PATH = JSON_PATHS[0]
+
+
+class TippyTopSites(JsonProcessor):
JSON_PATHS = (
arguments.MAIN_PATH /
- 'browser/components/newtab/data/content/tippytop/top_sites.json',
+ 'browser/components/topsites/content/tippytop/top_sites.json',
arguments.BRANDING_PATH /
'tippytop/top_sites.json')
@classmethod
- def process(cls, parsed_jsons, parsed_schema):
+ def process_parsed(cls, parsed_jsons, parsed_schema):
tippy_top_sites_main = parsed_jsons[0]
tippy_top_sites_branding = parsed_jsons[1]
result = tippy_top_sites_branding.content + \
@@ -224,7 +324,7 @@ class TopSites(RemoteSettings):
@classmethod
def should_drop_record(cls, site):
- return site['url'] != 'https://www.wikipedia.org/'
+ return True
@classmethod
def process_record(cls, site):
@@ -234,19 +334,15 @@ class TopSites(RemoteSettings):
# To reflect the latest timestamps, Changes class should always come after
# all other RemoteSettings subclasses
-processors = (SearchConfig, Changes)
+processors = (
+ SearchConfigV2,
+ SearchConfigOverridesV2,
+ SearchDefaultOverrideAllowlist,
+ SearchTelemetryV2,
+ UrlClassifierSkipUrls,
+ TopSites,
+ Changes,
+ TippyTopSites)
for processor in processors:
- parsed_jsons = []
- for json_path in processor.JSON_PATHS:
- with json_path.open(encoding='utf-8') as file:
- parsed_jsons.append(File(json_path, json.load(file)))
-
- parsed_schema = None
- if hasattr(processor, "SCHEMA_PATH"):
- with processor.SCHEMA_PATH.open() as file:
- parsed_schema = json.load(file)
-
- processed = processor.process(parsed_jsons, parsed_schema)
- with processed.path.open('w') as file:
- json.dump(processed.content, file, indent=arguments.indent)
+ processor.process()
diff --git a/helpers/DATA/firefox/rollback_ddg_firefox_partnership_codes.patch b/helpers/DATA/firefox/rollback_ddg_firefox_partnership_codes.patch
deleted file mode 100644
index f266643..0000000
--- a/helpers/DATA/firefox/rollback_ddg_firefox_partnership_codes.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-More info related to the change: https://hg.mozilla.org/mozilla-central/rev/5079bb7577182734823d6e4a3c468115d45a9dd9
-
---- a/browser/components/search/extensions/ddg/manifest.json 2023-04-06 23:48:16.983734806 -0600
-+++ b/browser/components/search/extensions/ddg/manifest.json 2023-04-06 23:54:27.848103496 -0600
-@@ -21,7 +21,7 @@
- "name": "DuckDuckGo",
- "search_url": "https://duckduckgo.com/",
- "search_form": "https://duckduckgo.com/",
-- "search_url_get_params": "t=ffab&q={searchTerms}",
-+ "search_url_get_params": "q={searchTerms}",
- "suggest_url": "https://ac.duckduckgo.com/ac/",
- "suggest_url_get_params": "q={searchTerms}&type=list"
- }
---- a/browser/components/search/extensions/ddg-html/manifest.json 2023-04-06 23:48:16.987734810 -0600
-+++ b/browser/components/search/extensions/ddg-html/manifest.json 2023-04-06 23:55:19.080158907 -0600
-@@ -21,7 +21,7 @@
- "name": "DuckDuckGo (HTML)",
- "search_url": "https://html.duckduckgo.com/html/",
- "search_form": "https://html.duckduckgo.com/html/",
-- "search_url_get_params": "t=ffab&q={searchTerms}",
-+ "search_url_get_params": "q={searchTerms}",
- "suggest_url": "https://ac.duckduckgo.com/ac/",
- "suggest_url_get_params": "q={searchTerms}&type=list"
- }
diff --git a/helpers/DATA/firefox/search-custom/services/settings/dumps/main/top-sites.json b/helpers/DATA/firefox/search-custom/services/settings/dumps/main/top-sites.json
new file mode 100644
index 0000000..3f8d0ff
--- /dev/null
+++ b/helpers/DATA/firefox/search-custom/services/settings/dumps/main/top-sites.json
@@ -0,0 +1,61 @@
+{
+ "data": [
+ {
+ "url": "https://trisquel.info/",
+ "order": 0,
+ "title": "Trisquel",
+ "id": "ec7f4843-6be5-5e86-870a-1c8383500a4b",
+ "last_modified": 1715345084783
+ },
+ {
+ "url": "https://packages.trisquel.org/",
+ "order": 1,
+ "title": "Trisquel Packages",
+ "id": "27a9b035-0b8b-4472-97cb-b1866aba0740",
+ "last_modified": 1715345084786
+ },
+ {
+ "url": "https://www.gnu.org/",
+ "order": 2,
+ "title": "GNU",
+ "id": "1baee931-751c-5993-b6fe-d86fbf78f9b0",
+ "last_modified": 1715345084789
+ },
+ {
+ "url": "https://www.fsf.org/",
+ "order": 3,
+ "title": "FSF",
+ "id": "fcc60dd8-4d97-5aca-8e5d-784652c75818",
+ "last_modified": 1715345084792
+ },
+ {
+ "url": "https://directory.fsf.org/",
+ "order": 4,
+ "title": "FSF Directory",
+ "id": "abe5bfb2-9487-5697-9f27-e0b782dfe006",
+ "last_modified": 1715345084796
+ },
+ {
+ "url": "https://libreplanet.org/",
+ "order": 5,
+ "title": "LibrePlanet",
+ "id": "e3d2cf88-a4dc-5d2e-9f9a-f3ea241d17d8",
+ "last_modified": 1715345084800
+ },
+ {
+ "url": "https://www.wikipedia.org/",
+ "order": 6,
+ "title": "Wikipedia",
+ "id": "02c295f5-54a8-5d29-8d1f-b619216b20c0",
+ "last_modified": 1715345084803
+ },
+ {
+ "url": "https://h-node.org/",
+ "order": 7,
+ "title": "h-node",
+ "id": "c426481f-8c3f-53b8-b23a-431a91a1c7b4",
+ "last_modified": 1715345084807
+ }
+ ],
+ "timestamp": 1715345084810
+}
diff --git a/helpers/DATA/firefox/search-custom/tippytop/top_sites.json b/helpers/DATA/firefox/search-custom/tippytop/top_sites.json
new file mode 100644
index 0000000..68433f9
--- /dev/null
+++ b/helpers/DATA/firefox/search-custom/tippytop/top_sites.json
@@ -0,0 +1,52 @@
+[
+ {
+ "domains": ["duckduckgo.com"],
+ "image_url": "images/duckduckgo-com@2x.svg",
+ "favicon_url": "favicons/duckduckgo-com.ico"
+ },
+ {
+ "domains": ["trisquel.info"],
+ "image_url": "images/trisquel.png",
+ "favicon_url": "favicons/trisquel.ico"
+ },
+ {
+ "domains": ["packages.trisquel.org"],
+ "image_url": "images/trisquel-packages.png",
+ "favicon_url": "favicons/trisquel-packages.ico"
+ },
+ {
+ "domains": ["gnu.org"],
+ "image_url": "images/gnu.png",
+ "favicon_url": "favicons/gnu.ico"
+ },
+ {
+ "domains": ["fsf.org"],
+ "image_url": "images/fsf.png",
+ "favicon_url": "favicons/fsf.ico"
+ },
+ {
+ "domains": ["directory.fsf.org"],
+ "image_url": "images/directory.png",
+ "favicon_url": "favicons/fsf.ico"
+ },
+ {
+ "domains": ["libreplanet.org"],
+ "image_url": "images/libreplanet.png",
+ "favicon_url": "favicons/libreplanet.ico"
+ },
+ {
+ "domains": ["fsfe.org"],
+ "image_url": "images/fsfe.png",
+ "favicon_url": "favicons/fsfe.ico"
+ },
+ {
+ "domains": ["wikipedia.org"],
+ "image_url": "images/wikipedia.png",
+ "favicon_url": "favicons/wikipedia.ico"
+ },
+ {
+ "domains": ["h-node.org"],
+ "image_url": "images/hnode.png",
+ "favicon_url": "favicons/hnode.ico"
+ }
+]
diff --git a/helpers/DATA/firefox/searchplugins/trisquel-packages-v2.json b/helpers/DATA/firefox/searchplugins/trisquel-packages-v2.json
new file mode 100644
index 0000000..bdfbe63
--- /dev/null
+++ b/helpers/DATA/firefox/searchplugins/trisquel-packages-v2.json
@@ -0,0 +1,30 @@
+ {
+ "base": {
+ "aliases": [
+ "packages",
+ "p"
+ ],
+ "classification": "unknown",
+ "name": "Trisquel Packages",
+ "urls": {
+ "search": {
+ "base": "https://packages.trisquel.org/search",
+ "params": [],
+ "searchTermParamName": "keywords"
+ }
+ }
+ },
+ "id": "b5fd21a8-e369-477f-a3f2-b47a370f9030",
+ "identifier": "trisquel-packages",
+ "last_modified": 1678,
+ "recordType": "engine",
+ "schema": "defaultEngines",
+ "variants": [
+ {
+ "environment": {
+ "allRegionsAndLocales": true
+ },
+ "optional": false
+ }
+ ]
+ },
diff --git a/helpers/DATA/firefox/searchplugins/trisquel-packages.json b/helpers/DATA/firefox/searchplugins/trisquel-packages.json
deleted file mode 100644
index c52066d..0000000
--- a/helpers/DATA/firefox/searchplugins/trisquel-packages.json
+++ /dev/null
@@ -1,15 +0,0 @@
- {
- "schema": 1674147734592,
- "appliesTo": [
- {
- "included": {
- "everywhere": true
- }
- }
- ],
- "webExtension": {
- "id": "trisquel-packages@search.mozilla.org"
- },
- "id": "b5fd21a8-e369-477f-a3f2-b47a370f9030",
- "last_modified": 1678
- },
diff --git a/helpers/DATA/firefox/newtab/trisquel-packages.ico b/helpers/DATA/firefox/searchplugins/trisquel-packages/b5fd21a8-e369-477f-a3f2-b47a370f9030
similarity index 100%
rename from helpers/DATA/firefox/newtab/trisquel-packages.ico
rename to helpers/DATA/firefox/searchplugins/trisquel-packages/b5fd21a8-e369-477f-a3f2-b47a370f9030
diff --git a/helpers/DATA/firefox/searchplugins/trisquel-v2.json b/helpers/DATA/firefox/searchplugins/trisquel-v2.json
new file mode 100644
index 0000000..dffbbd5
--- /dev/null
+++ b/helpers/DATA/firefox/searchplugins/trisquel-v2.json
@@ -0,0 +1,30 @@
+ {
+ "base": {
+ "aliases": [
+ "trisquel",
+ "t"
+ ],
+ "classification": "unknown",
+ "name": "Trisquel",
+ "urls": {
+ "search": {
+ "base": "https://trisquel.info/search/node",
+ "params": [],
+ "searchTermParamName": "q"
+ }
+ }
+ },
+ "id": "b99ed276-9557-4492-8bbb-d59826381893",
+ "identifier": "trisquel",
+ "last_modified": 1678,
+ "recordType": "engine",
+ "schema": "defaultEngines",
+ "variants": [
+ {
+ "environment": {
+ "allRegionsAndLocales": true
+ },
+ "optional": false
+ }
+ ]
+ },
diff --git a/helpers/DATA/firefox/searchplugins/trisquel.json b/helpers/DATA/firefox/searchplugins/trisquel.json
deleted file mode 100644
index 5f093ba..0000000
--- a/helpers/DATA/firefox/searchplugins/trisquel.json
+++ /dev/null
@@ -1,15 +0,0 @@
- {
- "schema": 1674147734535,
- "appliesTo": [
- {
- "included": {
- "everywhere": true
- }
- }
- ],
- "webExtension": {
- "id": "trisquel@search.mozilla.org"
- },
- "id": "b99ed276-9557-4492-8bbb-d59826381893",
- "last_modified": 1678
- },
diff --git a/helpers/DATA/firefox/searchplugins/trisquel/b99ed276-9557-4492-8bbb-d59826381893 b/helpers/DATA/firefox/searchplugins/trisquel/b99ed276-9557-4492-8bbb-d59826381893
new file mode 100644
index 0000000..4a0f9fd
Binary files /dev/null and b/helpers/DATA/firefox/searchplugins/trisquel/b99ed276-9557-4492-8bbb-d59826381893 differ
diff --git a/helpers/DATA/firefox/settings.js b/helpers/DATA/firefox/settings.js
index 64393d4..a297d56 100644
--- a/helpers/DATA/firefox/settings.js
+++ b/helpers/DATA/firefox/settings.js
@@ -1,4 +1,3 @@
-
// Release notes and vendor URLs
pref("app.releaseNotesURL", "https://trisquel.info/en/wiki/abrowser-help");
pref("app.vendorURL", "https://trisquel.info/en/wiki/abrowser-help");
@@ -63,7 +62,7 @@ pref("general.useragent.compatMode.abrowser",true);
pref ("browser.startup.homepage_override.mstone", "ignore");
// Preferences for the Get Add-ons panel
-pref ("extensions.webservice.discoverURL", "https://gnuzilla.gnu.org/mozzarella/");
+pref ("extensions.webservice.discoverURL", "https://gnuzilla.gnu.org/");
pref ("extensions.getAddons.search.url", "https://trisquel.info");
// Help URL
@@ -75,8 +74,8 @@ pref ("plugins.update.url", "https://trisquel.info/en/wiki/abrowser-help");
pref ("browser.customizemode.tip0.learnMoreUrl", "https://trisquel.info/en/wiki/abrowser-help");
// Dictionary download preference
-pref("browser.dictionaries.download.url", "http://dictionaries.mozdev.org/");
-pref("browser.search.searchEnginesURL", "http://mycroft.mozdev.org/");
+pref("browser.dictionaries.download.url", "https://addons.mozilla.org/%LOCALE%/firefox/language-tools/");
+pref("browser.search.searchEnginesURL", "https://mycroftproject.com/");
// Enable Spell Checking In All Text Fields
pref("layout.spellcheckDefault", 2);
@@ -117,6 +116,7 @@ pref("network.http.sendRefererHeader", 2);
pref("dom.event.clipboardevents.enabled",false);
pref("network.prefetch-next", false);
pref("network.dns.disablePrefetch", true);
+pref("network.dns.disablePrefetchFromHTTPS", true);
pref("network.http.sendSecureXSiteReferrer", false);
pref("toolkit.telemetry.enabled", false);
// Do not tell what plugins do we have enabled: https://mail.mozilla.org/pipermail/firefox-dev/2013-November/001186.html
@@ -126,6 +126,7 @@ pref("plugin.state.flash", 1);
pref("browser.newtabpage.directory.source", "");
pref("browser.newtabpage.directory.ping", "");
pref("browser.newtabpage.introShown", true);
+pref("browser.newtabpage.activity-stream.unifiedAds.endpoint","");
// Disable home snippets
pref("browser.aboutHomeSnippets.updateUrl", "");
// Always ask before restoring the browsing session
@@ -152,6 +153,7 @@ pref("toolkit.telemetry.firstShutdownPing.enabled", false);
pref("toolkit.telemetry.bhrPing.enabled", false);
pref("browser.ping-centre.telemetry", false);
pref("dom.security.unexpected_system_load_telemetry_enabled", false);
+pref("network.connectivity-service.enabled", false);
// Canvas fingerprint protection
// Disabled, as it breaks things and does little improvements to fingerprinting
@@ -202,6 +204,10 @@ pref("media.gmp-manager.url", "");
pref("media.gmp-provider.enabled", false);
// Don't install openh264 codec
pref("media.gmp-gmpopenh264.enabled", false);
+// Disable Widevine
+pref("media.gmp-widevinecdm.enabled", false);
+// Disable eme codecs
+pref("media.eme.enabled", false);
//Disable middle click content load
//Avoid loading urls by mistake
@@ -246,9 +252,13 @@ pref("browser.onboarding.enabled", false);
pref("browser.newtabpage.activity-stream.default.sites", "https://trisquel.info/,https://packages.trisquel.org,https://www.gnu.org/,https://www.fsf.org/,https://directory.fsf.org,https://libreplanet.org/,https://fsfe.org,https://www.wikipedia.org/wiki/,https://www.h-node.org/");
pref("browser.newtabpage.activity-stream.showTopSites",true);
pref("browser.newtabpage.activity-stream.feeds.section.topstories",false);
+pref("browser.newtabpage.activity-stream.feeds.discoverystreamfeed", false);
+pref("browser.newtabpage.activity-stream.discoverystream.enabled", false);
+pref("browser.newtabpage.activity-stream.discoverystream.endpoints", "");
pref("browser.newtabpage.activity-stream.feeds.snippets",false);
pref("browser.newtabpage.activity-stream.disableSnippets", true);
-user_pref("browser.newtabpage.activity-stream.tippyTop.service.endpoint", "");
+pref("browser.newtabpage.activity-stream.tippyTop.service.endpoint", "");
+pref("browser.newtabpage.activity-stream.showSponsoredCheckboxes", false);
// Enable xrender
//pref("gfx.xrender.enabled",true);
@@ -256,7 +266,6 @@ user_pref("browser.newtabpage.activity-stream.tippyTop.service.endpoint", "");
// Disable push notifications
pref("dom.webnotifications.enabled",false);
pref("dom.webnotifications.serviceworker.enabled",false);
-pref("dom.push.enabled",false);
// Disable services server
pref("services.settings.server", "");
@@ -268,14 +277,13 @@ pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false);
pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false);
pref("extensions.htmlaboutaddons.discover.enabled", false);
pref("extensions.htmlaboutaddons.recommendations.enabled", false);
-//pref("browser.newtabpage.activity-stream.asrouterExperimentEnabled", false);
+pref("extensions.getAddons.cache.enabled", false);
pref("extensions.getAddons.get.url", "");
-pref("extensions.getAddons.link.url", "https://gnuzilla.gnu.org/mozzarella/");
+pref("extensions.getAddons.link.url", "https://gnuzilla.gnu.org/");
pref("extensions.getAddons.langpacks.url", "");
pref("extensions.getAddons.discovery.api_url", "");
pref("extensions.recommendations.privacyPolicyUrl", "https://trisquel.info/legal");
-pref("extensions.getAddons.search.browseURL", "https://gnuzilla.gnu.org/mozzarella/search.php?q=%TERMS%");
-
+pref("extensions.getAddons.search.browseURL", "https://gnuzilla.gnu.org/search.php?q=%TERMS%");
// Disable pingback on first run
pref("browser.newtabpage.activity-stream.fxaccounts.endpoint", "");
@@ -284,3 +292,35 @@ pref("browser.newtabpage.activity-stream.fxaccounts.endpoint", "");
// Disable Normandy (remote settings changer for AB testing)
pref("app.normandy.enabled", false);
pref("app.normandy.api_url", "");
+
+// Disable Adwaita theme by default.
+pref("widget.gtk.libadwaita-colors.enabled", false);
+
+
+// High level search data collection
+pref("browser.search.serpEventTelemetry.enabled",false);
+
+// Disable Privacy-Preserving Attribution submition
+pref("dom.private-attribution.submission.enabled", false);
+
+// Disable Machine Learning
+pref("browser.ml.chat.enabled", false);
+pref("browser.tabs.groups.smart.enabled", false);
+
+// Hide from UI
+pref("browser.ml.chat.hideFromLabs", true);
+pref("browser.ml.chat.hideLabsShortcuts", true);
+pref("browser.tabs.groups.smart.userEnabled", false);
+
+// Disable tab hover preview
+pref("browser.tabs.hoverPreview.enabled", false);
+
+// Disable DAP telemetry servers & experiments
+pref("toolkit.telemetry.dap.leader.url", "");
+pref("toolkit.telemetry.dap.helper.url", "");
+pref("messaging-system.rsexperimentloader.enabled", false);
+
+// Disable DoH as third party service, users can restore it at will.
+pref("network.trr.mode", 5);
+pref("doh-rollout.enabled", false);
+pref("doh-rollout.provider-steering.enabled", false);
diff --git a/helpers/DATA/firefox/newtab/directory.png b/helpers/DATA/firefox/topsites/directory.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/directory.png
rename to helpers/DATA/firefox/topsites/directory.png
diff --git a/helpers/DATA/firefox/newtab/fsf.ico b/helpers/DATA/firefox/topsites/fsf.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/fsf.ico
rename to helpers/DATA/firefox/topsites/fsf.ico
diff --git a/helpers/DATA/firefox/newtab/fsf.png b/helpers/DATA/firefox/topsites/fsf.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/fsf.png
rename to helpers/DATA/firefox/topsites/fsf.png
diff --git a/helpers/DATA/firefox/newtab/fsfe.ico b/helpers/DATA/firefox/topsites/fsfe.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/fsfe.ico
rename to helpers/DATA/firefox/topsites/fsfe.ico
diff --git a/helpers/DATA/firefox/newtab/fsfe.png b/helpers/DATA/firefox/topsites/fsfe.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/fsfe.png
rename to helpers/DATA/firefox/topsites/fsfe.png
diff --git a/helpers/DATA/firefox/newtab/gnu.ico b/helpers/DATA/firefox/topsites/gnu.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/gnu.ico
rename to helpers/DATA/firefox/topsites/gnu.ico
diff --git a/helpers/DATA/firefox/newtab/gnu.png b/helpers/DATA/firefox/topsites/gnu.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/gnu.png
rename to helpers/DATA/firefox/topsites/gnu.png
diff --git a/helpers/DATA/firefox/newtab/hnode.ico b/helpers/DATA/firefox/topsites/hnode.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/hnode.ico
rename to helpers/DATA/firefox/topsites/hnode.ico
diff --git a/helpers/DATA/firefox/newtab/hnode.png b/helpers/DATA/firefox/topsites/hnode.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/hnode.png
rename to helpers/DATA/firefox/topsites/hnode.png
diff --git a/helpers/DATA/firefox/newtab/libreplanet.ico b/helpers/DATA/firefox/topsites/libreplanet.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/libreplanet.ico
rename to helpers/DATA/firefox/topsites/libreplanet.ico
diff --git a/helpers/DATA/firefox/newtab/libreplanet.png b/helpers/DATA/firefox/topsites/libreplanet.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/libreplanet.png
rename to helpers/DATA/firefox/topsites/libreplanet.png
diff --git a/helpers/DATA/firefox/topsites/trisquel-packages.ico b/helpers/DATA/firefox/topsites/trisquel-packages.ico
new file mode 100644
index 0000000..5a727c1
Binary files /dev/null and b/helpers/DATA/firefox/topsites/trisquel-packages.ico differ
diff --git a/helpers/DATA/firefox/newtab/trisquel-packages.png b/helpers/DATA/firefox/topsites/trisquel-packages.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/trisquel-packages.png
rename to helpers/DATA/firefox/topsites/trisquel-packages.png
diff --git a/helpers/DATA/firefox/newtab/trisquel.ico b/helpers/DATA/firefox/topsites/trisquel.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/trisquel.ico
rename to helpers/DATA/firefox/topsites/trisquel.ico
diff --git a/helpers/DATA/firefox/newtab/trisquel.png b/helpers/DATA/firefox/topsites/trisquel.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/trisquel.png
rename to helpers/DATA/firefox/topsites/trisquel.png
diff --git a/helpers/DATA/firefox/newtab/wikinews.ico b/helpers/DATA/firefox/topsites/wikinews.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/wikinews.ico
rename to helpers/DATA/firefox/topsites/wikinews.ico
diff --git a/helpers/DATA/firefox/newtab/wikinews.png b/helpers/DATA/firefox/topsites/wikinews.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/wikinews.png
rename to helpers/DATA/firefox/topsites/wikinews.png
diff --git a/helpers/DATA/firefox/newtab/wikipedia-org@2x.png b/helpers/DATA/firefox/topsites/wikipedia-org@2x.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/wikipedia-org@2x.png
rename to helpers/DATA/firefox/topsites/wikipedia-org@2x.png
diff --git a/helpers/DATA/firefox/newtab/wikipedia.ico b/helpers/DATA/firefox/topsites/wikipedia.ico
similarity index 100%
rename from helpers/DATA/firefox/newtab/wikipedia.ico
rename to helpers/DATA/firefox/topsites/wikipedia.ico
diff --git a/helpers/DATA/firefox/newtab/wikipedia.png b/helpers/DATA/firefox/topsites/wikipedia.png
similarity index 100%
rename from helpers/DATA/firefox/newtab/wikipedia.png
rename to helpers/DATA/firefox/topsites/wikipedia.png
diff --git a/helpers/DATA/firefox/trisquel-search-icons/b5fd21a8-e369-477f-a3f2-b47a370f9030.png b/helpers/DATA/firefox/trisquel-search-icons/b5fd21a8-e369-477f-a3f2-b47a370f9030.png
new file mode 100644
index 0000000..043512b
Binary files /dev/null and b/helpers/DATA/firefox/trisquel-search-icons/b5fd21a8-e369-477f-a3f2-b47a370f9030.png differ
diff --git a/helpers/DATA/firefox/trisquel-search-icons/b5fd21a8-trisquel-packages.json b/helpers/DATA/firefox/trisquel-search-icons/b5fd21a8-trisquel-packages.json
new file mode 100644
index 0000000..aed8303
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel-search-icons/b5fd21a8-trisquel-packages.json
@@ -0,0 +1,17 @@
+{
+ "schema": 40960,
+ "imageSize": 48,
+ "attachment": {
+ "hash": "0b077376b224b66159130f587371d67f97454fd692296c449590a9123591c9f6",
+ "size": 3441,
+ "filename": "trisquel-packages-48-firefox.png",
+ "location": "main-workspace/search-config-icons/b5fd21a8-e369-477f-a3f2-b47a370f9030.png",
+ "mimetype": "image/png"
+ },
+ "engineIdentifiers": [
+ "trisquel-packages"
+ ],
+ "filter_expression": "env.appinfo.ID == \"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}\"",
+ "id": "b5fd21a8-e369-477f-a3f2-b47a370f9030",
+ "last_modified": 1734316560
+}
diff --git a/helpers/DATA/firefox/trisquel-search-icons/b99ed276-9557-4492-8bbb-d59826381893.png b/helpers/DATA/firefox/trisquel-search-icons/b99ed276-9557-4492-8bbb-d59826381893.png
new file mode 100644
index 0000000..b5b175c
Binary files /dev/null and b/helpers/DATA/firefox/trisquel-search-icons/b99ed276-9557-4492-8bbb-d59826381893.png differ
diff --git a/helpers/DATA/firefox/trisquel-search-icons/b99ed276-trisquel.json b/helpers/DATA/firefox/trisquel-search-icons/b99ed276-trisquel.json
new file mode 100644
index 0000000..3707567
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel-search-icons/b99ed276-trisquel.json
@@ -0,0 +1,17 @@
+{
+ "schema": 45056,
+ "imageSize": 48,
+ "attachment": {
+ "hash": "93bc9a505442520b44ae5ffb880979943826308bcc051b966e1cbd67dbc64125",
+ "size": 4493,
+ "filename": "trisquel-48-firefox.png",
+ "location": "main-workspace/search-config-icons/b99ed276-9557-4492-8bbb-d59826381893",
+ "mimetype": "image/png"
+ },
+ "engineIdentifiers": [
+ "trisquel"
+ ],
+ "filter_expression": "env.appinfo.ID == \"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}\"",
+ "id": "b99ed276-9557-4492-8bbb-d59826381893",
+ "last_modified": 1734316560
+}
diff --git a/helpers/DATA/firefox/trisquel-search-icons/update_mozbuild.py b/helpers/DATA/firefox/trisquel-search-icons/update_mozbuild.py
new file mode 100644
index 0000000..1625d28
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel-search-icons/update_mozbuild.py
@@ -0,0 +1,64 @@
+#! /usr/bin/python3
+#
+# Script to add trisquel's icons on search engine options.
+#
+# Copyright (C) 2024 Luis Guzmán
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+# File path
+moz_build_path = "services/settings/dumps/main/moz.build"
+
+# New entries to add
+new_entries = [
+ "search-config-icons/b99ed276-9557-4492-8bbb-d59826381893",
+ "search-config-icons/b99ed276-9557-4492-8bbb-d59826381893.meta.json",
+ "search-config-icons/b5fd21a8-e369-477f-a3f2-b47a370f9030",
+ "search-config-icons/b5fd21a8-e369-477f-a3f2-b47a370f9030.meta.json",
+]
+
+# Read the moz.build file
+with open(moz_build_path, "r") as file:
+ lines = file.readlines()
+
+# Locate the section for `search-config-icons`
+start_idx = None
+for idx, line in enumerate(lines):
+ if "FINAL_TARGET_FILES.defaults.settings.main[\"search-config-icons\"] += [" in line:
+ start_idx = idx
+ break
+
+if start_idx is None:
+ raise RuntimeError("Could not find the 'search-config-icons' section in moz.build")
+
+# Extract existing entries
+start_idx += 1
+end_idx = start_idx
+while end_idx < len(lines) and lines[end_idx].strip() != "]":
+ end_idx += 1
+
+current_entries = [line.strip().strip(",") for line in lines[start_idx:end_idx]]
+
+# Combine and sort all entries
+all_entries = sorted(set(current_entries + [f'"{entry}"' for entry in new_entries]))
+
+# Replace the section in moz.build
+lines[start_idx:end_idx] = [f" {entry},\n" for entry in all_entries]
+
+# Write the updated content back to the file
+with open(moz_build_path, "w") as file:
+ file.writelines(lines)
+
+print("> Added trisquel's search engine icons to 'moz.build'")
diff --git a/helpers/DATA/freedom-maker/0001-documentation_could-be-upstreamed.patch b/helpers/DATA/freedom-maker/0001-documentation_could-be-upstreamed.patch
index 4038e5c..41707e2 100644
--- a/helpers/DATA/freedom-maker/0001-documentation_could-be-upstreamed.patch
+++ b/helpers/DATA/freedom-maker/0001-documentation_could-be-upstreamed.patch
@@ -1,5 +1,5 @@
diff --git a/README.md b/README.md
-index cd1815f..aaa7caa 100644
+index 2ea7ebf3..aa30828e 100644
--- a/README.md
+++ b/README.md
@@ -26,31 +26,32 @@ tweaks, see the *Build Images* section below.
@@ -28,35 +28,35 @@ index cd1815f..aaa7caa 100644
-- *raspberry2*: RasbperryPi 2's SD card
-- *raspberry3*: RasbperryPi 3's SD card
-- *raspberry3-b-plus*: RasbperryPi 3 Model B+'s SD card
--- *test*: build virtualbox i386 image and run diagnostics tests on it
+-- *raspberry64*: Single image for Raspberry Pi 3B, Raspberry Pi 3B+ and Raspberry Pi 4B
-- *virtualbox-amd64*: 64-bit image for the VirtualBox virtualization tool
-- *virtualbox-i386*: 32-bit image for the VirtualBox virtualization tool
+| target | description |
+|-----------------------|-------------|
-+| *a20-olinuxino-lime* | A20 OLinuXino Lime's SD card |
-+| *a20-olinuxino-lime2* | A20 OLinuXino Lime2's SD card |
-+| *a20-olinuxino-micro* | A20 OLinuXino MICRO's SD card |
-+| *amd64* | Disk image for any machine with amd64 architecture |
-+| *arm64* | Disk image for any machine with arm64/aarch64 architecture |
-+| *armhf* | Disk image for any machine with arm32 architecture |
-+| *banana-pro* | Banana Pro's SD card |
-+| *beaglebone* | BeagleBone Black's SD card |
-+| *cubieboard2* | Cubieboard2's SD card |
-+| *cubietruck* | Cubietruck's SD card |
-+| *i386* | Disk image for any machine with i386 architecture |
-+| *lamobo-r1* | Lamobo R1 aka BananaPi Router SD card |
-+| *orange-pi-zero* | Orange Pi Zero's SD card |
-+| *pcduino3* | pcDuino3's SD card |
-+| *pine64-lts* | Pine64 LTS board's SD card |
-+| *pine64-plus* | Pine64+ board's SD card |
-+| *qemu-amd64* | 64-bit image for the Qemu virtualization tool |
-+| *qemu-i386* | 32-bit image for the Qemu virtualization tool |
-+| *raspberry2* | RasbperryPi 2's SD card |
-+| *raspberry3* | RasbperryPi 3's SD card |
-+| *raspberry3-b-plus* | RasbperryPi 3 Model B+'s SD card |
-+| *test* | build virtualbox i386 image and run diagnostics tests on it
-+| *virtualbox-amd64* | 64-bit image for the VirtualBox virtualization tool |
-+| *virtualbox-i386* | 32-bit image for the VirtualBox virtualization tool |
++| *a20-olinuxino-lime* | A20 OLinuXino Lime's SD card |
++| *a20-olinuxino-lime2* | A20 OLinuXino Lime2's SD card |
++| *a20-olinuxino-micro* | A20 OLinuXino MICRO's SD card |
++| *amd64* | Disk image for any machine with amd64 architecture |
++| *arm64* | Disk image for any machine with arm64/aarch64 architecture |
++| *armhf* | Disk image for any machine with arm32 architecture |
++| *banana-pro* | Banana Pro's SD card |
++| *beaglebone* | BeagleBone Black's SD card |
++| *cubieboard2* | Cubieboard2's SD card |
++| *cubietruck* | Cubietruck's SD card |
++| *i386* | Disk image for any machine with i386 architecture |
++| *lamobo-r1* | Lamobo R1 aka BananaPi Router SD card |
++| *orange-pi-zero* | Orange Pi Zero's SD card |
++| *pcduino3* | pcDuino3's SD card |
++| *pine64-lts* | Pine64 LTS board's SD card |
++| *pine64-plus* | Pine64+ board's SD card |
++| *qemu-amd64* | 64-bit image for the Qemu virtualization tool |
++| *qemu-i386* | 32-bit image for the Qemu virtualization tool |
++| *raspberry2* | RasbperryPi 2's SD card |
++| *raspberry3* | RasbperryPi 3's SD card |
++| *raspberry3-b-plus* | RasbperryPi 3 Model B+'s SD card |
++| *raspberry64* | Single image for Raspberry Pi 3B, Raspberry Pi 3B+ and Raspberry Pi 4B |
++| *virtualbox-amd64* | 64-bit image for the VirtualBox virtualization tool |
++| *virtualbox-i386* | 32-bit image for the VirtualBox virtualization tool |
## Running Build
diff --git a/helpers/DATA/freedom-maker/0002-generalize-distro-fork-name_could-be-upstreamed.patch b/helpers/DATA/freedom-maker/0002-generalize-distro-fork-name_could-be-upstreamed.patch
index aa38523..4f924ec 100644
--- a/helpers/DATA/freedom-maker/0002-generalize-distro-fork-name_could-be-upstreamed.patch
+++ b/helpers/DATA/freedom-maker/0002-generalize-distro-fork-name_could-be-upstreamed.patch
@@ -11,22 +11,31 @@ index ca998d9..1b051e2 100644
# initramfs-tools is a dependency for the kernel-image package. However, when
# kernel is not installed, as in case of Raspberry Pi image, explicit
# dependency is needed.
-@@ -114,14 +116,15 @@ class ImageBuilder(object): # pylint: disable=too-many-instance-attributes
- elif 'contrib' in self.release_components:
- free_tag = 'contrib'
- else:
-- free_tag = 'free'
-+ free_tag = 'libre'
- else:
-- free_tag = 'nonfree'
-+ free_tag = 'libre'
+diff --git a/freedommaker/builder.py b/freedommaker/builder.py
+index e4ccddd5..1ec3026b 100644
+--- a/freedommaker/builder.py
++++ b/freedommaker/builder.py
+@@ -87,10 +87,10 @@ class ImageBuilder: # pylint: disable=too-many-instance-attributes
+ """Return the Debian release components to use for the build."""
+ components = ['main']
+ if self.include_non_free_firmware:
+- components.append('non-free-firmware')
++ components.append('libre')
+ if self.include_contrib:
+- components.append('contrib')
++ components.append('libre')
+
+ if self.arguments.release_component:
+ for component in self.arguments.release_component:
+@@ -120,8 +120,9 @@ class ImageBuilder: # pylint: disable=too-many-instance-attributes
+ """Return the base file name of the final image."""
build_stamp = self.arguments.build_stamp
build_stamp = build_stamp + '_' if build_stamp else ''
-- return 'freedombox-{distribution}-{free_tag}_{build_stamp}{machine}' \
+- return 'freedombox-{distribution}_{build_stamp}{machine}' \
+ return '{distro}freedombox-{distribution}-{free_tag}_{build_stamp}_{machine}' \
'-{architecture}'.format(
+ distro=DISTRO_BRAND.lower() + '-' if DISTRO_BRAND else '',
- distribution=self.arguments.distribution, free_tag=free_tag,
+ distribution=self.arguments.distribution,
build_stamp=build_stamp, machine=self.machine,
architecture=self.architecture)
diff --git a/helpers/DATA/freedom-maker/0003-trisquelize-documentation.patch b/helpers/DATA/freedom-maker/0003-trisquelize-documentation.patch
index 4292ec1..2ea68f0 100644
--- a/helpers/DATA/freedom-maker/0003-trisquelize-documentation.patch
+++ b/helpers/DATA/freedom-maker/0003-trisquelize-documentation.patch
@@ -31,16 +31,16 @@ index aaa7caa..293545b 100644
| target | description |
|-----------------------|-------------|
-@@ -46,25 +42,18 @@ Freedom-maker supports building for the following targets:
- | *pine64-plus* | Pine64+ board's SD card |
- | *qemu-amd64* | 64-bit image for the Qemu virtualization tool |
- | *qemu-i386* | 32-bit image for the Qemu virtualization tool |
--| *raspberry2* | RasbperryPi 2's SD card |
--| *raspberry3* | RasbperryPi 3's SD card |
--| *raspberry3-b-plus* | RasbperryPi 3 Model B+'s SD card |
--| *test* | build virtualbox i386 image and run diagnostics tests on it
--| *virtualbox-amd64* | 64-bit image for the VirtualBox virtualization tool |
--| *virtualbox-i386* | 32-bit image for the VirtualBox virtualization tool |
+@@ -42,25 +42,18 @@ Trisquel Freedom-maker supports building for the following targets:
+ | *pine64-plus* | Pine64+ board's SD card |
+ | *qemu-amd64* | 64-bit image for the Qemu virtualization tool |
+ | *qemu-i386* | 32-bit image for the Qemu virtualization tool |
+-| *raspberry2* | RasbperryPi 2's SD card |
+-| *raspberry3* | RasbperryPi 3's SD card |
+-| *raspberry3-b-plus* | RasbperryPi 3 Model B+'s SD card |
+-| *raspberry64* | Single image for Raspberry Pi 3B, Raspberry Pi 3B+ and Raspberry Pi 4B |
+-| *virtualbox-amd64* | 64-bit image for the VirtualBox virtualization tool |
+-| *virtualbox-i386* | 32-bit image for the VirtualBox virtualization tool |
## Running Build
@@ -53,7 +53,7 @@ index aaa7caa..293545b 100644
2. Install the required dependencies:
```shell
- $ sudo apt install btrfs-progs debootstrap kpartx parted qemu-user-static qemu-utils sshpass
+ $ sudo apt install binfmt-support btrfs-progs debootstrap dmsetup dosfstools fdisk git kpartx parted psmisc qemu-user-static qemu-utils sshpass sudo u-boot-tools xz-utils
- $ cd freedom-maker
- $ sudo apt build-dep .
+ $ sudo apt build-dep freedom-maker
@@ -68,47 +68,69 @@ index aaa7caa..293545b 100644
$ sudo python3 -m freedommaker
```
where: <TARGET> is one of the 'Supported Targets' above.
-diff --git a/debian/freedom-maker.1 b/debian/freedom-maker.1
-index 71a9a9b..58051f3 100644
---- a/debian/freedom-maker.1
-+++ b/debian/freedom-maker.1
-@@ -51,17 +51,17 @@ Size of the image to build
- .PP
- \fB\-\-build\-mirror\fR
- .RS 4
--Debian mirror to use for building
-+Trisquel mirror to use for building
- .RE
- .PP
- \fB\-\-mirror\fR
- .RS 4
--Debian mirror to use in built image
-+Trisquel mirror to use in built image
- .RE
- .PP
- \fB\-\-distribution\fR
- .RS 4
--Debian release to use in built image
-+Trisquel release to use in built image
- .RE
- .PP
- \fB\-\-package\fR
-@@ -101,7 +101,7 @@ Force rebuild of images even when required image exists
- .PP
- \fBtargets\fR
- .RS 4
--Image targets to build\&. Choose one or more of a20\-olinuxino\-lime, a20\-olinuxino\-lime2, a20\-olinuxino\-micro, amd64, arm64, armhf, banana\-pro, beaglebone, cubieboard2, cubietruck, i386, lamobo\-r1, orange\-pi\-zero, pcduino3, pine64\-lts, pine64\-plus, qemu\-amd64, qemu\-i386, raspberry2, raspberry3, raspberry3\-b\-plus, test, virtualbox\-amd64, virtualbox\-i386
-+Image targets to build\&. Choose one or more of freedommaker, dreamplug, beaglebone, cubieboard2, cubietruck, a20\-olinuxino\-lime, a20\-olinuxino\-lime2, a20\-olinuxino\-micro, i386, amd64, qemu\-i386, qemu\-amd64, pcDuino3
- .RE
- .SH "EXAMPLES"
- .PP
-@@ -128,8 +128,7 @@ Build a FreedomBox image for the BeagleBone Single Board Computer\&.
- $ freedommaker a20\-olinuxino\-lime a20\-olinuxino\-lime2
- a20\-olinuxino\-micro amd64 arm64 armhf banana\-pro beaglebone cubieboard2
- cubietruck i386 lamobo\-r1 orange\-pi\-zero pcduino3 pine64\-lts pine64\-plus
-- qemu\-amd64 qemu\-i386 raspberry2 raspberry3 raspberry3\-b\-plus test
-- virtualbox\-amd64 virtualbox\-i386
-+ qemu\-amd64 qemu\-i386
- .fi
- .if n \{\
- .RE
+diff --git a/doc/freedom-maker.xml b/doc/freedom-maker.xml
+index 09c2f001..8c4abdd6 100644
+--- a/doc/freedom-maker.xml
++++ b/doc/freedom-maker.xml
+@@ -85,7 +85,7 @@
+ --build-mirror
+
+
+- Debian mirror to use for building
++ Trisquel mirror to use for building
+
+
+
+@@ -93,7 +93,7 @@
+ --mirror
+
+
+- Debian mirror to use in built image
++ Trisquel mirror to use in built image
+
+
+
+@@ -101,15 +101,7 @@
+ --distribution
+
+
+- Debian release to use in built image
+-
+-
+-
+-
+- --add-release-component
+-
+-
+- Add an extra Debian release component (other than main)
++ Trisquel release to use in built image
+
+
+
+@@ -208,12 +200,10 @@
+ targets
+
+
+- Image targets to build. Choose one or more of a20-olinuxino-lime,
+- a20-olinuxino-lime2, a20-olinuxino-micro, amd64, arm64, armhf,
+- banana-pro, beaglebone, cubieboard2, cubietruck, i386, lamobo-r1,
+- orange-pi-zero, pcduino3, pine64-lts, pine64-plus, qemu-amd64,
+- qemu-i386, raspberry2, raspberry3, raspberry3-b-plus, raspberry64,
+- vagrant virtualbox-amd64, virtualbox-i386
++ Image targets to build. Choose one or more of freedommaker,
++ dreamplug, beaglebone, cubieboard2, cubietruck,
++ a20-olinuxino-lime,a20-olinuxino-lime2, a20-olinuxino-micro,
++ i386, amd64, qemu-i386, qemu-amd64, pcDuino3
+
+
+
+@@ -236,8 +226,7 @@
+ $ freedommaker a20-olinuxino-lime a20-olinuxino-lime2
+ a20-olinuxino-micro amd64 arm64 armhf banana-pro beaglebone cubieboard2
+ cubietruck i386 lamobo-r1 orange-pi-zero pcduino3 pine64-lts pine64-plus
+- qemu-amd64 qemu-i386 raspberry2 raspberry3 raspberry3-b-plus raspberry64
+- vagrant virtualbox-amd64 virtualbox-i386
++ qemu-amd64 qemu-i386
+
+ Build all the available FreedomBox images using freedom-maker.
+
diff --git a/helpers/DATA/freedom-maker/0005-trisquelize-code.patch b/helpers/DATA/freedom-maker/0005-trisquelize-code.patch
index ca9c46e..539e4df 100644
--- a/helpers/DATA/freedom-maker/0005-trisquelize-code.patch
+++ b/helpers/DATA/freedom-maker/0005-trisquelize-code.patch
@@ -16,23 +16,23 @@ index c5175a8..a479721 100644
LOG_LEVEL = 'debug'
HOSTNAME = 'freedombox'
diff --git a/freedommaker/library.py b/freedommaker/library.py
-index f8ea629..04954b5 100644
+index 28f10cfa..b821226b 100644
--- a/freedommaker/library.py
+++ b/freedommaker/library.py
-@@ -493,12 +493,12 @@ deb {mirror} {distribution}-updates {components}
+@@ -527,12 +527,12 @@ deb {mirror} {distribution}-updates {components}
deb-src {mirror} {distribution}-updates {components}
'''
security_template = '''
-deb http://security.debian.org/debian-security/ {distribution}-security {components}
-deb-src http://security.debian.org/debian-security/ {distribution}-security {components}
-+deb {mirror} {distribution}-security {components}
-+deb-src {mirror} {distribution}-security {components}
++deb https://archive.trisquel.org/trisquel/ {distribution}-security {components}
++deb-src https://archive.trisquel.org/trisquel/ {distribution}-security {components}
'''
backports_template = f'''
--deb http://deb.debian.org/debian {STABLE_CODENAME}-backports main
--deb-src http://deb.debian.org/debian {STABLE_CODENAME}-backports main
-+#deb {mirror} {distribution}-backports {components}
-+#deb-src {mirror} {distribution}-backports {components}
+-deb http://deb.debian.org/debian {releases.STABLE_CODENAME}-backports main
+-deb-src http://deb.debian.org/debian {releases.STABLE_CODENAME}-backports main
++deb {mirror} {distribution}-backports {components}
++deb-src {mirror} {distribution}-backports {components}
'''
file_path = path_in_mount(state, 'etc/apt/sources.list')
with open(file_path, 'w') as file_handle:
diff --git a/helpers/DATA/freedom-maker/0006-remove-nonfree-support.patch b/helpers/DATA/freedom-maker/0006-remove-nonfree-support.patch
index 0241e69..94b8a80 100644
--- a/helpers/DATA/freedom-maker/0006-remove-nonfree-support.patch
+++ b/helpers/DATA/freedom-maker/0006-remove-nonfree-support.patch
@@ -12,23 +12,24 @@ index 1f2c207..c97d392 100644
FreedomBox is a personal cloud server which can be installed on single board
computers and Debian machines.
diff --git a/freedommaker/builders/__init__.py b/freedommaker/builders/__init__.py
-index dd694f3..139c654 100644
+index 56c180db..139c6541 100644
--- a/freedommaker/builders/__init__.py
+++ b/freedommaker/builders/__init__.py
-@@ -25,10 +25,3 @@ from . import pine64_plus
+@@ -25,11 +25,3 @@ from . import pine64_plus
from . import pine64_lts
from . import qemu_amd64
from . import qemu_i386
-from . import raspberry_pi_2
-from . import raspberry_pi_3
-from . import raspberry_pi_3_b_plus
+-from . import raspberry_pi_64bit
-from . import raspberry_pi_with_uboot
-from . import vagrant
-from . import virtualbox_amd64
-from . import virtualbox_i386
diff --git a/freedommaker/builders/raspberry_pi_2.py b/freedommaker/builders/raspberry_pi_2.py
deleted file mode 100644
-index c226683..0000000
+index 439444e7..00000000
--- a/freedommaker/builders/raspberry_pi_2.py
+++ /dev/null
@@ -1,15 +0,0 @@
@@ -46,13 +47,13 @@ index c226683..0000000
- machine = 'raspberry2'
- kernel_flavor = 'armmp'
- flash_kernel_name = 'Raspberry Pi 2 Model B'
-- uboot_variant = 'rpi_2'
+- u_boot_rpi_variant = 'rpi_2'
diff --git a/freedommaker/builders/raspberry_pi_3.py b/freedommaker/builders/raspberry_pi_3.py
deleted file mode 100644
-index 797e8df..0000000
+index 3b9bf82b..00000000
--- a/freedommaker/builders/raspberry_pi_3.py
+++ /dev/null
-@@ -1,16 +0,0 @@
+@@ -1,15 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-"""
-Worker class to build Raspberry Pi 3 image.
@@ -65,34 +66,67 @@ index 797e8df..0000000
- """Image builder for Raspberry Pi 3 target."""
- architecture = 'armhf'
- machine = 'raspberry3'
-- free = False
- kernel_flavor = 'armmp'
- flash_kernel_name = 'Raspberry Pi 3 Model B'
-- uboot_variant = 'rpi_3_32b'
-diff --git a/freedommaker/builders/raspberry_pi_3_b_plus.py b/freedommaker/builders/raspberry_pi_3_b_plus.py
+- u_boot_rpi_variant = 'rpi_3_32b'
+diff --git a/freedommaker/builders/raspberry_pi_64bit.py b/freedommaker/builders/raspberry_pi_64bit.py
deleted file mode 100644
-index 7a54842..0000000
---- a/freedommaker/builders/raspberry_pi_3_b_plus.py
+index e6a9ffa0..00000000
+--- a/freedommaker/builders/raspberry_pi_64bit.py
+++ /dev/null
-@@ -1,12 +0,0 @@
+@@ -1,46 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-"""
--Worker class to build Raspberry Pi 3 Model B+ image.
+-Worker class to build Raspberry Pi 64-bit image.
-"""
-
--from .raspberry_pi_3 import RaspberryPi3ImageBuilder
+-from .. import library
+-from ..builder import ImageBuilder
-
-
--class RaspberryPi3BPlusImageBuilder(RaspberryPi3ImageBuilder):
-- """Image builder for Raspberry Pi 3 Model B+ target."""
-- machine = 'raspberry3-b-plus'
-- flash_kernel_name = 'Raspberry Pi 3 Model B+'
+-class RaspberryPi64ImageBuilder(ImageBuilder):
+- """Image builder for Raspberry Pi 64-bit target."""
+- architecture = 'arm64'
+- boot_loader = None
+- firmware_filesystem_type = 'vfat'
+- firmware_size = '256MiB'
+- include_non_free_firmware = True
+- kernel_flavor = 'arm64'
+- machine = 'raspberry64'
+- update_initramfs = False
+-
+- def __init__(self, arguments):
+- """Add to list of packages."""
+- super().__init__(arguments)
+- self.packages += ['firmware-brcm80211']
+-
+- @classmethod
+- def get_target_name(cls):
+- """Return the name of the target for an image builder."""
+- return getattr(cls, 'machine', None)
+-
+- def install_boot_loader(self, state):
+- """Install the firmware onto the image."""
+- uuid = library.get_uuid_of_device(state['devices']['root'])
+- script = '''
+-set -e
+-set -x
+-set -o pipefail
+-
+-# This will trigger installing firmware and updating initramfs.
+-apt-get install raspi-firmware
+-
+-# Fixup cmdline.txt and set defaults
+-echo "console=tty0 console=ttyS1,115200 root=UUID={uuid} rw fsck.repair=yes net.ifnames=0 rootwait" >/boot/firmware/cmdline.txt
+-sed -i 's/^#ROOTPART=.*/ROOTPART=UUID={uuid}/' /etc/default/raspi-firmware
+-'''.format(uuid=uuid)
+- library.run_in_chroot(state, ['bash', '-c', script])
diff --git a/freedommaker/builders/raspberry_pi_with_uboot.py b/freedommaker/builders/raspberry_pi_with_uboot.py
deleted file mode 100644
-index 8057f87..0000000
+index c4be09cd..00000000
--- a/freedommaker/builders/raspberry_pi_with_uboot.py
+++ /dev/null
-@@ -1,44 +0,0 @@
+@@ -1,46 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-"""
-Base worker class to build Raspberry Pi 2 and 3 images.
@@ -104,14 +138,15 @@ index 8057f87..0000000
-
-class RaspberryPiWithUBoot(ARMImageBuilder):
- """Base image builder for Raspberry Pi 2 and 3 targets."""
-- free = False
+- include_non_free_firmware = True
- uboot_variant = None
- firmware_filesystem_type = 'vfat'
-- firmware_size = '64MiB'
+- firmware_size = '256MiB'
+- u_boot_variant = 'rpi'
-
- def install_boot_loader(self, state):
- """Install the boot loader onto the image."""
-- if not self.uboot_variant:
+- if not self.u_boot_rpi_variant:
- raise NotImplementedError
-
- firmware_package = 'raspi-firmware'
@@ -133,29 +168,35 @@ index 8057f87..0000000
-
-# u-boot setup
-apt-get install -y u-boot-rpi
--cp /usr/lib/u-boot/{uboot_variant}/u-boot.bin /boot/firmware/kernel.img
--cp /usr/lib/u-boot/{uboot_variant}/u-boot.bin /boot/firmware/kernel7.img
--'''.format(firmware_package=firmware_package, uboot_variant=self.uboot_variant)
+-cp /usr/lib/u-boot/{u_boot_rpi_variant}/u-boot.bin /boot/firmware/kernel.img
+-cp /usr/lib/u-boot/{u_boot_rpi_variant}/u-boot.bin /boot/firmware/kernel7.img
+-'''.format(firmware_package=firmware_package,
+- u_boot_rpi_variant=self.u_boot_rpi_variant)
- library.run_in_chroot(state, ['bash', '-c', script])
diff --git a/freedommaker/builders/vagrant.py b/freedommaker/builders/vagrant.py
deleted file mode 100644
-index 13d124d..0000000
+index 30df772b..00000000
--- a/freedommaker/builders/vagrant.py
+++ /dev/null
-@@ -1,41 +0,0 @@
+@@ -1,56 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-"""
-Worker class to build Vagrant images.
-"""
-
+-import logging
-import os
+-import subprocess
-
-from .. import library
-from .virtualbox_amd64 import VirtualBoxAmd64ImageBuilder
-
+-logger = logging.getLogger(__name__)
+-
-
-class VagrantImageBuilder(VirtualBoxAmd64ImageBuilder):
- """Image builder for Vagrant package."""
+- include_contrib = True
- vagrant_extension = '.box'
-
- @classmethod
@@ -174,86 +215,23 @@ index 13d124d..0000000
- self.create_vm_file(self.image_file, vm_file)
- os.remove(self.image_file)
- self.vagrant_package(vm_file, vagrant_file)
+- self.store_hash(vagrant_file)
-
- def vagrant_package(self, vm_file, vagrant_file):
- """Create a vagrant package from VM file."""
- command = [
-- 'bin/vagrant-package', '--distribution',
+- 'freedommaker/vagrant_package.py', '--distribution',
- self.arguments.distribution, '--release-components'
- ]
- command.extend(self.release_components)
- command += ['--output', vagrant_file, vm_file]
- library.run(command)
-diff --git a/freedommaker/builders/virtualbox.py b/freedommaker/builders/virtualbox.py
-deleted file mode 100644
-index 73c1965..0000000
---- a/freedommaker/builders/virtualbox.py
-+++ /dev/null
-@@ -1,31 +0,0 @@
--# SPDX-License-Identifier: GPL-3.0-or-later
--"""
--Base worker class to build VirtualBox images.
--"""
-
--import os
--
--from .. import library
--from .vm import VMImageBuilder
--
--
--class VirtualBoxImageBuilder(VMImageBuilder):
-- """Base image builder for all VirtualBox targets."""
-- vm_image_extension = '.vdi'
--
-- @classmethod
-- def get_target_name(cls):
-- """Return the name of the target for an image builder."""
-- if getattr(cls, 'architecture', None):
-- return 'virtualbox-' + cls.architecture
--
-- return None
--
-- def create_vm_file(self, image_file, vm_file):
-- """Create a VM file from image file."""
-- try:
-- os.remove(vm_file)
-- except FileNotFoundError:
-- pass
--
-- library.run(['VBoxManage', 'convertdd', image_file, vm_file])
-diff --git a/freedommaker/builders/virtualbox_amd64.py b/freedommaker/builders/virtualbox_amd64.py
-deleted file mode 100644
-index 20108d6..0000000
---- a/freedommaker/builders/virtualbox_amd64.py
-+++ /dev/null
-@@ -1,12 +0,0 @@
--# SPDX-License-Identifier: GPL-3.0-or-later
--"""
--Worker class to build VirtualBox amd64 images.
--"""
--
--from .virtualbox import VirtualBoxImageBuilder
--
--
--class VirtualBoxAmd64ImageBuilder(VirtualBoxImageBuilder):
-- """Image builder for all VirtualBox amd64 targets."""
-- architecture = 'amd64'
-- kernel_flavor = 'amd64'
-diff --git a/freedommaker/builders/virtualbox_i386.py b/freedommaker/builders/virtualbox_i386.py
-deleted file mode 100644
-index 9380a6a..0000000
---- a/freedommaker/builders/virtualbox_i386.py
-+++ /dev/null
-@@ -1,12 +0,0 @@
--# SPDX-License-Identifier: GPL-3.0-or-later
--"""
--Worker class to build VirtualBox i386 images.
--"""
--
--from .virtualbox import VirtualBoxImageBuilder
--
--
--class VirtualBoxI386ImageBuilder(VirtualBoxImageBuilder):
-- """Image builder for all VirtualBox i386 targets."""
-- architecture = 'i386'
-- kernel_flavor = '686'
+- def store_hash(self, vagrant_file):
+- """Store the SHA-256 hash of the vagrant box file."""
+- output = subprocess.check_output(['sha256sum', vagrant_file])
+- result = output.decode()
+- logger.info('sha256sum: %s', result)
+- hash_filename = self._replace_extension(vagrant_file, '.sha256')
+- with open(hash_filename, 'w') as hash_file:
+- hash_file.write(result)
diff --git a/helpers/DATA/freedom-maker/0007-patch-test_library-nabia.patch b/helpers/DATA/freedom-maker/0007-patch-test_library-nabia.patch
index 86c318d..d6cd449 100644
--- a/helpers/DATA/freedom-maker/0007-patch-test_library-nabia.patch
+++ b/helpers/DATA/freedom-maker/0007-patch-test_library-nabia.patch
@@ -1,76 +1,75 @@
diff --git a/freedommaker/tests/test_library.py b/freedommaker/tests/test_library.py
-index 2cc840a..6e63917 100644
+index 4b52b278..b4688a11 100644
--- a/freedommaker/tests/test_library.py
+++ b/freedommaker/tests/test_library.py
-@@ -422,13 +422,13 @@ modify x x
- @patch('freedommaker.library.run')
- def test_debootstrap(self, run):
- """Test debootstrapping."""
-- library.debootstrap(self.state, 'i386', 'stretch', 'minbase',
-- ['main', 'contrib'], ['p1', 'p2'],
-- 'http://deb.debian.org/debian')
-+ library.debootstrap(self.state, 'amd64', 'nabia', 'minbase',
-+ ['main'], ['p1', 'p2'],
-+ 'http://archive.trisquel.org/trisquel')
- run.assert_called_with([
-- 'debootstrap', '--arch=i386', '--variant=minbase',
-- '--components=main,contrib', '--include=p1,p2', 'stretch',
-- self.state['mount_point'], 'http://deb.debian.org/debian'
-+ 'debootstrap', '--arch=amd64', '--variant=minbase',
-+ '--components=main', '--include=p1,p2', 'nabia',
-+ self.state['mount_point'], 'http://archive.trisquel.org/trisquel'
- ])
+@@ -446,13 +446,13 @@ def test_cleanup_extra_storage(run, image, state, random_string):
+ @patch('freedommaker.library.run')
+ def test_debootstrap(run, state):
+ """Test debootstrapping."""
+- library.debootstrap(state, 'i386', 'stretch', 'minbase',
+- ['main', 'contrib'], ['p1', 'p2'],
+- 'http://deb.debian.org/debian')
++ library.debootstrap(state, 'amd64', 'aramo', 'minbase',
++ ['main'], ['p1', 'p2'],
++ 'http://archive.trisquel.org/trisquel')
+ run.assert_called_with([
+- 'debootstrap', '--arch=i386', '--variant=minbase',
+- '--components=main,contrib', '--include=p1,p2', 'stretch',
+- state['mount_point'], 'http://deb.debian.org/debian'
++ 'debootstrap', '--arch=amd64', '--variant=minbase',
++ '--components=main', '--include=p1,p2', 'aramo',
++ state['mount_point'], 'http://archive.trisquel.org/trisquel'
+ ])
- self.assertEqual(self.state['cleanup'], [[
-@@ -574,31 +574,37 @@ ff02::2 ip6-allrouters
- sources_path = self.state['mount_point'] + '/etc/apt/sources.list'
+ assert state['cleanup'] == [[
+@@ -602,17 +602,17 @@ def test_setup_apt(run, state):
+ sources_path = state['mount_point'] + '/etc/apt/sources.list'
- stable_content = '''
+ stable_content = '''
-deb http://deb.debian.org/debian stable main
-deb-src http://deb.debian.org/debian stable main
-+deb http://archive.trisquel.org/trisquel nabia main
-+deb-src http://archive.trisquel.org/trisquel nabia main
++deb http://archive.trisquel.org/trisquel aramo main
++deb-src http://archive.trisquel.org/trisquel aramo main
-deb http://deb.debian.org/debian stable-updates main
-deb-src http://deb.debian.org/debian stable-updates main
-+deb http://archive.trisquel.org/trisquel nabia-updates main
-+deb-src http://archive.trisquel.org/trisquel nabia-updates main
++deb http://archive.trisquel.org/trisquel aramo-updates main
++deb-src http://archive.trisquel.org/trisquel aramo-updates main
-deb http://security.debian.org/debian-security/ stable-security main
-deb-src http://security.debian.org/debian-security/ stable-security main
-+deb http://archive.trisquel.org/trisquel nabia-security main
-+deb-src http://archive.trisquel.org/trisquel nabia-security main
++deb https://archive.trisquel.org/trisquel/ aramo-security main
++deb-src https://archive.trisquel.org/trisquel/ aramo-security main
'''
- with self.assert_file_change(sources_path, None, stable_content):
-- library.setup_apt(self.state, 'http://deb.debian.org/debian',
-- 'stable', ['main'])
-+ library.setup_apt(self.state, 'http://archive.trisquel.org/trisquel',
-+ 'nabia', ['main'])
+ with assert_file_change(sources_path, None, stable_content):
+- library.setup_apt(state, 'http://deb.debian.org/debian', 'stable',
++ library.setup_apt(state, 'http://archive.trisquel.org/trisquel', 'aramo',
+ ['main'])
- self.assertEqual(run.call_args_list, [
- call(self.state, ['apt-get', 'update']),
- call(self.state, ['apt-get', 'clean'])
- ])
+ assert run.call_args_list == [
+@@ -620,13 +620,19 @@ deb-src https://archive.trisquel.org/trisquel/ aramo-security main
+ call(state, ['apt-get', 'clean'])
+ ]
-- unstable_content = '''
--deb http://ftp.us.debian.org/debian unstable main contrib non-free
--deb-src http://ftp.us.debian.org/debian unstable main contrib non-free
-+ aramo_content = '''
-+deb http://archive.trisquel.org/trisquel aramo main
-+deb-src http://archive.trisquel.org/trisquel aramo main
+- unstable_content = '''
+-deb http://ftp.us.debian.org/debian unstable main contrib non-free-firmware
+-deb-src http://ftp.us.debian.org/debian unstable main contrib non-free-firmware
++ ecne_content = '''
++deb http://archive.trisquel.org/trisquel ecne main
++deb-src http://archive.trisquel.org/trisquel ecne main
+
-+deb http://archive.trisquel.org/trisquel aramo-updates main
-+deb-src http://archive.trisquel.org/trisquel aramo-updates main
++deb http://archive.trisquel.org/trisquel ecne-updates main
++deb-src http://archive.trisquel.org/trisquel ecne-updates main
+
-+deb http://archive.trisquel.org/trisquel aramo-security main
-+deb-src http://archive.trisquel.org/trisquel aramo-security main
++deb https://archive.trisquel.org/trisquel/ ecne-security main
++deb-src https://archive.trisquel.org/trisquel/ ecne-security main
'''
-- with self.assert_file_change(sources_path, None, unstable_content):
-- library.setup_apt(self.state, 'http://ftp.us.debian.org/debian',
-- 'unstable', ['main', 'contrib', 'non-free'])
-+ with self.assert_file_change(sources_path, None, aramo_content):
-+ library.setup_apt(self.state, 'http://archive.trisquel.org/trisquel',
-+ 'aramo', ['main'])
+- with assert_file_change(sources_path, None, unstable_content):
+- library.setup_apt(state, 'http://ftp.us.debian.org/debian', 'unstable',
+- ['main', 'contrib', 'non-free-firmware'])
++ with assert_file_change(sources_path, None, ecne_content):
++ library.setup_apt(state, 'http://archive.trisquel.org/trisquel', 'ecne',
++ ['main'])
- @patch('freedommaker.library.run_in_chroot')
- def test_setup_flash_kernel(self, run):
+
+ @patch('freedommaker.library.run_in_chroot')
diff --git a/helpers/DATA/freedom-maker/0008-specify-generic-kernels.patch b/helpers/DATA/freedom-maker/0008-specify-generic-kernels.patch
index ac7a908..08c2472 100644
--- a/helpers/DATA/freedom-maker/0008-specify-generic-kernels.patch
+++ b/helpers/DATA/freedom-maker/0008-specify-generic-kernels.patch
@@ -5,12 +5,12 @@ index ff7f807..ad94e1c 100644
@@ -10,7 +10,7 @@ from .arm import ARMImageBuilder
class A20ImageBuilder(ARMImageBuilder):
"""Base image builder for all Allwinner A20 board based targets."""
- architecture = 'armhf'
-- kernel_flavor = 'armmp-lpae'
-+ kernel_flavor = 'generic'
- u_boot_path = None
+ architecture: str = 'armhf'
+- kernel_flavor: str = 'armmp-lpae'
++ kernel_flavor: str = 'generic'
+ u_boot_path: str | None = None
+ u_boot_variant: str = 'sunxi'
- def install_boot_loader(self, state):
diff --git a/freedommaker/builders/a64.py b/ffreedommaker/builders/a64.py
index 7314724..21f3ae1 100644
--- a/freedommaker/builders/a64.py
@@ -18,22 +18,25 @@ index 7314724..21f3ae1 100644
@@ -12,7 +12,7 @@ from .arm import ARMImageBuilder
class A64ImageBuilder(ARMImageBuilder):
"""Image builder for all Allwinner A64 board targets."""
- architecture = 'arm64'
-- kernel_flavor = 'arm64'
-+ kernel_flavor = 'generic'
- u_boot_target = None
+ architecture: str = 'arm64'
+- kernel_flavor: str = 'arm64'
++ kernel_flavor: str = 'generic'
+ u_boot_target: str | None = None
def __init__(self, *args, **kwargs):
diff --git a/freedommaker/builders/amd64.py b/ffreedommaker/builders/amd64.py
index d577ece..1b758f8 100644
--- a/freedommaker/builders/amd64.py
+++ b/ffreedommaker/builders/amd64.py
-@@ -9,4 +9,4 @@ from .amd_intel import AMDIntelImageBuilder
+@@ -9,7 +9,7 @@ from .amd_intel import AMDIntelImageBuilder
class AMD64ImageBuilder(AMDIntelImageBuilder):
"""Image builder for all amd64 targets."""
architecture = 'amd64'
- kernel_flavor = 'amd64'
+ kernel_flavor = 'generic'
+ include_non_free_firmware = True
+
+ def __init__(self, *args, **kwargs):
diff --git a/freedommaker/builders/arm64.py b/ffreedommaker/builders/arm64.py
index 4576d3e..fc593f9 100644
--- a/freedommaker/builders/arm64.py
@@ -77,12 +80,15 @@ diff --git a/freedommaker/builders/i386.py b/ffreedommaker/builders/i386.py
index 98a48da..692122d 100644
--- a/freedommaker/builders/i386.py
+++ b/ffreedommaker/builders/i386.py
-@@ -9,4 +9,4 @@ from .amd_intel import AMDIntelImageBuilder
+@@ -9,7 +9,7 @@ from .amd_intel import AMDIntelImageBuilder
class I386ImageBuilder(AMDIntelImageBuilder):
"""Image builder for all i386 targets."""
architecture = 'i386'
- kernel_flavor = '686'
+ kernel_flavor = 'generic'
+ include_non_free_firmware = True
+
+ def __init__(self, *args, **kwargs):
diff --git a/freedommaker/builders/qemu_amd64.py b/ffreedommaker/builders/qemu_amd64.py
index bb28f0a..61e5863 100644
--- a/freedommaker/builders/qemu_amd64.py
diff --git a/helpers/DATA/gnome-boxes/001_add_trisquel_gnome-boxes_logo.patch b/helpers/DATA/gnome-boxes/001_add_trisquel_gnome-boxes_logo.patch
new file mode 100644
index 0000000..8f5b0ca
--- /dev/null
+++ b/helpers/DATA/gnome-boxes/001_add_trisquel_gnome-boxes_logo.patch
@@ -0,0 +1,29 @@
+diff --git a/data/osinfo/meson.build b/data/osinfo/meson.build
+index acf27962..158af16b 100644
+--- a/data/osinfo/meson.build
++++ b/data/osinfo/meson.build
+@@ -16,7 +16,8 @@ osinfo_db = [
+ ['popos-17.10.xml', 'gnome-boxes/osinfo/os/system76.com'],
+ ['rhel-8.0.xml', 'gnome-boxes/osinfo/os/redhat.com'],
+ ['rocky-8.4.xml', 'gnome-boxes/osinfo/os/rockylinux.org'],
+- ['silverblue-28.xml', 'gnome-boxes/osinfo/os/fedoraproject.org']
++ ['silverblue-28.xml', 'gnome-boxes/osinfo/os/fedoraproject.org'],
++ ['trisquel-9.xml', 'gnome-boxes/osinfo/os/trisquel.info']
+ ]
+
+ foreach os: osinfo_db
+diff --git a/data/osinfo/trisquel-11.xml b/data/osinfo/trisquel-11.xml
+new file mode 100644
+index 00000000..ce9b4b36
+--- /dev/null
++++ b/data/osinfo/trisquel-9.xml
+@@ -0,0 +1,9 @@
++
++
++
++
++
++ https://gitlab.gnome.org/GNOME/gnome-boxes-logos/-/raw/master/logos/trisquel.svg
++
++
++
diff --git a/helpers/DATA/gnome-shell/drop_gnome-shell-overrides-migration.patch b/helpers/DATA/gnome-shell/drop_gnome-shell-overrides-migration.patch
deleted file mode 100644
index 7188f72..0000000
--- a/helpers/DATA/gnome-shell/drop_gnome-shell-overrides-migration.patch
+++ /dev/null
@@ -1,127 +0,0 @@
-From a9e6e44ef898671229388938cc3ed511fa394dfc Mon Sep 17 00:00:00 2001
-From: Philip Withnall
-Date: Mon, 23 Jan 2023 16:38:36 +0000
-Subject: [PATCH] tools: Drop gnome-shell-overrides-migration.sh
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The tool was added in 2018 to migrate to per-desktop overrides from the
-old overrides system.
-
-5 years later, everyone who’s going to migrate probably has migrated, so
-we can delete the script and remove a process running on every login.
-
-Signed-off-by: Philip Withnall
-Part-of:
----
- ...gnome-shell-overrides-migration.desktop.in | 5 ---
- data/meson.build | 9 -----
- meson.build | 1 -
- tools/gnome-shell-overrides-migration.sh | 38 -------------------
- tools/meson.build | 4 --
- 5 files changed, 57 deletions(-)
- delete mode 100644 data/gnome-shell-overrides-migration.desktop.in
- delete mode 100755 tools/gnome-shell-overrides-migration.sh
- delete mode 100644 tools/meson.build
-
-diff --git a/data/gnome-shell-overrides-migration.desktop.in b/data/gnome-shell-overrides-migration.desktop.in
-deleted file mode 100644
-index 99452e6ec1..0000000000
---- a/data/gnome-shell-overrides-migration.desktop.in
-+++ /dev/null
-@@ -1,5 +0,0 @@
--[Desktop Entry]
--Type=Application
--Name=GNOME settings overrides migration
--NoDisplay=true
--Exec=@libexecdir@/gnome-shell-overrides-migration.sh
-diff --git a/data/meson.build b/data/meson.build
-index 7fa7f15ffb..a31efcc794 100644
---- a/data/meson.build
-+++ b/data/meson.build
-@@ -99,15 +99,6 @@ schema = configure_file(
- )
- install_data('00_org.gnome.shell.gschema.override', install_dir: schemadir)
-
--overrides_migration_conf = configuration_data()
--overrides_migration_conf.set('libexecdir', libexecdir)
--overrides_migration = configure_file(
-- input: 'gnome-shell-overrides-migration.desktop.in',
-- output: 'gnome-shell-overrides-migration.desktop',
-- configuration: overrides_migration_conf,
-- install_dir: autostartdir
--)
--
- if have_systemd
- unitconf = configuration_data()
- unitconf.set('bindir', bindir)
-diff --git a/meson.build b/meson.build
-index 791ec2e64e..6cd40cefa8 100644
---- a/meson.build
-+++ b/meson.build
-@@ -283,7 +283,6 @@ subdir('js')
- subdir('src')
- subdir('po')
- subdir('data')
--subdir('tools')
-
- if get_option('tests')
- subdir('tests')
-diff --git a/tools/gnome-shell-overrides-migration.sh b/tools/gnome-shell-overrides-migration.sh
-deleted file mode 100755
-index a1b4cb6331..0000000000
---- a/tools/gnome-shell-overrides-migration.sh
-+++ /dev/null
-@@ -1,38 +0,0 @@
--#!/bin/sh
--
--PKG_DATA_DIR=${XDG_DATA_HOME:-$HOME/.local/share}/gnome-shell
--
--MIGRATION_GUARD=$PKG_DATA_DIR/gnome-overrides-migrated
--OVERRIDE_SCHEMA=
--
--if [ -f $MIGRATION_GUARD ]; then
-- exit # already migrated
--fi
--
--# Find the right session
--if echo $XDG_CURRENT_DESKTOP | grep -q -v GNOME; then
-- exit # not a GNOME session
--fi
--
--if echo $XDG_CURRENT_DESKTOP | grep -q Classic; then
-- OVERRIDE_SCHEMA=org.gnome.shell.extensions.classic-overrides
--else
-- OVERRIDE_SCHEMA=org.gnome.shell.overrides
--fi
--
--mkdir -p $PKG_DATA_DIR
--
--for k in `gsettings list-keys $OVERRIDE_SCHEMA`
--do
-- if [ $k = button-layout ]; then
-- orig_schema=org.gnome.desktop.wm.preferences
-- else
-- orig_schema=org.gnome.mutter
-- fi
--
-- oldValue=`gsettings get $OVERRIDE_SCHEMA $k`
-- curValue=`gsettings get $orig_schema $k`
-- if [ $oldValue != $curValue ]; then
-- gsettings set $orig_schema $k $oldValue
-- fi
--done && touch $MIGRATION_GUARD
-diff --git a/tools/meson.build b/tools/meson.build
-deleted file mode 100644
-index d8e217cc44..0000000000
---- a/tools/meson.build
-+++ /dev/null
-@@ -1,4 +0,0 @@
--install_data('gnome-shell-overrides-migration.sh',
-- install_dir: libexecdir,
-- install_mode: 'rwxr-xr-x'
--)
---
-GitLab
-
diff --git a/helpers/DATA/gnome-software/rm_snap_fwup_support.patch b/helpers/DATA/gnome-software/rm_snap_fwup_support.patch
new file mode 100644
index 0000000..dd3403d
--- /dev/null
+++ b/helpers/DATA/gnome-software/rm_snap_fwup_support.patch
@@ -0,0 +1,95 @@
+diff --git a/debian/control b/debian/control
+index 7262a65c..497779f7 100644
+--- a/debian/control
++++ b/debian/control
+@@ -17,7 +17,6 @@ Build-Depends: appstream,
+ libadwaita-1-dev (>= 1.4),
+ libappstream-dev (>= 1.0.0),
+ libflatpak-dev (>= 1.14.0) [amd64 arm64 armel armhf i386 mipsel mips64el ppc64el s390x hppa powerpc ppc64 riscv64 x32],
+- libfwupd-dev (>= 1.5.6) [linux-any],
+ libglib-testing-0-dev,
+ libglib2.0-dev (>= 2.70.0),
+ libgtk-4-dev (>= 4.12.0),
+@@ -60,10 +60,8 @@ Depends: appstream,
+ ${misc:Depends},
+ ${shlibs:Depends}
+ Conflicts: sessioninstaller
+-Recommends: fwupd [linux-any],
+- ${plugin:Recommends}
++Recommends: ${plugin:Recommends}
+ Suggests: apt-config-icons-hidpi,
+- gnome-software-plugin-flatpak [amd64 arm64 armel armhf i386 mipsel mips64el ppc64el s390x hppa powerpc ppc64 riscv64 x32],
+ ${plugin:Suggests}
+ Description: Software Center for GNOME
+ Software lets you install and update applications and system extensions.
+@@ -106,26 +106,6 @@ Description: Flatpak support for GNOME Software
+ .
+ This package contains the Flatpak plugin.
+
+-Package: gnome-software-plugin-snap
+-Architecture: amd64 arm64 armel armhf i386 ppc64el s390x
+-Depends: gnome-software (= ${binary:Version}),
+- snapd [amd64 arm64 armel armhf i386 ppc64el],
+- ${misc:Depends},
+- ${shlibs:Depends}
+-Recommends: snapd [s390x]
+-Breaks: gnome-software (<< 3.22.3)
+-Replaces: gnome-software (<< 3.22.3)
+-Description: Snap support for GNOME Software
+- Software lets you install and update applications and system extensions.
+- .
+- Software uses a plugin architecture to separate the frontend from the
+- technologies that are used underneath. Currently, a PackageKit plugin provides
+- data from a number of traditional packaging systems, such as rpm or apt. An
+- appdata plugin provides additional metadata from locally installed data in the
+- appdata format.
+- .
+- This package contains the Snap plugin.
+-
+ Package: gnome-software-dev
+ Section: libdevel
+ Architecture: any
+diff --git a/debian/rules b/debian/rules
+index f0bb2394..58b4bc70 100755
+--- a/debian/rules
++++ b/debian/rules
+@@ -30,11 +30,11 @@ ifeq ($(DEB_HOST_ARCH_OS), linux)
+ GS_CONFIGURE_FLAGS += -Dgudev=true
+
+ # Enable fwupd support on Linux
+- GS_CONFIGURE_FLAGS += -Dfwupd=true
++ GS_CONFIGURE_FLAGS += -Dfwupd=false
+
+ # Enable snap support on supported architectures
+ ifneq (,$(filter $(DEB_HOST_ARCH), amd64 arm64 armel armhf i386 ppc64el s390x))
+- GS_CONFIGURE_FLAGS += -Dsnap=true
++ GS_CONFIGURE_FLAGS += -Dsnap=false
+ endif
+ endif
+
+@@ -42,9 +42,9 @@ DISTRO_ID = debian
+ FREE_REPOS = \'@DISTRO@-*-main\'
+ FREE_URL = https:\/\/www.debian.org\/social_contract\#guidelines
+ ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
+- DISTRO_ID = ubuntu
+- FREE_REPOS = \'@DISTRO@-*-main\', \'@DISTRO@-*-universe\'
+- FREE_URL = https:\/\/www.ubuntu.com\/about\/about-ubuntu\/licensing
++ DISTRO_ID = trisquel
++ FREE_REPOS = \'@DISTRO@-*-main\'
++ FREE_URL = https:\/\/trisquel.info\/legal
+ else ifeq (yes,$(shell dpkg-vendor --derives-from Tanglu && echo yes))
+ DISTRO_ID = tanglu
+ else ifeq (yes,$(shell dpkg-vendor --derives-from PureOS && echo yes))
+@@ -87,11 +87,7 @@ override_dh_shlibdeps:
+ override_dh_auto_test:
+
+ override_dh_gencontrol:
+-ifeq ($(shell dpkg-vendor --query vendor),Ubuntu)
+- dh_gencontrol -- -Vplugin:Recommends='gnome-software-plugin-snap [linux-any]'
+-else
+- dh_gencontrol -- -Vplugin:Suggests='gnome-software-plugin-snap [linux-any]'
+-endif
++ dh_gencontrol
+
+ override_dh_clean:
+ rm -f debian/gnome-software.gsettings-override
diff --git a/helpers/DATA/gnupg2/001_add-gpgv-udeb-dependencies-hack.patch b/helpers/DATA/gnupg2/001_add-gpgv-udeb-dependencies-hack.patch
new file mode 100644
index 0000000..c78d1d5
--- /dev/null
+++ b/helpers/DATA/gnupg2/001_add-gpgv-udeb-dependencies-hack.patch
@@ -0,0 +1,17 @@
+diff --git a/debian/control b/debian/control
+index c599ba9e..7215fac0 100644
+--- a/debian/control
++++ b/debian/control
+@@ -388,8 +388,10 @@ Build-Profiles:
+ Section: debian-installer
+ Architecture: any
+ Depends:
+- ${misc:Depends},
+- ${shlibs:Depends},
++ libc6-udeb (>= 2.39),
++ libgcrypt20-udeb (>= 1.10.3),
++ libgpg-error0-udeb (>= 1.47),
++ zlib1g-udeb (>= 1:1.2.3.3.dfsg-1)
+ Description: minimal signature verification tool
+ GnuPG is GNU's tool for secure communication and data storage.
+ It can be used to encrypt data and to create digital signatures.
diff --git a/helpers/DATA/grub-installer/custom/01_39c6708ef9c5f191cf9000f7499f0a1fe2dc9422.patch b/helpers/DATA/grub-installer/custom/01_39c6708ef9c5f191cf9000f7499f0a1fe2dc9422.patch
deleted file mode 100644
index 6abeca6..0000000
--- a/helpers/DATA/grub-installer/custom/01_39c6708ef9c5f191cf9000f7499f0a1fe2dc9422.patch
+++ /dev/null
@@ -1,1098 +0,0 @@
-From 7bcf88624342b44066bcb312486e1d7c81ae7e7f Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 07:50:47 +0200
-Subject: [PATCH 01/14] move duplicated functions into functions.sh
-
----
- debian/postinst | 18 +------------
- functions.sh | 41 +++++++++++++++++++++++++++++
- grub-installer | 16 -----------
- rescue.d/80grub-reinstall | 16 -----------
- rescue.d/81grub-efi-force-removable | 29 --------------------
- 5 files changed, 42 insertions(+), 78 deletions(-)
-
-diff --git a/debian/postinst b/debian/postinst
-index 85714195..b7f5ef1f 100755
---- a/debian/postinst
-+++ b/debian/postinst
-@@ -2,23 +2,7 @@
-
- . /usr/share/debconf/confmodule
-
--log () {
-- logger -t grub-installer "$@"
--}
--
--error () {
-- log "error: $@"
--}
--
--die () {
-- local template="$1"
-- shift
--
-- error "$@"
-- db_input critical "$template" || [ $? -eq 30 ]
-- db_go || true
-- exit 1
--}
-+. /usr/share/grub-installer/functions.sh
-
- mountvirtfs () {
- fstype="$1"
-diff --git a/functions.sh b/functions.sh
-index 412e97a7..55789b08 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -37,3 +37,44 @@ update_mtab() {
- is_floppy () {
- echo "$1" | grep -q '(fd' || echo "$1" | grep -q "/dev/fd" || echo "$1" | grep -q floppy
- }
-+
-+log () {
-+ logger -t grub-installer "$@"
-+}
-+
-+error () {
-+ log "error: $@"
-+}
-+
-+info() {
-+ log "info: $@"
-+}
-+
-+debug () {
-+ [ -z "${DEBCONF_DEBUG}" ] || log "debug: $@"
-+}
-+
-+die () {
-+ local template="$1"
-+ shift
-+
-+ error "$@"
-+ db_input critical "$template" || [ $? -eq 30 ]
-+ db_go || true
-+ exit 1
-+}
-+
-+EXTRA_PATHS=""
-+mountvirtfs () {
-+ fstype="$1"
-+ path="$2"
-+ if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
-+ ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
-+ mkdir -p "$path" || \
-+ die grub-installer/mounterr "Error creating $path"
-+ mount -t "$fstype" "$fstype" "$path" || \
-+ die grub-installer/mounterr "Error mounting $path"
-+ EXTRA_PATHS="$EXTRA_PATHS $path"
-+ trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+ fi
-+}
-diff --git a/grub-installer b/grub-installer
-index 2787e7c8..bd2bcf9d 100755
---- a/grub-installer
-+++ b/grub-installer
-@@ -21,22 +21,6 @@ newline="
-
- db_capb backup
-
--log() {
-- logger -t grub-installer "$@"
--}
--
--error() {
-- log "error: $@"
--}
--
--info() {
-- log "info: $@"
--}
--
--debug () {
-- [ -z "${DEBCONF_DEBUG}" ] || log "debug: $@"
--}
--
- ARCH="$(archdetect)"
- info "architecture: $ARCH"
- SUBARCH="${ARCH#*/}"
-diff --git a/rescue.d/80grub-reinstall b/rescue.d/80grub-reinstall
-index cc3fe8a8..c52a0be2 100755
---- a/rescue.d/80grub-reinstall
-+++ b/rescue.d/80grub-reinstall
-@@ -4,22 +4,6 @@
-
- . /usr/share/grub-installer/functions.sh
-
--mountvirtfs () {
-- fstype="$1"
-- path="$2"
-- if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
-- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
-- mkdir -p "$path" || \
-- die grub-installer/mounterr "Error creating $path"
-- mount -t "$fstype" "$fstype" "$path" || \
-- die grub-installer/mounterr "Error mounting $path"
-- EXTRA_PATHS="$EXTRA_PATHS $path"
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-- fi
--}
--
--
--
- db_progress START 0 2 grub-installer/progress/title
- db_progress INFO grub-installer/progress/step_bootdev
-
-diff --git a/rescue.d/81grub-efi-force-removable b/rescue.d/81grub-efi-force-removable
-index cbb1ce74..958f9a48 100755
---- a/rescue.d/81grub-efi-force-removable
-+++ b/rescue.d/81grub-efi-force-removable
-@@ -4,39 +4,10 @@
-
- . /usr/share/grub-installer/functions.sh
-
--EXTRA_PATHS=""
--
- log () {
- logger -t grub-installer "grub-efi-force-removable $@"
- }
-
--error () {
-- log "error: $@"
--}
--
--die () {
-- local template="$1"
-- shift
--
-- error "$@"
-- db_input critical "$template" || [ $? -eq 30 ]
-- db_go || true
-- exit 1
--}
--
--mountvirtfs () {
-- fstype="$1"
-- path="$2"
-- if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
-- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
-- mkdir -p "$path" || \
-- die grub-installer/mounterr "Error creating $path"
-- mount -t "$fstype" "$fstype" "$path" || \
-- die grub-installer/mounterr "Error mounting $path"
-- EXTRA_PATHS="$EXTRA_PATHS $path"
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-- fi
--}
-
- db_progress START 0 3 grub-installer/progress/title
- db_progress INFO grub-installer/progress/step_force_efi_removable
---
-GitLab
-
-
-From 1ec23ed1b62a4fed2b42b0cf555f4d2894c31b7c Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 08:12:10 +0200
-Subject: [PATCH 02/14] log: append the script's name if DEBCONF_DEBUG set
-
-This is a way of making 81grub-efi-force-removable less special, and
-seems like it might be a useful thing to have in our logs anyway.
-
-The fact that 81grub-efi-force-removable adds its own name when logging
-strikes me as left-over scafolding from when it was built, so we could
-just remove this instead.
----
- functions.sh | 8 ++++----
- rescue.d/81grub-efi-force-removable | 14 +++++++-------
- 2 files changed, 11 insertions(+), 11 deletions(-)
-
-diff --git a/functions.sh b/functions.sh
-index 55789b08..9eeb34b0 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -39,19 +39,19 @@ is_floppy () {
- }
-
- log () {
-- logger -t grub-installer "$@"
-+ logger -t grub-installer "$*${DEBCONF_DEBUG:+ [${0##*/}]}"
- }
-
- error () {
-- log "error: $@"
-+ log "error: $*"
- }
-
- info() {
-- log "info: $@"
-+ log "info: $*"
- }
-
- debug () {
-- [ -z "${DEBCONF_DEBUG}" ] || log "debug: $@"
-+ [ -z "${DEBCONF_DEBUG}" ] || log "debug: $*"
- }
-
- die () {
-diff --git a/rescue.d/81grub-efi-force-removable b/rescue.d/81grub-efi-force-removable
-index 958f9a48..f03d88d7 100755
---- a/rescue.d/81grub-efi-force-removable
-+++ b/rescue.d/81grub-efi-force-removable
-@@ -4,17 +4,17 @@
-
- . /usr/share/grub-installer/functions.sh
-
--log () {
-- logger -t grub-installer "grub-efi-force-removable $@"
-+_dbg_log() {
-+ # just having DEBCONF_DEBUG defined is enough to get log() to append the script's name
-+ DEBCONF_DEBUG=${DEBCONF_DEBUG:-0} log "$@"
- }
-
--
- db_progress START 0 3 grub-installer/progress/title
- db_progress INFO grub-installer/progress/step_force_efi_removable
-
- # Should we also install grub-efi to the removable media path?
- # Ask the user
--log "Prompting user about removable media path"
-+_dbg_log "Prompting user about removable media path"
- db_input high grub-installer/force-efi-extra-removable
- if ! db_go; then
- # back up to menu
-@@ -30,7 +30,7 @@ fi
- db_progress STEP 1
- db_progress INFO grub-installer/progress/step_mount_filesystems
-
--log "Mounting filesystems"
-+_dbg_log "Mounting filesystems"
- # If we're installing grub-efi, it wants /sys mounted in the
- # target. Maybe /proc too, and definitely the efivars fs. Should be
- # harmless if we're not using it.
-@@ -45,7 +45,7 @@ trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
- db_progress STEP 1
- db_progress INFO grub-installer/progress/step_install_loader
- # Do the installation now
--log "Running grub-install"
-+_dbg_log "Running grub-install"
- if ! chroot /target grub-install --force-extra-removable; then
- db_input critical grub-installer/grub-install-failed || true
- db_go || true
-@@ -56,7 +56,7 @@ fi
- db_progress STEP 1
- db_progress INFO grub-installer/progress/step_update_debconf_efi_removable
- # And add the debconf flag so the installed system will also do this in future
--log "Running debconf-set-selections in the chroot"
-+_dbg_log "Running debconf-set-selections in the chroot"
- chroot /target 'debconf-set-selections' <
-Date: Wed, 23 Aug 2023 08:13:48 +0200
-Subject: [PATCH 03/14] merge 'efivarsfs' special case into functions.sh
-
----
- debian/postinst | 23 ++++-------------------
- functions.sh | 12 +++++++++---
- 2 files changed, 13 insertions(+), 22 deletions(-)
-
-diff --git a/debian/postinst b/debian/postinst
-index b7f5ef1f..b1954b87 100755
---- a/debian/postinst
-+++ b/debian/postinst
-@@ -4,29 +4,14 @@
-
- . /usr/share/grub-installer/functions.sh
-
--mountvirtfs () {
-- fstype="$1"
-- path="$2"
-- if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
-- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
-- mkdir -p "$path" || \
-- die grub-installer/mounterr "Error creating $path"
--
-- if mount -t "$fstype" "$fstype" "$path"; then
-- log "Success mounting $path"
-- trap "umount $path" HUP INT QUIT KILL PIPE TERM EXIT
-- elif [ "$fstype" = "efivarfs" ]; then
-- error "Error mounting $path (non-fatal)"
-- else
-- die grub-installer/mounterr "Error mounting $path"
-- fi
-- fi
--}
--
- # If we're installing grub-efi, it wants /sys mounted in the
- # target. Maybe /proc too?
- mountvirtfs proc /target/proc
- mountvirtfs sysfs /target/sys
-+# unmounting /target/proc causes an error later on in the install:
-+# umount: can't unmount /target/proc: Invalid argument
-+# (seems like a bug somewhere, but will preserve the old 'overwriting traps' behaviour for now)
-+EXTRA_PATHS=""
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars
-
- grub-installer /target
-diff --git a/functions.sh b/functions.sh
-index 9eeb34b0..c23265ab 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -72,9 +72,15 @@ mountvirtfs () {
- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
- mkdir -p "$path" || \
- die grub-installer/mounterr "Error creating $path"
-- mount -t "$fstype" "$fstype" "$path" || \
-+
-+ if mount -t "$fstype" "$fstype" "$path"; then
-+ log "Success mounting $path"
-+ EXTRA_PATHS="$EXTRA_PATHS $path"
-+ trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+ elif [ "$fstype" = "efivarfs" ]; then
-+ error "Error mounting $path (non-fatal)"
-+ else
- die grub-installer/mounterr "Error mounting $path"
-- EXTRA_PATHS="$EXTRA_PATHS $path"
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+ fi
- fi
- }
---
-GitLab
-
-
-From 676368b5f9b9c7e8b9d7e2fd3e4ce98770659660 Mon Sep 17 00:00:00 2001
-From: Arnaud Rebillout
-Date: Wed, 23 Aug 2023 09:59:22 +0200
-Subject: [PATCH 04/14] Don't fail if we can't mkdir efivars
-
-Closes: #1031183
----
- functions.sh | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/functions.sh b/functions.sh
-index c23265ab..183a6baa 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -70,8 +70,14 @@ mountvirtfs () {
- path="$2"
- if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
-- mkdir -p "$path" || \
-+ if mkdir -p "$path"; then
-+ true
-+ elif [ "$fstype" = "efivarfs" ]; then
-+ error "Error creating $path (non-fatal)"
-+ return
-+ else
- die grub-installer/mounterr "Error creating $path"
-+ fi
-
- if mount -t "$fstype" "$fstype" "$path"; then
- log "Success mounting $path"
---
-GitLab
-
-
-From 5d7b0988cedc35707f17f824aa6ad11a5199f989 Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 10:15:51 +0200
-Subject: [PATCH 05/14] mountvirtfs: separate success vs. fatality logic
-
-Having the efivarfs check in an elif made this code seem tangly to me.
-Hopefully this is now cleaner, with the operation's success or failure
-first being deterimined, then whether any error should be fatal being
-deterimined afterwards.
----
- functions.sh | 25 +++++++++++++------------
- 1 file changed, 13 insertions(+), 12 deletions(-)
-
-diff --git a/functions.sh b/functions.sh
-index 183a6baa..6675efcd 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -71,22 +71,23 @@ mountvirtfs () {
- if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
- if mkdir -p "$path"; then
-- true
-- elif [ "$fstype" = "efivarfs" ]; then
-- error "Error creating $path (non-fatal)"
-- return
-+ if mount -t "$fstype" "$fstype" "$path"; then
-+ log "Success mounting $path"
-+ EXTRA_PATHS="$EXTRA_PATHS $path"
-+ trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+ return
-+ else
-+ failed_action="Mounting"
-+ fi
- else
-- die grub-installer/mounterr "Error creating $path"
-+ failed_action="Creating"
- fi
-
-- if mount -t "$fstype" "$fstype" "$path"; then
-- log "Success mounting $path"
-- EXTRA_PATHS="$EXTRA_PATHS $path"
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-- elif [ "$fstype" = "efivarfs" ]; then
-- error "Error mounting $path (non-fatal)"
-+ # if here, a failure has occured (otherwise would 'return' above)
-+ if [ "$fstype" = "efivarfs" ]; then
-+ error "$failed_action $path failed (non-fatal)"
- else
-- die grub-installer/mounterr "Error mounting $path"
-+ die grub-installer/mounterr "$failed_action '$path' failed"
- fi
- fi
- }
---
-GitLab
-
-
-From bc1945e46f6ae7a3113e6761d9f2a5e21a52adbd Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 10:27:27 +0200
-Subject: [PATCH 06/14] avoid tagging expected(ish) failure as 'error:'
-
-I've left the word 'error' in the message, to make it easy to find
-anyway, but if the behaviour is somewhat expected, then having 'error:'
-starting the line seems likely to be a red-herring when an unrelated bug
-occurs (even with the 'non-fatal').
----
- functions.sh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/functions.sh b/functions.sh
-index 6675efcd..a03e03af 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -85,7 +85,7 @@ mountvirtfs () {
-
- # if here, a failure has occured (otherwise would 'return' above)
- if [ "$fstype" = "efivarfs" ]; then
-- error "$failed_action $path failed (non-fatal)"
-+ info "$failed_action $path failed (non-fatal error)"
- else
- die grub-installer/mounterr "$failed_action '$path' failed"
- fi
---
-GitLab
-
-
-From 2b80ed9f3295f2fde11dfd97dc5e5da3cacc699e Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 10:36:16 +0200
-Subject: [PATCH 07/14] only try to mount /sys.../efi/... on efi systems
-
----
- debian/postinst | 21 ++++++++++++---------
- 1 file changed, 12 insertions(+), 9 deletions(-)
-
-diff --git a/debian/postinst b/debian/postinst
-index b1954b87..86d6428b 100755
---- a/debian/postinst
-+++ b/debian/postinst
-@@ -4,14 +4,17 @@
-
- . /usr/share/grub-installer/functions.sh
-
--# If we're installing grub-efi, it wants /sys mounted in the
--# target. Maybe /proc too?
--mountvirtfs proc /target/proc
--mountvirtfs sysfs /target/sys
--# unmounting /target/proc causes an error later on in the install:
--# umount: can't unmount /target/proc: Invalid argument
--# (seems like a bug somewhere, but will preserve the old 'overwriting traps' behaviour for now)
--EXTRA_PATHS=""
--mountvirtfs efivarfs /target/sys/firmware/efi/efivars
-+ARCH=$(archdetect)
-+if [ "${ARCH#*/}" = "efi" ]; then
-+ # If we're installing grub-efi, it wants /sys mounted in the
-+ # target. Maybe /proc too?
-+ mountvirtfs proc /target/proc
-+ mountvirtfs sysfs /target/sys
-+ # unmounting /target/proc causes an error later on in the install:
-+ # umount: can't unmount /target/proc: Invalid argument
-+ # (seems like a bug somewhere, but will preserve the old 'overwriting traps' behaviour for now)
-+ EXTRA_PATHS=""
-+ mountvirtfs efivarfs /target/sys/firmware/efi/efivars
-+fi
-
- grub-installer /target
---
-GitLab
-
-
-From da766c976ef03b578dab1306ba86581fb474ba61 Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 10:45:07 +0200
-Subject: [PATCH 08/14] mountvirtfs: introduce optional 'fatality' param
-
-This seems clearer than having mountvirtfs treat efivarfs as a special
-case, as one gets to see that there's something different in the call,
-and it also means that if the function manages to fail for some other
-reason than the mkdir failing, we won't mask that with `... || true`
----
- debian/postinst | 2 +-
- functions.sh | 9 ++++++---
- rescue.d/80grub-reinstall | 2 +-
- rescue.d/81grub-efi-force-removable | 2 +-
- 4 files changed, 9 insertions(+), 6 deletions(-)
-
-diff --git a/debian/postinst b/debian/postinst
-index 86d6428b..2523c14f 100755
---- a/debian/postinst
-+++ b/debian/postinst
-@@ -14,7 +14,7 @@ if [ "${ARCH#*/}" = "efi" ]; then
- # umount: can't unmount /target/proc: Invalid argument
- # (seems like a bug somewhere, but will preserve the old 'overwriting traps' behaviour for now)
- EXTRA_PATHS=""
-- mountvirtfs efivarfs /target/sys/firmware/efi/efivars
-+ mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- fi
-
- grub-installer /target
-diff --git a/functions.sh b/functions.sh
-index a03e03af..a40af89d 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -68,6 +68,8 @@ EXTRA_PATHS=""
- mountvirtfs () {
- fstype="$1"
- path="$2"
-+ failure_response="${3:-fatal}"
-+
- if grep -q "[[:space:]]$fstype\$" /proc/filesystems && \
- ! grep -q "^[^ ]\+ \+$path " /proc/mounts; then
- if mkdir -p "$path"; then
-@@ -83,11 +85,12 @@ mountvirtfs () {
- failed_action="Creating"
- fi
-
-+ log_msg="$failed_action '$path' failed ($failure_response error)"
- # if here, a failure has occured (otherwise would 'return' above)
-- if [ "$fstype" = "efivarfs" ]; then
-- info "$failed_action $path failed (non-fatal error)"
-+ if [ "$failure_response" != "fatal" ]; then
-+ info "$log_msg"
- else
-- die grub-installer/mounterr "$failed_action '$path' failed"
-+ die grub-installer/mounterr "$log_msg"
- fi
- fi
- }
-diff --git a/rescue.d/80grub-reinstall b/rescue.d/80grub-reinstall
-index c52a0be2..31b45125 100755
---- a/rescue.d/80grub-reinstall
-+++ b/rescue.d/80grub-reinstall
-@@ -13,7 +13,7 @@ db_progress INFO grub-installer/progress/step_bootdev
- mountvirtfs proc /target/proc
- mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
--mountvirtfs efivarfs /target/sys/firmware/efi/efivars || true
-+mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- if [ -e /target/boot/efi ]; then
- chroot /target mount /boot/efi || true
- EXTRA_PATHS="$EXTRA_PATHS /target/boot/efi"
-diff --git a/rescue.d/81grub-efi-force-removable b/rescue.d/81grub-efi-force-removable
-index f03d88d7..212aeb74 100755
---- a/rescue.d/81grub-efi-force-removable
-+++ b/rescue.d/81grub-efi-force-removable
-@@ -37,7 +37,7 @@ _dbg_log "Mounting filesystems"
- mountvirtfs proc /target/proc
- mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
--mountvirtfs efivarfs /target/sys/firmware/efi/efivars || true
-+mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- chroot /target mount /boot/efi || true
- EXTRA_PATHS="$EXTRA_PATHS /target/boot/efi"
- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
---
-GitLab
-
-
-From a1e2235247fd6c1ead6b15e7122d9e3451878b3b Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 10:52:23 +0200
-Subject: [PATCH 09/14] grub-installer/mounterr: say which path failed
-
----
- debian/grub-installer.templates | 4 ++--
- functions.sh | 10 +++++++---
- 2 files changed, 9 insertions(+), 5 deletions(-)
-
-diff --git a/debian/grub-installer.templates b/debian/grub-installer.templates
-index 83bbb217..7c4272bd 100644
---- a/debian/grub-installer.templates
-+++ b/debian/grub-installer.templates
-@@ -229,8 +229,8 @@ Description: for internal use; can be preseeded
- Template: grub-installer/mounterr
- Type: error
- # :sl4:
--_Description: Failed to mount /target/proc
-- Mounting the proc file system on /target/proc failed.
-+_Description: Failed to mount ${PATH}
-+ Mounting the ${FSTYPE} file system on ${PATH} failed.
- .
- Check /var/log/syslog or see virtual console 4 for the details.
- .
-diff --git a/functions.sh b/functions.sh
-index a40af89d..4e3338c6 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -55,10 +55,14 @@ debug () {
- }
-
- die () {
-- local template="$1"
-- shift
-+ local template="$1" ; shift
-+ local fstype="$1" ; shift
-+ local path="$1" ; shift
-+
-
- error "$@"
-+ db_subst "$template" FSTYPE "$fstype"
-+ db_subst "$template" PATH "$path"
- db_input critical "$template" || [ $? -eq 30 ]
- db_go || true
- exit 1
-@@ -90,7 +94,7 @@ mountvirtfs () {
- if [ "$failure_response" != "fatal" ]; then
- info "$log_msg"
- else
-- die grub-installer/mounterr "$log_msg"
-+ die grub-installer/mounterr "$fstype" "$path" "$log_msg"
- fi
- fi
- }
---
-GitLab
-
-
-From b878d83e2289e3907126d29dc2f687aaba7d4aab Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Wed, 23 Aug 2023 18:30:04 +0200
-Subject: [PATCH 10/14] insert new paths at the start of $EXTRA_PATHS
-
-This ensures that umount is called with the most recently mounted thing
-first, which is required when mountpoints are nested.
----
- functions.sh | 2 +-
- rescue.d/80grub-reinstall | 2 +-
- rescue.d/81grub-efi-force-removable | 2 +-
- 3 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/functions.sh b/functions.sh
-index 4e3338c6..186ad7b1 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -79,7 +79,7 @@ mountvirtfs () {
- if mkdir -p "$path"; then
- if mount -t "$fstype" "$fstype" "$path"; then
- log "Success mounting $path"
-- EXTRA_PATHS="$EXTRA_PATHS $path"
-+ EXTRA_PATHS="$path $EXTRA_PATHS"
- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
- return
- else
-diff --git a/rescue.d/80grub-reinstall b/rescue.d/80grub-reinstall
-index 31b45125..d9441a49 100755
---- a/rescue.d/80grub-reinstall
-+++ b/rescue.d/80grub-reinstall
-@@ -16,7 +16,7 @@ modprobe efivarfs >/dev/null 2>&1 || true
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- if [ -e /target/boot/efi ]; then
- chroot /target mount /boot/efi || true
-- EXTRA_PATHS="$EXTRA_PATHS /target/boot/efi"
-+ EXTRA_PATHS="/target/boot/efi $EXTRA_PATHS"
- fi
- if [ -n "$EXTRA_PATHS" ]; then
- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-diff --git a/rescue.d/81grub-efi-force-removable b/rescue.d/81grub-efi-force-removable
-index 212aeb74..ede1ed33 100755
---- a/rescue.d/81grub-efi-force-removable
-+++ b/rescue.d/81grub-efi-force-removable
-@@ -39,7 +39,7 @@ mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- chroot /target mount /boot/efi || true
--EXTRA_PATHS="$EXTRA_PATHS /target/boot/efi"
-+EXTRA_PATHS="/target/boot/efi $EXTRA_PATHS"
- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-
- db_progress STEP 1
---
-GitLab
-
-
-From 01126606e5055c1448b439666557fa1e94588ff0 Mon Sep 17 00:00:00 2001
-From: Pascal Hambourg
-Date: Sun, 27 Aug 2023 15:17:42 +0200
-Subject: [PATCH 11/14] Move unmount-on-exit logic into its own function
-
-So that it can be used with other mounts than mountvirtfs (/run, /boot/efi).
-
-Use unmount_on_exit with /proc and /run, so that unmounts match mounts
-even on error exit. Unconditional unmount on normal exit only was
-flawed.
----
- functions.sh | 8 ++++++--
- grub-installer | 14 +++++---------
- rescue.d/80grub-reinstall | 6 +-----
- rescue.d/81grub-efi-force-removable | 4 +---
- 4 files changed, 13 insertions(+), 19 deletions(-)
-
-diff --git a/functions.sh b/functions.sh
-index 186ad7b1..76df5ae0 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -69,6 +69,11 @@ die () {
- }
-
- EXTRA_PATHS=""
-+unmount_on_exit () {
-+ EXTRA_PATHS="$1 $EXTRA_PATHS"
-+ trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+}
-+
- mountvirtfs () {
- fstype="$1"
- path="$2"
-@@ -79,8 +84,7 @@ mountvirtfs () {
- if mkdir -p "$path"; then
- if mount -t "$fstype" "$fstype" "$path"; then
- log "Success mounting $path"
-- EXTRA_PATHS="$path $EXTRA_PATHS"
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+ unmount_on_exit "$path"
- return
- else
- failed_action="Mounting"
-diff --git a/grub-installer b/grub-installer
-index bd2bcf9d..efdc5fa7 100755
---- a/grub-installer
-+++ b/grub-installer
-@@ -35,17 +35,21 @@ if [ -z "$initial_proc_contents" ]; then
- info "Mounting /proc into $ROOT"
- if [ "$(udpkg --print-os)" = "kfreebsd" ]; then
- mount -t linprocfs proc $ROOT/proc
-+ unmount_on_exit $ROOT/proc
- elif [ "$(udpkg --print-os)" = "hurd" ]; then
- mount -t proc none $ROOT/proc
-+ unmount_on_exit $ROOT/proc
- else
-- mount -t proc proc $ROOT/proc
-+ mountvirtfs proc $ROOT/proc
- fi
- fi
-
- # On Linux, we need /run in the chroot to work around
- # https://bugs.debian.org/918590.
- if [ "$(udpkg --print-os)" = "linux" ] && [ ! -d "$ROOT/run/udev" ]; then
-+ info "Bind mounting /run into $ROOT"
- mount --bind /run $ROOT/run
-+ unmount_on_exit $ROOT/run
- fi
-
- get_serial_console() {
-@@ -1483,11 +1487,3 @@ fi
-
- db_progress STEP 1
- db_progress STOP
--
--if [ "$(udpkg --print-os)" = "linux" ] && ! umount $ROOT/run; then
-- info "Failed to unmount /run in $ROOT"
--fi
--
--if ! umount $ROOT/proc; then
-- info "Failed to unmount /proc in $ROOT"
--fi
-diff --git a/rescue.d/80grub-reinstall b/rescue.d/80grub-reinstall
-index d9441a49..754338ba 100755
---- a/rescue.d/80grub-reinstall
-+++ b/rescue.d/80grub-reinstall
-@@ -15,11 +15,7 @@ mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- if [ -e /target/boot/efi ]; then
-- chroot /target mount /boot/efi || true
-- EXTRA_PATHS="/target/boot/efi $EXTRA_PATHS"
--fi
--if [ -n "$EXTRA_PATHS" ]; then
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+ chroot /target mount /boot/efi && unmount_on_exit /target/boot/efi || true
- fi
-
- db_input critical grub-installer/bootdev
-diff --git a/rescue.d/81grub-efi-force-removable b/rescue.d/81grub-efi-force-removable
-index ede1ed33..9275185d 100755
---- a/rescue.d/81grub-efi-force-removable
-+++ b/rescue.d/81grub-efi-force-removable
-@@ -38,9 +38,7 @@ mountvirtfs proc /target/proc
- mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
--chroot /target mount /boot/efi || true
--EXTRA_PATHS="/target/boot/efi $EXTRA_PATHS"
--trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+chroot /target mount /boot/efi && unmount_on_exit /target/boot/efi || true
-
- db_progress STEP 1
- db_progress INFO grub-installer/progress/step_install_loader
---
-GitLab
-
-
-From 4ce7d6c337c36cee7db499482ab9507c7d018c5f Mon Sep 17 00:00:00 2001
-From: Pascal Hambourg
-Date: Sun, 27 Aug 2023 18:02:38 +0200
-Subject: [PATCH 12/14] Move /sys and efivarfs mounts from postinst to
- grub-installer
-
-And mount them only if we're installing grub-efi* to avoid adding a
-bogus 'uefi-firmware' menu entry when ignore_uefi is set.
-Also, remove /proc mount from postinst since grub-installer does it too.
----
- debian/postinst | 17 -----------------
- grub-installer | 7 +++++++
- 2 files changed, 7 insertions(+), 17 deletions(-)
-
-diff --git a/debian/postinst b/debian/postinst
-index 2523c14f..f63eea3d 100755
---- a/debian/postinst
-+++ b/debian/postinst
-@@ -1,20 +1,3 @@
- #! /bin/sh -e
-
--. /usr/share/debconf/confmodule
--
--. /usr/share/grub-installer/functions.sh
--
--ARCH=$(archdetect)
--if [ "${ARCH#*/}" = "efi" ]; then
-- # If we're installing grub-efi, it wants /sys mounted in the
-- # target. Maybe /proc too?
-- mountvirtfs proc /target/proc
-- mountvirtfs sysfs /target/sys
-- # unmounting /target/proc causes an error later on in the install:
-- # umount: can't unmount /target/proc: Invalid argument
-- # (seems like a bug somewhere, but will preserve the old 'overwriting traps' behaviour for now)
-- EXTRA_PATHS=""
-- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
--fi
--
- grub-installer /target
-diff --git a/grub-installer b/grub-installer
-index efdc5fa7..50defde0 100755
---- a/grub-installer
-+++ b/grub-installer
-@@ -461,6 +461,13 @@ fi
-
- case $grub_package in
- grub-efi*)
-+ # If we're installing grub-efi, it wants /sys and efivarfs
-+ # mounted in the target. Conversely, if we're installing grub-pc,
-+ # efivarfs must not be mounted in the target to prevent update-grub
-+ # from adding a bogus menu entry for UEFI firmware settings.
-+ mountvirtfs sysfs $ROOT/sys
-+ mountvirtfs efivarfs $ROOT/sys/firmware/efi/efivars non-fatal
-+
- # debconf priority for the EFI removable question. The happy path here
- # is that efi boot variables are available. If they are not, then the
- # user most likely has to force grub to the removable media path in
---
-GitLab
-
-
-From 74edbf3a4ce9882569f8238cecd7651b6295087c Mon Sep 17 00:00:00 2001
-From: Philip Hands
-Date: Mon, 28 Aug 2023 14:31:24 +0200
-Subject: [PATCH 13/14] Use a combined stack for on_exit() cleanup tasks
-
-Add support for not only umount but any cleanup commands (rmdir, rm...)
-to prepare partman's ignore_uefi flag propagation to the target system.
-
-This requires to undo the operations in the reverse order to which they
-were done in order to accomodate nested operations. So push all the
-commands onto a single LIFO stack.
----
- functions.sh | 25 ++++++++++++++++++++-----
- grub-installer | 6 +++---
- rescue.d/80grub-reinstall | 2 +-
- rescue.d/81grub-efi-force-removable | 2 +-
- 4 files changed, 25 insertions(+), 10 deletions(-)
-
-diff --git a/functions.sh b/functions.sh
-index 76df5ae0..c48bf675 100644
---- a/functions.sh
-+++ b/functions.sh
-@@ -68,11 +68,26 @@ die () {
- exit 1
- }
-
--EXTRA_PATHS=""
--unmount_on_exit () {
-- EXTRA_PATHS="$1 $EXTRA_PATHS"
-- trap "umount $EXTRA_PATHS" HUP INT QUIT KILL PIPE TERM EXIT
-+# on_exit() takes a command, and pushes it onto a stack of commands, which
-+# are later executed by perform_exit_stack() (via trap) in LIFO order.
-+EXIT_STACK=""
-+on_exit() {
-+ if [ 1 != $# ]; then
-+ error "$0: on_exit() expects exactly 1 argument, but was given $# ${*:+(args:$(printf " [%s]" "$@"))}"
-+ exit 1
-+ fi
-+ EXIT_STACK=$(printf '%s\n%s' "$1" "$EXIT_STACK")
-+}
-+
-+perform_exit_stack () {
-+ printf '%s\n' "$EXIT_STACK" | \
-+ while read -r cmd; do
-+ debug "perform_exit_stack(): Running \"$cmd\""
-+ eval "$cmd" || info "attempt to run \"$cmd\" failed [$?] when exiting \"$0\" (non-fatal)"
-+ done
-+ debug "perform_exit_stack(): exiting \"$0\""
- }
-+trap perform_exit_stack HUP INT QUIT KILL PIPE TERM EXIT
-
- mountvirtfs () {
- fstype="$1"
-@@ -84,7 +99,7 @@ mountvirtfs () {
- if mkdir -p "$path"; then
- if mount -t "$fstype" "$fstype" "$path"; then
- log "Success mounting $path"
-- unmount_on_exit "$path"
-+ on_exit "umount '$path'"
- return
- else
- failed_action="Mounting"
-diff --git a/grub-installer b/grub-installer
-index 50defde0..5b9dc6a1 100755
---- a/grub-installer
-+++ b/grub-installer
-@@ -35,10 +35,10 @@ if [ -z "$initial_proc_contents" ]; then
- info "Mounting /proc into $ROOT"
- if [ "$(udpkg --print-os)" = "kfreebsd" ]; then
- mount -t linprocfs proc $ROOT/proc
-- unmount_on_exit $ROOT/proc
-+ on_exit "umount '$ROOT/proc'"
- elif [ "$(udpkg --print-os)" = "hurd" ]; then
- mount -t proc none $ROOT/proc
-- unmount_on_exit $ROOT/proc
-+ on_exit "umount '$ROOT/proc'"
- else
- mountvirtfs proc $ROOT/proc
- fi
-@@ -49,7 +49,7 @@ fi
- if [ "$(udpkg --print-os)" = "linux" ] && [ ! -d "$ROOT/run/udev" ]; then
- info "Bind mounting /run into $ROOT"
- mount --bind /run $ROOT/run
-- unmount_on_exit $ROOT/run
-+ on_exit "umount '$ROOT/run'"
- fi
-
- get_serial_console() {
-diff --git a/rescue.d/80grub-reinstall b/rescue.d/80grub-reinstall
-index 754338ba..cd05f3d6 100755
---- a/rescue.d/80grub-reinstall
-+++ b/rescue.d/80grub-reinstall
-@@ -15,7 +15,7 @@ mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
- if [ -e /target/boot/efi ]; then
-- chroot /target mount /boot/efi && unmount_on_exit /target/boot/efi || true
-+ chroot /target mount /boot/efi && on_exit "umount /target/boot/efi" || true
- fi
-
- db_input critical grub-installer/bootdev
-diff --git a/rescue.d/81grub-efi-force-removable b/rescue.d/81grub-efi-force-removable
-index 9275185d..82e17a3b 100755
---- a/rescue.d/81grub-efi-force-removable
-+++ b/rescue.d/81grub-efi-force-removable
-@@ -38,7 +38,7 @@ mountvirtfs proc /target/proc
- mountvirtfs sysfs /target/sys
- modprobe efivarfs >/dev/null 2>&1 || true
- mountvirtfs efivarfs /target/sys/firmware/efi/efivars non-fatal
--chroot /target mount /boot/efi && unmount_on_exit /target/boot/efi || true
-+chroot /target mount /boot/efi && on_exit "umount /target/boot/efi" || true
-
- db_progress STEP 1
- db_progress INFO grub-installer/progress/step_install_loader
---
-GitLab
-
-
-From 44cf4f9ea70d42371a37f159a9610a92b506f4a1 Mon Sep 17 00:00:00 2001
-From: Pascal Hambourg
-Date: Sun, 27 Aug 2023 19:28:45 +0200
-Subject: [PATCH 14/14] grub-installer: propagate ignore_uefi flag to target
- system for os-prober
-
-If partman-efi set /var/lib/partman/ignore_uefi flag, os-prober
-should perform legacy BIOS probes and skip EFI probes in target chroot,
-so temporarily set ignore_uefi in the target system too.
----
- grub-installer | 30 ++++++++++++++++++++++++++++++
- 1 file changed, 30 insertions(+)
-
-diff --git a/grub-installer b/grub-installer
-index 5b9dc6a1..09dfe212 100755
---- a/grub-installer
-+++ b/grub-installer
-@@ -323,6 +323,8 @@ case $ARCH in
- ;;
- i386/efi|amd64/efi)
- if [ -f /var/lib/partman/ignore_uefi ]; then
-+ # $SUBARCH != "efi" if partman ignore_uefi flag is set
-+ # so this branch should not be reached
- grub_package="grub-pc"
- else
- grub_package="grub-efi"
-@@ -368,6 +370,34 @@ case $ARCH in
- grub_package="grub-pc"
- esac
-
-+if [ -f /var/lib/partman/ignore_uefi ]; then
-+ # propagate partman ignore_uefi flag to the target system so that
-+ # os-prober performs legacy BIOS probes instead of EFI probes
-+ # when running update-grub in target chroot
-+ if [ ! -e $ROOT/var/lib/partman ]; then
-+ if mkdir -p $ROOT/var/lib/partman; then
-+ on_exit "rmdir '$ROOT/var/lib/partman'"
-+ else
-+ error "Failed to create directory $ROOT/var/lib/partman"
-+ exit 1
-+ fi
-+ elif [ ! -d $ROOT/var/lib/partman ]; then
-+ error "$ROOT/var/lib/partman exists but is not a directory"
-+ exit 1
-+ fi
-+ if [ ! -e $ROOT/var/lib/partman/ignore_uefi ]; then
-+ if touch $ROOT/var/lib/partman/ignore_uefi; then
-+ on_exit "rm '$ROOT/var/lib/partman/ignore_uefi'"
-+ else
-+ error "Failed to create file $ROOT/var/lib/partman/ignore_uefi"
-+ exit 1
-+ fi
-+ elif [ ! -f $ROOT/var/lib/partman/ignore_uefi ]; then
-+ error "$ROOT/var/lib/partman/ignore_uefi exists but is not a regular file"
-+ exit 1
-+ fi
-+fi
-+
- case "$frtype:$bootfstype:$bootfslabel:$grub_package" in
- multipath:*:*:*)
- # Multipath requires GRUB Legacy for now
---
-GitLab
-
diff --git a/helpers/DATA/grub-installer/custom/02_a50782a34b4e792d62b77a5b56c9ca7fe14ece9c.patch b/helpers/DATA/grub-installer/custom/02_a50782a34b4e792d62b77a5b56c9ca7fe14ece9c.patch
deleted file mode 100644
index 6097ef4..0000000
--- a/helpers/DATA/grub-installer/custom/02_a50782a34b4e792d62b77a5b56c9ca7fe14ece9c.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From a50782a34b4e792d62b77a5b56c9ca7fe14ece9c Mon Sep 17 00:00:00 2001
-From: D-I role
-Date: Thu, 14 Sep 2023 20:02:51 +0000
-Subject: [PATCH] [l10n] Update templates.pot (from l10n-sync run at dillon)
-
----
- debian/po/templates.pot | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/debian/po/templates.pot b/debian/po/templates.pot
-index 30e63b4e..c46bf4bd 100644
---- a/debian/po/templates.pot
-+++ b/debian/po/templates.pot
-@@ -8,7 +8,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: grub-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME \n"
- "Language-Team: LANGUAGE \n"
-@@ -394,14 +394,14 @@ msgstr ""
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
-+msgid "Failed to mount ${PATH}"
- msgstr ""
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr ""
-
- #. Type: error
---
-GitLab
-
diff --git a/helpers/DATA/grub-installer/custom/03_1e1b1e7cd8e9284dd4067705f55c3a207e008d60.patch b/helpers/DATA/grub-installer/custom/03_1e1b1e7cd8e9284dd4067705f55c3a207e008d60.patch
deleted file mode 100644
index 5a7b49b..0000000
--- a/helpers/DATA/grub-installer/custom/03_1e1b1e7cd8e9284dd4067705f55c3a207e008d60.patch
+++ /dev/null
@@ -1,2659 +0,0 @@
-From 1e1b1e7cd8e9284dd4067705f55c3a207e008d60 Mon Sep 17 00:00:00 2001
-From: D-I role
-Date: Thu, 14 Sep 2023 20:23:31 +0000
-Subject: [PATCH] [l10n] Commit changed/added po files (from l10n-sync run at
- dillon)
-
----
- debian/po/am.po | 10 ++++++----
- debian/po/ar.po | 14 ++++++++------
- debian/po/ast.po | 10 ++++++----
- debian/po/be.po | 14 ++++++++------
- debian/po/bg.po | 12 +++++++-----
- debian/po/bn.po | 10 ++++++----
- debian/po/bo.po | 11 +++++------
- debian/po/bs.po | 10 ++++++----
- debian/po/ca.po | 12 +++++++-----
- debian/po/cs.po | 12 +++++++-----
- debian/po/cy.po | 10 ++++++----
- debian/po/da.po | 10 ++++++----
- debian/po/de.po | 12 +++++++-----
- debian/po/dz.po | 10 ++++++----
- debian/po/el.po | 10 ++++++----
- debian/po/eo.po | 10 ++++++----
- debian/po/es.po | 12 +++++++-----
- debian/po/et.po | 10 ++++++----
- debian/po/eu.po | 10 ++++++----
- debian/po/fa.po | 10 ++++++----
- debian/po/fi.po | 14 ++++++++------
- debian/po/fr.po | 10 ++++++----
- debian/po/ga.po | 10 ++++++----
- debian/po/gl.po | 10 ++++++----
- debian/po/gu.po | 10 ++++++----
- debian/po/he.po | 12 +++++++-----
- debian/po/hi.po | 14 ++++++++------
- debian/po/hr.po | 14 ++++++++------
- debian/po/hu.po | 10 ++++++----
- debian/po/id.po | 14 ++++++++------
- debian/po/is.po | 12 +++++++-----
- debian/po/it.po | 10 ++++++----
- debian/po/ja.po | 10 ++++++----
- debian/po/ka.po | 12 +++++++-----
- debian/po/kab.po | 10 ++++++----
- debian/po/kk.po | 10 ++++++----
- debian/po/km.po | 10 ++++++----
- debian/po/kn.po | 10 ++++++----
- debian/po/ko.po | 12 +++++++-----
- debian/po/ku.po | 10 ++++++----
- debian/po/lo.po | 10 ++++++----
- debian/po/lt.po | 12 +++++++-----
- debian/po/lv.po | 10 ++++++----
- debian/po/mk.po | 10 ++++++----
- debian/po/ml.po | 10 ++++++----
- debian/po/mr.po | 10 ++++++----
- debian/po/nb.po | 14 ++++++++------
- debian/po/ne.po | 10 ++++++----
- debian/po/nl.po | 12 +++++++-----
- debian/po/nn.po | 10 ++++++----
- debian/po/oc.po | 10 ++++++----
- debian/po/pa.po | 10 ++++++----
- debian/po/pl.po | 12 +++++++-----
- debian/po/pt.po | 12 +++++++-----
- debian/po/pt_BR.po | 12 +++++++-----
- debian/po/ro.po | 12 +++++++-----
- debian/po/ru.po | 10 ++++++----
- debian/po/se.po | 11 +++++++----
- debian/po/si.po | 10 ++++++----
- debian/po/sk.po | 10 ++++++----
- debian/po/sl.po | 10 ++++++----
- debian/po/sq.po | 10 ++++++----
- debian/po/sr.po | 12 +++++++-----
- debian/po/sv.po | 14 ++++++++------
- debian/po/ta.po | 10 ++++++----
- debian/po/te.po | 10 ++++++----
- debian/po/tg.po | 10 ++++++----
- debian/po/th.po | 10 ++++++----
- debian/po/tl.po | 10 ++++++----
- debian/po/tr.po | 14 ++++++++------
- debian/po/ug.po | 10 ++++++----
- debian/po/uk.po | 14 ++++++++------
- debian/po/vi.po | 10 ++++++----
- debian/po/zh_CN.po | 14 ++++++++------
- debian/po/zh_TW.po | 14 ++++++++------
- 75 files changed, 490 insertions(+), 342 deletions(-)
-
-diff --git a/debian/po/am.po b/debian/po/am.po
-index ee843616..1b753cf7 100644
---- a/debian/po/am.po
-+++ b/debian/po/am.po
-@@ -17,7 +17,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2022-12-11 11:40+0000\n"
- "Last-Translator: Danial Behzadi \n"
- "Language-Team: Amharic \n"
-@@ -428,14 +428,16 @@ msgstr "ግሩብ የገዢ ስልት ማስነሻ እንደገና ይተከል"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "/target/proc ን መጫን አልተሳካም"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "ሲዲውን መጫን አልተሳካም"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "የproc ፋይል ስርዓትን በ /target/proc መጫን አልተሳካም።"
-
- #. Type: error
-diff --git a/debian/po/ar.po b/debian/po/ar.po
-index 300d86ee..fa7fca2c 100644
---- a/debian/po/ar.po
-+++ b/debian/po/ar.po
-@@ -30,9 +30,9 @@ msgid ""
- msgstr ""
- "Project-Id-Version: ar\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2022-01-05 22:55+0000\n"
--"Last-Translator: Bashir Hassan \n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-02-10 08:40+0000\n"
-+"Last-Translator: Khaled Mahmoud \n"
- "Language-Team: \n"
- "Language: ar\n"
- "MIME-Version: 1.0\n"
-@@ -453,14 +453,16 @@ msgstr "تثبيت محمّل الإقلاع GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "فشل تركيب /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "فشل تركيب القرص المدمج"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "فشل تركيب نظام ملفّات proc عند /target/proc."
-
- #. Type: error
-diff --git a/debian/po/ast.po b/debian/po/ast.po
-index 9dca7d44..04971f2a 100644
---- a/debian/po/ast.po
-+++ b/debian/po/ast.po
-@@ -19,7 +19,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2022-12-11 11:40+0000\n"
- "Last-Translator: Danial Behzadi \n"
- "Language-Team: Softastur\n"
-@@ -460,14 +460,16 @@ msgstr "Reinstalar el cargador d'arranque GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Falló montar /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Falló montar CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Falló montar el sistema de ficheros proc en /target/proc"
-
- #. Type: error
-diff --git a/debian/po/be.po b/debian/po/be.po
-index a3ba5ad3..3b137f1a 100644
---- a/debian/po/be.po
-+++ b/debian/po/be.po
-@@ -22,9 +22,9 @@ msgid ""
- msgstr ""
- "Project-Id-Version: be\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2023-04-27 15:36+0300\n"
--"Last-Translator: Viktar Siarheichyk \n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-08-01 07:07+0000\n"
-+"Last-Translator: Viktar Siarhejčyk \n"
- "Language-Team: Belarusian \n"
- "Language: be\n"
- "MIME-Version: 1.0\n"
-@@ -451,14 +451,16 @@ msgstr "Пераўсталяваць загрузчык GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Не атрымалася прымацаваць /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Не атрымалася прымацаваць CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr ""
- "Не атрымалася прымацаваць файлавую сістэму proc да пункта /target/proc."
-
-diff --git a/debian/po/bg.po b/debian/po/bg.po
-index dc0e9821..ab00af87 100644
---- a/debian/po/bg.po
-+++ b/debian/po/bg.po
-@@ -35,8 +35,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: bg\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2022-12-10 18:02+0200\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-04-06 18:54+0300\n"
- "Last-Translator: Damyan Ivanov \n"
- "Language-Team: Bulgarian \n"
- "Language: bg\n"
-@@ -474,14 +474,16 @@ msgstr "Повторно инсталиране на програмата за
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Грешка при монтирането на /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Грешка при монтиране на компактдиска"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr ""
- "Монтирането на файловата система proc в /target/proc завърши неуспешно."
-
-diff --git a/debian/po/bn.po b/debian/po/bn.po
-index f5bd85ec..df9424bd 100644
---- a/debian/po/bn.po
-+++ b/debian/po/bn.po
-@@ -32,7 +32,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: bn\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-05-14 17:53+0000\n"
- "Last-Translator: Indrani Roy \n"
- "Language-Team: Bengali\n"
-@@ -464,14 +464,16 @@ msgstr "পুনরায় GRUB বুট লোডার ইনস্টলক
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "/target/proc মাউন্ট করার যায় নি"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "CD-ROM মাউন্ট করতে ব্যর্থ"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "proc ফাইল সিস্টেমকে /target/proc-এ মাউন্ট করা যায় নি।"
-
- #. Type: error
-diff --git a/debian/po/bo.po b/debian/po/bo.po
-index 7a0972a8..64557a7f 100644
---- a/debian/po/bo.po
-+++ b/debian/po/bo.po
-@@ -8,7 +8,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2019-08-28 18:09+0000\n"
- "Last-Translator: leela <53352@protonmail.com>\n"
- "Language-Team: bo \n"
-@@ -435,17 +435,16 @@ msgstr "GRUB འགོ་འཛུགས་ཆས་བསྐྱར་དུ་
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--#, fuzzy
--msgid "Failed to mount /target/proc"
--msgstr "/target ཐོག་ཏུ་བཀར་ཡོད་པའི་ཡིག་ཆ་མ་ལག་མེད་པ"
-+msgid "Failed to mount ${PATH}"
-+msgstr ""
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
- #, fuzzy
--msgid "Mounting the proc file system on /target/proc failed."
--msgstr "/target/ ཐོག་ཏུ་རྨང་གཞིའི་སྒྲིག་འཇུག་བྱེད་མ་ཐུབ"
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
-+msgstr "${DEVICE} ཐོག་གི་ཁག་${PARTITION} གི་ཡིག་ཆའི་མ་ལག་${TYPE} འཚོལ་བཤེར་བཞིན་པ་་་"
-
- #. Type: error
- #. Description
-diff --git a/debian/po/bs.po b/debian/po/bs.po
-index f6e8262e..6e1c8f8a 100644
---- a/debian/po/bs.po
-+++ b/debian/po/bs.po
-@@ -26,7 +26,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer_packages_po_sublevel1_bs\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2022-04-28 20:08+0000\n"
- "Last-Translator: Amar Tufo \n"
- "Language-Team: Bosnian \n"
-@@ -464,14 +464,16 @@ msgstr "Reinstaliraj GRUB boot loader"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Nemogu montirati /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Nemogu montirati CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Montiranje proc datotečnog sistema na /target/proc nije uspjelo."
-
- #. Type: error
-diff --git a/debian/po/ca.po b/debian/po/ca.po
-index 980286e3..d002101f 100644
---- a/debian/po/ca.po
-+++ b/debian/po/ca.po
-@@ -23,8 +23,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2023-04-23 19:09+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-08-21 06:34+0000\n"
- "Last-Translator: d \n"
- "Language-Team: Catalan \n"
- "Language: ca\n"
-@@ -465,14 +465,16 @@ msgstr "Reinstal·la el carregador GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "No s'ha pogut muntar /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "No s'ha pogut muntar el CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Ha fallat el muntatge del sistema de fitxers proc a /target/proc."
-
- #. Type: error
-diff --git a/debian/po/cs.po b/debian/po/cs.po
-index ff27c66d..3a901e62 100644
---- a/debian/po/cs.po
-+++ b/debian/po/cs.po
-@@ -18,8 +18,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2023-05-15 14:16+0200\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-06-27 21:49+0200\n"
- "Last-Translator: Miroslav Kure \n"
- "Language-Team: Czech \n"
- "Language: cs\n"
-@@ -446,14 +446,16 @@ msgstr "Reinstalovat zavaděč GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Připojení /target/proc selhalo"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Selhalo připojení CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Připojení souborového systému proc pod /target/proc selhalo."
-
- #. Type: error
-diff --git a/debian/po/cy.po b/debian/po/cy.po
-index d262bc6e..0e55e884 100644
---- a/debian/po/cy.po
-+++ b/debian/po/cy.po
-@@ -20,7 +20,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: \n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2022-03-06 22:56+0000\n"
- "Last-Translator: Ceiri Wyn Tudur \n"
- "Language-Team: Welsh <>\n"
-@@ -462,14 +462,16 @@ msgstr "Ailsefydlu'r llwythwr ymgychwyn GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Methwyd clymu /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Methwyd clymu CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Methwyd clymu'r system ffeiliau proc ar /target/proc."
-
- #. Type: error
-diff --git a/debian/po/da.po b/debian/po/da.po
-index f2b6dfa5..e555ff97 100644
---- a/debian/po/da.po
-+++ b/debian/po/da.po
-@@ -39,7 +39,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer_packages_po_sublevel1_da\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-05-10 00:53+0000\n"
- "Last-Translator: Tino Didriksen \n"
- "Language-Team: \n"
-@@ -470,14 +470,16 @@ msgstr "Geninstaller GRUB-opstartsindlæseren"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Kunne ikke montere /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Kunne ikke montere disketten"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Montering af proc-filsystemet på /target/proc mislykkedes."
-
- #. Type: error
-diff --git a/debian/po/de.po b/debian/po/de.po
-index dd82683b..47340661 100644
---- a/debian/po/de.po
-+++ b/debian/po/de.po
-@@ -41,8 +41,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2023-04-22 23:52+0200\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-08-30 22:32+0200\n"
- "Last-Translator: Holger Wansing \n"
- "Language-Team: German \n"
- "Language: de\n"
-@@ -487,14 +487,16 @@ msgstr "Den GRUB-Bootloader neu installieren"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Einbinden von /target/proc fehlgeschlagen"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Einbinden der CD-ROM fehlgeschlagen"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Das proc-Dateisystem konnte nicht als /target/proc eingebunden werden."
-
- #. Type: error
-diff --git a/debian/po/dz.po b/debian/po/dz.po
-index 3d4438cb..c58b12c3 100644
---- a/debian/po/dz.po
-+++ b/debian/po/dz.po
-@@ -18,7 +18,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: dDz.po\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2021-05-21 05:32+0000\n"
- "Last-Translator: Jacque Fresco \n"
- "Language-Team: Dzongkha \n"
-@@ -454,14 +454,16 @@ msgstr "GRUB བུཊི་མངོན་གསལ་པ་ལོག་གཞ
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr " /target/proc སྦྱར་བརྩེགས་འབད་ནི་ལུ་འཐུས་ཤོར་བྱུང་ཡོད།"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "སི་ཌི་-རོམ་སྦྱར་བཙེགས་འབད་ནི་ལུ་འཐུས་ཤོར་བྱུང་ཡོད།"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr " /target/proc ལུ་ proc ཡིག་སྣོད་རིམ་ལུགས་སྦྱར་བརྩེགས་འབད་ནི་ལུ་འཐུས་ཤོར་བྱུང་ཡོ"
-
- #. Type: error
-diff --git a/debian/po/el.po b/debian/po/el.po
-index 2a1f8a5e..5ca0e845 100644
---- a/debian/po/el.po
-+++ b/debian/po/el.po
-@@ -35,7 +35,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: el\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-05-13 02:46+0300\n"
- "Last-Translator: galaxico \n"
- "Language-Team: Greek \n"
-@@ -477,14 +477,16 @@ msgstr "Επανεγκατάσταση του φορτωτή εκκίνησης
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Σφάλμα κατά τη προσάρτηση του /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Σφάλμα κατά την προσάρτηση (mount) του CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr ""
- "Η προσάρτηση του εικονικού συστήματος αρχείων procfs στο /target/proc "
- "απέτυχε."
-diff --git a/debian/po/eo.po b/debian/po/eo.po
-index 3ae61c11..3bc6e47d 100644
---- a/debian/po/eo.po
-+++ b/debian/po/eo.po
-#@@ -22,7 +22,7 @@ msgid ""
-# msgstr ""
-# "Project-Id-Version: debian-installer\n"
-# "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
-#-"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-#+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-# "PO-Revision-Date: 2023-07-21 00:03+0000\n"
-# "Last-Translator: Felipe Castro \n"
-# "Language-Team: Esperanto \n"
-@@ -453,14 +453,16 @@ msgstr "Reinstali la ekŝargilon 'GRUB'"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Malsukcesis munti /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Munto de lumdisko malsukcesis"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Muntado de dosiersistemo proc sur /target/proc malsukcesis."
-
- #. Type: error
-diff --git a/debian/po/es.po b/debian/po/es.po
-index 4f716c37..72bedde0 100644
---- a/debian/po/es.po
-+++ b/debian/po/es.po
-@@ -60,8 +60,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2023-04-23 19:09+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-08-18 17:56+0000\n"
- "Last-Translator: gallegonovato \n"
- "Language-Team: Debian Spanish \n"
- "Language: es\n"
-@@ -503,14 +503,16 @@ msgstr "Reinstalar el cargador de arranque GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Fallo al montar «/target/proc»"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Se produjo un fallo al montar el CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Falló el montaje el sistema de ficheros proc en «/target/proc»."
-
- #. Type: error
-diff --git a/debian/po/et.po b/debian/po/et.po
-index a638f434..26f09abe 100644
---- a/debian/po/et.po
-+++ b/debian/po/et.po
-@@ -31,7 +31,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: \n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-04-25 19:42+0000\n"
- "Last-Translator: Kristjan Räts \n"
- "Language-Team: Estonian <>\n"
-@@ -460,14 +460,16 @@ msgstr "GRUB alglaaduri uuesti seadistamine"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "/target/proc haakimine nurjus"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Laserketast ei õnnestunud haakida"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Failisüsteemi /target/proc ei õnnestunud külge haakida."
-
- #. Type: error
-diff --git a/debian/po/eu.po b/debian/po/eu.po
-index eecab2dc..f6166dd1 100644
---- a/debian/po/eu.po
-+++ b/debian/po/eu.po
-@@ -27,7 +27,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: di-sublevel1_eu\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2022-06-09 19:45+0000\n"
- "Last-Translator: Gontzal Manuel Pujana Onaindia \n"
- "Language-Team: Basque \n"
-@@ -458,14 +458,16 @@ msgstr "Berriro instalatu GRUB abioko kargatzailea"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Huts egin du /target/proc muntatzean"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Ezin izan da CD-ROMa muntatu"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Huts egin du proc fitxategi-sistema /target/proc-en muntatzean."
-
- #. Type: error
-diff --git a/debian/po/fa.po b/debian/po/fa.po
-index 71d635c3..6ef61be0 100644
---- a/debian/po/fa.po
-+++ b/debian/po/fa.po
-@@ -25,7 +25,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: fa sublevel1\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-05-06 12:58+0000\n"
- "Last-Translator: Danial Behzadi \n"
- "Language-Team: Debian-l10n-persian \n"
-@@ -456,14 +456,16 @@ msgstr "نصب مجدد راهانداز GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "سوار کردن /target/proc شکست خورد"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "مونت CD-ROM با شکست مواجه شد"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "فایل سیستم proc بر روی /target/proc مانت نشده است ."
-
- #. Type: error
-diff --git a/debian/po/fi.po b/debian/po/fi.po
-index f489caba..299edc36 100644
---- a/debian/po/fi.po
-+++ b/debian/po/fi.po
-@@ -27,9 +27,9 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2022-06-02 19:19+0000\n"
--"Last-Translator: Jiri Nakola \n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2022-09-16 09:23+0000\n"
-+"Last-Translator: Tommi Nieminen \n"
- "Language-Team: Finnish \n"
- "Language: fi\n"
- "MIME-Version: 1.0\n"
-@@ -456,14 +456,16 @@ msgstr "Asennetaan GRUB-alkulatausohjelma uudelleen"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Hakemiston /target/proc liittäminen ei onnistunut"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "CD-levyn liittäminen epäonnistui"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr ""
- "proc-tiedostojärjestelmän liittäminen liitoskohtaan /target/proc ei "
- "onnistunut."
-diff --git a/debian/po/fr.po b/debian/po/fr.po
-index 205fe424..9333b07f 100644
---- a/debian/po/fr.po
-+++ b/debian/po/fr.po
-@@ -30,7 +30,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: fr\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-05-14 09:38+0200\n"
- "Last-Translator: Baptiste Jammet \n"
- "Language-Team: French \n"
-@@ -480,14 +480,16 @@ msgstr "Réinstallation du programme de démarrage GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Échec du montage de /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Impossible de monter le CD"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Le montage du système de fichiers « proc » sur /target/proc a échoué."
-
- #. Type: error
-diff --git a/debian/po/ga.po b/debian/po/ga.po
-index 8f134764..338d0466 100644
---- a/debian/po/ga.po
-+++ b/debian/po/ga.po
-@@ -17,7 +17,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-04-24 19:41-0500\n"
- "Last-Translator: Kevin Scannell \n"
- "Language-Team: Irish \n"
-@@ -451,14 +451,16 @@ msgstr "Athshuiteáil luchtóir tosaithe GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Theip ar /target/proc a fheistiú"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Theip ar CD-ROM a fheistiú"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Níorbh fhéidir an córas comhad proc a fheistiú ar /target/proc."
-
- #. Type: error
-diff --git a/debian/po/gl.po b/debian/po/gl.po
-index 9a10d06e..fe262a98 100644
---- a/debian/po/gl.po
-+++ b/debian/po/gl.po
-@@ -25,7 +25,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: gl\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2023-04-16 12:50+0000\n"
- "Last-Translator: gallegonovato \n"
- "Language-Team: Galician \n"
-@@ -460,14 +460,16 @@ msgstr "Reinstalar o cargador de arranque GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "Non foi posíbel montar /target/proc"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "Non foi posíbel montar o CD-ROM"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "Non foi posíbel montar o sistema de ficheiros proc en /target/proc ."
-
- #. Type: error
-diff --git a/debian/po/gu.po b/debian/po/gu.po
-index e6325e69..ea12770d 100644
---- a/debian/po/gu.po
-+++ b/debian/po/gu.po
-@@ -24,7 +24,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: d-i\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
- "PO-Revision-Date: 2008-08-07 11:42+0530\n"
- "Last-Translator: Kartik Mistry \n"
- "Language-Team: \n"
-@@ -451,14 +451,16 @@ msgstr "GRUB બૂટ લોડર ફરી સ્થાપિત કરો"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "/target/proc માઉન્ટ કરવામાં નિષ્ફળ"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "સીડી-રોમ માઉન્ટ કરવામાં નિષ્ફળ"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "/target/proc પર proc ફાઇલ સિસ્ટમ માઉન્ટ કરવામાં નિષ્ફળ ગયું"
-
- #. Type: error
-diff --git a/debian/po/he.po b/debian/po/he.po
-index 69beaa2d..3dda5b63 100644
---- a/debian/po/he.po
-+++ b/debian/po/he.po
-@@ -27,8 +27,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: debian-installer\n"
- "Report-Msgid-Bugs-To: grub-installer@packages.debian.org\n"
--"POT-Creation-Date: 2023-04-20 20:02+0000\n"
--"PO-Revision-Date: 2023-04-23 13:41+0000\n"
-+"POT-Creation-Date: 2023-09-14 20:02+0000\n"
-+"PO-Revision-Date: 2023-08-18 17:56+0000\n"
- "Last-Translator: Yaron Shahrabani \n"
- "Language-Team: Hebrew (https://www.transifex.com/yaron/teams/79473/he/)\n"
- "Language: he\n"
-@@ -449,14 +449,16 @@ msgstr "התקנה מחדש של מנהל האתחול GRUB"
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Failed to mount /target/proc"
--msgstr "העיגון של /target/proc נכשל"
-+#, fuzzy
-+msgid "Failed to mount ${PATH}"
-+msgstr "עגינת התקליטור נכשלה"
-
- #. Type: error
- #. Description
- #. :sl4:
- #: ../grub-installer.templates:30001
--msgid "Mounting the proc file system on /target/proc failed."
-+#, fuzzy
-+msgid "Mounting the ${FSTYPE} file system on ${PATH} failed."
- msgstr "עיגון מערכת קבצים מסוג proc ב־ /target/proc נכשל."
-
- #. Type: error
-diff --git a/debian/po/hi.po b/debian/po/hi.po
-index e90c81ac..c9411908 100644
---- a/debian/po/hi.po
-+++ b/debian/po/hi.po
-@@ -27,7 +27,7 @@
- # Kumar Appaiah , 2008, 2011, 2012.
- # Sruthi Chandran , 2018.
- # Himanshu Awasthi , 2018.
--# KushagraKarira , 2020, 2021.
-+# KushagraKarira , 2020, 2021, 2022.
- # षिखर् , 2020.
- # Indrani Roy