summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2022-04-26 12:19:41 +0200
committerMaximilian Bosch <maximilian@mbosch.me>2022-05-20 01:21:20 +0200
commit72a14ea563a3f5bf85db659349a533fe75a8b0ce (patch)
tree2efe0917804963ba5dbca434ded84a780df557e7
parent977df9de2e2705651903e7a7ba2478f52917b7e5 (diff)
downloadnixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.tar
nixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.tar.gz
nixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.tar.bz2
nixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.tar.lz
nixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.tar.xz
nixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.tar.zst
nixpkgs-72a14ea563a3f5bf85db659349a533fe75a8b0ce.zip
mailman: refactor package structure
* Removed unused `.package`-option.
* Added explicit postgresql support.
* Create a new meta-package for mailman to make sure each component has
  the **same** python and packages can be downgraded if needed (e.g.
  psycopg2 or sqlalchemy) without interfering with `pythonPackages` in any way.
* Document why certain python overrides are needed.

Closes #170035
Closes #158424
-rw-r--r--nixos/modules/services/mail/mailman.nix34
-rw-r--r--pkgs/servers/mail/mailman/default.nix105
-rw-r--r--pkgs/servers/mail/mailman/hyperkitty.nix30
-rw-r--r--pkgs/servers/mail/mailman/mailman-hyperkitty.nix (renamed from pkgs/development/python-modules/mailman-hyperkitty/default.nix)10
-rw-r--r--pkgs/servers/mail/mailman/package.nix76
-rw-r--r--pkgs/servers/mail/mailman/postorius.nix6
-rw-r--r--pkgs/servers/mail/mailman/python.nix30
-rw-r--r--pkgs/servers/mail/mailman/web.nix6
-rw-r--r--pkgs/servers/mail/mailman/wrapped.nix20
-rw-r--r--pkgs/top-level/all-packages.nix6
-rw-r--r--pkgs/top-level/python-aliases.nix5
-rw-r--r--pkgs/top-level/python-packages.nix10
12 files changed, 164 insertions, 174 deletions
diff --git a/nixos/modules/services/mail/mailman.nix b/nixos/modules/services/mail/mailman.nix
index f1e074587b3..4dd3af219f1 100644
--- a/nixos/modules/services/mail/mailman.nix
+++ b/nixos/modules/services/mail/mailman.nix
@@ -6,10 +6,11 @@ let
 
   cfg = config.services.mailman;
 
-  pythonEnv = pkgs.python3.withPackages (ps:
-    [ps.mailman ps.mailman-web]
-    ++ lib.optional cfg.hyperkitty.enable ps.mailman-hyperkitty
-    ++ cfg.extraPythonPackages);
+  pythonEnv = pkgs.mailmanPackages.buildEnv {
+    withHyperkitty = cfg.hyperkitty.enable;
+  };
+
+  withPostgresql = config.services.postgresql.enable;
 
   # This deliberately doesn't use recursiveUpdate so users can
   # override the defaults.
@@ -72,6 +73,9 @@ in {
       stored in the world-readable Nix store.  To continue using
       Hyperkitty, you must set services.mailman.hyperkitty.enable = true.
     '')
