all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions.
@ 2023-10-08 16:26 Clément Lassieur
  2023-10-08 23:07 ` [bug#66408] [PATCH v2] " Clément Lassieur
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-08 16:26 UTC (permalink / raw)
  To: 66408; +Cc: mhw, Clément Lassieur, marius, Jonathan Brielmaier

* gnu/build/icecat-extension.scm: New file.
* gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
* gnu/packages/browser-extensions.scm (ublock-origin):
[properties]: Store the addon id so that it is accessible in
MAKE-ICECAT-EXTENSION.
[arguments]: Use the addon id as first directory level.
(ublock-origin/icecat): New procedure.
* gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
'apply-guix-specific-patches' phase so that it applies the following two
patches.
* gnu/packages/patches/icecat-compare-canonicalized-paths.patch: New patch
that canonicalizes the addon path and use it to detect package changes.
* gnu/packages/patches/icecat-use-guix-extension.patch: New patch that
replaces /usr/share/mozilla/extensions with ~/.guix-profile/share/extensions.
---
 gnu/build/icecat-extension.scm                | 62 +++++++++++++++++++
 gnu/local.mk                                  |  5 +-
 gnu/packages/browser-extensions.scm           | 13 +++-
 gnu/packages/gnuzilla.scm                     | 19 +++---
 .../icecat-compare-canonicalized-paths.patch  | 33 ++++++++++
 .../patches/icecat-use-guix-extensions.patch  | 30 +++++++++
 6 files changed, 147 insertions(+), 15 deletions(-)
 create mode 100644 gnu/build/icecat-extension.scm
 create mode 100644 gnu/packages/patches/icecat-compare-canonicalized-paths.patch
 create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch

diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
new file mode 100644
index 000000000000..ccc6a1ece7fb
--- /dev/null
+++ b/gnu/build/icecat-extension.scm
@@ -0,0 +1,62 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu build icecat-extension)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix build-system trivial)
+  #:export (make-icecat-extension))
+
+(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
+  "Create an Icecat extension from package PKG and return a package that,
+when installed, will make the extension contained in PKG available as an
+Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
+  (package
+    (inherit pkg)
+    (name (string-append (package-name pkg) "-icecat"))
+    (native-inputs '())
+    (inputs '())
+    (propagated-inputs '())
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     (list
+      #:modules '((guix build utils))
+      #:builder
+      #~(begin
+          (use-modules (guix build utils))
+          (let* ((id #$(assq-ref (package-properties pkg) 'id))
+                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
+                 (search-dir (string-append #$output
+                                            "/share/icecat/extensions/"
+                                            moz-app-id)))
+            ;; Icecat's XPIProvider.jsm looks within `search-dir` for a
+            ;; directory named after the add-on id.
+
+            ;; This directory has to be a symlink, because Icecat's
+            ;; GetNativeTarget checks S_ISLNK before canonicalizing it like
+            ;; `readlink -f` would do.
+
+            ;; Canonicalizing is required because Icecat compares the path
+            ;; against its local database to know if there is an extension
+            ;; update.  A path that contains the store path will change every
+            ;; time the package is updated.
+            (mkdir-p search-dir)
+            (symlink (in-vicinity (ungexp pkg pkg-output) id)
+                     (in-vicinity search-dir id))))))))
diff --git a/gnu/local.mk b/gnu/local.mk
index a53701c673b7..17916a106dfb 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -13,7 +13,7 @@
 # Copyright © 2016-2023 Efraim Flashner <efraim@flashner.co.il>
 # Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 # Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
-# Copyright © 2017, 2018 Clément Lassieur <clement@lassieur.org>
+# Copyright © 2017, 2018, 2023 Clément Lassieur <clement@lassieur.org>
 # Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
 # Copyright © 2017, 2018, 2019 Gábor Boskovits <boskovits@gmail.com>
 # Copyright © 2018 Amirouche Boubekki <amirouche@hypermove.net>
@@ -759,6 +759,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/build/chromium-extension.scm		\
   %D%/build/cross-toolchain.scm			\
   %D%/build/dbus-service.scm			\
+  %D%/build/icecat-extension.scm		\
   %D%/build/image.scm				\
   %D%/build/jami-service.scm			\
   %D%/build/file-systems.scm			\
@@ -1406,6 +1407,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/icecat-makeicecat.patch			\
   %D%/packages/patches/icecat-102-makeicecat.patch		\
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
+  %D%/packages/patches/icecat-compare-canonicalized-paths.patch	\
+  %D%/packages/patches/icecat-use-guix-extensions.patch		\
   %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
   %D%/packages/patches/icecat-use-system-media-libs.patch	\
   %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 3f6da8d77a3f..8a76f3a3e042 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu build chromium-extension)
+  #:use-module (gnu build icecat-extension)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python))
 
@@ -98,6 +100,7 @@ (define ublock-origin
                 "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
+    (properties '((id . "uBlock0@raymondhill.net")))
     (arguments
      (list
       #:tests? #f                      ;no tests
@@ -125,9 +128,10 @@ (define ublock-origin
               (invoke "./tools/make-chromium.sh")))
           (add-after 'build-chromium 'install
             (lambda* (#:key outputs #:allow-other-keys)
-              (let ((firefox (assoc-ref outputs "firefox"))
-                    (xpi (assoc-ref outputs "xpi"))
-                    (chromium (assoc-ref outputs "chromium")))
+              (let* ((id #$(assq-ref (package-properties this-package) 'id))
+                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
+                     (xpi (assoc-ref outputs "xpi"))
+                     (chromium (assoc-ref outputs "chromium")))
                 (install-file "dist/build/uBlock0.firefox.xpi"
                               (string-append xpi "/lib/mozilla/extensions"))
                 (copy-recursively "dist/build/uBlock0.firefox" firefox)
@@ -142,3 +146,6 @@ (define ublock-origin
 
 (define-public ublock-origin/chromium
   (make-chromium-extension ublock-origin "chromium"))
+
+(define-public ublock-origin/icecat
+  (make-icecat-extension ublock-origin "firefox"))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index ab629afd3d20..1ef30498e49c 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016, 2017, 2018, 2019, 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
-;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
+;;; Copyright © 2017, 2023 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2017, 2018 Nikita <nikita@n0.is>
 ;;; Copyright © 2017, 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2020 Ricardo Wurmus <rekado@elephly.net>
@@ -880,16 +880,13 @@ (define-public icecat-minimal
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'apply-guix-specific-patches
-            (lambda* (#:key inputs native-inputs #:allow-other-keys)
-              (let ((patch (search-input-file inputs "bin/patch")))
-                (for-each (match-lambda
-                            ((label . file)
-                             (when (and (string-prefix? "icecat-" label)
-                                        (string-suffix? ".patch" label))
-                               (format #t "applying '~a'...~%" file)
-                               (invoke patch "--force" "--no-backup-if-mismatch"
-                                       "-p1" "--input" file))))
-                          (or native-inputs inputs)))))
+            (lambda _
+              (for-each
+               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
+               '(#$(local-file
+                    (search-patch "icecat-compare-canonicalized-paths.patch"))
+                 #$(local-file
+                    (search-patch "icecat-use-guix-extensions.patch"))))))
           (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
             (lambda _
               ;; Remove bundled libraries that we don't use, since they may
diff --git a/gnu/packages/patches/icecat-compare-canonicalized-paths.patch b/gnu/packages/patches/icecat-compare-canonicalized-paths.patch
new file mode 100644
index 000000000000..f0130062624b
--- /dev/null
+++ b/gnu/packages/patches/icecat-compare-canonicalized-paths.patch
@@ -0,0 +1,33 @@
+--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
+     if (
+       newAddon ||
+       oldAddon.updateDate != xpiState.mtime ||
++      oldAddon.path != xpiState.path ||
+       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
+     ) {
+       newAddon = this.updateMetadata(
+@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
+         xpiState,
+         newAddon
+       );
+-    } else if (oldAddon.path != xpiState.path) {
+-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
+     } else if (aUpdateCompatibility || aSchemaChange) {
+       newAddon = this.updateCompatibility(
+         installLocation,
+--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+@@ -1167,8 +1167,9 @@ class SystemAddonDefaults extends DirectoryLocation {
+ 
+       // Only attempt to load unpacked directory if unofficial build.
+       if (!AppConstants.MOZILLA_OFFICIAL && !file.exists()) {
+-        file = this.dir.clone();
+-        file.append(`${id}`);
++        let symlink = this.dir.clone();
++        symlink.append(`${id}`);
++        file = symlink.isSymlink() ? new nsIFile(symlink.target) : symlink;
+       }
+ 
+       addons.set(id, file);
diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch
new file mode 100644
index 000000000000..0d90ea98b685
--- /dev/null
+++ b/gnu/packages/patches/icecat-use-guix-extensions.patch
@@ -0,0 +1,30 @@
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -415,13 +415,20 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
+ #if defined(XP_UNIX) && !defined(XP_MACOSX)
+   else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) {
+ #  ifdef ENABLE_SYSTEM_EXTENSION_DIRS
+-#    if defined(__OpenBSD__) || defined(__FreeBSD__)
+-    static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions";
+-#    else
+-    static const char* const sysLExtDir = "/usr/share/mozilla/extensions";
+-#    endif
+-    rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false,
+-                               getter_AddRefs(file));
++    rv = GetUserDataDirectoryHome(getter_AddRefs(file), false);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative(".guix-profile"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative("share"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative("icecat"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative("extensions"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
+ #  endif
+   }
+ #endif  // defined(XP_UNIX) && !defined(XP_MACOSX)

base-commit: 47d0346553fdad9795c9390a60944ccaad7e5255
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v2] gnu: icecat: Add support for Guix packaged extensions.
  2023-10-08 16:26 [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions Clément Lassieur
@ 2023-10-08 23:07 ` Clément Lassieur
  2023-10-11 12:26 ` [bug#66408] [PATCH v3] " Clément Lassieur
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-08 23:07 UTC (permalink / raw)
  To: 66408; +Cc: Clément Lassieur, Jonathan Brielmaier

* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
procedure that makes sure the add-on directory is a symlink, so that Icecat
can normalize it into a store path.
* gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
* gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
[arguments]: Use the add-on ID as root directory.
(ublock-origin/icecat): New procedure.
* gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
'apply-guix-specific-patches' phase so that it applies the following two
patches.
* gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
add-on store paths to detect package changes.
* gnu/packages/patches/icecat-use-guix-extensions.patch: New patch replacing
/usr/share/mozilla/extensions with ~/.guix-profile/share/icecat/extensions.
---
 gnu/build/icecat-extension.scm                | 64 +++++++++++++++++++
 gnu/local.mk                                  |  5 +-
 gnu/packages/browser-extensions.scm           | 13 +++-
 gnu/packages/gnuzilla.scm                     | 19 +++---
 .../patches/icecat-compare-paths.patch        | 19 ++++++
 .../patches/icecat-use-guix-extensions.patch  | 30 +++++++++
 6 files changed, 135 insertions(+), 15 deletions(-)
 create mode 100644 gnu/build/icecat-extension.scm
 create mode 100644 gnu/packages/patches/icecat-compare-paths.patch
 create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch

diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
new file mode 100644
index 000000000000..c1e528bc35fa
--- /dev/null
+++ b/gnu/build/icecat-extension.scm
@@ -0,0 +1,64 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu build icecat-extension)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix build-system trivial)
+  #:export (make-icecat-extension))
+
+(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
+  "Create an Icecat extension from package PKG and return a package that,
+when installed, will make the extension contained in PKG available as an
+Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
+  (package
+    (inherit pkg)
+    (name (string-append (package-name pkg) "-icecat"))
+    (native-inputs '())
+    (inputs '())
+    (propagated-inputs '())
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     (list
+      #:modules '((guix build utils))
+      #:builder
+      #~(begin
+          (use-modules (guix build utils))
+          (let* ((id #$(assq-ref (package-properties pkg) 'id))
+                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
+                 (search-dir (string-append #$output
+                                            "/share/icecat/extensions/"
+                                            moz-app-id)))
+            ;; Icecat's iterates over `search-dir` for directories.  If a
+            ;; directory's name is not a valid add-on ID, it is ignored.  See
+            ;; DirectoryLocation::readAddons() in XPIProvider.jsm.
+
+            ;; This directory has to be a symlink, because Icecat's
+            ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a
+            ;; symlink.
+
+            ;; Normalizing is required because Icecat compares the add-on path
+            ;; against its local database to know if there is an extension
+            ;; update.  A store path will change every time the package is
+            ;; updated.  See updateExistingAddon() in XPIDatabase.jsm, with
+            ;; our patch `icecat-compare-paths.patch`.
+            (mkdir-p search-dir)
+            (symlink (in-vicinity (ungexp pkg pkg-output) id)
+                     (in-vicinity search-dir id))))))))
diff --git a/gnu/local.mk b/gnu/local.mk
index 631b901b8a77..702bda3e4638 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -13,7 +13,7 @@
 # Copyright © 2016-2023 Efraim Flashner <efraim@flashner.co.il>
 # Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 # Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
-# Copyright © 2017, 2018 Clément Lassieur <clement@lassieur.org>
+# Copyright © 2017, 2018, 2023 Clément Lassieur <clement@lassieur.org>
 # Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
 # Copyright © 2017, 2018, 2019 Gábor Boskovits <boskovits@gmail.com>
 # Copyright © 2018 Amirouche Boubekki <amirouche@hypermove.net>
@@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/build/chromium-extension.scm		\
   %D%/build/cross-toolchain.scm			\
   %D%/build/dbus-service.scm			\
+  %D%/build/icecat-extension.scm		\
   %D%/build/image.scm				\
   %D%/build/jami-service.scm			\
   %D%/build/file-systems.scm			\
@@ -1413,6 +1414,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/icecat-makeicecat.patch			\
   %D%/packages/patches/icecat-102-makeicecat.patch		\
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
+  %D%/packages/patches/icecat-compare-paths.patch		\
+  %D%/packages/patches/icecat-use-guix-extensions.patch		\
   %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
   %D%/packages/patches/icecat-use-system-media-libs.patch	\
   %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 3f6da8d77a3f..8a76f3a3e042 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu build chromium-extension)
+  #:use-module (gnu build icecat-extension)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python))
 
@@ -98,6 +100,7 @@ (define ublock-origin
                 "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
+    (properties '((id . "uBlock0@raymondhill.net")))
     (arguments
      (list
       #:tests? #f                      ;no tests
@@ -125,9 +128,10 @@ (define ublock-origin
               (invoke "./tools/make-chromium.sh")))
           (add-after 'build-chromium 'install
             (lambda* (#:key outputs #:allow-other-keys)
-              (let ((firefox (assoc-ref outputs "firefox"))
-                    (xpi (assoc-ref outputs "xpi"))
-                    (chromium (assoc-ref outputs "chromium")))
+              (let* ((id #$(assq-ref (package-properties this-package) 'id))
+                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
+                     (xpi (assoc-ref outputs "xpi"))
+                     (chromium (assoc-ref outputs "chromium")))
                 (install-file "dist/build/uBlock0.firefox.xpi"
                               (string-append xpi "/lib/mozilla/extensions"))
                 (copy-recursively "dist/build/uBlock0.firefox" firefox)
@@ -142,3 +146,6 @@ (define ublock-origin
 
 (define-public ublock-origin/chromium
   (make-chromium-extension ublock-origin "chromium"))
+
+(define-public ublock-origin/icecat
+  (make-icecat-extension ublock-origin "firefox"))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index ac96d7fb1fb6..a6a92cd8a53b 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016, 2017, 2018, 2019, 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
-;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
+;;; Copyright © 2017, 2023 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2017, 2018 Nikita <nikita@n0.is>
 ;;; Copyright © 2017, 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2020 Ricardo Wurmus <rekado@elephly.net>
@@ -880,16 +880,13 @@ (define-public icecat-minimal
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'apply-guix-specific-patches
-            (lambda* (#:key inputs native-inputs #:allow-other-keys)
-              (let ((patch (search-input-file inputs "bin/patch")))
-                (for-each (match-lambda
-                            ((label . file)
-                             (when (and (string-prefix? "icecat-" label)
-                                        (string-suffix? ".patch" label))
-                               (format #t "applying '~a'...~%" file)
-                               (invoke patch "--force" "--no-backup-if-mismatch"
-                                       "-p1" "--input" file))))
-                          (or native-inputs inputs)))))
+            (lambda _
+              (for-each
+               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
+               '(#$(local-file
+                    (search-patch "icecat-compare-paths.patch"))
+                 #$(local-file
+                    (search-patch "icecat-use-guix-extensions.patch"))))))
           (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
             (lambda _
               ;; Remove bundled libraries that we don't use, since they may
diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
new file mode 100644
index 000000000000..9205899dc0c4
--- /dev/null
+++ b/gnu/packages/patches/icecat-compare-paths.patch
@@ -0,0 +1,19 @@
+--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
+     if (
+       newAddon ||
+       oldAddon.updateDate != xpiState.mtime ||
++      oldAddon.path != xpiState.path ||
+       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
+     ) {
+       newAddon = this.updateMetadata(
+@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
+         xpiState,
+         newAddon
+       );
+-    } else if (oldAddon.path != xpiState.path) {
+-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
+     } else if (aUpdateCompatibility || aSchemaChange) {
+       newAddon = this.updateCompatibility(
+         installLocation,
diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch
new file mode 100644
index 000000000000..0d90ea98b685
--- /dev/null
+++ b/gnu/packages/patches/icecat-use-guix-extensions.patch
@@ -0,0 +1,30 @@
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -415,13 +415,20 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
+ #if defined(XP_UNIX) && !defined(XP_MACOSX)
+   else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) {
+ #  ifdef ENABLE_SYSTEM_EXTENSION_DIRS
+-#    if defined(__OpenBSD__) || defined(__FreeBSD__)
+-    static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions";
+-#    else
+-    static const char* const sysLExtDir = "/usr/share/mozilla/extensions";
+-#    endif
+-    rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false,
+-                               getter_AddRefs(file));
++    rv = GetUserDataDirectoryHome(getter_AddRefs(file), false);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative(".guix-profile"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative("share"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative("icecat"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
++
++    rv = file->AppendNative("extensions"_ns);
++    NS_ENSURE_SUCCESS(rv, rv);
+ #  endif
+   }
+ #endif  // defined(XP_UNIX) && !defined(XP_MACOSX)

base-commit: 40a1254b05612759e919507c9201d7cd291d5975
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v3] gnu: icecat: Add support for Guix packaged extensions.
  2023-10-08 16:26 [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions Clément Lassieur
  2023-10-08 23:07 ` [bug#66408] [PATCH v2] " Clément Lassieur
@ 2023-10-11 12:26 ` Clément Lassieur
  2023-10-11 14:52   ` Clément Lassieur
  2023-10-23  7:37   ` Andrew Tropin
  2023-10-17 12:48 ` [bug#66408] [PATCH v4] " Clément Lassieur
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-11 12:26 UTC (permalink / raw)
  To: 66408; +Cc: Clément Lassieur, Jonathan Brielmaier

* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
procedure that makes sure the add-on directory is a symlink, so that Icecat
can normalize it into a package store path.
* gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
* gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
[arguments]: Use the add-on ID as root directory.
(ublock-origin/icecat): New procedure.
* gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
'apply-guix-specific-patches' phase so that it applies the following two
patches.
[native-search-paths]: New field.
* gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
add-on paths (which are package store paths) to detect package changes.
* gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that
replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR".
---
 gnu/build/icecat-extension.scm                | 71 +++++++++++++++++++
 gnu/local.mk                                  |  3 +
 gnu/packages/browser-extensions.scm           | 13 +++-
 gnu/packages/gnuzilla.scm                     | 22 +++---
 .../patches/icecat-compare-paths.patch        | 19 +++++
 .../patches/icecat-use-guix-extensions.patch  | 52 ++++++++++++++
 6 files changed, 167 insertions(+), 13 deletions(-)
 create mode 100644 gnu/build/icecat-extension.scm
 create mode 100644 gnu/packages/patches/icecat-compare-paths.patch
 create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch

diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
new file mode 100644
index 000000000000..8ecd8a505f72
--- /dev/null
+++ b/gnu/build/icecat-extension.scm
@@ -0,0 +1,71 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu build icecat-extension)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix build-system trivial)
+  #:export (make-icecat-extension))
+
+(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
+  "Create an Icecat extension from package PKG and return a package that,
+when installed, will make the extension contained in PKG available as an
+Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
+  (package
+    (inherit pkg)
+    (name (string-append (package-name pkg) "-icecat"))
+    (native-inputs '())
+    (inputs '())
+    (propagated-inputs '())
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     (list
+      #:modules '((guix build utils))
+      #:builder
+      #~(begin
+          (use-modules (guix build utils))
+          (let* ((id #$(assq-ref (package-properties pkg) 'id))
+                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
+                 (search-dir (string-append #$output
+                                            "/share/icecat/extensions/"
+                                            moz-app-id)))
+            ;; Icecat's iterates over `search-dir` for directories.  If a
+            ;; directory's name is not a valid add-on ID, it is ignored.  See
+            ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm.
+
+            ;; This directory has to be a symlink, because Icecat's
+            ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a
+            ;; symlink.
+
+            ;; Normalizing is required because Icecat compares the add-on path
+            ;; against its local database to know if there is an extension
+            ;; update.  We want the add-on path to be the package store path,
+            ;; so that a path change is detected every time the package is
+            ;; updated.  See `updateExistingAddon()` in XPIDatabase.jsm, with
+            ;; our patch `icecat-compare-paths.patch`.
+
+            ;; We don't want the add-on path to be the profile store path,
+            ;; which would change too often.  We don't want the add-on path to
+            ;; be hard-coded ("/usr/share/mozilla/extensions") either because
+            ;; it would never change.
+
+            (mkdir-p search-dir)
+            (symlink (in-vicinity (ungexp pkg pkg-output) id)
+                     (in-vicinity search-dir id))))))))
diff --git a/gnu/local.mk b/gnu/local.mk
index 9fa52833cbc5..1bf925a57d9e 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/build/chromium-extension.scm		\
   %D%/build/cross-toolchain.scm			\
   %D%/build/dbus-service.scm			\
+  %D%/build/icecat-extension.scm		\
   %D%/build/image.scm				\
   %D%/build/jami-service.scm			\
   %D%/build/file-systems.scm			\
@@ -1415,6 +1416,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/icecat-makeicecat.patch			\
   %D%/packages/patches/icecat-102-makeicecat.patch		\
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
+  %D%/packages/patches/icecat-compare-paths.patch		\
+  %D%/packages/patches/icecat-use-guix-extensions.patch		\
   %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
   %D%/packages/patches/icecat-use-system-media-libs.patch	\
   %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 3f6da8d77a3f..8a76f3a3e042 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu build chromium-extension)
+  #:use-module (gnu build icecat-extension)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python))
 
@@ -98,6 +100,7 @@ (define ublock-origin
                 "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
+    (properties '((id . "uBlock0@raymondhill.net")))
     (arguments
      (list
       #:tests? #f                      ;no tests
@@ -125,9 +128,10 @@ (define ublock-origin
               (invoke "./tools/make-chromium.sh")))
           (add-after 'build-chromium 'install
             (lambda* (#:key outputs #:allow-other-keys)
-              (let ((firefox (assoc-ref outputs "firefox"))
-                    (xpi (assoc-ref outputs "xpi"))
-                    (chromium (assoc-ref outputs "chromium")))
+              (let* ((id #$(assq-ref (package-properties this-package) 'id))
+                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
+                     (xpi (assoc-ref outputs "xpi"))
+                     (chromium (assoc-ref outputs "chromium")))
                 (install-file "dist/build/uBlock0.firefox.xpi"
                               (string-append xpi "/lib/mozilla/extensions"))
                 (copy-recursively "dist/build/uBlock0.firefox" firefox)
@@ -142,3 +146,6 @@ (define ublock-origin
 
 (define-public ublock-origin/chromium
   (make-chromium-extension ublock-origin "chromium"))
+
+(define-public ublock-origin/icecat
+  (make-icecat-extension ublock-origin "firefox"))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index a367d7a00ff6..608219c97303 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -885,16 +885,13 @@ (define-public icecat-minimal
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'apply-guix-specific-patches
-            (lambda* (#:key inputs native-inputs #:allow-other-keys)
-              (let ((patch (search-input-file inputs "bin/patch")))
-                (for-each (match-lambda
-                            ((label . file)
-                             (when (and (string-prefix? "icecat-" label)
-                                        (string-suffix? ".patch" label))
-                               (format #t "applying '~a'...~%" file)
-                               (invoke patch "--force" "--no-backup-if-mismatch"
-                                       "-p1" "--input" file))))
-                          (or native-inputs inputs)))))
+            (lambda _
+              (for-each
+               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
+               '(#$(local-file
+                    (search-patch "icecat-compare-paths.patch"))
+                 #$(local-file
+                    (search-patch "icecat-use-guix-extensions.patch"))))))
           (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
             (lambda _
               ;; Remove bundled libraries that we don't use, since they may
@@ -1138,6 +1135,11 @@ (define-public icecat-minimal
                  '("default16.png" "default22.png" "default24.png"
                    "default32.png" "default48.png" "content/icon64.png"
                    "mozicon128.png" "default256.png"))))))))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "ICECAT_EXTENSION_DIR")
+            (separator #f)              ;single entry
+            (files '("share/icecat/extensions")))))
     (home-page "https://www.gnu.org/software/gnuzilla/")
     (synopsis "Entirely free browser derived from Mozilla Firefox")
     (description
diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
new file mode 100644
index 000000000000..9205899dc0c4
--- /dev/null
+++ b/gnu/packages/patches/icecat-compare-paths.patch
@@ -0,0 +1,19 @@
+--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
+     if (
+       newAddon ||
+       oldAddon.updateDate != xpiState.mtime ||
++      oldAddon.path != xpiState.path ||
+       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
+     ) {
+       newAddon = this.updateMetadata(
+@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
+         xpiState,
+         newAddon
+       );
+-    } else if (oldAddon.path != xpiState.path) {
+-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
+     } else if (aUpdateCompatibility || aSchemaChange) {
+       newAddon = this.updateCompatibility(
+         installLocation,
diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch
new file mode 100644
index 000000000000..f2fe4260c2cd
--- /dev/null
+++ b/gnu/packages/patches/icecat-use-guix-extensions.patch
@@ -0,0 +1,52 @@
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -415,13 +415,7 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
+ #if defined(XP_UNIX) && !defined(XP_MACOSX)
+   else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) {
+ #  ifdef ENABLE_SYSTEM_EXTENSION_DIRS
+-#    if defined(__OpenBSD__) || defined(__FreeBSD__)
+-    static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions";
+-#    else
+-    static const char* const sysLExtDir = "/usr/share/mozilla/extensions";
+-#    endif
+-    rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false,
+-                               getter_AddRefs(file));
++    rv = GetGuixExtensionDir(getter_AddRefs(file));
+ #  endif
+   }
+ #endif  // defined(XP_UNIX) && !defined(XP_MACOSX)
+@@ -1198,6 +1192,24 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
+   return NS_OK;
+ }
+ 
++nsresult nsXREDirProvider::GetGuixExtensionDir(nsIFile** aFile) {
++  nsresult rv;
++  nsCOMPtr<nsIFile> localDir;
++
++#if defined(XP_UNIX)
++  const char* extensionDir = getenv("ICECAT_EXTENSION_DIR");
++  if (!extensionDir || !*extensionDir) return NS_ERROR_FAILURE;
++
++  rv = NS_NewNativeLocalFile(nsDependentCString(extensionDir), true,
++                             getter_AddRefs(localDir));
++#else
++#  error "Don't know how to get product dir on your platform"
++#endif
++
++  NS_IF_ADDREF(*aFile = localDir);
++  return rv;
++}
++
+ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
+                                                     bool aLocal) {
+   // Copied from nsAppFileLocationProvider (more or less)
+--- a/toolkit/xre/nsXREDirProvider.h
++++ b/toolkit/xre/nsXREDirProvider.h
+@@ -112,6 +112,7 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
+  private:
+   nsresult GetFilesInternal(const char* aProperty,
+                             nsISimpleEnumerator** aResult);
++  static nsresult GetGuixExtensionDir(nsIFile** aFile);
+   static nsresult GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal);
+   static nsresult GetSysUserExtensionsDirectory(nsIFile** aFile);
+ #if defined(XP_UNIX) || defined(XP_MACOSX)

base-commit: 9ad9113fc238ee8de5191a5e15b5153fd149e9fa
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v3] gnu: icecat: Add support for Guix packaged extensions.
  2023-10-11 12:26 ` [bug#66408] [PATCH v3] " Clément Lassieur
@ 2023-10-11 14:52   ` Clément Lassieur
  2023-10-23  7:37   ` Andrew Tropin
  1 sibling, 0 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-11 14:52 UTC (permalink / raw)
  To: 66408; +Cc: Mark H Weaver, Marius Bakke

Hello,

Now that this patch looks stable to me, please let me introduce it
shortly.  I believe that a lot of people use Icecat extensions
downloaded from Mozilla store[2].  Mozzarella[1] is really just a
"plugin finder", so the extension is really downloaded from
https://addons.mozilla.org/, which means we have no control over the
software we are running, except for the bundled extensions.  An upgrade
could very well import non-free software when the initial version was
free.

I think it would be great to do like we do with Emacs and a lot of other
softwares: package our own plugins.  That would give users the assurance
that the software is free and can be trusted as they trust any Guix
packaged software.  That would also allow to do Guix-specific changes,
like removing the non-free bits, or adapting the package for technical
reasons.  And that would allow for a declarative deployment of the
browser, because the extensions could be added, say, to the Guix home
config.scm.

So this is what this patch is about.  And it works with the only add-on
that is currently packaged: uBlock Origin.  To test it one needs to
install both "icecat" and "ublock-origin-icecat".  This is related to
the work Marius did on ungoogled-chromium, and of course to the work
Mark did on Icecat, so both of you are CCed.  As for the technical
details, there is a long comment in "icecat-extensions.scm" explaining
what I did.

Thank you,
Clément Lassieur

[1]: https://gnuzilla.gnu.org/mozzarella/
[2]: https://addons.mozilla.org/

> * gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
> procedure that makes sure the add-on directory is a symlink, so that Icecat
> can normalize it into a package store path.
> * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
> * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
> add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
> [arguments]: Use the add-on ID as root directory.
> (ublock-origin/icecat): New procedure.
> * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
> 'apply-guix-specific-patches' phase so that it applies the following two
> patches.
> [native-search-paths]: New field.
> * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
> add-on paths (which are package store paths) to detect package changes.
> * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that
> replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR".




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v4] gnu: icecat: Add support for Guix packaged extensions.
  2023-10-08 16:26 [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions Clément Lassieur
  2023-10-08 23:07 ` [bug#66408] [PATCH v2] " Clément Lassieur
  2023-10-11 12:26 ` [bug#66408] [PATCH v3] " Clément Lassieur
@ 2023-10-17 12:48 ` Clément Lassieur
  2023-10-17 16:45 ` [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests Clément Lassieur
  2023-10-20 12:26 ` [bug#66408] [PATCH v6] " Clément Lassieur
  4 siblings, 0 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-17 12:48 UTC (permalink / raw)
  To: 66408; +Cc: Clément Lassieur, Jonathan Brielmaier

* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
procedure that makes sure the add-on directory is a symlink, so that Icecat
can normalize it into a package store path.
* gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
* gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
[arguments]: Use the add-on ID as root directory.
(ublock-origin/icecat): New procedure.
* gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
'apply-guix-specific-patches' phase so that it applies the following two
patches.
[native-search-paths]: New field.
* gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
add-on paths (which are package store paths) to detect package changes.
* gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that
replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR".
---
 gnu/build/icecat-extension.scm                | 71 +++++++++++++++++++
 gnu/local.mk                                  |  3 +
 gnu/packages/browser-extensions.scm           | 13 +++-
 gnu/packages/gnuzilla.scm                     | 22 +++---
 .../patches/icecat-compare-paths.patch        | 19 +++++
 .../patches/icecat-use-guix-extensions.patch  | 40 +++++++++++
 6 files changed, 155 insertions(+), 13 deletions(-)
 create mode 100644 gnu/build/icecat-extension.scm
 create mode 100644 gnu/packages/patches/icecat-compare-paths.patch
 create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch

diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
new file mode 100644
index 000000000000..8ecd8a505f72
--- /dev/null
+++ b/gnu/build/icecat-extension.scm
@@ -0,0 +1,71 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu build icecat-extension)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix build-system trivial)
+  #:export (make-icecat-extension))
+
+(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
+  "Create an Icecat extension from package PKG and return a package that,
+when installed, will make the extension contained in PKG available as an
+Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
+  (package
+    (inherit pkg)
+    (name (string-append (package-name pkg) "-icecat"))
+    (native-inputs '())
+    (inputs '())
+    (propagated-inputs '())
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     (list
+      #:modules '((guix build utils))
+      #:builder
+      #~(begin
+          (use-modules (guix build utils))
+          (let* ((id #$(assq-ref (package-properties pkg) 'id))
+                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
+                 (search-dir (string-append #$output
+                                            "/share/icecat/extensions/"
+                                            moz-app-id)))
+            ;; Icecat's iterates over `search-dir` for directories.  If a
+            ;; directory's name is not a valid add-on ID, it is ignored.  See
+            ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm.
+
+            ;; This directory has to be a symlink, because Icecat's
+            ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a
+            ;; symlink.
+
+            ;; Normalizing is required because Icecat compares the add-on path
+            ;; against its local database to know if there is an extension
+            ;; update.  We want the add-on path to be the package store path,
+            ;; so that a path change is detected every time the package is
+            ;; updated.  See `updateExistingAddon()` in XPIDatabase.jsm, with
+            ;; our patch `icecat-compare-paths.patch`.
+
+            ;; We don't want the add-on path to be the profile store path,
+            ;; which would change too often.  We don't want the add-on path to
+            ;; be hard-coded ("/usr/share/mozilla/extensions") either because
+            ;; it would never change.
+
+            (mkdir-p search-dir)
+            (symlink (in-vicinity (ungexp pkg pkg-output) id)
+                     (in-vicinity search-dir id))))))))
diff --git a/gnu/local.mk b/gnu/local.mk
index 13c2b949449d..5e8aaea9ff99 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/build/chromium-extension.scm		\
   %D%/build/cross-toolchain.scm			\
   %D%/build/dbus-service.scm			\
+  %D%/build/icecat-extension.scm		\
   %D%/build/image.scm				\
   %D%/build/jami-service.scm			\
   %D%/build/file-systems.scm			\
@@ -1416,6 +1417,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/icecat-makeicecat.patch			\
   %D%/packages/patches/icecat-102-makeicecat.patch		\
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
+  %D%/packages/patches/icecat-compare-paths.patch		\
+  %D%/packages/patches/icecat-use-guix-extensions.patch		\
   %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
   %D%/packages/patches/icecat-use-system-media-libs.patch	\
   %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 3f6da8d77a3f..68c38a76d8ac 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu build chromium-extension)
+  #:use-module (gnu build icecat-extension)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python))
 
@@ -98,6 +100,7 @@ (define ublock-origin
                 "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
+    (properties '((id . "uBlock0@raymondhill.net")))
     (arguments
      (list
       #:tests? #f                      ;no tests
@@ -125,9 +128,10 @@ (define ublock-origin
               (invoke "./tools/make-chromium.sh")))
           (add-after 'build-chromium 'install
             (lambda* (#:key outputs #:allow-other-keys)
-              (let ((firefox (assoc-ref outputs "firefox"))
-                    (xpi (assoc-ref outputs "xpi"))
-                    (chromium (assoc-ref outputs "chromium")))
+              (let* ((id #$(assq-ref properties 'id))
+                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
+                     (xpi (assoc-ref outputs "xpi"))
+                     (chromium (assoc-ref outputs "chromium")))
                 (install-file "dist/build/uBlock0.firefox.xpi"
                               (string-append xpi "/lib/mozilla/extensions"))
                 (copy-recursively "dist/build/uBlock0.firefox" firefox)
@@ -142,3 +146,6 @@ (define ublock-origin
 
 (define-public ublock-origin/chromium
   (make-chromium-extension ublock-origin "chromium"))
+
+(define-public ublock-origin/icecat
+  (make-icecat-extension ublock-origin "firefox"))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index a367d7a00ff6..608219c97303 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -885,16 +885,13 @@ (define-public icecat-minimal
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'apply-guix-specific-patches
-            (lambda* (#:key inputs native-inputs #:allow-other-keys)
-              (let ((patch (search-input-file inputs "bin/patch")))
-                (for-each (match-lambda
-                            ((label . file)
-                             (when (and (string-prefix? "icecat-" label)
-                                        (string-suffix? ".patch" label))
-                               (format #t "applying '~a'...~%" file)
-                               (invoke patch "--force" "--no-backup-if-mismatch"
-                                       "-p1" "--input" file))))
-                          (or native-inputs inputs)))))
+            (lambda _
+              (for-each
+               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
+               '(#$(local-file
+                    (search-patch "icecat-compare-paths.patch"))
+                 #$(local-file
+                    (search-patch "icecat-use-guix-extensions.patch"))))))
           (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
             (lambda _
               ;; Remove bundled libraries that we don't use, since they may
@@ -1138,6 +1135,11 @@ (define-public icecat-minimal
                  '("default16.png" "default22.png" "default24.png"
                    "default32.png" "default48.png" "content/icon64.png"
                    "mozicon128.png" "default256.png"))))))))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "ICECAT_EXTENSION_DIR")
+            (separator #f)              ;single entry
+            (files '("share/icecat/extensions")))))
     (home-page "https://www.gnu.org/software/gnuzilla/")
     (synopsis "Entirely free browser derived from Mozilla Firefox")
     (description
diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
new file mode 100644
index 000000000000..9205899dc0c4
--- /dev/null
+++ b/gnu/packages/patches/icecat-compare-paths.patch
@@ -0,0 +1,19 @@
+--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
+     if (
+       newAddon ||
+       oldAddon.updateDate != xpiState.mtime ||
++      oldAddon.path != xpiState.path ||
+       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
+     ) {
+       newAddon = this.updateMetadata(
+@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
+         xpiState,
+         newAddon
+       );
+-    } else if (oldAddon.path != xpiState.path) {
+-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
+     } else if (aUpdateCompatibility || aSchemaChange) {
+       newAddon = this.updateCompatibility(
+         installLocation,
diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch
new file mode 100644
index 000000000000..ed1ce922d55b
--- /dev/null
+++ b/gnu/packages/patches/icecat-use-guix-extensions.patch
@@ -0,0 +1,40 @@
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -281,6 +281,22 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir(
+ }
+ #endif
+ 
++static nsresult GetGuixExtensionDir(nsIFile** aFile) {
++  nsresult rv;
++  nsCOMPtr<nsIFile> localDir;
++
++  const char* extensionDir = getenv("ICECAT_EXTENSION_DIR");
++  if (!extensionDir || !*extensionDir) return NS_ERROR_FAILURE;
++
++  rv = NS_NewNativeLocalFile(nsDependentCString(extensionDir), true,
++                             getter_AddRefs(localDir));
++
++  if (NS_SUCCEEDED(rv)) {
++    localDir.forget(aFile);
++  }
++  return rv;
++}
++
+ #if defined(XP_UNIX) || defined(XP_MACOSX)
+ /**
+  * Get the directory that is the parent of the system-wide directories
+@@ -415,13 +431,7 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
+ #if defined(XP_UNIX) && !defined(XP_MACOSX)
+   else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) {
+ #  ifdef ENABLE_SYSTEM_EXTENSION_DIRS
+-#    if defined(__OpenBSD__) || defined(__FreeBSD__)
+-    static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions";
+-#    else
+-    static const char* const sysLExtDir = "/usr/share/mozilla/extensions";
+-#    endif
+-    rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false,
+-                               getter_AddRefs(file));
++    rv = ::GetGuixExtensionDir(getter_AddRefs(file));
+ #  endif
+   }
+ #endif  // defined(XP_UNIX) && !defined(XP_MACOSX)

base-commit: 5498835bb38c0de57f284f0fa6b1178ecdcaf678
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests.
  2023-10-08 16:26 [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions Clément Lassieur
                   ` (2 preceding siblings ...)
  2023-10-17 12:48 ` [bug#66408] [PATCH v4] " Clément Lassieur
@ 2023-10-17 16:45 ` Clément Lassieur
  2023-10-20 10:01   ` Mathieu Othacehe
  2023-10-20 12:26 ` [bug#66408] [PATCH v6] " Clément Lassieur
  4 siblings, 1 reply; 12+ messages in thread
From: Clément Lassieur @ 2023-10-17 16:45 UTC (permalink / raw)
  To: 66408; +Cc: Clément Lassieur, Jonathan Brielmaier

* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
procedure that makes sure the add-on directory is a symlink, so that Icecat
can normalize it into a package store path.
* gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
* gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
[arguments]: Use the add-on ID as root directory.
(ublock-origin/icecat): New procedure.
* gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
'apply-guix-specific-patches' phase so that it applies the following two
patches.
[native-search-paths]: New field.
* gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
add-on paths (which are package store paths) to detect package changes.
* gnu/packages/patches/icecat-use-system-wide-dir.patch: New patch that
replaces "/usr/lib/mozilla" (the system-wide directory for extensions and
native manifests) with "$ICECAT_SYSTEM_DIR".
---
 gnu/build/icecat-extension.scm                | 70 +++++++++++++++++++
 gnu/local.mk                                  |  3 +
 gnu/packages/browser-extensions.scm           | 13 +++-
 gnu/packages/gnuzilla.scm                     | 22 +++---
 .../patches/icecat-compare-paths.patch        | 19 +++++
 .../patches/icecat-use-system-wide-dir.patch  | 33 +++++++++
 6 files changed, 147 insertions(+), 13 deletions(-)
 create mode 100644 gnu/build/icecat-extension.scm
 create mode 100644 gnu/packages/patches/icecat-compare-paths.patch
 create mode 100644 gnu/packages/patches/icecat-use-system-wide-dir.patch

diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
new file mode 100644
index 000000000000..ebdf30f2af06
--- /dev/null
+++ b/gnu/build/icecat-extension.scm
@@ -0,0 +1,70 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu build icecat-extension)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix build-system trivial)
+  #:export (make-icecat-extension))
+
+(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
+  "Create an Icecat extension from package PKG and return a package that,
+when installed, will make the extension contained in PKG available as an
+Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
+  (package
+    (inherit pkg)
+    (name (string-append (package-name pkg) "-icecat"))
+    (native-inputs '())
+    (inputs '())
+    (propagated-inputs (package-propagated-inputs pkg))
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     (list
+      #:modules '((guix build utils))
+      #:builder
+      #~(begin
+          (use-modules (guix build utils))
+          (let* ((id #$(assq-ref (package-properties pkg) 'id))
+                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
+                 (search-dir (string-append #$output "/lib/icecat/extensions/"
+                                            moz-app-id)))
+            ;; Icecat's iterates over `search-dir` for directories.  If a
+            ;; directory's name is not a valid add-on ID, it is ignored.  See
+            ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm.
+
+            ;; This directory has to be a symlink, because Icecat's
+            ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a
+            ;; symlink.
+
+            ;; Normalizing is required because Icecat compares the add-on path
+            ;; against its local database to know if there is an extension
+            ;; update.  We want the add-on path to be the package store path,
+            ;; so that a path change is detected every time the package is
+            ;; updated.  See `updateExistingAddon()` in XPIDatabase.jsm, with
+            ;; our patch `icecat-compare-paths.patch`.
+
+            ;; We don't want the add-on path to be the profile store path,
+            ;; which would change too often.  We don't want the add-on path to
+            ;; be hard-coded either because it would never change (but it
+            ;; wouldn't make sense anyway).
+
+            (mkdir-p search-dir)
+            (symlink (in-vicinity (ungexp pkg pkg-output) id)
+                     (in-vicinity search-dir id))))))))
diff --git a/gnu/local.mk b/gnu/local.mk
index 13c2b949449d..3bf0ad0cf08b 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/build/chromium-extension.scm		\
   %D%/build/cross-toolchain.scm			\
   %D%/build/dbus-service.scm			\
+  %D%/build/icecat-extension.scm		\
   %D%/build/image.scm				\
   %D%/build/jami-service.scm			\
   %D%/build/file-systems.scm			\
@@ -1416,8 +1417,10 @@ dist_patch_DATA =						\
   %D%/packages/patches/icecat-makeicecat.patch			\
   %D%/packages/patches/icecat-102-makeicecat.patch		\
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
+  %D%/packages/patches/icecat-compare-paths.patch		\
   %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
   %D%/packages/patches/icecat-use-system-media-libs.patch	\
+  %D%/packages/patches/icecat-use-system-wide-dir.patch		\
   %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
   %D%/packages/patches/icedtea-7-hotspot-pointer-comparison.patch	\
   %D%/packages/patches/icu4c-fix-TestHebrewCalendarInTemporalLeapYear.patch	\
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 3f6da8d77a3f..68c38a76d8ac 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu build chromium-extension)
+  #:use-module (gnu build icecat-extension)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python))
 
@@ -98,6 +100,7 @@ (define ublock-origin
                 "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
+    (properties '((id . "uBlock0@raymondhill.net")))
     (arguments
      (list
       #:tests? #f                      ;no tests
@@ -125,9 +128,10 @@ (define ublock-origin
               (invoke "./tools/make-chromium.sh")))
           (add-after 'build-chromium 'install
             (lambda* (#:key outputs #:allow-other-keys)
-              (let ((firefox (assoc-ref outputs "firefox"))
-                    (xpi (assoc-ref outputs "xpi"))
-                    (chromium (assoc-ref outputs "chromium")))
+              (let* ((id #$(assq-ref properties 'id))
+                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
+                     (xpi (assoc-ref outputs "xpi"))
+                     (chromium (assoc-ref outputs "chromium")))
                 (install-file "dist/build/uBlock0.firefox.xpi"
                               (string-append xpi "/lib/mozilla/extensions"))
                 (copy-recursively "dist/build/uBlock0.firefox" firefox)
@@ -142,3 +146,6 @@ (define ublock-origin
 
 (define-public ublock-origin/chromium
   (make-chromium-extension ublock-origin "chromium"))
+
+(define-public ublock-origin/icecat
+  (make-icecat-extension ublock-origin "firefox"))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index a367d7a00ff6..1817dd44d1e3 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -885,16 +885,13 @@ (define-public icecat-minimal
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'apply-guix-specific-patches
-            (lambda* (#:key inputs native-inputs #:allow-other-keys)
-              (let ((patch (search-input-file inputs "bin/patch")))
-                (for-each (match-lambda
-                            ((label . file)
-                             (when (and (string-prefix? "icecat-" label)
-                                        (string-suffix? ".patch" label))
-                               (format #t "applying '~a'...~%" file)
-                               (invoke patch "--force" "--no-backup-if-mismatch"
-                                       "-p1" "--input" file))))
-                          (or native-inputs inputs)))))
+            (lambda _
+              (for-each
+               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
+               '(#$(local-file
+                    (search-patch "icecat-compare-paths.patch"))
+                 #$(local-file
+                    (search-patch "icecat-use-system-wide-dir.patch"))))))
           (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
             (lambda _
               ;; Remove bundled libraries that we don't use, since they may
@@ -1138,6 +1135,11 @@ (define-public icecat-minimal
                  '("default16.png" "default22.png" "default24.png"
                    "default32.png" "default48.png" "content/icon64.png"
                    "mozicon128.png" "default256.png"))))))))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "ICECAT_SYSTEM_DIR")
+            (separator #f)              ;single entry
+            (files '("lib/icecat")))))
     (home-page "https://www.gnu.org/software/gnuzilla/")
     (synopsis "Entirely free browser derived from Mozilla Firefox")
     (description
diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
new file mode 100644
index 000000000000..9205899dc0c4
--- /dev/null
+++ b/gnu/packages/patches/icecat-compare-paths.patch
@@ -0,0 +1,19 @@
+--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
+     if (
+       newAddon ||
+       oldAddon.updateDate != xpiState.mtime ||
++      oldAddon.path != xpiState.path ||
+       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
+     ) {
+       newAddon = this.updateMetadata(
+@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
+         xpiState,
+         newAddon
+       );
+-    } else if (oldAddon.path != xpiState.path) {
+-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
+     } else if (aUpdateCompatibility || aSchemaChange) {
+       newAddon = this.updateCompatibility(
+         installLocation,
diff --git a/gnu/packages/patches/icecat-use-system-wide-dir.patch b/gnu/packages/patches/icecat-use-system-wide-dir.patch
new file mode 100644
index 000000000000..db9cf12e5435
--- /dev/null
+++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch
@@ -0,0 +1,33 @@
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -293,24 +293,12 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir(
+ static nsresult GetSystemParentDirectory(nsIFile** aFile) {
+   nsresult rv;
+   nsCOMPtr<nsIFile> localDir;
+-#  if defined(XP_MACOSX)
+-  rv = GetOSXFolderType(kOnSystemDisk, kApplicationSupportFolderType,
+-                        getter_AddRefs(localDir));
+-  if (NS_SUCCEEDED(rv)) {
+-    rv = localDir->AppendNative("Mozilla"_ns);
+-  }
+-#  else
+-  constexpr auto dirname =
+-#    ifdef HAVE_USR_LIB64_DIR
+-      "/usr/lib64/mozilla"_ns
+-#    elif defined(__OpenBSD__) || defined(__FreeBSD__)
+-      "/usr/local/lib/mozilla"_ns
+-#    else
+-      "/usr/lib/mozilla"_ns
+-#    endif
+-      ;
+-  rv = NS_NewNativeLocalFile(dirname, false, getter_AddRefs(localDir));
+-#  endif
++
++  const char* systemParentDir = getenv("ICECAT_SYSTEM_DIR");
++  if (!systemParentDir || !*systemParentDir) return NS_ERROR_FAILURE;
++
++  rv = NS_NewNativeLocalFile(nsDependentCString(systemParentDir), false,
++                             getter_AddRefs(localDir));
+ 
+   if (NS_SUCCEEDED(rv)) {
+     localDir.forget(aFile);

base-commit: 5498835bb38c0de57f284f0fa6b1178ecdcaf678
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests.
  2023-10-17 16:45 ` [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests Clément Lassieur
@ 2023-10-20 10:01   ` Mathieu Othacehe
  2023-10-20 12:40     ` Clément Lassieur
  0 siblings, 1 reply; 12+ messages in thread
From: Mathieu Othacehe @ 2023-10-20 10:01 UTC (permalink / raw)
  To: Clément Lassieur; +Cc: Jonathan Brielmaier, 66408


Hey Clément,

> +              (let* ((id #$(assq-ref properties 'id))

id is maybe a bit generic?

> +                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
> +                     (xpi (assoc-ref outputs "xpi"))
> +                     (chromium (assoc-ref outputs "chromium")))
>                  (install-file "dist/build/uBlock0.firefox.xpi"
>                                (string-append xpi "/lib/mozilla/extensions"))
>                  (copy-recursively "dist/build/uBlock0.firefox" firefox)
> @@ -142,3 +146,6 @@ (define ublock-origin
>  
>  (define-public ublock-origin/chromium
>    (make-chromium-extension ublock-origin "chromium"))
> +
> +(define-public ublock-origin/icecat
> +  (make-icecat-extension ublock-origin "firefox"))

It does not appear clearly that one has to install ublock-origin-icecat
here. We have the same issue for ublock-origin-chromium though.

> diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
> new file mode 100644
> index 000000000000..9205899dc0c4
> --- /dev/null
> +++ b/gnu/packages/patches/icecat-compare-paths.patch

You could add a small header explaining the content of that patch, ...

> --- /dev/null
> +++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch

..., as well as that one.

I tried a guix shell icecat ublock-origin-icecat and it worked perfectly
:) It is also very appreciated to have a pre-built icecat by the QA :).

Thanks,

Mathieu




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v6] gnu: icecat: Support Guix packaged extensions and native manifests.
  2023-10-08 16:26 [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions Clément Lassieur
                   ` (3 preceding siblings ...)
  2023-10-17 16:45 ` [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests Clément Lassieur
@ 2023-10-20 12:26 ` Clément Lassieur
  4 siblings, 0 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-20 12:26 UTC (permalink / raw)
  To: 66408; +Cc: Clément Lassieur, Jonathan Brielmaier

* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
procedure that makes sure the add-on directory is a symlink, so that Icecat
can normalize it into a package store path.
* gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
* gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
[arguments]: Use the add-on ID as root directory.
(ublock-origin/icecat): New procedure.
* gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
'apply-guix-specific-patches' phase so that it applies the following two
patches.
[native-search-paths]: New field.
* gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
add-on paths (which are package store paths) to detect package changes.
* gnu/packages/patches/icecat-use-system-wide-dir.patch: New patch that
replaces "/usr/lib/mozilla" (the system-wide directory for extensions and
native manifests) with "$ICECAT_SYSTEM_DIR".
---
 gnu/build/icecat-extension.scm                | 70 +++++++++++++++++++
 gnu/local.mk                                  |  3 +
 gnu/packages/browser-extensions.scm           | 14 +++-
 gnu/packages/gnuzilla.scm                     | 22 +++---
 .../patches/icecat-compare-paths.patch        | 21 ++++++
 .../patches/icecat-use-system-wide-dir.patch  | 36 ++++++++++
 6 files changed, 153 insertions(+), 13 deletions(-)
 create mode 100644 gnu/build/icecat-extension.scm
 create mode 100644 gnu/packages/patches/icecat-compare-paths.patch
 create mode 100644 gnu/packages/patches/icecat-use-system-wide-dir.patch

diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
new file mode 100644
index 000000000000..1e6a9a54e4bb
--- /dev/null
+++ b/gnu/build/icecat-extension.scm
@@ -0,0 +1,70 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu build icecat-extension)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix build-system trivial)
+  #:export (make-icecat-extension))
+
+(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
+  "Create an Icecat extension from package PKG and return a package that,
+when installed, will make the extension contained in PKG available as an
+Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
+  (package
+    (inherit pkg)
+    (name (string-append (package-name pkg) "-icecat"))
+    (native-inputs '())
+    (inputs '())
+    (propagated-inputs (package-propagated-inputs pkg))
+    (outputs '("out"))
+    (build-system trivial-build-system)
+    (arguments
+     (list
+      #:modules '((guix build utils))
+      #:builder
+      #~(begin
+          (use-modules (guix build utils))
+          (let* ((addon-id #$(assq-ref (package-properties pkg) 'addon-id))
+                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
+                 (search-dir (string-append #$output "/lib/icecat/extensions/"
+                                            moz-app-id)))
+            ;; Icecat's iterates over `search-dir` for directories.  If a
+            ;; directory's name is not a valid add-on ID, it is ignored.  See
+            ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm.
+
+            ;; This directory has to be a symlink, because Icecat's
+            ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a
+            ;; symlink.
+
+            ;; Normalizing is required because Icecat compares the add-on path
+            ;; against its local database to know if there is an extension
+            ;; update.  We want the add-on path to be the package store path,
+            ;; so that a path change is detected every time the package is
+            ;; updated.  See `updateExistingAddon()` in XPIDatabase.jsm, with
+            ;; our patch `icecat-compare-paths.patch`.
+
+            ;; We don't want the add-on path to be the profile store path,
+            ;; which would change too often.  We don't want the add-on path to
+            ;; be hard-coded either because it would never change (but it
+            ;; wouldn't make sense anyway).
+
+            (mkdir-p search-dir)
+            (symlink (in-vicinity (ungexp pkg pkg-output) addon-id)
+                     (in-vicinity search-dir addon-id))))))))
diff --git a/gnu/local.mk b/gnu/local.mk
index daacd786a7d3..be3ec73cb1e9 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/build/chromium-extension.scm		\
   %D%/build/cross-toolchain.scm			\
   %D%/build/dbus-service.scm			\
+  %D%/build/icecat-extension.scm		\
   %D%/build/image.scm				\
   %D%/build/jami-service.scm			\
   %D%/build/file-systems.scm			\
@@ -1416,8 +1417,10 @@ dist_patch_DATA =						\
   %D%/packages/patches/icecat-makeicecat.patch			\
   %D%/packages/patches/icecat-102-makeicecat.patch		\
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
+  %D%/packages/patches/icecat-compare-paths.patch		\
   %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
   %D%/packages/patches/icecat-use-system-media-libs.patch	\
+  %D%/packages/patches/icecat-use-system-wide-dir.patch		\
   %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
   %D%/packages/patches/icedtea-7-hotspot-pointer-comparison.patch	\
   %D%/packages/patches/icu4c-fix-TestHebrewCalendarInTemporalLeapYear.patch	\
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 3f6da8d77a3f..252c95729dad 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu build chromium-extension)
+  #:use-module (gnu build icecat-extension)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python))
 
@@ -98,6 +100,7 @@ (define ublock-origin
                 "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
+    (properties '((addon-id . "uBlock0@raymondhill.net")))
     (arguments
      (list
       #:tests? #f                      ;no tests
@@ -125,9 +128,11 @@ (define ublock-origin
               (invoke "./tools/make-chromium.sh")))
           (add-after 'build-chromium 'install
             (lambda* (#:key outputs #:allow-other-keys)
-              (let ((firefox (assoc-ref outputs "firefox"))
-                    (xpi (assoc-ref outputs "xpi"))
-                    (chromium (assoc-ref outputs "chromium")))
+              (let* ((addon-id #$(assq-ref properties 'addon-id))
+                     (firefox (in-vicinity
+                               (assoc-ref outputs "firefox") addon-id))
+                     (xpi (assoc-ref outputs "xpi"))
+                     (chromium (assoc-ref outputs "chromium")))
                 (install-file "dist/build/uBlock0.firefox.xpi"
                               (string-append xpi "/lib/mozilla/extensions"))
                 (copy-recursively "dist/build/uBlock0.firefox" firefox)
@@ -142,3 +147,6 @@ (define ublock-origin
 
 (define-public ublock-origin/chromium
   (make-chromium-extension ublock-origin "chromium"))
+
+(define-public ublock-origin/icecat
+  (make-icecat-extension ublock-origin "firefox"))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index a367d7a00ff6..1817dd44d1e3 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -885,16 +885,13 @@ (define-public icecat-minimal
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'apply-guix-specific-patches
-            (lambda* (#:key inputs native-inputs #:allow-other-keys)
-              (let ((patch (search-input-file inputs "bin/patch")))
-                (for-each (match-lambda
-                            ((label . file)
-                             (when (and (string-prefix? "icecat-" label)
-                                        (string-suffix? ".patch" label))
-                               (format #t "applying '~a'...~%" file)
-                               (invoke patch "--force" "--no-backup-if-mismatch"
-                                       "-p1" "--input" file))))
-                          (or native-inputs inputs)))))
+            (lambda _
+              (for-each
+               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
+               '(#$(local-file
+                    (search-patch "icecat-compare-paths.patch"))
+                 #$(local-file
+                    (search-patch "icecat-use-system-wide-dir.patch"))))))
           (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
             (lambda _
               ;; Remove bundled libraries that we don't use, since they may
@@ -1138,6 +1135,11 @@ (define-public icecat-minimal
                  '("default16.png" "default22.png" "default24.png"
                    "default32.png" "default48.png" "content/icon64.png"
                    "mozicon128.png" "default256.png"))))))))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "ICECAT_SYSTEM_DIR")
+            (separator #f)              ;single entry
+            (files '("lib/icecat")))))
     (home-page "https://www.gnu.org/software/gnuzilla/")
     (synopsis "Entirely free browser derived from Mozilla Firefox")
     (description
diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
new file mode 100644
index 000000000000..69c03e05eebc
--- /dev/null
+++ b/gnu/packages/patches/icecat-compare-paths.patch
@@ -0,0 +1,21 @@
+See comment in gnu/build/icecat-extension.scm.
+
+--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
+     if (
+       newAddon ||
+       oldAddon.updateDate != xpiState.mtime ||
++      oldAddon.path != xpiState.path ||
+       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
+     ) {
+       newAddon = this.updateMetadata(
+@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
+         xpiState,
+         newAddon
+       );
+-    } else if (oldAddon.path != xpiState.path) {
+-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
+     } else if (aUpdateCompatibility || aSchemaChange) {
+       newAddon = this.updateCompatibility(
+         installLocation,
diff --git a/gnu/packages/patches/icecat-use-system-wide-dir.patch b/gnu/packages/patches/icecat-use-system-wide-dir.patch
new file mode 100644
index 000000000000..a635a4d18ee6
--- /dev/null
+++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch
@@ -0,0 +1,36 @@
+Replace "/usr/lib/mozilla" (the system-wide directory for extensions and
+native manifests) with "$ICECAT_SYSTEM_DIR".
+
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -293,24 +293,12 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir(
+ static nsresult GetSystemParentDirectory(nsIFile** aFile) {
+   nsresult rv;
+   nsCOMPtr<nsIFile> localDir;
+-#  if defined(XP_MACOSX)
+-  rv = GetOSXFolderType(kOnSystemDisk, kApplicationSupportFolderType,
+-                        getter_AddRefs(localDir));
+-  if (NS_SUCCEEDED(rv)) {
+-    rv = localDir->AppendNative("Mozilla"_ns);
+-  }
+-#  else
+-  constexpr auto dirname =
+-#    ifdef HAVE_USR_LIB64_DIR
+-      "/usr/lib64/mozilla"_ns
+-#    elif defined(__OpenBSD__) || defined(__FreeBSD__)
+-      "/usr/local/lib/mozilla"_ns
+-#    else
+-      "/usr/lib/mozilla"_ns
+-#    endif
+-      ;
+-  rv = NS_NewNativeLocalFile(dirname, false, getter_AddRefs(localDir));
+-#  endif
++
++  const char* systemParentDir = getenv("ICECAT_SYSTEM_DIR");
++  if (!systemParentDir || !*systemParentDir) return NS_ERROR_FAILURE;
++
++  rv = NS_NewNativeLocalFile(nsDependentCString(systemParentDir), false,
++                             getter_AddRefs(localDir));
+ 
+   if (NS_SUCCEEDED(rv)) {
+     localDir.forget(aFile);

base-commit: c065da01ff956d3c2bdfc45a33d910e509a211d9
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests.
  2023-10-20 10:01   ` Mathieu Othacehe
@ 2023-10-20 12:40     ` Clément Lassieur
  2023-10-23  7:14       ` Mathieu Othacehe
  0 siblings, 1 reply; 12+ messages in thread
From: Clément Lassieur @ 2023-10-20 12:40 UTC (permalink / raw)
  To: Mathieu Othacehe; +Cc: Jonathan Brielmaier, 66408

Hey Mathieu,

>> +              (let* ((id #$(assq-ref properties 'id))
>
> id is maybe a bit generic?

Done.

>> +                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
>> +                     (xpi (assoc-ref outputs "xpi"))
>> +                     (chromium (assoc-ref outputs "chromium")))
>>                  (install-file "dist/build/uBlock0.firefox.xpi"
>>                                (string-append xpi "/lib/mozilla/extensions"))
>>                  (copy-recursively "dist/build/uBlock0.firefox" firefox)
>> @@ -142,3 +146,6 @@ (define ublock-origin
>>  
>>  (define-public ublock-origin/chromium
>>    (make-chromium-extension ublock-origin "chromium"))
>> +
>> +(define-public ublock-origin/icecat
>> +  (make-icecat-extension ublock-origin "firefox"))
>
> It does not appear clearly that one has to install ublock-origin-icecat
> here. We have the same issue for ublock-origin-chromium though.

Indeed!  That's a small change that should be in another patch I
believe.

>> diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
>> new file mode 100644
>> index 000000000000..9205899dc0c4
>> --- /dev/null
>> +++ b/gnu/packages/patches/icecat-compare-paths.patch
>
> You could add a small header explaining the content of that patch, ...

Done.

>> --- /dev/null
>> +++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch
>
> ..., as well as that one.

Done.

> I tried a guix shell icecat ublock-origin-icecat and it worked perfectly
> :) It is also very appreciated to have a pre-built icecat by the QA :).

Thanks for the review!
Clément




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests.
  2023-10-20 12:40     ` Clément Lassieur
@ 2023-10-23  7:14       ` Mathieu Othacehe
  2023-10-23  9:55         ` bug#66408: " Clément Lassieur
  0 siblings, 1 reply; 12+ messages in thread
From: Mathieu Othacehe @ 2023-10-23  7:14 UTC (permalink / raw)
  To: Clément Lassieur; +Cc: Jonathan Brielmaier, 66408


Hello,

> Indeed!  That's a small change that should be in another patch I
> believe.

Agreed. I think you can go ahead!

Thanks,

Mathieu




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [bug#66408] [PATCH v3] gnu: icecat: Add support for Guix packaged extensions.
  2023-10-11 12:26 ` [bug#66408] [PATCH v3] " Clément Lassieur
  2023-10-11 14:52   ` Clément Lassieur
@ 2023-10-23  7:37   ` Andrew Tropin
  1 sibling, 0 replies; 12+ messages in thread
From: Andrew Tropin @ 2023-10-23  7:37 UTC (permalink / raw)
  To: Clément Lassieur, 66408; +Cc: Jonathan Brielmaier, Clément Lassieur

[-- Attachment #1: Type: text/plain, Size: 15040 bytes --]

On 2023-10-11 14:26, Clément Lassieur wrote:

> * gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION
> procedure that makes sure the add-on directory is a symlink, so that Icecat
> can normalize it into a package store path.
> * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches.
> * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the
> add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION.
> [arguments]: Use the add-on ID as root directory.
> (ublock-origin/icecat): New procedure.
> * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused
> 'apply-guix-specific-patches' phase so that it applies the following two
> patches.
> [native-search-paths]: New field.
> * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares
> add-on paths (which are package store paths) to detect package changes.
> * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that
> replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR".
> ---
>  gnu/build/icecat-extension.scm                | 71 +++++++++++++++++++
>  gnu/local.mk                                  |  3 +
>  gnu/packages/browser-extensions.scm           | 13 +++-
>  gnu/packages/gnuzilla.scm                     | 22 +++---
>  .../patches/icecat-compare-paths.patch        | 19 +++++
>  .../patches/icecat-use-guix-extensions.patch  | 52 ++++++++++++++
>  6 files changed, 167 insertions(+), 13 deletions(-)
>  create mode 100644 gnu/build/icecat-extension.scm
>  create mode 100644 gnu/packages/patches/icecat-compare-paths.patch
>  create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch
>
> diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm
> new file mode 100644
> index 000000000000..8ecd8a505f72
> --- /dev/null
> +++ b/gnu/build/icecat-extension.scm
> @@ -0,0 +1,71 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
> +;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
> +;;;
> +;;; This file is part of GNU Guix.
> +;;;
> +;;; GNU Guix 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 3 of the License, or (at
> +;;; your option) any later version.
> +;;;
> +;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
> +
> +(define-module (gnu build icecat-extension)
> +  #:use-module (guix gexp)
> +  #:use-module (guix packages)
> +  #:use-module (guix build-system trivial)
> +  #:export (make-icecat-extension))
> +
> +(define* (make-icecat-extension pkg #:optional (pkg-output "out"))
> +  "Create an Icecat extension from package PKG and return a package that,
> +when installed, will make the extension contained in PKG available as an
> +Icecat browser extension.  PKG-OUTPUT specifies which output of PKG to use."
> +  (package
> +    (inherit pkg)
> +    (name (string-append (package-name pkg) "-icecat"))
> +    (native-inputs '())
> +    (inputs '())
> +    (propagated-inputs '())
> +    (outputs '("out"))
> +    (build-system trivial-build-system)
> +    (arguments
> +     (list
> +      #:modules '((guix build utils))
> +      #:builder
> +      #~(begin
> +          (use-modules (guix build utils))
> +          (let* ((id #$(assq-ref (package-properties pkg) 'id))
> +                 (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
> +                 (search-dir (string-append #$output
> +                                            "/share/icecat/extensions/"
> +                                            moz-app-id)))
> +            ;; Icecat's iterates over `search-dir` for directories.  If a
> +            ;; directory's name is not a valid add-on ID, it is ignored.  See
> +            ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm.
> +
> +            ;; This directory has to be a symlink, because Icecat's
> +            ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a
> +            ;; symlink.
> +
> +            ;; Normalizing is required because Icecat compares the add-on path
> +            ;; against its local database to know if there is an extension
> +            ;; update.  We want the add-on path to be the package store path,
> +            ;; so that a path change is detected every time the package is
> +            ;; updated.  See `updateExistingAddon()` in XPIDatabase.jsm, with
> +            ;; our patch `icecat-compare-paths.patch`.
> +
> +            ;; We don't want the add-on path to be the profile store path,
> +            ;; which would change too often.  We don't want the add-on path to
> +            ;; be hard-coded ("/usr/share/mozilla/extensions") either because
> +            ;; it would never change.
> +
> +            (mkdir-p search-dir)
> +            (symlink (in-vicinity (ungexp pkg pkg-output) id)
> +                     (in-vicinity search-dir id))))))))
> diff --git a/gnu/local.mk b/gnu/local.mk
> index 9fa52833cbc5..1bf925a57d9e 100644
> --- a/gnu/local.mk
> +++ b/gnu/local.mk
> @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES =				\
>    %D%/build/chromium-extension.scm		\
>    %D%/build/cross-toolchain.scm			\
>    %D%/build/dbus-service.scm			\
> +  %D%/build/icecat-extension.scm		\
>    %D%/build/image.scm				\
>    %D%/build/jami-service.scm			\
>    %D%/build/file-systems.scm			\
> @@ -1415,6 +1416,8 @@ dist_patch_DATA =						\
>    %D%/packages/patches/icecat-makeicecat.patch			\
>    %D%/packages/patches/icecat-102-makeicecat.patch		\
>    %D%/packages/patches/icecat-avoid-bundled-libraries.patch	\
> +  %D%/packages/patches/icecat-compare-paths.patch		\
> +  %D%/packages/patches/icecat-use-guix-extensions.patch		\
>    %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch	\
>    %D%/packages/patches/icecat-use-system-media-libs.patch	\
>    %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch	\
> diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
> index 3f6da8d77a3f..8a76f3a3e042 100644
> --- a/gnu/packages/browser-extensions.scm
> +++ b/gnu/packages/browser-extensions.scm
> @@ -1,6 +1,7 @@
>  ;;; GNU Guix --- Functional package management for GNU
>  ;;; Copyright © 2020, 2021 Marius Bakke <marius@gnu.org>
>  ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
> +;;; Copyright © 2023 Clément Lassieur <clement@lassieur.org>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions)
>    #:use-module (guix build-system gnu)
>    #:use-module ((guix licenses) #:prefix license:)
>    #:use-module (gnu build chromium-extension)
> +  #:use-module (gnu build icecat-extension)
>    #:use-module (gnu packages compression)
>    #:use-module (gnu packages python))
>  
> @@ -98,6 +100,7 @@ (define ublock-origin
>                  "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1"))))
>      (build-system gnu-build-system)
>      (outputs '("xpi" "firefox" "chromium"))
> +    (properties '((id . "uBlock0@raymondhill.net")))
>      (arguments
>       (list
>        #:tests? #f                      ;no tests
> @@ -125,9 +128,10 @@ (define ublock-origin
>                (invoke "./tools/make-chromium.sh")))
>            (add-after 'build-chromium 'install
>              (lambda* (#:key outputs #:allow-other-keys)
> -              (let ((firefox (assoc-ref outputs "firefox"))
> -                    (xpi (assoc-ref outputs "xpi"))
> -                    (chromium (assoc-ref outputs "chromium")))
> +              (let* ((id #$(assq-ref (package-properties this-package) 'id))
> +                     (firefox (in-vicinity (assoc-ref outputs "firefox") id))
> +                     (xpi (assoc-ref outputs "xpi"))
> +                     (chromium (assoc-ref outputs "chromium")))
>                  (install-file "dist/build/uBlock0.firefox.xpi"
>                                (string-append xpi "/lib/mozilla/extensions"))
>                  (copy-recursively "dist/build/uBlock0.firefox" firefox)
> @@ -142,3 +146,6 @@ (define ublock-origin
>  
>  (define-public ublock-origin/chromium
>    (make-chromium-extension ublock-origin "chromium"))
> +
> +(define-public ublock-origin/icecat
> +  (make-icecat-extension ublock-origin "firefox"))
> diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
> index a367d7a00ff6..608219c97303 100644
> --- a/gnu/packages/gnuzilla.scm
> +++ b/gnu/packages/gnuzilla.scm
> @@ -885,16 +885,13 @@ (define-public icecat-minimal
>        #:phases
>        #~(modify-phases %standard-phases
>            (add-after 'unpack 'apply-guix-specific-patches
> -            (lambda* (#:key inputs native-inputs #:allow-other-keys)
> -              (let ((patch (search-input-file inputs "bin/patch")))
> -                (for-each (match-lambda
> -                            ((label . file)
> -                             (when (and (string-prefix? "icecat-" label)
> -                                        (string-suffix? ".patch" label))
> -                               (format #t "applying '~a'...~%" file)
> -                               (invoke patch "--force" "--no-backup-if-mismatch"
> -                                       "-p1" "--input" file))))
> -                          (or native-inputs inputs)))))
> +            (lambda _
> +              (for-each
> +               (lambda (file) (invoke "patch" "--force" "-p1" "-i" file))
> +               '(#$(local-file
> +                    (search-patch "icecat-compare-paths.patch"))
> +                 #$(local-file
> +                    (search-patch "icecat-use-guix-extensions.patch"))))))
>            (add-after 'apply-guix-specific-patches 'remove-bundled-libraries
>              (lambda _
>                ;; Remove bundled libraries that we don't use, since they may
> @@ -1138,6 +1135,11 @@ (define-public icecat-minimal
>                   '("default16.png" "default22.png" "default24.png"
>                     "default32.png" "default48.png" "content/icon64.png"
>                     "mozicon128.png" "default256.png"))))))))
> +    (native-search-paths
> +     (list (search-path-specification
> +            (variable "ICECAT_EXTENSION_DIR")
> +            (separator #f)              ;single entry
> +            (files '("share/icecat/extensions")))))
>      (home-page "https://www.gnu.org/software/gnuzilla/")
>      (synopsis "Entirely free browser derived from Mozilla Firefox")
>      (description
> diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch
> new file mode 100644
> index 000000000000..9205899dc0c4
> --- /dev/null
> +++ b/gnu/packages/patches/icecat-compare-paths.patch
> @@ -0,0 +1,19 @@
> +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
> ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
> +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = {
> +     if (
> +       newAddon ||
> +       oldAddon.updateDate != xpiState.mtime ||
> ++      oldAddon.path != xpiState.path ||
> +       (aUpdateCompatibility && this.isAppBundledLocation(installLocation))
> +     ) {
> +       newAddon = this.updateMetadata(
> +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = {
> +         xpiState,
> +         newAddon
> +       );
> +-    } else if (oldAddon.path != xpiState.path) {
> +-      newAddon = this.updatePath(installLocation, oldAddon, xpiState);
> +     } else if (aUpdateCompatibility || aSchemaChange) {
> +       newAddon = this.updateCompatibility(
> +         installLocation,
> diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch
> new file mode 100644
> index 000000000000..f2fe4260c2cd
> --- /dev/null
> +++ b/gnu/packages/patches/icecat-use-guix-extensions.patch
> @@ -0,0 +1,52 @@
> +--- a/toolkit/xre/nsXREDirProvider.cpp
> ++++ b/toolkit/xre/nsXREDirProvider.cpp
> +@@ -415,13 +415,7 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
> + #if defined(XP_UNIX) && !defined(XP_MACOSX)
> +   else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) {
> + #  ifdef ENABLE_SYSTEM_EXTENSION_DIRS
> +-#    if defined(__OpenBSD__) || defined(__FreeBSD__)
> +-    static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions";
> +-#    else
> +-    static const char* const sysLExtDir = "/usr/share/mozilla/extensions";
> +-#    endif
> +-    rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false,
> +-                               getter_AddRefs(file));
> ++    rv = GetGuixExtensionDir(getter_AddRefs(file));
> + #  endif
> +   }
> + #endif  // defined(XP_UNIX) && !defined(XP_MACOSX)
> +@@ -1198,6 +1192,24 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
> +   return NS_OK;
> + }
> + 
> ++nsresult nsXREDirProvider::GetGuixExtensionDir(nsIFile** aFile) {
> ++  nsresult rv;
> ++  nsCOMPtr<nsIFile> localDir;
> ++
> ++#if defined(XP_UNIX)
> ++  const char* extensionDir = getenv("ICECAT_EXTENSION_DIR");
> ++  if (!extensionDir || !*extensionDir) return NS_ERROR_FAILURE;
> ++
> ++  rv = NS_NewNativeLocalFile(nsDependentCString(extensionDir), true,
> ++                             getter_AddRefs(localDir));
> ++#else
> ++#  error "Don't know how to get product dir on your platform"
> ++#endif
> ++
> ++  NS_IF_ADDREF(*aFile = localDir);
> ++  return rv;
> ++}
> ++
> + nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
> +                                                     bool aLocal) {
> +   // Copied from nsAppFileLocationProvider (more or less)
> +--- a/toolkit/xre/nsXREDirProvider.h
> ++++ b/toolkit/xre/nsXREDirProvider.h
> +@@ -112,6 +112,7 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
> +  private:
> +   nsresult GetFilesInternal(const char* aProperty,
> +                             nsISimpleEnumerator** aResult);
> ++  static nsresult GetGuixExtensionDir(nsIFile** aFile);
> +   static nsresult GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal);
> +   static nsresult GetSysUserExtensionsDirectory(nsIFile** aFile);
> + #if defined(XP_UNIX) || defined(XP_MACOSX)
>
> base-commit: 9ad9113fc238ee8de5191a5e15b5153fd149e9fa

Looks good!

-- 
Best regards,
Andrew Tropin

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#66408: [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests.
  2023-10-23  7:14       ` Mathieu Othacehe
@ 2023-10-23  9:55         ` Clément Lassieur
  0 siblings, 0 replies; 12+ messages in thread
From: Clément Lassieur @ 2023-10-23  9:55 UTC (permalink / raw)
  To: Mathieu Othacehe, Andrew Tropin; +Cc: 66408-done, Jonathan Brielmaier

Andrew Tropin <andrew@trop.in> writes:

> Looks good!

Mathieu Othacehe <othacehe@gnu.org> writes:

> Hello,
>
>> Indeed!  That's a small change that should be in another patch I
>> believe.
>
> Agreed. I think you can go ahead!
>
> Thanks,
>
> Mathieu

Pushed as 25043e01b6cb6696ffdc6cdedd9cdf8235bb695c, thanks!




^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-10-23  9:57 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-08 16:26 [bug#66408] [PATCH] gnu: icecat: Add support for Guix packaged extensions Clément Lassieur
2023-10-08 23:07 ` [bug#66408] [PATCH v2] " Clément Lassieur
2023-10-11 12:26 ` [bug#66408] [PATCH v3] " Clément Lassieur
2023-10-11 14:52   ` Clément Lassieur
2023-10-23  7:37   ` Andrew Tropin
2023-10-17 12:48 ` [bug#66408] [PATCH v4] " Clément Lassieur
2023-10-17 16:45 ` [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests Clément Lassieur
2023-10-20 10:01   ` Mathieu Othacehe
2023-10-20 12:40     ` Clément Lassieur
2023-10-23  7:14       ` Mathieu Othacehe
2023-10-23  9:55         ` bug#66408: " Clément Lassieur
2023-10-20 12:26 ` [bug#66408] [PATCH v6] " Clément Lassieur

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.