+    (mkRemovedOptionModule [ "services" "mailman" "package" ] ''
+      Didn't have an effect for several years.
+    '')
   ];
 
   options = {
@@ -84,14 +88,6 @@ in {
         description = "Enable Mailman on this host. Requires an active MTA on the host (e.g. Postfix).";
       };
 
-      package = mkOption {
-        type = types.package;
-        default = pkgs.mailman;
-        defaultText = literalExpression "pkgs.mailman";
-        example = literalExpression "pkgs.mailman.override { archivers = []; }";
-        description = "Mailman package to use";
-      };
-
       enablePostfix = mkOption {
         type = types.bool;
         default = true;
@@ -185,7 +181,7 @@ in {
       mailman.layout = "fhs";
 
       "paths.fhs" = {
-        bin_dir = "${pkgs.python3Packages.mailman}/bin";
+        bin_dir = "${pkgs.mailmanPackages.mailman}/bin";
         var_dir = "/var/lib/mailman";
         queue_dir = "$var_dir/queue";
         template_dir = "$var_dir/templates";
@@ -320,8 +316,10 @@ in {
         description = "GNU Mailman Master Process";
         before = lib.optional cfg.enablePostfix "postfix.service";
         after = [ "network.target" ]
-          ++ lib.optional cfg.enablePostfix "postfix-setup.service";
+          ++ lib.optional cfg.enablePostfix "postfix-setup.service"
+          ++ lib.optional withPostgresql "postgresql.service";
         restartTriggers = [ config.environment.etc."mailman.cfg".source ];
+        requires = optional withPostgresql "postgresql.service";
         wantedBy = [ "multi-user.target" ];
         serviceConfig = {
           ExecStart = "${pythonEnv}/bin/mailman start";
@@ -340,6 +338,8 @@ in {
         before = [ "mailman.service" "mailman-web-setup.service" "mailman-uwsgi.service" "hyperkitty.service" ];
         requiredBy = [ "mailman.service" "mailman-web-setup.service" "mailman-uwsgi.service" "hyperkitty.service" ];
         path = with pkgs; [ jq ];
+        after = optional withPostgresql "postgresql.service";
+        requires = optional withPostgresql "postgresql.service";
         serviceConfig.Type = "oneshot";
         script = ''
           mailmanDir=/var/lib/mailman
@@ -404,7 +404,9 @@ in {
         uwsgiConfigFile = pkgs.writeText "uwsgi-mailman.json" (builtins.toJSON uwsgiConfig);
       in {
         wantedBy = ["multi-user.target"];
-        requires = ["mailman-uwsgi.socket" "mailman-web-setup.service"];
+        after = optional withPostgresql "postgresql.service";
+        requires = ["mailman-uwsgi.socket" "mailman-web-setup.service"]
+          ++ optional withPostgresql "postgresql.service";
         restartTriggers = [ config.environment.etc."mailman3/settings.py".source ];
         serviceConfig = {
           # Since the mailman-web settings.py obstinately creates a logs
@@ -462,7 +464,7 @@ in {
   };
 
   meta = {
-    maintainers = with lib.maintainers; [ lheckemann qyliss ];
+    maintainers = with lib.maintainers; [ lheckemann qyliss ma27 ];
     doc = ./mailman.xml;
   };
 
diff --git a/pkgs/servers/mail/mailman/default.nix b/pkgs/servers/mail/mailman/default.nix
index f5632df7949..7345f78dec5 100644
--- a/pkgs/servers/mail/mailman/default.nix
+++ b/pkgs/servers/mail/mailman/default.nix
@@ -1,95 +1,30 @@
-{ lib, buildPythonPackage, fetchPypi, fetchpatch, pythonOlder, python3, postfix, lynx
-}:
+{ newScope, lib, python3 }:
 
 let
-  # Mailman does not support sqlalchemy >= 1.4 https://gitlab.com/mailman/mailman/-/issues/845
-  pythonOverride = python3.override {
-    packageOverrides = self: super: {
-      alembic = super.alembic.overridePythonAttrs (oldAttrs:  {
-        # does not find tests
-        doCheck = false;
-      });
-      sqlalchemy = super.sqlalchemy.overridePythonAttrs (oldAttrs: rec {
-        version = "1.3.24";
-        src = oldAttrs.src.override {
-          inherit version;
-          hash = "sha256-67t3fL+TEjWbiXv4G6ANrg9ctp+6KhgmXcwYpvXvdRk=";
-        };
-        # does not find tests
-        doCheck = false;
-      });
-    };
-  };
-in
+  callPackage = newScope self;
 
-buildPythonPackage rec {
-  pname = "mailman";
-  version = "3.3.5";
-  disabled = pythonOlder "3.6";
+  self = lib.makeExtensible (self: {
+    python3 = callPackage ./python.nix { inherit python3; };
 
-  src = fetchPypi {
-    inherit pname version;
-    sha256 = "12mgxs1ndhdjjkydx48b95na9k9h0disfqgrr6wxx7vda6dqvcwz";
-  };
+    hyperkitty = callPackage ./hyperkitty.nix { };
 
-  propagatedBuildInputs = with pythonOverride.pkgs; [
-    aiosmtpd
-    alembic
-    authheaders
-    click
-    dnspython
-    falcon
-    flufl_bounce
-    flufl_i18n
-    flufl_lock
-    gunicorn
-    importlib-resources
-    lazr_config
-    passlib
-    requests
-    sqlalchemy
-    zope_component
-    zope_configuration
-  ];
+    mailman = callPackage ./package.nix { };
 
-  patches = [
-    (fetchpatch {
-      url = "https://gitlab.com/mailman/mailman/-/commit/4b206e2a5267a0e17f345fd7b2d957122ba57566.patch";
-      sha256 = "06axmrn74p81wvcki36c7gfj5fp5q15zxz2yl3lrvijic7hbs4n2";
-    })
-    (fetchpatch {
-      url = "https://gitlab.com/mailman/mailman/-/commit/9613154f3c04fa2383fbf017031ef263c291418d.patch";
-      sha256 = "0vyw87s857vfxbf7kihwb6w094xyxmxbi1bpdqi3ybjamjycp55r";
-    })
-    ./log-stderr.patch
-  ];
+    mailman-hyperkitty = callPackage ./mailman-hyperkitty.nix { };
 
-  postPatch = ''
-    substituteInPlace setup.py \
-      --replace "alembic>=1.6.2,<1.7" "alembic>=1.6.2"
+    postorius = callPackage ./postorius.nix { };
 
-    substituteInPlace src/mailman/config/postfix.cfg \
-      --replace /usr/sbin/postmap ${postfix}/bin/postmap
-    substituteInPlace src/mailman/config/schema.cfg \
-      --replace /usr/bin/lynx ${lynx}/bin/lynx
-  '';
+    web = callPackage ./web.nix { };
 
-  # Mailman assumes that those scripts in $out/bin are Python scripts. Wrapping
-  # them in shell code breaks this assumption. Use the wrapped version (see
-  # wrapped.nix) if you need the CLI (rather than the Python library).
-  #
-  # This gives a properly wrapped 'mailman' command plus an interpreter that
-  # has all the necessary search paths to execute unwrapped 'master' and
-  # 'runner' scripts.
-  dontWrapPythonPrograms = true;
+    buildEnv = { web ? self.web
+               , mailman ? self.mailman
+               , mailman-hyperkitty ? self.mailman-hyperkitty
+               , withHyperkitty ? false
+               }:
+      self.python3.withPackages
+        (ps:
+          [ web mailman ps.psycopg2 ]
+          ++ lib.optional withHyperkitty mailman-hyperkitty);
+  });
 
-  # requires flufl.testing, which the upstream has archived
-  doCheck = false;
-
-  meta = {
-    homepage = "https://www.gnu.org/software/mailman/";
-    description = "Free software for managing electronic mail discussion and newsletter lists";
-    license = lib.licenses.gpl3Plus;
-    maintainers = with lib.maintainers; [ qyliss ];
-  };
-}
+in self
diff --git a/pkgs/servers/mail/mailman/hyperkitty.nix b/pkgs/servers/mail/mailman/hyperkitty.nix
index b84e78e323d..c10f2c1ba75 100644
--- a/pkgs/servers/mail/mailman/hyperkitty.nix
+++ b/pkgs/servers/mail/mailman/hyperkitty.nix
@@ -1,34 +1,10 @@
 { lib
-, buildPythonPackage
+, python3
 , fetchpatch
-, fetchPypi
-, pythonOlder
-
-# dependencies
-, defusedxml
-, django
-, django-gravatar2
-, django-haystack
-, django-mailman3
-, django-paintstore
-, django-q
-, django_compressor
-, django-extensions
-, djangorestframework
-, flufl_lock
-, mistune_2_0
-, networkx
-, psycopg2
-, python-dateutil
-, robot-detection
-
-# tests
-, beautifulsoup4
-, elasticsearch
-, mock
-, whoosh
 }:
 
+with python3.pkgs;
+
 buildPythonPackage rec {
   pname = "HyperKitty";
   # Note: Mailman core must be on the latest version before upgrading HyperKitty.
diff --git a/pkgs/development/python-modules/mailman-hyperkitty/default.nix b/pkgs/servers/mail/mailman/mailman-hyperkitty.nix
index 117ec4fb436..39f9b5ec37a 100644
--- a/pkgs/development/python-modules/mailman-hyperkitty/default.nix
+++ b/pkgs/servers/mail/mailman/mailman-hyperkitty.nix
@@ -1,15 +1,9 @@
 { lib
-, buildPythonPackage
-, fetchPypi
+, python3
 , mailman
-, mock
-, nose2
-, python
-, pythonOlder
-, requests
-, zope_interface
 }:
 
+with python3.pkgs;
 buildPythonPackage rec {
   pname = "mailman-hyperkitty";
   version = "1.2.0";
diff --git a/pkgs/servers/mail/mailman/package.nix b/pkgs/servers/mail/mailman/package.nix
new file mode 100644
index 00000000000..a990f3cdb05
--- /dev/null
+++ b/pkgs/servers/mail/mailman/package.nix
@@ -0,0 +1,76 @@
+{ lib, fetchpatch, python3, postfix, lynx
+}:
+
+with python3.pkgs;
+
+buildPythonPackage rec {
+  pname = "mailman";
+  version = "3.3.5";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12mgxs1ndhdjjkydx48b95na9k9h0disfqgrr6wxx7vda6dqvcwz";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    aiosmtpd
+    alembic
+    authheaders
+    click
+    dnspython
+    falcon
+    flufl_bounce
+    flufl_i18n
+    flufl_lock
+    gunicorn
+    importlib-resources
+    lazr_config
+    passlib
+    requests
+    sqlalchemy
+    zope_component
+    zope_configuration
+  ];
+
+  patches = [
+    (fetchpatch {
+      url = "https://gitlab.com/mailman/mailman/-/commit/4b206e2a5267a0e17f345fd7b2d957122ba57566.patch";
+      sha256 = "06axmrn74p81wvcki36c7gfj5fp5q15zxz2yl3lrvijic7hbs4n2";
+    })
+    (fetchpatch {
+      url = "https://gitlab.com/mailman/mailman/-/commit/9613154f3c04fa2383fbf017031ef263c291418d.patch";
+      sha256 = "0vyw87s857vfxbf7kihwb6w094xyxmxbi1bpdqi3ybjamjycp55r";
+    })
+    ./log-stderr.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "alembic>=1.6.2,<1.7" "alembic>=1.6.2"
+
+    substituteInPlace src/mailman/config/postfix.cfg \
+      --replace /usr/sbin/postmap ${postfix}/bin/postmap
+    substituteInPlace src/mailman/config/schema.cfg \
+      --replace /usr/bin/lynx ${lynx}/bin/lynx
+  '';
+
+  # Mailman assumes that those scripts in $out/bin are Python scripts. Wrapping
+  # them in shell code breaks this assumption. Use the wrapped version (see
+  # wrapped.nix) if you need the CLI (rather than the Python library).
+  #
+  # This gives a properly wrapped 'mailman' command plus an interpreter that
+  # has all the necessary search paths to execute unwrapped 'master' and
+  # 'runner' scripts.
+  dontWrapPythonPrograms = true;
+
+  # requires flufl.testing, which the upstream has archived
+  doCheck = false;
+
+  meta = {
+    homepage = "https://www.gnu.org/software/mailman/";
+    description = "Free software for managing electronic mail discussion and newsletter lists";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ qyliss ma27 ];
+  };
+}
diff --git a/pkgs/servers/mail/mailman/postorius.nix b/pkgs/servers/mail/mailman/postorius.nix
index 4022b6fe91c..bd4425e5efa 100644
--- a/pkgs/servers/mail/mailman/postorius.nix
+++ b/pkgs/servers/mail/mailman/postorius.nix
@@ -1,6 +1,6 @@
-{ lib, buildPythonPackage, fetchPypi, beautifulsoup4, vcrpy, mock
-, django-mailman3, mailmanclient, readme_renderer
-}:
+{ lib, python3 }:
+
+with python3.pkgs;
 
 buildPythonPackage rec {
   pname = "postorius";
diff --git a/pkgs/servers/mail/mailman/python.nix b/pkgs/servers/mail/mailman/python.nix
new file mode 100644
index 00000000000..359f974f598
--- /dev/null
+++ b/pkgs/servers/mail/mailman/python.nix
@@ -0,0 +1,30 @@
+{ python3 }:
+
+python3.override {
+  packageOverrides = self: super: {
+    # does not find tests
+    alembic = super.alembic.overridePythonAttrs (oldAttrs:  {
+      doCheck = false;
+    });
+    # Needed by mailman, see https://gitlab.com/mailman/mailman/-/issues/964
+    sqlalchemy = super.sqlalchemy.overridePythonAttrs (oldAttrs: rec {
+      version = "1.3.24";
+      src = super.fetchPypi {
+        inherit version;
+        inherit (oldAttrs) pname;
+        sha256 = "06bmxzssc66cblk1hamskyv5q3xf1nh1py3vi6dka4lkpxy7gfzb";
+      };
+      # does not find tests
+      doCheck = false;
+    });
+    # Fixes `AssertionError: database connection isn't set to UTC`
+    psycopg2 = super.psycopg2.overridePythonAttrs (a: (rec {
+      version = "2.8.6";
+      src = super.fetchPypi {
+        inherit version;
+        inherit (a) pname;
+        sha256 = "fb23f6c71107c37fd667cb4ea363ddeb936b348bbd6449278eb92c189699f543";
+      };
+    }));
+  };
+}
diff --git a/pkgs/servers/mail/mailman/web.nix b/pkgs/servers/mail/mailman/web.nix
index adad9d21943..64489bc3e41 100644
--- a/pkgs/servers/mail/mailman/web.nix
+++ b/pkgs/servers/mail/mailman/web.nix
@@ -1,7 +1,9 @@
-{ buildPythonPackage, lib, fetchPypi, pythonOlder
-, sassc, hyperkitty, postorius, whoosh, setuptools-scm
+{ lib, python3
+, sassc, hyperkitty, postorius
 }:
 
+with python3.pkgs;
+
 buildPythonPackage rec {
   pname = "mailman-web";
   version = "0.0.5";
diff --git a/pkgs/servers/mail/mailman/wrapped.nix b/pkgs/servers/mail/mailman/wrapped.nix
deleted file mode 100644
index c244af10e78..00000000000
--- a/pkgs/servers/mail/mailman/wrapped.nix
+++ /dev/null
@@ -1,20 +0,0 @@
-{ runCommand, lib, makeWrapper, python3
-, archivers ? [ python3.pkgs.mailman-hyperkitty ]
-}:
-
-let
-  inherit (python3.pkgs) makePythonPath mailman;
-in
-
-runCommand "${mailman.name}-wrapped" {
-  inherit (mailman) meta;
-  nativeBuildInputs = [ makeWrapper ];
-  passthru = mailman.passthru // { unwrapped = mailman; };
-} ''
-  mkdir -p "$out/bin"
-  cd "${mailman}/bin"
-  for exe in *; do
-    makeWrapper "${mailman}/bin/$exe" "$out/bin/$exe" \
-        --set PYTHONPATH ${makePythonPath ([ mailman ] ++ archivers)}
-  done
-''
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 743d67d5d6a..e6f5b514e1b 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -21858,12 +21858,12 @@ with pkgs;
 
   mackerel-agent = callPackage ../servers/monitoring/mackerel-agent { };
 
-  mailman = callPackage ../servers/mail/mailman/wrapped.nix { };
+  mailmanPackages = callPackage ../servers/mail/mailman { };
+  inherit (mailmanPackages) mailman mailman-hyperkitty;
+  mailman-web = mailmanPackages.web;
 
   mailman-rss = callPackage ../tools/misc/mailman-rss { };
 
-  mailman-web = with python3.pkgs; toPythonApplication mailman-web;
-
   listadmin = callPackage ../applications/networking/listadmin {};
 
   maker-panel = callPackage ../tools/misc/maker-panel { };
diff --git a/pkgs/top-level/python-aliases.nix b/pkgs/top-level/python-aliases.nix
index d8e5c19f0c7..477f403c702 100644
--- a/pkgs/top-level/python-aliases.nix
+++ b/pkgs/top-level/python-aliases.nix
@@ -77,6 +77,7 @@ mapAliases ({
   HAP-python = hap-python; # added 2021-06-01
   hbmqtt = throw "hbmqtt was removed because it is no longer maintained"; # added 2021-11-07
   hdlparse = throw "hdlparse has been removed, it was using setuptools 2to3 translation feature, which has been removed in setuptools 58"; # added 2022-01-18
+  hyperkitty = throw "Please use pkgs.mailmanPackages.hyperkitty"; # added 2022-04-29
   IMAPClient = imapclient; # added 2021-10-28
   jupyter_client = jupyter-client; # added 2021-10-15
   Keras = keras; # added 2021-11-25
@@ -85,12 +86,16 @@ mapAliases ({
   Markups = markups; # added 2022-02-14
   MechanicalSoup = mechanicalsoup; # added 2021-06-01
   memcached = python-memcached; # added 2022-05-06
+  mailman = throw "Please use pkgs.mailman"; # added 2022-04-29
+  mailman-hyperkitty = throw "Please use pkgs.mailmanPackages.mailman-hyperkitty"; # added 2022-04-29
+  mailman-web = throw "Please use pkgs.mailman-web"; # added 2022-04-29
   net2grid = gridnet; # add 2022-04-22
   nose-cover3 = throw "nose-cover3 has been removed, it was using setuptools 2to3 translation feature, which has been removed in setuptools 58"; # added 2022-02-16
   pam = python-pam; # added 2020-09-07.
   PasteDeploy = pastedeploy; # added 2021-10-07
   pathpy = path; # added 2022-04-12
   pep257 = pydocstyle; # added 2022-04-12
+  postorius = throw "Please use pkgs.mailmanPackages.postorius"; # added 2022-04-29
   powerlineMemSegment = powerline-mem-segment; # added 2021-10-08
   privacyidea = throw "privacyidea has been renamed to pkgs.privacyidea"; # added 2021-06-20
   prometheus_client = prometheus-client; # added 2021-06-10
diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix
index 0ed03be8d5e..25e9132e160 100644
--- a/pkgs/top-level/python-packages.nix
+++ b/pkgs/top-level/python-packages.nix
@@ -4017,8 +4017,6 @@ in {
 
   hyperion-py = callPackage ../development/python-modules/hyperion-py { };
 
-  hyperkitty = callPackage ../servers/mail/mailman/hyperkitty.nix { };
-
   hyperlink = callPackage ../development/python-modules/hyperlink { };
 
   hyperopt = callPackage ../development/python-modules/hyperopt { };
@@ -5068,14 +5066,8 @@ in {
 
   mailchimp = callPackage ../development/python-modules/mailchimp { };
 
-  mailman = callPackage ../servers/mail/mailman { };
-
   mailmanclient = callPackage ../development/python-modules/mailmanclient { };
 
-  mailman-hyperkitty = callPackage ../development/python-modules/mailman-hyperkitty { };
-
-  mailman-web = callPackage ../servers/mail/mailman/web.nix { };
-
   rtmixer = callPackage ../development/python-modules/rtmixer { };
 
   mail-parser = callPackage ../development/python-modules/mail-parser { };
@@ -6657,8 +6649,6 @@ in {
 
   poster3 = callPackage ../development/python-modules/poster3 { };
 
-  postorius = callPackage ../servers/mail/mailman/postorius.nix { };
-
   pot = callPackage ../development/python-modules/pot { };
 
   potentials = callPackage ../development/python-modules/potentials { };