about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/package-management
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/package-management')
-rw-r--r--nixpkgs/pkgs/tools/package-management/akku/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/package-management/akku/hardcode-libcurl.patch18
-rw-r--r--nixpkgs/pkgs/tools/package-management/apk-tools/default.nix49
-rw-r--r--nixpkgs/pkgs/tools/package-management/apkg/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/package-management/appimage-run/default.nix29
-rw-r--r--nixpkgs/pkgs/tools/package-management/appimage-run/test.nix37
-rw-r--r--nixpkgs/pkgs/tools/package-management/appimagekit/default.nix131
-rw-r--r--nixpkgs/pkgs/tools/package-management/appimagekit/nix.patch82
-rw-r--r--nixpkgs/pkgs/tools/package-management/apt-dater/default.nix50
-rw-r--r--nixpkgs/pkgs/tools/package-management/apx/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/package-management/cde/default.nix50
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/default.nix81
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/empty-dirs.patch49
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/etc-dirs.patch25
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/glibc-check.patch71
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/missing-functions.patch162
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/readlink-types.patch19
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/scandir.patch75
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/set-buildroot.patch15
-rw-r--r--nixpkgs/pkgs/tools/package-management/checkinstall/use-old-memcpy.patch12
-rw-r--r--nixpkgs/pkgs/tools/package-management/ciel/Cargo.lock2342
-rw-r--r--nixpkgs/pkgs/tools/package-management/ciel/default.nix72
-rw-r--r--nixpkgs/pkgs/tools/package-management/clib/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/package-management/comma/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/package-management/conda/default.nix96
-rw-r--r--nixpkgs/pkgs/tools/package-management/createrepo_c/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/package-management/createrepo_c/fix-bash-completion-path.patch11
-rw-r--r--nixpkgs/pkgs/tools/package-management/createrepo_c/fix-python-install-path.patch11
-rw-r--r--nixpkgs/pkgs/tools/package-management/deploy-rs/default.nix34
-rw-r--r--nixpkgs/pkgs/tools/package-management/disnix/DisnixWebService/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/package-management/disnix/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/package-management/disnix/disnixos/default.nix21
-rw-r--r--nixpkgs/pkgs/tools/package-management/disnix/dydisnix/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/package-management/disnix/dysnomia/default.nix88
-rw-r--r--nixpkgs/pkgs/tools/package-management/dnf5/default.nix121
-rw-r--r--nixpkgs/pkgs/tools/package-management/dpkg/default.nix99
-rw-r--r--nixpkgs/pkgs/tools/package-management/dpkg/setup-hook.sh12
-rw-r--r--nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile2
-rw-r--r--nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile.lock39
-rw-r--r--nixpkgs/pkgs/tools/package-management/elm-github-install/default.nix22
-rw-r--r--nixpkgs/pkgs/tools/package-management/elm-github-install/gemset.nix114
-rw-r--r--nixpkgs/pkgs/tools/package-management/emplace/default.nix23
-rw-r--r--nixpkgs/pkgs/tools/package-management/fortran-fpm/default.nix49
-rw-r--r--nixpkgs/pkgs/tools/package-management/fpm/Gemfile3
-rw-r--r--nixpkgs/pkgs/tools/package-management/fpm/Gemfile.lock43
-rw-r--r--nixpkgs/pkgs/tools/package-management/fpm/default.nix18
-rw-r--r--nixpkgs/pkgs/tools/package-management/fpm/gemset.nix146
-rw-r--r--nixpkgs/pkgs/tools/package-management/fusesoc/default.nix39
-rw-r--r--nixpkgs/pkgs/tools/package-management/gx/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/package-management/gx/go/default.nix24
-rw-r--r--nixpkgs/pkgs/tools/package-management/harmonia/default.nix55
-rw-r--r--nixpkgs/pkgs/tools/package-management/holo-build/default.nix60
-rw-r--r--nixpkgs/pkgs/tools/package-management/home-manager/default.nix93
-rw-r--r--nixpkgs/pkgs/tools/package-management/libcomps/default.nix65
-rw-r--r--nixpkgs/pkgs/tools/package-management/libcomps/fix-python-install-dir.patch13
-rw-r--r--nixpkgs/pkgs/tools/package-management/libdnf/default.nix104
-rw-r--r--nixpkgs/pkgs/tools/package-management/libdnf/fix-python-install-dir.patch12
-rw-r--r--nixpkgs/pkgs/tools/package-management/librepo/default.nix64
-rw-r--r--nixpkgs/pkgs/tools/package-management/licensee/Gemfile2
-rw-r--r--nixpkgs/pkgs/tools/package-management/licensee/Gemfile.lock42
-rw-r--r--nixpkgs/pkgs/tools/package-management/licensee/default.nix18
-rw-r--r--nixpkgs/pkgs/tools/package-management/licensee/gemset.nix159
-rw-r--r--nixpkgs/pkgs/tools/package-management/microdnf/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/package-management/micromamba/default.nix79
-rw-r--r--nixpkgs/pkgs/tools/package-management/morph/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/package-management/mynewt-newt/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/package-management/nfpm/default.nix45
-rw-r--r--nixpkgs/pkgs/tools/package-management/niff/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-bundle/default.nix61
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-doc/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-du/default.nix50
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-eval-jobs/default.nix47
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-index/default.nix35
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-index/wrapper.nix14
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-pin/default.nix51
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-prefetch-scripts/default.nix46
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-prefetch/default.nix81
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-serve/default.nix51
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-simple-deploy/default.nix31
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-template/default.nix52
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-top/default.nix53
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-universal-prefetch/default.nix33
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-update-source/default.nix59
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix-update/default.nix43
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix/common.nix252
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix/default.nix277
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix/nix-perl.nix43
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch127
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix/patches/boehmgc-coroutine-sp-fallback.patch45
-rw-r--r--nixpkgs/pkgs/tools/package-management/nix/patches/flaky-tests.patch12
-rw-r--r--nixpkgs/pkgs/tools/package-management/nixpkgs-review/default.nix70
-rw-r--r--nixpkgs/pkgs/tools/package-management/nox/default.nix32
-rw-r--r--nixpkgs/pkgs/tools/package-management/nox/nox-review-wip.patch11
-rw-r--r--nixpkgs/pkgs/tools/package-management/npm-check-updates/default.nix27
-rw-r--r--nixpkgs/pkgs/tools/package-management/nvd/default.nix42
-rw-r--r--nixpkgs/pkgs/tools/package-management/opkg-utils/default.nix25
-rw-r--r--nixpkgs/pkgs/tools/package-management/opkg/default.nix54
-rw-r--r--nixpkgs/pkgs/tools/package-management/packagekit/default.nix112
-rw-r--r--nixpkgs/pkgs/tools/package-management/packagekit/qt.nix24
-rw-r--r--nixpkgs/pkgs/tools/package-management/pacman/default.nix134
-rw-r--r--nixpkgs/pkgs/tools/package-management/pacman/dont-create-empty-dirs.patch20
-rw-r--r--nixpkgs/pkgs/tools/package-management/pacup/default.nix46
-rw-r--r--nixpkgs/pkgs/tools/package-management/pdm/default.nix112
-rw-r--r--nixpkgs/pkgs/tools/package-management/pkg/default.nix37
-rw-r--r--nixpkgs/pkgs/tools/package-management/poetry/default.nix53
-rw-r--r--nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-audit-plugin.nix54
-rw-r--r--nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-export.nix38
-rw-r--r--nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-up.nix43
-rw-r--r--nixpkgs/pkgs/tools/package-management/poetry/unwrapped.nix171
-rw-r--r--nixpkgs/pkgs/tools/package-management/poetry2conda/default.nix48
-rw-r--r--nixpkgs/pkgs/tools/package-management/protontricks/default.nix68
-rw-r--r--nixpkgs/pkgs/tools/package-management/protontricks/steam-run.patch470
-rw-r--r--nixpkgs/pkgs/tools/package-management/repro-get/default.nix74
-rw-r--r--nixpkgs/pkgs/tools/package-management/rpm/default.nix100
-rw-r--r--nixpkgs/pkgs/tools/package-management/smlpkg/default.nix44
-rw-r--r--nixpkgs/pkgs/tools/package-management/wapm/cli/default.nix38
-rw-r--r--nixpkgs/pkgs/tools/package-management/xbps/cert-paths.patch25
-rw-r--r--nixpkgs/pkgs/tools/package-management/xbps/default.nix49
-rw-r--r--nixpkgs/pkgs/tools/package-management/yarn-lock-converter/default.nix50
-rw-r--r--nixpkgs/pkgs/tools/package-management/yarn-lock-converter/package-lock.json592
-rw-r--r--nixpkgs/pkgs/tools/package-management/yarn-lock-converter/source.json6
-rwxr-xr-xnixpkgs/pkgs/tools/package-management/yarn-lock-converter/update.sh25
122 files changed, 9899 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/tools/package-management/akku/default.nix b/nixpkgs/pkgs/tools/package-management/akku/default.nix
new file mode 100644
index 000000000000..68ee94d3f94e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/akku/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchFromGitLab, autoreconfHook, pkg-config, guile, curl, substituteAll }:
+
+stdenv.mkDerivation rec {
+  pname = "akku";
+  version = "1.1.0";
+
+  src = fetchFromGitLab {
+    owner = "akkuscm";
+    repo = "akku";
+    rev = "v${version}";
+    sha256 = "1pi18aamg1fd6f9ynfl7zx92052xzf0zwmhi2pwcwjs1kbah19f5";
+  };
+
+  patches = [
+    # substitute libcurl path
+    (substituteAll {
+      src = ./hardcode-libcurl.patch;
+      libcurl = "${curl.out}/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+
+  buildInputs = [ guile ];
+
+  # Use a dummy package index to boostrap Akku
+  preBuild = ''
+    touch bootstrap.db
+  '';
+
+  makeFlags = [ "GUILE_AUTO_COMPILE=0" ];
+
+  meta = with lib; {
+    homepage = "https://akkuscm.org/";
+    description = "Language package manager for Scheme";
+    changelog = "https://gitlab.com/akkuscm/akku/-/raw/v${version}/NEWS.md";
+    platforms = platforms.all;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marsam ];
+    mainProgram = "akku";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/akku/hardcode-libcurl.patch b/nixpkgs/pkgs/tools/package-management/akku/hardcode-libcurl.patch
new file mode 100644
index 000000000000..7c5b8b50c320
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/akku/hardcode-libcurl.patch
@@ -0,0 +1,18 @@
+--- old/private/http.scm
++++ new/private/http.scm
+@@ -101,14 +101,7 @@
+                  ;; shouldn't, but it's an old issue.
+                  (log/error "Could not load libcurl. Please install the curl development(!) package.")
+                  (exit 1)))
+-          (case (os-name)
+-            ((darwin) (set! libcurl (open-shared-object "libcurl.dylib")))
+-            ((msys) (set! libcurl (open-shared-object "msys-curl-4")))
+-            (else
+-             (guard (exn
+-                     (else
+-                      (set! libcurl (open-shared-object "libcurl.so.3"))))
+-               (set! libcurl (open-shared-object "libcurl.so.4"))))))
++          (set! libcurl (open-shared-object "@libcurl@")))
+         (letrec ()
+           (define %curl_global_init (foreign-procedure libcurl int curl_global_init (long)))
+           (call %curl_global_init #b11)))
diff --git a/nixpkgs/pkgs/tools/package-management/apk-tools/default.nix b/nixpkgs/pkgs/tools/package-management/apk-tools/default.nix
new file mode 100644
index 000000000000..4a460adfd0ff
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/apk-tools/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, fetchFromGitLab, pkg-config, scdoc, openssl, zlib
+, luaSupport ? stdenv.hostPlatform == stdenv.buildPlatform, lua
+}:
+
+stdenv.mkDerivation rec {
+  pname = "apk-tools";
+  version = "2.14.0";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.alpinelinux.org";
+    owner = "alpine";
+    repo = "apk-tools";
+    rev = "v${version}";
+    sha256 = "sha256-NbADp017wL6h+Owg/GISidoXEq0seWaa98/Hyyq6pYc=";
+  };
+
+  nativeBuildInputs = [ pkg-config scdoc ]
+    ++ lib.optionals luaSupport [ lua lua.pkgs.lua-zlib ];
+  buildInputs = [ openssl zlib ] ++ lib.optional luaSupport lua;
+  strictDeps = true;
+
+  makeFlags = [
+    "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
+    "SBINDIR=$(out)/bin"
+    "LIBDIR=$(out)/lib"
+    "LUA=${if luaSupport then "lua" else "no"}"
+    "LUA_LIBDIR=$(out)/lib/lua/${lib.versions.majorMinor lua.version}"
+    "MANDIR=$(out)/share/man"
+    "DOCDIR=$(out)/share/doc/apk"
+    "INCLUDEDIR=$(out)/include"
+    "PKGCONFIGDIR=$(out)/lib/pkgconfig"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-Wno-error=unused-result"
+    "-Wno-error=deprecated-declarations"
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://gitlab.alpinelinux.org/alpine/apk-tools";
+    description = "Alpine Package Keeper";
+    maintainers = with maintainers; [ qyliss ];
+    license = licenses.gpl2Only;
+    platforms = platforms.linux;
+    mainProgram = "apk";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/apkg/default.nix b/nixpkgs/pkgs/tools/package-management/apkg/default.nix
new file mode 100644
index 000000000000..18b52f0bcdb8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/apkg/default.nix
@@ -0,0 +1,52 @@
+{ lib, fetchFromGitLab, python3Packages
+, gitMinimal, rpm, dpkg, fakeroot
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "apkg";
+  version = "0.4.1";
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.nic.cz";
+    owner = "packaging";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "x7UYkqkF1XJ3OMfQpIQ4+27KI0dLvL42Wms5xQTY/H4=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    # copy&pasted requirements.txt (almost exactly)
+    beautifulsoup4   # upstream version detection
+    blessed          # terminal colors
+    build            # apkg distribution
+    cached-property  # for python <= 3.7; but pip complains even with 3.8
+    click            # nice CLI framework
+    distro           # current distro detection
+    jinja2           # templating
+    packaging        # version parsing
+    requests         # HTTP for humansâ„¢
+    toml             # config files
+  ];
+
+  nativeBuildInputs = with python3Packages; [ hatchling ];
+
+  makeWrapperArgs = [ # deps for `srcpkg` operation for other distros; could be optional
+    "--prefix" "PATH" ":" (lib.makeBinPath [ gitMinimal rpm dpkg fakeroot ])
+  ];
+
+  nativeCheckInputs = with python3Packages; [ pytest dunamai ];
+  checkPhase = ''
+    runHook preCheck
+    py.test # inspiration: .gitlab-ci.yml
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Upstream packaging automation tool";
+    homepage = "https://pkg.labs.nic.cz/pages/apkg";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.vcunat /* close to upstream */ ];
+    mainProgram = "apkg";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/appimage-run/default.nix b/nixpkgs/pkgs/tools/package-management/appimage-run/default.nix
new file mode 100644
index 000000000000..286fd9d7ff68
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/appimage-run/default.nix
@@ -0,0 +1,29 @@
+{ appimageTools, buildFHSEnv, makeDesktopItem, extraPkgs ? pkgs: [], appimage-run-tests ? null }:
+
+let
+  name = "appimage-run";
+
+  fhsArgs = appimageTools.defaultFhsEnvArgs;
+
+  desktopItem = makeDesktopItem {
+    inherit name;
+    exec = name;
+    desktopName = name;
+    genericName = "AppImage runner";
+    noDisplay = true;
+    mimeTypes = ["application/vnd.appimage" "application/x-iso9660-appimage"];
+    categories = ["PackageManager" "Utility"];
+  };
+in buildFHSEnv (fhsArgs // {
+  inherit name;
+
+  targetPkgs = pkgs: [ appimageTools.appimage-exec ]
+    ++ fhsArgs.targetPkgs pkgs ++ extraPkgs pkgs;
+  runScript = "appimage-exec.sh";
+
+  extraInstallCommands = ''
+    cp --recursive "${desktopItem}/share" "$out/"
+  '';
+
+  passthru.tests.appimage-run = appimage-run-tests;
+})
diff --git a/nixpkgs/pkgs/tools/package-management/appimage-run/test.nix b/nixpkgs/pkgs/tools/package-management/appimage-run/test.nix
new file mode 100644
index 000000000000..8a6e27095123
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/appimage-run/test.nix
@@ -0,0 +1,37 @@
+{ runCommand, fetchurl, appimage-run, glibcLocales, file, xdg-utils }:
+let
+  # any AppImage usable on cli, really
+  sample-appImage = fetchurl {
+    url = "https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage";
+    sha256 =  "04ws94q71bwskmhizhwmaf41ma4wabvfgjgkagr8wf3vakgv866r";
+  };
+  owdtest = fetchurl {
+    url = "https://github.com/NixOS/nixpkgs/files/10099048/owdtest.AppImage.gz";
+    sha256 = "sha256-EEp9dxz/+l5XkNaVBFgv5v64sizQILnljRAzwXv/yV8=";
+  };
+in
+  runCommand "appimage-run-tests" {
+    buildInputs = [ appimage-run glibcLocales file xdg-utils ];
+    meta.platforms = [ "x86_64-linux" ];
+  }
+  ''
+    export HOME=$(mktemp -d)
+    set -x
+
+    # regression test for #101137, must come first
+    LANG=fr_FR appimage-run ${sample-appImage} --list ${sample-appImage}
+
+    # regression test for #108426
+    cp ${sample-appImage} foo.appImage
+    LANG=fr_FR appimage-run ${sample-appImage} --list foo.appImage
+    cp ${owdtest} owdtest.AppImage.gz
+    gunzip owdtest.AppImage.gz
+    appimage-run owdtest.AppImage
+
+    # Verify desktop entry
+    XDG_DATA_DIRS="${appimage-run}/share"
+    [[ "$(xdg-mime query default application/vnd.appimage)" == '${appimage-run.name}.desktop' ]]
+
+    set +x
+    touch $out
+  ''
diff --git a/nixpkgs/pkgs/tools/package-management/appimagekit/default.nix b/nixpkgs/pkgs/tools/package-management/appimagekit/default.nix
new file mode 100644
index 000000000000..d11cd1612758
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/appimagekit/default.nix
@@ -0,0 +1,131 @@
+{ lib, stdenv, fetchFromGitHub
+, pkg-config, cmake, autoconf, automake, libtool, makeWrapper
+, wget, xxd, desktop-file-utils, file
+, gnupg, glib, zlib, cairo, openssl, fuse, xz, squashfuse, inotify-tools, libarchive
+, squashfsTools
+, gtest
+}:
+
+let
+
+  appimagekit_src = fetchFromGitHub {
+    owner = "AppImage";
+    repo = "AppImageKit";
+    rev = "8bbf694455d00f48d835f56afaa1dabcd9178ba6";
+    sha256 = "sha256-pqg+joomC5CI9WdKP/h/XKPsruMgZEaIOjPLOqnNPZw=";
+    fetchSubmodules = true;
+  };
+
+  # squashfuse adapted to nix from cmake experession in "${appimagekit_src}/lib/libappimage/cmake/dependencies.cmake"
+  appimagekit_squashfuse = squashfuse.overrideAttrs rec {
+    pname = "squashfuse";
+    version = "unstable-2016-10-09";
+
+    src = fetchFromGitHub {
+      owner = "vasi";
+      repo  = pname;
+      rev = "1f980303b89c779eabfd0a0fdd36d6a7a311bf92";
+      sha256 = "sha256-BZd1+7sRYZHthULKk3RlgMIy4uCUei45GbSEiZxLPFM=";
+    };
+
+    patches = [
+      "${appimagekit_src}/lib/libappimage/src/patches/squashfuse.patch"
+      "${appimagekit_src}/lib/libappimage/src/patches/squashfuse_dlopen.patch"
+    ];
+
+    postPatch = ''
+      cp -v ${appimagekit_src}/lib/libappimage/src/patches/squashfuse_dlopen.[hc] .
+    '';
+
+    # Workaround build failure on -fno-common toolchains:
+    #   ld: libsquashfuse_ll.a(libfuseprivate_la-fuseprivate.o):(.bss+0x8):
+    #     multiple definition of `have_libloaded'; runtime.4.o:(.bss.have_libloaded+0x0): first defined here
+    env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+    preConfigure = ''
+      sed -i "/PKG_CHECK_MODULES.*/,/,:./d" configure
+      sed -i "s/typedef off_t sqfs_off_t/typedef int64_t sqfs_off_t/g" common.h
+    '';
+
+    configureFlags = [
+      "--disable-demo" "--disable-high-level" "--without-lzo" "--without-lz4"
+    ];
+
+    postConfigure = ''
+      sed -i "s|XZ_LIBS = -llzma |XZ_LIBS = -Bstatic -llzma/|g" Makefile
+    '';
+
+    # only static libs and header files
+    installPhase = ''
+      mkdir -p $out/lib $out/include
+      cp -v ./.libs/*.a $out/lib
+      cp -v ./*.h $out/include
+    '';
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "appimagekit";
+  version = "unstable-2020-12-31";
+
+  src = appimagekit_src;
+
+  patches = [ ./nix.patch ];
+
+  postPatch = ''
+    patchShebangs src/embed-magic-bytes-in-file.sh
+  '';
+
+  nativeBuildInputs = [
+    pkg-config cmake autoconf automake libtool wget xxd
+    desktop-file-utils makeWrapper
+  ];
+
+  buildInputs = [
+    glib zlib cairo openssl fuse xz inotify-tools
+    libarchive squashfsTools appimagekit_squashfuse
+  ];
+
+  preConfigure = ''
+    export HOME=$(pwd)
+  '';
+
+  cmakeFlags = [
+    "-DUSE_SYSTEM_XZ=ON"
+    "-DUSE_SYSTEM_SQUASHFUSE=ON"
+    "-DSQUASHFUSE=${appimagekit_squashfuse}"
+    "-DUSE_SYSTEM_LIBARCHIVE=ON"
+    "-DUSE_SYSTEM_GTEST=ON"
+    "-DUSE_SYSTEM_MKSQUASHFS=ON"
+    "-DTOOLS_PREFIX=${stdenv.cc.targetPrefix}"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/lib/appimagekit
+    cp "${squashfsTools}/bin/mksquashfs" "$out/lib/appimagekit/"
+    cp "${desktop-file-utils}/bin/desktop-file-validate" "$out/bin"
+
+    wrapProgram "$out/bin/appimagetool" \
+      --prefix PATH : "${lib.makeBinPath [ file gnupg ]}" \
+      --unset SOURCE_DATE_EPOCH
+  '';
+
+  nativeCheckInputs = [ gtest ];
+
+  # for debugging
+  passthru = {
+    squashfuse = appimagekit_squashfuse;
+  };
+
+  meta = with lib; {
+    description = "A tool to package desktop applications as AppImages";
+    longDescription = ''
+      AppImageKit is an implementation of the AppImage format that
+      provides tools such as appimagetool and appimaged for handling
+      AppImages.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ taeer ];
+    homepage = src.meta.homepage;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/appimagekit/nix.patch b/nixpkgs/pkgs/tools/package-management/appimagekit/nix.patch
new file mode 100644
index 000000000000..f03922cb5ca4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/appimagekit/nix.patch
@@ -0,0 +1,82 @@
+Submodule lib/libappimage contains modified content
+diff --git a/lib/libappimage/cmake/dependencies.cmake b/lib/libappimage/cmake/dependencies.cmake
+index 8d96484..c7b17a1 100644
+--- a/lib/libappimage/cmake/dependencies.cmake
++++ b/lib/libappimage/cmake/dependencies.cmake
+@@ -91,9 +91,18 @@ if(NOT USE_SYSTEM_SQUASHFUSE)
+         INCLUDE_DIRS "<SOURCE_DIR>"
+     )
+ else()
+-    message(STATUS "Using system squashfuse")
++    message(STATUS "Using system squashfsfuse from ${SQUASHFUSE}")
+
+-    import_pkgconfig_target(TARGET_NAME libsquashfuse PKGCONFIG_TARGET squashfuse)
++    add_library(libsquashfuse INTERFACE IMPORTED GLOBAL)
++
++    set(squashfuse_INCLUDE_DIRS "${SQUASHFUSE}/include")
++    set(squashfuse_LIBRARIES "${SQUASHFUSE}/lib/libsquashfuse.a;${SQUASHFUSE}/lib/libsquashfuse_ll.a;${SQUASHFUSE}/lib/libfuseprivate.a")
++
++    set_property(
++      TARGET libsquashfuse
++      PROPERTY INTERFACE_LINK_LIBRARIES ${squashfuse_LIBRARIES}
++    )
++    include_directories(${squashfuse_INCLUDE_DIRS})
+ endif()
+
+
+diff --git a/src/appimagetool.c b/src/appimagetool.c
+index 6b37419..23425e7 100644
+--- a/src/appimagetool.c
++++ b/src/appimagetool.c
+@@ -38,7 +38,7 @@
+ #include <argp.h>
+
+ #include <fcntl.h>
+-#include "squashfuse.h"
++#include <squashfuse.h>
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+@@ -96,7 +96,7 @@ static void die(const char *msg) {
+ }
+
+ /* Function that prints the contents of a squashfs file
+-* using libsquashfuse (#include "squashfuse.h") */
++* using libsquashfuse (#include <squashfuse.h>) */
+ int sfs_ls(char* image) {
+     sqfs_err err = SQFS_OK;
+     sqfs_traverse trv;
+diff --git a/src/appimagetoolnoglib.c b/src/appimagetoolnoglib.c
+index f900e76..ffa87f8 100644
+--- a/src/appimagetoolnoglib.c
++++ b/src/appimagetoolnoglib.c
+@@ -3,7 +3,7 @@
+
+ #include <stdlib.h>
+ #include <fcntl.h>
+-#include "squashfuse.h"
++#include <squashfuse.h>
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+@@ -118,7 +118,7 @@ int is_regular_file(const char *path)
+ }
+
+ /* Function that prints the contents of a squashfs file
+- * using libsquashfuse (#include "squashfuse.h") */
++ * using libsquashfuse (#include <squashfuse.h>) */
+ int sfs_ls(char* image) {
+ 	sqfs_err err = SQFS_OK;
+ 	sqfs_traverse trv;
+diff --git a/src/runtime.c b/src/runtime.c
+index bada3af..70a642b 100644
+--- a/src/runtime.c
++++ b/src/runtime.c
+@@ -29,7 +29,7 @@
+
+ #define _GNU_SOURCE
+
+-#include "squashfuse.h"
++#include <squashfuse.h>
+ #include <squashfs_fs.h>
+ #include <nonstd.h>
diff --git a/nixpkgs/pkgs/tools/package-management/apt-dater/default.nix b/nixpkgs/pkgs/tools/package-management/apt-dater/default.nix
new file mode 100644
index 000000000000..a15ec7e9c168
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/apt-dater/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchFromGitHub
+, autoreconfHook, pkg-config, gettext
+, vim, glib, libxml2, ncurses, popt, screen
+}:
+
+stdenv.mkDerivation rec {
+  pname = "apt-dater";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "DE-IBH";
+    repo = "apt-dater";
+    rev = "v${version}";
+    sha256 = "1r6gz9jkh1wxi11mcq5p9mqg0szclsaq8ic79vnfnbjdrmmdfi4y";
+  };
+
+  nativeBuildInputs = [
+    pkg-config autoreconfHook gettext
+  ];
+
+  buildInputs = [
+    libxml2 ncurses vim glib popt screen
+  ];
+
+  configureFlags = [ "--disable-history" ];
+
+  prePatch = ''
+    substituteInPlace etc/Makefile.am \
+      --replace 02770 0770
+  '';
+
+  postPatch = ''
+    substituteInPlace configure.ac \
+      --replace "/usr/bin/screen" "${screen}/bin/screen"
+  '';
+
+  doCheck = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/DE-IBH/apt-dater";
+    description = "Terminal-based remote package update manager";
+    longDescription = ''
+      Provides an ncurses frontend for managing package updates on a large
+      number of remote hosts using SSH. It supports Debian-based managed hosts
+      as well as rug (e.g. openSUSE) and yum (e.g. CentOS) based systems.
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ c0bw3b ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/apx/default.nix b/nixpkgs/pkgs/tools/package-management/apx/default.nix
new file mode 100644
index 000000000000..eb7b0f3a8c71
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/apx/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, distrobox
+}:
+
+buildGoModule rec {
+  pname = "apx";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "Vanilla-OS";
+    repo = "apx";
+    rev = "v${version}";
+    hash = "sha256-0xQfbnLvNB1X1B8440CYHZWFGSQV319IU5tgXS3lyUI=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" "-w" ];
+
+  postPatch = ''
+    substituteInPlace config/apx.json \
+      --replace "/usr/share/apx/distrobox/distrobox" "${distrobox}/bin/distrobox" \
+      --replace "/usr/share/apx" "$out/bin/apx"
+    substituteInPlace settings/config.go \
+      --replace "/usr/share/apx/" "$out/share/apx/"
+  '';
+
+  postInstall = ''
+    install -D config/apx.json -t $out/share/apx/
+    install -D man/man1/apx.1 -t $out/man/man1/
+  '';
+
+  meta = with lib; {
+    description = "The Vanilla OS package manager";
+    homepage = "https://github.com/Vanilla-OS/apx";
+    changelog = "https://github.com/Vanilla-OS/apx/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ dit7ya chewblacka ];
+    mainProgram = "apx";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/cde/default.nix b/nixpkgs/pkgs/tools/package-management/cde/default.nix
new file mode 100644
index 000000000000..2e0ceb53e4f9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/cde/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchFromGitHub, libxcrypt }:
+
+stdenv.mkDerivation rec {
+  pname = "cde";
+  version = "0.1";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "corr-CDE";
+    rev = "v${version}";
+    sha256 = "sha256-s375gtqBWx0GGXALXR+fN4bb3tmpvPNu/3bNz+75UWU=";
+  };
+
+  # The build is small, so there should be no problem
+  # running this locally. There is also a use case for
+  # older systems, where modern binaries might not be
+  # useful.
+  preferLocalBuild = true;
+
+  buildInputs = [ libxcrypt ];
+
+  patchBuild = ''
+    sed -i -e '/install/d' $src/Makefile
+  '';
+
+  preBuild = ''
+    patchShebangs .
+  '';
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: ../readelf-mini/libreadelf-mini.a(dwarf.o):/build/source/readelf-mini/dwarf.c:64:
+  #     multiple definition of `do_wide'; ../readelf-mini/libreadelf-mini.a(readelf-mini.o):/build/source/readelf-mini/readelf-mini.c:170: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  installPhase = ''
+    install -d $out/bin
+    install -t $out/bin cde cde-exec
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/usnistgov/corr-CDE";
+    description = "A packaging tool for building portable packages";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.rlupton20 ];
+    platforms = platforms.linux;
+    # error: architecture aarch64 is not supported by bundled strace
+    badPlatforms = [ "aarch64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/default.nix b/nixpkgs/pkgs/tools/package-management/checkinstall/default.nix
new file mode 100644
index 000000000000..323464847b60
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/default.nix
@@ -0,0 +1,81 @@
+{lib, stdenv, fetchurl, gettext }:
+
+stdenv.mkDerivation rec {
+  pname = "checkinstall";
+  version = "1.6.2";
+
+  src = fetchurl {
+    url = "https://www.asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-${version}.tar.gz";
+    sha256 = "1x4kslyvfd6lm6zd1ylbq2pjxrafb77ydfjaqi16sa5qywn1jqfw";
+  };
+
+  patches = [
+    # Include empty directories created by the installation script in
+    # generated packages.  (E.g., if a `make install' does `mkdir
+    # /var/lib/mystuff', then /var/lib/mystuff should be included in
+    # the package.)
+    ./empty-dirs.patch
+
+    # Implement the getxattr(), lgetxattr(), __open_2() and
+    # __open64_2() functions.  Needed for doing builds on Ubuntu 8.10.
+    ./missing-functions.patch
+
+    # Don't include directories in the Debian `conffiles' file.
+    ./etc-dirs.patch
+
+    # Support Glibc >= 2.8.
+    ./glibc-check.patch
+
+    # Fix a `conflicting types for 'scandir'' error on Glibc 2.11.
+    ./scandir.patch
+
+    # Fix a `conflicting types for 'readlink'' error since Glibc 2.19
+    ./readlink-types.patch
+
+    # Fix BuildRoot handling in RPM builds.
+    ./set-buildroot.patch
+
+    (fetchurl {
+      url = "https://salsa.debian.org/debian/checkinstall/-/raw/7175ae9de0e45f42fdd7f185ab9a12043d5efeeb/debian/patches/0016-Define-_STAT_VER-_MKNOD_VER-locally-dropped-in-glibc.patch";
+      hash = "sha256-InodEfvVMuN708yjXPrVXb+q8aUcyFhCLx35PHls0Eo=";
+    })
+  ]
+
+  ++ lib.optional (stdenv.hostPlatform.system == "x86_64-linux")
+    # Force use of old memcpy so that installwatch works on Glibc <
+    # 2.14.
+    ./use-old-memcpy.patch;
+
+  buildInputs = [gettext];
+
+  hardeningDisable = [ "fortify" ];
+
+  preBuild = ''
+    makeFlagsArray=(PREFIX=$out)
+
+    substituteInPlace checkinstall --replace /usr/local/lib/checkinstall $out/lib/checkinstall
+    substituteInPlace checkinstallrc-dist --replace /usr/local $out
+
+    substituteInPlace installwatch/create-localdecls \
+      --replace /usr/include/unistd.h ${stdenv.cc.libc.dev}/include/unistd.h
+  '';
+
+  postInstall =
+    # Clear the RPATH, otherwise installwatch.so won't work properly
+    # as an LD_PRELOADed library on applications that load against a
+    # different Glibc.
+    ''
+       patchelf --set-rpath "" $out/lib/installwatch.so
+    '';
+
+  meta = {
+    homepage = "http://checkinstall.izto.org/";
+    description = "A tool for automatically generating Slackware, RPM or Debian packages when doing `make install'";
+    maintainers = [ lib.maintainers.eelco ];
+    platforms = lib.platforms.linux;
+    license = lib.licenses.gpl2;
+    knownVulnerabilities = [
+      "CVE-2020-25031"
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/empty-dirs.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/empty-dirs.patch
new file mode 100644
index 000000000000..9a3e29c84c12
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/empty-dirs.patch
@@ -0,0 +1,49 @@
+diff -rc checkinstall-orig/checkinstall checkinstall/checkinstall
+*** checkinstall-orig/checkinstall	2009-03-12 13:40:24.000000000 +0100
+--- checkinstall/checkinstall	2009-03-27 14:51:55.000000000 +0100
+***************
+*** 1635,1644 ****
+  
+  	# Find regular files first
+  	[ $DEBUG -gt 0 ] && echo "debug: BASE_TMP_DIR: $BASE_TMP_DIR"
+! 	cat /${TMP_DIR}/newfiles.tmp | egrep -v '^[-0-9][0-9]*[[:space:]]*(unlink|access)' | cut -f 3 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | sort -u > /${TMP_DIR}/newfiles
+  
+  	# symlinks are next
+! 	cat /${TMP_DIR}/newfiles.tmp | egrep -v '^[-0-9][0-9]*[[:space:]]*(unlink|access)' | cut -f 4 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | grep -v "#success" | sort -u  >> /${TMP_DIR}/newfiles
+          # Create another list of modified files that exclude all files the
+          # install script wanted to create but did not, e.g because they already
+          # existed.
+--- 1635,1648 ----
+  
+  	# Find regular files first
+  	[ $DEBUG -gt 0 ] && echo "debug: BASE_TMP_DIR: $BASE_TMP_DIR"
+! 	cat /${TMP_DIR}/newfiles.tmp | egrep -v '^[-0-9][0-9]*[[:space:]]*(unlink|access|mkdir)' | cut -f 3 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | sort -u > /${TMP_DIR}/newfiles
+  
+  	# symlinks are next
+! 	cat /${TMP_DIR}/newfiles.tmp | egrep -v '^[-0-9][0-9]*[[:space:]]*(unlink|access|mkdir)' | cut -f 4 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | grep -v "#success" | sort -u  >> /${TMP_DIR}/newfiles
+!         
+! 	# And finally newly created directories.
+! 	cat /${TMP_DIR}/newfiles.tmp | egrep '^0[[:space:]]+mkdir[[:space:]]+' | cut -f 3 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | sort -u >> /${TMP_DIR}/newfiles
+!         
+          # Create another list of modified files that exclude all files the
+          # install script wanted to create but did not, e.g because they already
+          # existed.
+***************
+*** 1738,1746 ****
+  	cd /
+  
+  	( cat /${TMP_DIR}/newfiles | while read i; do 
+! 	      if [ ! -d "${TRANSLROOT}${i}" -o -L "${TRANSLROOT}${i}" ]; then
+! 	      echo ".${i}"
+! 	   fi
+  	done ) > /${TMP_DIR}/newfiles-tar
+  
+          # Here it gets tricky: we need to copy all new files to our build dir,
+--- 1742,1748 ----
+  	cd /
+  
+  	( cat /${TMP_DIR}/newfiles | while read i; do 
+! 	    echo ".${i}"
+  	done ) > /${TMP_DIR}/newfiles-tar
+  
+          # Here it gets tricky: we need to copy all new files to our build dir,
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/etc-dirs.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/etc-dirs.patch
new file mode 100644
index 000000000000..a811e4afbb97
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/etc-dirs.patch
@@ -0,0 +1,25 @@
+diff -rc checkinstall-orig/checkinstall checkinstall/checkinstall
+*** checkinstall-orig/checkinstall	2009-03-27 17:07:26.000000000 +0100
+--- checkinstall/checkinstall	2009-04-14 16:34:08.000000000 +0200
+***************
+*** 2607,2615 ****
+     chmod 755 $BUILD_DIR/DEBIAN/postrm
+  fi
+  
+! # Tag files in /etc to be conffiles
+  find $BUILD_DIR/etc 2> /dev/null | sed -e "s,$BUILD_DIR,," | \
+! 	grep -v '^/etc$' > $BUILD_DIR/DEBIAN/conffiles
+  
+  # The package will be saved here (ignores <epoch>: prefix):
+  DEBPKG="${DIRECTORIO_FUENTE}/${NAME}_`echo ${VERSION} | sed -e 's/^[0123456789]*://'`-${RELEASE}_${ARCHITECTURE}.deb"
+--- 2607,2616 ----
+     chmod 755 $BUILD_DIR/DEBIAN/postrm
+  fi
+  
+! # Tag non-directory files in /etc to be conffiles
+  find $BUILD_DIR/etc 2> /dev/null | sed -e "s,$BUILD_DIR,," | \
+!         (while read fn; do test ! -d "$BUILD_DIR/$fn" && echo "$fn"; done) \
+!         > $BUILD_DIR/DEBIAN/conffiles
+  
+  # The package will be saved here (ignores <epoch>: prefix):
+  DEBPKG="${DIRECTORIO_FUENTE}/${NAME}_`echo ${VERSION} | sed -e 's/^[0123456789]*://'`-${RELEASE}_${ARCHITECTURE}.deb"
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/glibc-check.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/glibc-check.patch
new file mode 100644
index 000000000000..7f8cbccae8e5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/glibc-check.patch
@@ -0,0 +1,71 @@
+diff -x '*~' -rc checkinstall-1.6.2pre20081116-orig/installwatch/create-localdecls checkinstall-1.6.2pre20081116/installwatch/create-localdecls
+*** checkinstall-1.6.2pre20081116-orig/installwatch/create-localdecls	2008-11-16 17:18:58.000000000 +0100
+--- checkinstall-1.6.2pre20081116/installwatch/create-localdecls	2009-09-18 17:01:13.000000000 +0200
+***************
+*** 46,52 ****
+  echo -n 'Checking libc version... '
+  gcc -Wall -o libctest libctest.c
+  VERSION=`ldd libctest | grep libc\\.so | awk '{print $1}'`
+- rm libctest
+  echo $VERSION
+  echo "#define LIBC_VERSION \"$VERSION\"" >> $OUTFILE
+  if test "$VERSION" = 'libc.so.5' ; then
+--- 46,51 ----
+***************
+*** 56,62 ****
+  
+  if test "$VERSION" = 'libc.so.6' ; then
+  	echo -n 'Checking glibc subversion... '
+! 	tmp="`ldd /bin/sh | grep libc.so 2> /dev/null`"
+  	LibcPath=`expr "$tmp" : '[^/]*\(/[^ ]*\)'`
+  	tmp="`strings $LibcPath | grep -i 'c library'`"
+  	OsLibcMajor=`expr "$tmp" : '.* \([0-9][0-9]*\)'`
+--- 55,61 ----
+  
+  if test "$VERSION" = 'libc.so.6' ; then
+  	echo -n 'Checking glibc subversion... '
+! 	tmp="`ldd libctest | grep libc.so 2> /dev/null`"
+  	LibcPath=`expr "$tmp" : '[^/]*\(/[^ ]*\)'`
+  	tmp="`strings $LibcPath | grep -i 'c library'`"
+  	OsLibcMajor=`expr "$tmp" : '.* \([0-9][0-9]*\)'`
+***************
+*** 86,103 ****
+  		6)
+  			echo '#define GLIBC_MINOR 6' >> $OUTFILE
+  			SUBVERSION='glibc-2.6' ;;
+! 		7)
+  			echo '#define GLIBC_MINOR 7' >> $OUTFILE
+  			SUBVERSION='glibc-2.7' ;;
+  		*)
+- 			echo 'Treated as glibc >= 2.1 (finger crossed)'
+  			echo '#define GLIBC_MINOR 1' >> $OUTFILE
+  			SUBVERSION='glibc-2.1' ;;
+  	        esac
+  		;;
+  	esac
+  fi
+  
+  echo >> $OUTFILE
+  echo '#endif' >> $OUTFILE
+  
+--- 85,104 ----
+  		6)
+  			echo '#define GLIBC_MINOR 6' >> $OUTFILE
+  			SUBVERSION='glibc-2.6' ;;
+! 		7|8|9|10|11|12|13|14|15|16|17|18)
+  			echo '#define GLIBC_MINOR 7' >> $OUTFILE
+  			SUBVERSION='glibc-2.7' ;;
+  		*)
+  			echo '#define GLIBC_MINOR 1' >> $OUTFILE
+  			SUBVERSION='glibc-2.1' ;;
+  	        esac
+  		;;
+  	esac
++         echo $SUBVERSION
+  fi
+  
++ rm libctest
++ 
+  echo >> $OUTFILE
+  echo '#endif' >> $OUTFILE
+  
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/missing-functions.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/missing-functions.patch
new file mode 100644
index 000000000000..02066134b2ed
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/missing-functions.patch
@@ -0,0 +1,162 @@
+diff -rc checkinstall-orig/installwatch/installwatch.c checkinstall/installwatch/installwatch.c
+*** checkinstall-orig/installwatch/installwatch.c	2009-03-12 13:40:24.000000000 +0100
+--- checkinstall/installwatch/installwatch.c	2009-03-27 22:42:19.000000000 +0100
+***************
+*** 110,115 ****
+--- 110,117 ----
+  static int (*true_setxattr)(const char *,const char *,const void *,
+                              size_t, int);
+  static int (*true_removexattr)(const char *,const char *);
++ static ssize_t (*true_getxattr)(const char *,const char *,const void *,size_t);
++ static ssize_t (*true_lgetxattr)(const char *,const char *,const void *,size_t);
+  
+  #if(GLIBC_MINOR >= 1)
+  
+***************
+*** 369,374 ****
+--- 371,378 ----
+  	true_unlink      = dlsym(libc_handle, "unlink");
+  	true_utime       = dlsym(libc_handle, "utime");
+  	true_setxattr    = dlsym(libc_handle, "setxattr");
++ 	true_getxattr    = dlsym(libc_handle, "getxattr");
++ 	true_lgetxattr   = dlsym(libc_handle, "lgetxattr");
+          true_utimes      = dlsym(libc_handle, "utimes");
+          true_access      = dlsym(libc_handle, "access");
+  
+***************
+*** 3494,3499 ****
+--- 3498,3587 ----
+          return result;
+  }
+  
++ int getxattr (const char *pathname, const char *name,
++               const void *value, size_t size)
++ {
++         int result;
++         instw_t instw;
++ 	int status;
++ 
++         REFCOUNT;
++ 
++         if (!libc_handle)
++                initialize();
++ 
++ #if DEBUG
++         debug(2,"getxattr(%s,%s)\n",pathname,name);
++ #endif
++ 
++          /* We were asked to work in "real" mode */
++         if( !(__instw.gstatus & INSTW_INITIALIZED) ||
++            !(__instw.gstatus & INSTW_OKWRAP) ) {
++                result=true_getxattr(pathname,name,value,size);
++                return result;
++         }
++ 
++         instw_new(&instw);
++         instw_setpath(&instw,pathname);
++ 	instw_getstatus(&instw,&status);
++ 
++ #if DEBUG
++         instw_print(&instw);
++ #endif
++ 
++ 	if(status&INSTW_TRANSLATED) {
++             result=true_getxattr(instw.translpath,name,value,size);
++         } else {
++             result=true_getxattr(instw.path,name,value,size);
++         }
++ 
++         instw_delete(&instw);
++ 
++         return result;
++ }
++ 
++ int lgetxattr (const char *pathname, const char *name,
++               const void *value, size_t size)
++ {
++         int result;
++         instw_t instw;
++ 	int status;
++ 
++         REFCOUNT;
++ 
++         if (!libc_handle)
++                initialize();
++ 
++ #if DEBUG
++         debug(2,"lgetxattr(%s,%s)\n",pathname,name);
++ #endif
++ 
++          /* We were asked to work in "real" mode */
++         if( !(__instw.gstatus & INSTW_INITIALIZED) ||
++            !(__instw.gstatus & INSTW_OKWRAP) ) {
++                result=true_lgetxattr(pathname,name,value,size);
++                return result;
++         }
++ 
++         instw_new(&instw);
++         instw_setpath(&instw,pathname);
++ 	instw_getstatus(&instw,&status);
++ 
++ #if DEBUG
++         instw_print(&instw);
++ #endif
++ 
++ 	if(status&INSTW_TRANSLATED) {
++             result=true_lgetxattr(instw.translpath,name,value,size);
++         } else {
++             result=true_lgetxattr(instw.path,name,value,size);
++         }
++ 
++         instw_delete(&instw);
++ 
++         return result;
++ }
++ 
+  #if(GLIBC_MINOR >= 1)
+  
+  int creat64(const char *pathname, __mode_t mode) {
+***************
+*** 3663,3668 ****
+--- 3751,3791 ----
+  	return result;
+  }
+  
++ int __open_2(const char *pathname, int flags, ...) {
++ 	va_list ap;
++ 	mode_t mode;
++         
++ #if DEBUG
++ 	debug(2,"__open_2(%s,%d,mode)\n",pathname,flags);
++ #endif
++ 
++ 	va_start(ap, flags);
++ 	mode = va_arg(ap, mode_t);
++ 	va_end(ap);
++         
++         /* The open() function in Glibc 2.9 is an always-inline
++            function that may call __open_2(), so it's important that
++            we handle it.  I don't know what __open_2() is supposed to
++            do, but redirecting it to open() seems to work fine.  */
++         
++         return open(pathname,flags,mode);
++ }
++ 
++ int __open64_2(const char *pathname, int flags, ...) {
++ 	va_list ap;
++ 	mode_t mode;
++         
++ #if DEBUG
++ 	debug(2,"__open64_2(%s,%d,mode)\n",pathname,flags);
++ #endif
++ 
++ 	va_start(ap, flags);
++ 	mode = va_arg(ap, mode_t);
++ 	va_end(ap);
++         
++         return open64(pathname,flags,mode);
++ }
++ 
+  struct dirent64 *readdir64(DIR *dir) {
+  	struct dirent64 *result;
+  
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/readlink-types.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/readlink-types.patch
new file mode 100644
index 000000000000..a860607fcf66
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/readlink-types.patch
@@ -0,0 +1,19 @@
+Extracted from Arch's patch
+https://projects.archlinux.org/svntogit/community.git/tree/trunk/build-fix.patch?h=packages/checkinstall
+diff -wbBur checkinstall-1.6.2/installwatch/installwatch.c checkinstall-1.6.2.my/installwatch/installwatch.c
+--- checkinstall-1.6.2/installwatch/installwatch.c	2008-11-16 19:20:53.000000000 +0300
++++ checkinstall-1.6.2.my/installwatch/installwatch.c	2010-01-15 18:55:50.112716628 +0300
+@@ -2938,13 +2938,8 @@
+ 	return result;
+ }
+ 
+-#if (GLIBC_MINOR <= 4)
+-int readlink(const char *path,char *buf,size_t bufsiz) {
+-	int result;
+-#else
+ ssize_t readlink(const char *path,char *buf,size_t bufsiz) {
+ 	ssize_t result;
+-#endif
+ 	instw_t instw;
+ 	int status;
+ 
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/scandir.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/scandir.patch
new file mode 100644
index 000000000000..ae40100a9804
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/scandir.patch
@@ -0,0 +1,75 @@
+diff -rc -x '*~' checkinstall-1.6.2-orig/installwatch/installwatch.c checkinstall-1.6.2/installwatch/installwatch.c
+*** checkinstall-1.6.2-orig/installwatch/installwatch.c	2008-11-16 17:20:53.000000000 +0100
+--- checkinstall-1.6.2/installwatch/installwatch.c	2010-02-08 16:35:17.000000000 +0100
+***************
+*** 100,106 ****
+  static int (*true_lxstat)(int,const char *,struct stat *);
+  static int (*true_scandir)(	const char *,struct dirent ***,
+  				int (*)(const struct dirent *),
+! 				int (*)(const void *,const void *));
+  static int (*true_symlink)(const char *, const char *);
+  static int (*true_truncate)(const char *, TRUNCATE_T);
+  static int (*true_unlink)(const char *);
+--- 100,106 ----
+  static int (*true_lxstat)(int,const char *,struct stat *);
+  static int (*true_scandir)(	const char *,struct dirent ***,
+  				int (*)(const struct dirent *),
+! 				int (*)(const struct dirent **,const struct dirent **));
+  static int (*true_symlink)(const char *, const char *);
+  static int (*true_truncate)(const char *, TRUNCATE_T);
+  static int (*true_unlink)(const char *);
+***************
+*** 120,126 ****
+  static struct dirent64 *(*true_readdir64)(DIR *dir);
+  static int (*true_scandir64)(	const char *,struct dirent64 ***,
+  				int (*)(const struct dirent64 *),
+! 				int (*)(const void *,const void *));
+  static int (*true_xstat64)(int,const char *, struct stat64 *);
+  static int (*true_lxstat64)(int,const char *, struct stat64 *);
+  static int (*true_truncate64)(const char *, __off64_t);
+--- 120,126 ----
+  static struct dirent64 *(*true_readdir64)(DIR *dir);
+  static int (*true_scandir64)(	const char *,struct dirent64 ***,
+  				int (*)(const struct dirent64 *),
+! 				int (*)(const struct dirent64 **,const struct dirent64 **));
+  static int (*true_xstat64)(int,const char *, struct stat64 *);
+  static int (*true_lxstat64)(int,const char *, struct stat64 *);
+  static int (*true_truncate64)(const char *, __off64_t);
+***************
+*** 3077,3085 ****
+  	return result;
+  }
+  
+! int scandir(	const char *dir,struct dirent ***namelist,
+  		int (*select)(const struct dirent *),
+! 		int (*compar)(const void *,const void *)	) {
+  	int result;
+  
+  	if (!libc_handle)
+--- 3077,3085 ----
+  	return result;
+  }
+  
+! int scandir(	const char * dir,struct dirent ***namelist,
+  		int (*select)(const struct dirent *),
+! 		int (*compar)(const struct dirent **,const struct dirent **)	) {
+  	int result;
+  
+  	if (!libc_handle)
+***************
+*** 3691,3697 ****
+  
+  int scandir64(	const char *dir,struct dirent64 ***namelist,
+  		int (*select)(const struct dirent64 *),
+! 		int (*compar)(const void *,const void *)	) {
+  	int result;
+  
+  	if (!libc_handle)
+--- 3691,3697 ----
+  
+  int scandir64(	const char *dir,struct dirent64 ***namelist,
+  		int (*select)(const struct dirent64 *),
+! 		int (*compar)(const struct dirent64 **,const struct dirent64 **)	) {
+  	int result;
+  
+  	if (!libc_handle)
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/set-buildroot.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/set-buildroot.patch
new file mode 100644
index 000000000000..58840f491ecf
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/set-buildroot.patch
@@ -0,0 +1,15 @@
+https://build.opensuse.org/package/view_file/openSUSE:13.1/checkinstall/checkinstall-set_buildroot.patch
+
+Index: checkinstall
+===================================================================
+--- a/checkinstall	2009-12-26 20:17:24.000000000 +0100
++++ b/checkinstall	2011-01-31 18:17:56.171593541 +0100
+@@ -2463,7 +2463,7 @@ cd "$DIRECTORIO_FUENTE"
+ 
+ echo
+ echogn "Building RPM package..."
+-$RPMBUILD -bb ${RPM_TARGET_FLAG}${ARCHITECTURE} "$SPEC_PATH" &> ${TMP_DIR}/rpmbuild.log
++$RPMBUILD --buildroot ${BUILDROOT} -bb ${RPM_TARGET_FLAG}${ARCHITECTURE} "$SPEC_PATH" &> ${TMP_DIR}/rpmbuild.log
+ okfail
+ 
+ if [ $? -gt 0 ]; then
diff --git a/nixpkgs/pkgs/tools/package-management/checkinstall/use-old-memcpy.patch b/nixpkgs/pkgs/tools/package-management/checkinstall/use-old-memcpy.patch
new file mode 100644
index 000000000000..c8be7f0b5e26
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/checkinstall/use-old-memcpy.patch
@@ -0,0 +1,12 @@
+diff -ru -x '*~' checkinstall-1.6.2-orig/installwatch/installwatch.c checkinstall-1.6.2/installwatch/installwatch.c
+--- checkinstall-1.6.2-orig/installwatch/installwatch.c	2008-11-16 17:20:53.000000000 +0100
++++ checkinstall-1.6.2/installwatch/installwatch.c	2013-03-15 13:50:12.717646381 +0100
+@@ -28,6 +28,8 @@
+  *                                  <mail@fredemmott.co.uk>
+  */
+ 
++asm (".symver memcpy, memcpy@GLIBC_2.2.5");
++
+ #include <sys/param.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
diff --git a/nixpkgs/pkgs/tools/package-management/ciel/Cargo.lock b/nixpkgs/pkgs/tools/package-management/ciel/Cargo.lock
new file mode 100644
index 000000000000..3fce9253591d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/ciel/Cargo.lock
@@ -0,0 +1,2342 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
+
+[[package]]
+name = "ar"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69"
+
+[[package]]
+name = "async-broadcast"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b"
+dependencies = [
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b"
+dependencies = [
+ "async-lock",
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-fs"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
+dependencies = [
+ "async-lock",
+ "autocfg",
+ "blocking",
+ "futures-lite",
+]
+
+[[package]]
+name = "async-io"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794"
+dependencies = [
+ "async-lock",
+ "autocfg",
+ "concurrent-queue",
+ "futures-lite",
+ "libc",
+ "log",
+ "parking",
+ "polling",
+ "slab",
+ "socket2",
+ "waker-fn",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "async-lock"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "async-recursion"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.2",
+]
+
+[[package]]
+name = "async-task"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524"
+
+[[package]]
+name = "async-trait"
+version = "0.1.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86ea188f25f0255d8f92797797c97ebf5631fa88178beb1a46fdf5622c9a00e4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.2",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "base64"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5dd14596c0e5b954530d0e6f1fd99b89c03e313aa2086e8da4303701a09e1cf"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "blocking"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8"
+dependencies = [
+ "async-channel",
+ "async-lock",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+]
+
+[[package]]
+name = "build-env"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1522ac6ee801a11bf9ef3f80403f4ede6eb41291fac3dde3de09989679305f25"
+
+[[package]]
+name = "bumpalo"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+dependencies = [
+ "jobserver",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "ciel-rs"
+version = "3.1.4"
+dependencies = [
+ "adler32",
+ "anyhow",
+ "ar",
+ "bincode",
+ "clap",
+ "clap_complete",
+ "console",
+ "dialoguer",
+ "dotenv",
+ "faster-hex",
+ "flate2",
+ "fs3",
+ "git2",
+ "indicatif",
+ "lazy_static",
+ "libc",
+ "libmount",
+ "libsystemd-sys",
+ "nix",
+ "rand",
+ "rayon",
+ "reqwest",
+ "serde",
+ "sha2",
+ "tabwriter",
+ "tar",
+ "tempfile",
+ "time",
+ "toml",
+ "walkdir",
+ "which",
+ "xattr 1.0.0",
+ "xz2",
+ "zbus",
+]
+
+[[package]]
+name = "clap"
+version = "4.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42dfd32784433290c51d92c438bb72ea5063797fc3cc9a21a8c4346bebbb2098"
+dependencies = [
+ "bitflags 2.0.1",
+ "clap_lex",
+ "is-terminal",
+ "strsim",
+ "termcolor",
+ "terminal_size",
+]
+
+[[package]]
+name = "clap_complete"
+version = "4.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37686beaba5ac9f3ab01ee3172f792fc6ffdd685bfb9e63cfef02c0571a4e8e1"
+dependencies = [
+ "clap",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "console"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "unicode-width",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset 0.8.0",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "derivative"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "dialoguer"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af3c796f3b0b408d9fd581611b47fa850821fcb84aa640b83a3c1a5be2d691f2"
+dependencies = [
+ "console",
+ "shell-words",
+ "tempfile",
+ "zeroize",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "dirs"
+version = "4.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "dotenv"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enumflags2"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb"
+dependencies = [
+ "enumflags2_derive",
+ "serde",
+]
+
+[[package]]
+name = "enumflags2_derive"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "faster-hex"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51e2ce894d53b295cf97b05685aa077950ff3e8541af83217fc720a6437169f8"
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "fs3"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb17cf6ed704f72485332f6ab65257460c4f9f3083934cf402bf9f5b3b600a90"
+dependencies = [
+ "libc",
+ "rustc_version",
+ "winapi",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd"
+
+[[package]]
+name = "futures-io"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91"
+
+[[package]]
+name = "futures-lite"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2"
+
+[[package]]
+name = "futures-task"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879"
+
+[[package]]
+name = "futures-util"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "git2"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+ "libgit2-sys",
+ "log",
+ "openssl-probe",
+ "openssl-sys",
+ "url",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729"
+dependencies = [
+ "console",
+ "number_prefix",
+ "portable-atomic",
+ "unicode-width",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dd6da19f25979c7270e70fa95ab371ec3b701cd0eefc47667a09785b3c59155"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "jobserver"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
+
+[[package]]
+name = "libgit2-sys"
+version = "0.14.2+1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4"
+dependencies = [
+ "cc",
+ "libc",
+ "libssh2-sys",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "libmount"
+version = "0.1.15"
+source = "git+https://github.com/liushuyu/libmount?rev=163b2a70d10a4b38c1653c7283c8de28aad6bd54#163b2a70d10a4b38c1653c7283c8de28aad6bd54"
+dependencies = [
+ "libc",
+ "nix",
+ "quick-error",
+]
+
+[[package]]
+name = "libssh2-sys"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca"
+dependencies = [
+ "cc",
+ "libc",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "libsystemd-sys"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed080163caa59cc29b34bce2209b737149a4bac148cd9a8b04e4c12822798119"
+dependencies = [
+ "build-env",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "lzma-sys"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "nix"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if",
+ "libc",
+ "memoffset 0.7.1",
+ "pin-utils",
+ "static_assertions",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "openssl"
+version = "0.10.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd2523381e46256e40930512c7fd25562b9eae4812cb52078f155e87217c9d1e"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "176be2629957c157240f68f61f2d0053ad3a4ecfdd9ebf1e6521d18d9635cf67"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "ordered-stream"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "os_str_bytes"
+version = "6.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+
+[[package]]
+name = "parking"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
+[[package]]
+name = "polling"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e1f879b2998099c2d69ab9605d145d5b661195627eccc680002c4918a7fb6fa"
+dependencies = [
+ "autocfg",
+ "bitflags 1.3.2",
+ "cfg-if",
+ "concurrent-queue",
+ "libc",
+ "log",
+ "pin-project-lite",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "portable-atomic"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quick-error"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
+
+[[package]]
+name = "quote"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom",
+ "redox_syscall",
+ "thiserror",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+
+[[package]]
+name = "reqwest"
+version = "0.11.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9"
+dependencies = [
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "0.36.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fe885c3a125aa45213b68cc1472a49880cb5923dc23f522ad2791b882228778"
+dependencies = [
+ "bitflags 1.3.2",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "schannel"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+dependencies = [
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "security-framework"
+version = "2.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.157"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "707de5fcf5df2b5788fca98dd7eab490bc2fd9b7ef1404defc462833b83f25ca"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.157"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78997f4555c22a7971214540c4a661291970619afd56de19f77e0de86296e1e5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.2",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_repr"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.2",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "shell-words"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59d3276aee1fa0c33612917969b5172b5be2db051232a6e4826f1a1a9191b045"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tabwriter"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36205cfc997faadcc4b0b87aaef3fbedafe20d38d4959a7ca6ff803564051111"
+dependencies = [
+ "lazy_static",
+ "regex",
+ "unicode-width",
+]
+
+[[package]]
+name = "tar"
+version = "0.4.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6"
+dependencies = [
+ "filetime",
+ "libc",
+ "xattr 0.2.3",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall",
+ "rustix",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c9afddd2cec1c0909f06b00ef33f94ab2cc0578c4a610aa208ddfec8aa2b43a"
+dependencies = [
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.2",
+]
+
+[[package]]
+name = "time"
+version = "0.3.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
+dependencies = [
+ "itoa",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
+
+[[package]]
+name = "time-macros"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36"
+dependencies = [
+ "time-core",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "memchr",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "socket2",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc18466501acd8ac6a3f615dd29a3438f8ca6bb3b19537138b3106e575621274"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "uds_windows"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d"
+dependencies = [
+ "tempfile",
+ "winapi",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d502c968c6a838ead8e69b2ee18ec708802f99db92a0d156705ec9ef801993b"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
+[[package]]
+name = "walkdir"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "web-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "which"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "winnow"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23d020b441f92996c80d94ae9166e8501e59c7bb56121189dc9eab3bd8216966"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "xattr"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "xattr"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea263437ca03c1522846a4ddafbca2542d0ad5ed9b784909d4b27b76f62bc34a"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "xz2"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2"
+dependencies = [
+ "lzma-sys",
+]
+
+[[package]]
+name = "zbus"
+version = "3.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dc29e76f558b2cb94190e8605ecfe77dd40f5df8c072951714b4b71a97f5848"
+dependencies = [
+ "async-broadcast",
+ "async-executor",
+ "async-fs",
+ "async-io",
+ "async-lock",
+ "async-recursion",
+ "async-task",
+ "async-trait",
+ "byteorder",
+ "derivative",
+ "dirs",
+ "enumflags2",
+ "event-listener",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "hex",
+ "nix",
+ "once_cell",
+ "ordered-stream",
+ "rand",
+ "serde",
+ "serde_repr",
+ "sha1",
+ "static_assertions",
+ "tracing",
+ "uds_windows",
+ "winapi",
+ "zbus_macros",
+ "zbus_names",
+ "zvariant",
+]
+
+[[package]]
+name = "zbus_macros"
+version = "3.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62a80fd82c011cd08459eaaf1fd83d3090c1b61e6d5284360074a7475af3a85d"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "syn 1.0.109",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zbus_names"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f34f314916bd89bdb9934154627fab152f4f28acdda03e7c4c68181b214fe7e3"
+dependencies = [
+ "serde",
+ "static_assertions",
+ "zvariant",
+]
+
+[[package]]
+name = "zeroize"
+version = "1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
+
+[[package]]
+name = "zvariant"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46fe4914a985446d6fd287019b5fceccce38303d71407d9e6e711d44954a05d8"
+dependencies = [
+ "byteorder",
+ "enumflags2",
+ "libc",
+ "serde",
+ "static_assertions",
+ "zvariant_derive",
+]
+
+[[package]]
+name = "zvariant_derive"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34c20260af4b28b3275d6676c7e2a6be0d4332e8e0aba4616d34007fd84e462a"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zvariant_utils"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53b22993dbc4d128a17a3b6c92f1c63872dd67198537ee728d8b5d7c40640a8b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
diff --git a/nixpkgs/pkgs/tools/package-management/ciel/default.nix b/nixpkgs/pkgs/tools/package-management/ciel/default.nix
new file mode 100644
index 000000000000..87ea364aa4c4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/ciel/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, bash
+, dbus
+, fetchFromGitHub
+, fetchpatch
+, installShellFiles
+, libgit2
+, libssh2
+, openssl
+, pkg-config
+, rustPlatform
+, systemd
+, xz
+, zlib
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "ciel";
+  version = "3.1.4";
+
+  src = fetchFromGitHub {
+    owner = "AOSC-Dev";
+    repo = "ciel-rs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-b8oTVtDcxrV41OtfuthIxjbgZTANCfYHQLRJnnEc93c=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "libmount-0.1.15" = "sha256-t7CGGqJC85od8lOng9+Cn0+WDef6aciLLgxnQn1MrBk=";
+    };
+  };
+
+  nativeBuildInputs = [ pkg-config installShellFiles ];
+
+  # ciel has plugins which is actually bash scripts.
+  # Therefore, bash is required for plugins to work.
+  buildInputs = [ bash systemd dbus openssl libssh2 libgit2 xz zlib ];
+
+  patches = [
+    # cli,completions: use canonicalize path to find libexec location
+    # FIXME: remove this patch after https://github.com/AOSC-Dev/ciel-rs/pull/16 is merged
+    (fetchpatch {
+      name = "use-canonicalize-path-to-find-libexec.patch";
+      url = "https://github.com/AOSC-Dev/ciel-rs/commit/17f41538ed1057e855540f5abef7faf6ea4abf5c.patch";
+      sha256 = "sha256-ELK2KpOuoBS774apomUIo8q1eXYs/FX895G7eBdgOQg=";
+    })
+  ];
+
+  postInstall = ''
+    mv -v "$out/bin/ciel-rs" "$out/bin/ciel"
+
+    # From install-assets.sh
+    install -Dm555 -t "$out/libexec/ciel-plugin" plugins/*
+
+    # Install completions
+    installShellCompletion --cmd ciel \
+      --bash completions/ciel.bash \
+      --fish completions/ciel.fish \
+      --zsh completions/_ciel
+  '';
+
+  meta = with lib; {
+    description = "A tool for controlling AOSC OS packaging environments using multi-layer filesystems and containers.";
+    homepage = "https://github.com/AOSC-Dev/ciel-rs";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ yisuidenghua ];
+    mainProgram = "ciel";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/clib/default.nix b/nixpkgs/pkgs/tools/package-management/clib/default.nix
new file mode 100644
index 000000000000..4ecd812ddc2a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/clib/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchFromGitHub, curl  }:
+
+stdenv.mkDerivation rec {
+  version = "2.8.5";
+  pname = "clib";
+
+  src = fetchFromGitHub {
+    rev    = version;
+    owner  = "clibs";
+    repo   = "clib";
+    sha256 = "sha256-znvqxZWkQndxE6s36c77whUPc1UokrofTApFSIKFOtM=";
+  };
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  buildInputs = [ curl ];
+
+  meta = with lib; {
+    description = "C micro-package manager";
+    homepage = "https://github.com/clibs/clib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jb55 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/comma/default.nix b/nixpkgs/pkgs/tools/package-management/comma/default.nix
new file mode 100644
index 000000000000..b73e64924a6d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/comma/default.nix
@@ -0,0 +1,43 @@
+{ comma
+, fetchFromGitHub
+, fzy
+, lib
+, makeBinaryWrapper
+, nix-index-unwrapped
+, rustPlatform
+, testers
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "comma";
+  version = "1.7.1";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = "comma";
+    rev = "v${version}";
+    hash = "sha256-x2HVm2vcEFHDrCQLIp5QzNsDARcbBfPdaIMLWVNfi4c=";
+  };
+
+  cargoHash = "sha256-N6Bc0+m0Qz1c/80oLvQTj8gvMusPXIriegNlRYWWStU=";
+
+  nativeBuildInputs = [ makeBinaryWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/comma \
+      --prefix PATH : ${lib.makeBinPath [ fzy nix-index-unwrapped ]}
+    ln -s $out/bin/comma $out/bin/,
+  '';
+
+  passthru.tests = {
+    version = testers.testVersion { package = comma; };
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/nix-community/comma";
+    description = "Runs programs without installing them";
+    license = licenses.mit;
+    mainProgram = "comma";
+    maintainers = with maintainers; [ Enzime artturin marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/conda/default.nix b/nixpkgs/pkgs/tools/package-management/conda/default.nix
new file mode 100644
index 000000000000..5638676838f7
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/conda/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, stdenv
+, fetchurl
+, runCommand
+, makeWrapper
+, buildFHSEnv
+, libselinux
+, libarchive
+, libGL
+, xorg
+, zlib
+# Conda installs its packages and environments under this directory
+, installationPath ? "~/.conda"
+# Conda manages most pkgs itself, but expects a few to be on the system.
+, condaDeps ? [ stdenv.cc xorg.libSM xorg.libICE xorg.libX11 xorg.libXau xorg.libXi xorg.libXrender libselinux libGL zlib]
+# Any extra nixpkgs you'd like available in the FHS env for Conda to use
+, extraPkgs ? [ ]
+}:
+
+# How to use this package?
+#
+# First-time setup: this nixpkg downloads the conda installer and provides a FHS
+# env in which it can run. On first use, the user will need to install conda to
+# the installPath using the installer:
+# $ nix-env -iA conda
+# $ conda-shell
+# $ conda-install
+#
+# Under normal usage, simply call `conda-shell` to activate the FHS env,
+# and then use conda commands as normal:
+# $ conda-shell
+# $ conda install spyder
+let
+  version = "4.11.0";
+  src = fetchurl {
+      url = "https://repo.continuum.io/miniconda/Miniconda3-py39_${version}-Linux-x86_64.sh";
+      sha256 = "sha256-TunDqlMynNemO0mHfAurtJsZt+WvKYB7eTp2vbHTYrQ=";
+  };
+  conda = (
+    let
+      libPath = lib.makeLibraryPath [
+        zlib # libz.so.1
+      ];
+    in
+      runCommand "conda-install" { nativeBuildInputs = [ makeWrapper ]; buildInputs = [ zlib]; }
+        # on line 10, we have 'unset LD_LIBRARY_PATH'
+        # we have to comment it out however in a way that the number of bytes in the
+        # file does not change. So we replace the 'u' in the line with a '#'
+        # The reason is that the binary payload is encoded as number
+        # of bytes from the top of the installer script
+        # and unsetting the library path prevents the zlib library from being discovered
+        ''
+          mkdir -p $out/bin
+
+          sed 's/unset LD_LIBRARY_PATH/#nset LD_LIBRARY_PATH/' ${src} > $out/bin/miniconda-installer.sh
+          chmod +x $out/bin/miniconda-installer.sh
+
+          makeWrapper                            \
+            $out/bin/miniconda-installer.sh      \
+            $out/bin/conda-install               \
+            --add-flags "-p ${installationPath}" \
+            --add-flags "-b"                     \
+            --prefix "LD_LIBRARY_PATH" : "${libPath}"
+        '');
+in
+  buildFHSEnv {
+    name = "conda-shell";
+    targetPkgs = pkgs: (builtins.concatLists [ [ conda ] condaDeps extraPkgs]);
+    profile = ''
+      # Add conda to PATH
+      export PATH=${installationPath}/bin:$PATH
+      # Paths for gcc if compiling some C sources with pip
+      export NIX_CFLAGS_COMPILE="-I${installationPath}/include"
+      export NIX_CFLAGS_LINK="-L${installationPath}lib"
+      # Some other required environment variables
+      export FONTCONFIG_FILE=/etc/fonts/fonts.conf
+      export QTCOMPOSE=${xorg.libX11}/share/X11/locale
+      export LIBARCHIVE=${libarchive.lib}/lib/libarchive.so
+      # Allows `conda activate` to work properly
+      condaSh=${installationPath}/etc/profile.d/conda.sh
+      if [ ! -f $condaSh ]; then
+        conda-install
+      fi
+      source $condaSh
+    '';
+
+    runScript = "bash -l";
+
+    meta = {
+      description = "Conda is a package manager for Python";
+      homepage = "https://conda.io/";
+      platforms = lib.platforms.linux;
+      license = lib.licenses.bsd3;
+      maintainers = with lib.maintainers; [ jluttine bhipple ];
+    };
+  }
diff --git a/nixpkgs/pkgs/tools/package-management/createrepo_c/default.nix b/nixpkgs/pkgs/tools/package-management/createrepo_c/default.nix
new file mode 100644
index 000000000000..fc0628e09088
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/createrepo_c/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchFromGitHub, cmake, pkg-config, bzip2, expat, glib, curl, libxml2, python3, rpm
+, openssl, sqlite, file, xz, pcre, bash-completion, zstd, zchunk, libmodulemd
+}:
+
+stdenv.mkDerivation rec {
+  pname = "createrepo_c";
+  version = "0.17.2";
+
+  src = fetchFromGitHub {
+    owner  = "rpm-software-management";
+    repo   = "createrepo_c";
+    rev    = version;
+    sha256 = "sha256-rcrJjcWj+cTAE3k11Ynr7CQCOWD+rb60lcar0G2w06A=";
+  };
+
+  patches = [
+    # Use the output directory to install the bash completions.
+    ./fix-bash-completion-path.patch
+    # Use the output directory to install the python modules.
+    ./fix-python-install-path.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace '@BASHCOMP_DIR@' "$out/share/bash-completion/completions"
+    substituteInPlace src/python/CMakeLists.txt \
+      --replace "@PYTHON_INSTALL_DIR@" "$out/${python3.sitePackages}"
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config rpm ];
+
+  buildInputs = [ bzip2 expat glib curl libxml2 python3 openssl sqlite file xz pcre bash-completion zstd zchunk libmodulemd ];
+
+  meta = with lib; {
+    description = "C implementation of createrepo";
+    homepage    = "https://rpm-software-management.github.io/createrepo_c/";
+    license     = licenses.gpl2Plus;
+    platforms   = platforms.unix;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/tools/package-management/createrepo_c/fix-bash-completion-path.patch b/nixpkgs/pkgs/tools/package-management/createrepo_c/fix-bash-completion-path.patch
new file mode 100644
index 000000000000..2539ec5d338d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/createrepo_c/fix-bash-completion-path.patch
@@ -0,0 +1,11 @@
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -117,7 +117,7 @@ OPTION(ENABLE_BASHCOMP "Install Bash autocompletions?" ON)
+ IF (ENABLE_BASHCOMP)
+     pkg_check_modules(BASHCOMP bash-completion)
+     IF (BASHCOMP_FOUND)
+-        execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=completionsdir bash-completion OUTPUT_VARIABLE BASHCOMP_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
++        SET(BASHCOMP_DIR "@BASHCOMP_DIR@")
+         message("Bash completion directory: ${BASHCOMP_DIR}")
+         INSTALL(FILES createrepo_c.bash DESTINATION ${BASHCOMP_DIR} RENAME createrepo_c)
+         INSTALL(CODE "
diff --git a/nixpkgs/pkgs/tools/package-management/createrepo_c/fix-python-install-path.patch b/nixpkgs/pkgs/tools/package-management/createrepo_c/fix-python-install-path.patch
new file mode 100644
index 000000000000..b8739622e3c0
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/createrepo_c/fix-python-install-path.patch
@@ -0,0 +1,11 @@
+--- a/src/python/CMakeLists.txt
++++ b/src/python/CMakeLists.txt
+@@ -14,7 +14,7 @@ if (NOT SKBUILD)
+     FIND_PACKAGE(PythonLibs 3 REQUIRED)
+ endif (NOT SKBUILD)
+
+-EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; from distutils import sysconfig; stdout.write(sysconfig.get_python_lib(True))" OUTPUT_VARIABLE PYTHON_INSTALL_DIR)
++SET(PYTHON_INSTALL_DIR "@PYTHON_INSTALL_DIR@")
+ INCLUDE_DIRECTORIES (${PYTHON_INCLUDE_PATH})
+
+ MESSAGE(STATUS "Python install dir is ${PYTHON_INSTALL_DIR}")
diff --git a/nixpkgs/pkgs/tools/package-management/deploy-rs/default.nix b/nixpkgs/pkgs/tools/package-management/deploy-rs/default.nix
new file mode 100644
index 000000000000..72eacb558bb8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/deploy-rs/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, CoreServices
+, SystemConfiguration
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "deploy-rs";
+  version = "unstable-2023-12-20";
+
+  src = fetchFromGitHub {
+    owner = "serokell";
+    repo = "deploy-rs";
+    rev = "b709d63debafce9f5645a5ba550c9e0983b3d1f7";
+    hash = "sha256-0VUbWBW8VyiDRuimMuLsEO4elGuUw/nc2WDeuO1eN1M=";
+  };
+
+  cargoHash = "sha256-PVeCB1g3JSYE6PKWHyE3hfN/CKlb9XErt8uaD/ZyxIs=";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreServices
+    SystemConfiguration
+  ];
+
+  meta = with lib; {
+    description = "Multi-profile Nix-flake deploy tool";
+    homepage = "https://github.com/serokell/deploy-rs";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ teutat3s ];
+    mainProgram = "deploy";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/disnix/DisnixWebService/default.nix b/nixpkgs/pkgs/tools/package-management/disnix/DisnixWebService/default.nix
new file mode 100644
index 000000000000..461c0cacc06a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/disnix/DisnixWebService/default.nix
@@ -0,0 +1,44 @@
+{lib, stdenv, fetchFromGitHub, fetchpatch, apacheAnt, jdk, axis2, dbus_java }:
+
+stdenv.mkDerivation rec {
+  pname = "DisnixWebService";
+  version = "0.10.1";
+
+  src = fetchFromGitHub {
+    owner = "svanderburg";
+    repo = "DisnixWebService";
+    rev = "refs/tags/DisnixWebService-${version}";
+    hash = "sha256-zcYr2Ytx4pevSthTQLpnQ330wDxN9dWsZA20jbO6PxQ=";
+  };
+
+  patches = [
+    # Correct the DisnixWebService build for compatibility with Axis2 1.8.1
+    # See https://github.com/svanderburg/DisnixWebService/pull/2
+    (fetchpatch {
+      url = "https://github.com/svanderburg/DisnixWebService/commit/cee99c6af744b5dda16728a70ebd2800f61871a0.patch";
+      hash = "sha256-4rSEN8AwivUXUCIUYFBRIoE19jVDv+Vpgakmy8fR06A=";
+    })
+  ];
+
+  buildInputs = [ apacheAnt jdk ];
+  PREFIX = "\${env.out}";
+  AXIS2_LIB = "${axis2}/lib";
+  AXIS2_WEBAPP = "${axis2}/webapps/axis2";
+  DBUS_JAVA_LIB = "${dbus_java}/share/java";
+  prePatch = ''
+    sed -i -e "s|#JAVA_HOME=|JAVA_HOME=${jdk}|" \
+       -e "s|#AXIS2_LIB=|AXIS2_LIB=${axis2}/lib|" \
+        scripts/disnix-soap-client
+  '';
+  buildPhase = "ant";
+  installPhase = "ant install";
+
+  meta = {
+    description = "A SOAP interface and client for Disnix";
+    homepage = "https://github.com/svanderburg/DisnixWebService";
+    changelog = "https://github.com/svanderburg/DisnixWebService/blob/DisnixWebService-${version}/NEWS.txt";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.sander ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/disnix/default.nix b/nixpkgs/pkgs/tools/package-management/disnix/default.nix
new file mode 100644
index 000000000000..27f055c089cb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/disnix/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchurl, pkg-config, glib, libxml2, libxslt, getopt, dysnomia, libintl, libiconv }:
+
+stdenv.mkDerivation rec {
+  pname = "disnix";
+  version = "0.10.2";
+
+  src = fetchurl {
+    url = "https://github.com/svanderburg/disnix/releases/download/${pname}-${version}/${pname}-${version}.tar.gz";
+    sha256 = "0mc0wy8fca60w0d56cljq2cw1xigbp2dklb43fxa5xph94j3i49a";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ glib libxml2 libxslt getopt libintl libiconv dysnomia ];
+
+  meta = {
+    description = "A Nix-based distributed service deployment tool";
+    license = lib.licenses.lgpl21Plus;
+    maintainers = with lib.maintainers; [ sander tomberek ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/disnix/disnixos/default.nix b/nixpkgs/pkgs/tools/package-management/disnix/disnixos/default.nix
new file mode 100644
index 000000000000..15e5f3e0e947
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/disnix/disnixos/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchurl, dysnomia, disnix, socat, pkg-config, getopt }:
+
+stdenv.mkDerivation rec {
+  pname = "disnixos";
+  version = "0.9.4";
+
+  src = fetchurl {
+    url = "https://github.com/svanderburg/disnixos/releases/download/${pname}-${version}/${pname}-${version}.tar.gz";
+    sha256 = "0adv6dm6hszjhzkfkw48pmi37zj32plcibk80r6bm907mm7n50lj";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ socat dysnomia disnix getopt ];
+
+  meta = {
+    description = "Provides complementary NixOS infrastructure deployment to Disnix";
+    license = lib.licenses.lgpl21Plus;
+    maintainers = [ lib.maintainers.sander ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/disnix/dydisnix/default.nix b/nixpkgs/pkgs/tools/package-management/disnix/dydisnix/default.nix
new file mode 100644
index 000000000000..0c95e41f8c9a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/disnix/dydisnix/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, pkg-config, glib
+, libxml2, libxslt, getopt, libiconv, gettext, nix, disnix
+}:
+
+stdenv.mkDerivation rec {
+  version = "unstable-2020-11-02";
+  pname = "dydisnix";
+
+  src = fetchFromGitHub {
+    owner = "svanderburg";
+    repo = "dydisnix";
+    rev = "12ca1516bc1e5d161ac68f5d8252a0a2f353c8cf";
+    sha256 = "00f341274hwwil8mlgcgq331vfca9sscvpdbgkxsjvbhcqd8qa52";
+  };
+
+  nativeBuildInputs = [ pkg-config autoconf automake libtool ];
+  buildInputs = [ glib libxml2 libxslt getopt nix disnix libiconv gettext ];
+
+  preConfigure = ''
+    ./bootstrap
+  '';
+
+  meta = {
+    description = "A toolset enabling self-adaptive redeployment on top of Disnix";
+    longDescription = ''
+      Dynamic Disnix is a (very experimental!) prototype extension framework for Disnix supporting dynamic (re)deployment of service-oriented systems.
+    '';
+    license = lib.licenses.lgpl21Plus;
+    maintainers = [ lib.maintainers.tomberek ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/disnix/dysnomia/default.nix b/nixpkgs/pkgs/tools/package-management/disnix/dysnomia/default.nix
new file mode 100644
index 000000000000..48d1b7965112
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/disnix/dysnomia/default.nix
@@ -0,0 +1,88 @@
+{ lib, stdenv, fetchurl, netcat
+
+# Optional packages
+, systemd ? null, ejabberd ? null, mariadb ? null, postgresql ? null, subversion ? null
+, mongodb ? null, mongodb-tools ? null, influxdb ? null, supervisor ? null, docker ? null
+, nginx ? null, s6-rc ? null, xinetd ? null
+
+# Configuration flags
+, enableApacheWebApplication ? false
+, enableAxis2WebService ? false
+, enableEjabberdDump ? false
+, enableMySQLDatabase ? false
+, enablePostgreSQLDatabase ? false
+, enableSubversionRepository ? false
+, enableTomcatWebApplication ? false
+, enableMongoDatabase ? false
+, enableInfluxDatabase ? false
+, enableSupervisordProgram ? false
+, enableDockerContainer ? false
+, enableNginxWebApplication ? false
+, enableXinetdService ? false
+, enableS6RCService ? false
+, enableLegacy ? false
+, catalinaBaseDir ? "/var/tomcat"
+, jobTemplate ? "systemd"
+, getopt
+}:
+
+assert enableMySQLDatabase -> mariadb != null;
+assert enablePostgreSQLDatabase -> postgresql != null;
+assert enableSubversionRepository -> subversion != null;
+assert enableEjabberdDump -> ejabberd != null;
+assert enableMongoDatabase -> (mongodb != null && mongodb-tools != null);
+assert enableInfluxDatabase -> influxdb != null;
+assert enableSupervisordProgram -> supervisor != null;
+assert enableDockerContainer -> docker != null;
+assert enableNginxWebApplication -> nginx != null;
+assert enableS6RCService -> s6-rc != null;
+assert enableXinetdService -> xinetd != null;
+
+stdenv.mkDerivation rec {
+  pname = "dysnomia";
+  version = "0.10.2";
+  src = fetchurl {
+    url = "https://github.com/svanderburg/dysnomia/releases/download/dysnomia-${version}/dysnomia-${version}.tar.gz";
+    sha256 = "08ijqbijs2h584dvsb3z858ha385fqd5jfxc51lks9lxxv0sfkr4";
+  };
+
+  configureFlags = [
+     (if enableApacheWebApplication then "--with-apache" else "--without-apache")
+     (if enableAxis2WebService then "--with-axis2" else "--without-axis2")
+     (if enableEjabberdDump then "--with-ejabberd" else "--without-ejabberd")
+     (if enableMySQLDatabase then "--with-mysql" else "--without-mysql")
+     (if enablePostgreSQLDatabase then "--with-postgresql" else "--without-postgresql")
+     (if enableSubversionRepository then "--with-subversion" else "--without-subversion")
+     (if enableTomcatWebApplication then "--with-tomcat=${catalinaBaseDir}" else "--without-tomcat")
+     (if enableMongoDatabase then "--with-mongodb" else "--without-mongodb")
+     (if enableInfluxDatabase then "--with-influxdb" else "--without-influxdb")
+     (if enableSupervisordProgram then "--with-supervisord" else "--without-supervisord")
+     (if enableDockerContainer then "--with-docker" else "--without-docker")
+     (if enableNginxWebApplication then "--with-nginx" else "--without-nginx")
+     (if enableXinetdService then "--with-xinetd" else "--without-xinetd")
+     (if enableS6RCService then "--with-s6-rc" else "--without-s6-rc")
+     (if stdenv.isDarwin then "--with-launchd" else "--without-launchd")
+     "--with-job-template=${jobTemplate}"
+   ] ++ lib.optional enableLegacy "--enable-legacy";
+
+  buildInputs = [ getopt netcat ]
+    ++ lib.optional stdenv.isLinux systemd
+    ++ lib.optional enableEjabberdDump ejabberd
+    ++ lib.optional enableMySQLDatabase mariadb.out
+    ++ lib.optional enablePostgreSQLDatabase postgresql
+    ++ lib.optional enableSubversionRepository subversion
+    ++ lib.optionals enableMongoDatabase [ mongodb mongodb-tools ]
+    ++ lib.optional enableInfluxDatabase influxdb
+    ++ lib.optional enableSupervisordProgram supervisor
+    ++ lib.optional enableDockerContainer docker
+    ++ lib.optional enableNginxWebApplication nginx
+    ++ lib.optional enableS6RCService s6-rc
+    ++ lib.optional enableXinetdService xinetd;
+
+  meta = {
+    description = "Automated deployment of mutable components and services for Disnix";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.sander ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/dnf5/default.nix b/nixpkgs/pkgs/tools/package-management/dnf5/default.nix
new file mode 100644
index 000000000000..31a19b542e70
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/dnf5/default.nix
@@ -0,0 +1,121 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, createrepo_c
+, doxygen
+, gettext
+, help2man
+, pkg-config
+, python3Packages
+, cppunit
+, fmt
+, json_c
+, libmodulemd
+, librepo
+, libsmartcols
+, libsolv
+, libxml2
+, libyaml
+, pcre2
+, rpm
+, sdbus-cpp
+, sphinx
+, sqlite
+, systemd
+, testers
+, toml11
+, zchunk
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "dnf5";
+  version = "5.1.10";
+
+  outputs = [ "out" "man" ];
+
+  src = fetchFromGitHub {
+    owner = "rpm-software-management";
+    repo = "dnf5";
+    rev = finalAttrs.version;
+    hash = "sha256-u+UiiCl67VtIedW4kn3fycafkgBVsFFkWQcN3NXQKl4=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    createrepo_c
+    doxygen
+    gettext
+    help2man
+    pkg-config
+    sphinx
+  ] ++ (with python3Packages; [
+    breathe
+    sphinx-autoapi
+    sphinx-rtd-theme
+  ]);
+
+  buildInputs = [
+    cppunit
+    fmt
+    json_c
+    libmodulemd
+    librepo
+    libsmartcols
+    libsolv
+    libxml2
+    libyaml
+    pcre2.dev
+    rpm
+    sdbus-cpp
+    sqlite
+    systemd
+    toml11
+    zchunk
+  ];
+
+  # workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105329
+  NIX_CFLAGS_COMPILE = "-Wno-restrict -Wno-maybe-uninitialized";
+
+  cmakeFlags = [
+    "-DWITH_PERL5=OFF"
+    "-DWITH_PYTHON3=OFF"
+    "-DWITH_RUBY=OFF"
+    "-DWITH_PLUGIN_RHSM=OFF" # Red Hat Subscription Manager plugin
+    # the cmake package does not handle absolute CMAKE_INSTALL_INCLUDEDIR correctly
+    # (setting it to an absolute path causes include files to go to $out/$out/include,
+    #  because the absolute path is interpreted with root at $out).
+    "-DCMAKE_INSTALL_INCLUDEDIR=include"
+    "-DCMAKE_INSTALL_LIBDIR=lib"
+  ];
+
+  postBuild = ''
+    make doc
+  '';
+
+  prePatch = ''
+    substituteInPlace dnf5daemon-server/dbus/CMakeLists.txt \
+      --replace '/etc' "$out/etc" \
+      --replace '/usr' "$out"
+    substituteInPlace dnf5daemon-server/polkit/CMakeLists.txt \
+      --replace '/usr' "$out"
+    substituteInPlace dnf5/CMakeLists.txt \
+      --replace '/etc/bash_completion.d' "$out/etc/bash_completion.d"
+  '';
+
+  dontFixCmake = true;
+
+  passthru.tests = {
+    version = testers.testVersion { package = finalAttrs.finalPackage; };
+  };
+
+  meta = with lib; {
+    description = "Next-generation RPM package management system";
+    homepage = "https://github.com/rpm-software-management/dnf5";
+    changelog = "https://github.com/rpm-software-management/dnf5/releases/tag/${version}";
+    license = licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ malt3 katexochen ];
+    mainProgram = "dnf5";
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+})
diff --git a/nixpkgs/pkgs/tools/package-management/dpkg/default.nix b/nixpkgs/pkgs/tools/package-management/dpkg/default.nix
new file mode 100644
index 000000000000..59e259541992
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/dpkg/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, fetchgit
+, perl
+, gnutar
+, zlib
+, bzip2
+, xz
+, zstd
+, libmd
+, makeWrapper
+, coreutils
+, autoreconfHook
+, pkg-config
+, diffutils
+, glibc ? !stdenv.isDarwin
+}:
+
+stdenv.mkDerivation rec {
+  pname = "dpkg";
+  version = "1.22.1";
+
+  src = fetchgit {
+    url = "https://git.launchpad.net/ubuntu/+source/dpkg";
+    rev = "applied/${version}";
+    hash = "sha256-63XRO3Img+XS2F5Krb5DAw0LMhtxB+eJi754O03Lx8Q=";
+  };
+
+  configureFlags = [
+    "--disable-dselect"
+    "--disable-start-stop-daemon"
+    "--with-admindir=/var/lib/dpkg"
+    "PERL_LIBDIR=$(out)/${perl.libPrefix}"
+    "TAR=${gnutar}/bin/tar"
+  ] ++ lib.optional stdenv.isDarwin "--disable-linker-optimisations";
+
+  enableParallelBuilding = true;
+
+  preConfigure = ''
+    # Nice: dpkg has a circular dependency on itself. Its configure
+    # script calls scripts/dpkg-architecture, which calls "dpkg" in
+    # $PATH. It doesn't actually use its result, but fails if it
+    # isn't present, so make a dummy available.
+    touch $TMPDIR/dpkg
+    chmod +x $TMPDIR/dpkg
+    PATH=$TMPDIR:$PATH
+
+    for i in $(find . -name Makefile.in); do
+      substituteInPlace $i --replace "install-data-local:" "disabled:" ;
+    done
+  '';
+
+  postPatch = ''
+    patchShebangs .
+
+    # Dpkg commands sometimes calls out to shell commands
+    substituteInPlace lib/dpkg/dpkg.h \
+       --replace '"dpkg-deb"' \"$out/bin/dpkg-deb\" \
+       --replace '"dpkg-split"' \"$out/bin/dpkg-split\" \
+       --replace '"dpkg-query"' \"$out/bin/dpkg-query\" \
+       --replace '"dpkg-divert"' \"$out/bin/dpkg-divert\" \
+       --replace '"dpkg-statoverride"' \"$out/bin/dpkg-statoverride\" \
+       --replace '"dpkg-trigger"' \"$out/bin/dpkg-trigger\" \
+       --replace '"dpkg"' \"$out/bin/dpkg\" \
+       --replace '"debsig-verify"' \"$out/bin/debsig-verify\" \
+       --replace '"rm"' \"${coreutils}/bin/rm\" \
+       --replace '"cat"' \"${coreutils}/bin/cat\" \
+       --replace '"diff"' \"${diffutils}/bin/diff\"
+  '' + lib.optionalString (!stdenv.isDarwin) ''
+    substituteInPlace src/main/help.c \
+       --replace '"ldconfig"' \"${glibc.bin}/bin/ldconfig\"
+  '';
+
+  buildInputs = [ perl zlib bzip2 xz zstd libmd ];
+  nativeBuildInputs = [ makeWrapper perl autoreconfHook pkg-config ];
+
+  postInstall =
+    ''
+      for i in $out/bin/*; do
+        if head -n 1 $i | grep -q perl; then
+          substituteInPlace $i --replace \
+            "${perl}/bin/perl" "${perl}/bin/perl -I $out/${perl.libPrefix}"
+        fi
+      done
+
+      mkdir -p $out/etc/dpkg
+      cp -r scripts/t/origins $out/etc/dpkg
+    '';
+
+  setupHook = ./setup-hook.sh;
+
+  meta = with lib; {
+    description = "The Debian package manager";
+    homepage = "https://wiki.debian.org/Teams/Dpkg";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/dpkg/setup-hook.sh b/nixpkgs/pkgs/tools/package-management/dpkg/setup-hook.sh
new file mode 100644
index 000000000000..326f06eff318
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/dpkg/setup-hook.sh
@@ -0,0 +1,12 @@
+unpackCmdHooks+=(_tryDpkgDeb)
+_tryDpkgDeb() {
+    if ! [[ "$curSrc" =~ \.deb$ ]]; then return 1; fi
+    # Don't use dpkg-deb -x as that will error if the archive contains a file
+    # or directory with a setuid bit in its permissions. This is because dpkg
+    # calls tar internally with the -p flag, preserving file permissions.
+    #
+    # We instead only use dpkg-deb to extract the tarfile containing the files
+    # we want from the .deb, then finish extracting with tar directly.
+    mkdir root
+    dpkg-deb --fsys-tarfile "$curSrc" | tar --extract --directory=root
+}
diff --git a/nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile b/nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile
new file mode 100644
index 000000000000..b97eab9777d7
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'elm_install'
diff --git a/nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile.lock b/nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile.lock
new file mode 100644
index 000000000000..5b586256278b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/elm-github-install/Gemfile.lock
@@ -0,0 +1,39 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    adts (0.1.2)
+    commander (4.4.3)
+      highline (~> 1.7.2)
+    contracts (0.16.0)
+    elm_install (1.0.1)
+      adts (~> 0.1.2)
+      commander (~> 4.4, >= 4.4.2)
+      contracts (~> 0.16.0)
+      git (~> 1.3)
+      git_clone_url (~> 2.0)
+      hashdiff (~> 0.3.1)
+      indentation (~> 0.1.1)
+      smart_colored (~> 1.1, >= 1.1.1)
+      solve (~> 3.1)
+    git (1.3.0)
+    git_clone_url (2.0.0)
+      uri-ssh_git (>= 2.0)
+    hashdiff (0.3.4)
+    highline (1.7.8)
+    indentation (0.1.1)
+    molinillo (0.5.7)
+    semverse (2.0.0)
+    smart_colored (1.1.1)
+    solve (3.1.0)
+      molinillo (>= 0.5)
+      semverse (>= 1.1, < 3.0)
+    uri-ssh_git (2.0.0)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  elm_install
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/tools/package-management/elm-github-install/default.nix b/nixpkgs/pkgs/tools/package-management/elm-github-install/default.nix
new file mode 100644
index 000000000000..3c77af2b82bf
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/elm-github-install/default.nix
@@ -0,0 +1,22 @@
+{ lib, bundlerEnv, ruby, bundlerUpdateScript }:
+
+bundlerEnv rec {
+  pname = "elm_install";
+  name = "elm-github-install-${version}";
+
+  version = (import ./gemset.nix).elm_install.version;
+
+  inherit ruby;
+  gemdir = ./.;
+
+  passthru.updateScript = bundlerUpdateScript "elm-github-install";
+
+  meta = with lib; {
+    description = "Install Elm packages from git repositories";
+    homepage    = "https://github.com/gdotdesign/elm-github-install";
+    license     = licenses.unfree;
+    maintainers = with maintainers; [ roberth nicknovitski ];
+    platforms   = platforms.all;
+    mainProgram = "elm-install";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/elm-github-install/gemset.nix b/nixpkgs/pkgs/tools/package-management/elm-github-install/gemset.nix
new file mode 100644
index 000000000000..de7f8e20b648
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/elm-github-install/gemset.nix
@@ -0,0 +1,114 @@
+{
+  adts = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1793bfsgg8ca58b70xas9rglnspig41ih0iwqcad62s0grxzrjwz";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  commander = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01qx76y05v29kgyjsfkai73gwfnqhypp1k8v024m9w7qzpv4mpxf";
+      type = "gem";
+    };
+    version = "4.4.3";
+  };
+  contracts = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "119f5p1n6r5svbx8h09za6a4vrsnj5i1pzr9cqdn9hj3wrxvyl3a";
+      type = "gem";
+    };
+    version = "0.16.0";
+  };
+  elm_install = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d3fwhj54madabmzamss865kj8czicgaq5fbdll9kpapqvy6a2j5";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  git = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1waikaggw7a1d24nw0sh8fd419gbf7awh000qhsf411valycj6q3";
+      type = "gem";
+    };
+    version = "1.3.0";
+  };
+  git_clone_url = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qgq7pjl461si3m2gr28vwbx47dcbpyy682mcwra5y1klpkbcvr5";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  hashdiff = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n6hj7k7b9hazac0j48ypbak2nqi5wy4nh5cjra6xl3a92r8db0a";
+      type = "gem";
+    };
+    version = "0.3.4";
+  };
+  highline = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nf5lgdn6ni2lpfdn4gk3gi47fmnca2bdirabbjbz1fk9w4p8lkr";
+      type = "gem";
+    };
+    version = "1.7.8";
+  };
+  indentation = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ix64qgmm91xm1yiqxdcn9bqb1l6gwvkv7322yni34b3bd16lgvc";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  molinillo = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19h1nks0x2ljwyijs2rd1f9sh05j8xqvjaqk1rslp5nyy6h4a758";
+      type = "gem";
+    };
+    version = "0.5.7";
+  };
+  semverse = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cf6iv5wgwb7b8jf7il751223k9yahz9aym06s9r0prda5mwddyy";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  smart_colored = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hccah5iwsvn9rf7zdgl7mdbh0h63vfwy1c6d280cb9qkfj8rdny";
+      type = "gem";
+    };
+    version = "1.1.1";
+  };
+  solve = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bbzny2bl94mv1xwcfrxbi3fjhxxawlz6la7mip2wwz9kkaf376h";
+      type = "gem";
+    };
+    version = "3.1.0";
+  };
+  uri-ssh_git = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0klyyvivbjll2ry18d8fhm1rbxbzd4kqa9lskxyiha4ndlb22cqj";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/emplace/default.nix b/nixpkgs/pkgs/tools/package-management/emplace/default.nix
new file mode 100644
index 000000000000..0a2656e12932
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/emplace/default.nix
@@ -0,0 +1,23 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "emplace";
+  version = "1.4.2";
+
+  src = fetchFromGitHub {
+    owner = "tversteeg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-5PuSIOXns0FVLgyIw1mk8hZ/tYhikMV860BHTDlji78=";
+  };
+
+  cargoSha256 = "sha256-UbbVjT5JQuVSCgbcelEVaAql4CUnCtO99zHp3Ei31Gs=";
+
+  meta = with lib; {
+    description = "Mirror installed software on multiple machines";
+    homepage = "https://github.com/tversteeg/emplace";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ Br1ght0ne ];
+    mainProgram = "emplace";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/fortran-fpm/default.nix b/nixpkgs/pkgs/tools/package-management/fortran-fpm/default.nix
new file mode 100644
index 000000000000..d8adb9249006
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/fortran-fpm/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchurl
+, pkgs
+, stdenv
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fortran-fpm";
+
+  version = "0.9.0";
+
+  src = fetchurl {
+    url = "https://github.com/fortran-lang/fpm/releases/download/v${version}/fpm-${version}.F90";
+    sha256 = "sha256-VWs4g7odtv1iyZunFD8el+u0CXKcQgnwOqPG/JcMzj8=";
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = with pkgs; [ gfortran ];
+
+  buildPath = "build/bootstrap";
+
+  buildPhase = ''
+    runHook preBuild
+
+    mkdir -p ${buildPath}
+    gfortran -J ${buildPath} -o ${buildPath}/${pname} $src
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp ${buildPath}/${pname} $out/bin
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Fortran Package Manager (fpm)";
+    homepage = "https://fpm.fortran-lang.org";
+    maintainers = [ maintainers.proofconstruction ];
+    license = licenses.mit;
+    platforms = platforms.all;
+    mainProgram = "fortran-fpm";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/fpm/Gemfile b/nixpkgs/pkgs/tools/package-management/fpm/Gemfile
new file mode 100644
index 000000000000..17ed0a0cb2af
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/fpm/Gemfile
@@ -0,0 +1,3 @@
+source 'https://rubygems.org'
+
+gem 'fpm'
diff --git a/nixpkgs/pkgs/tools/package-management/fpm/Gemfile.lock b/nixpkgs/pkgs/tools/package-management/fpm/Gemfile.lock
new file mode 100644
index 000000000000..b3e8b9d221a5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/fpm/Gemfile.lock
@@ -0,0 +1,43 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    arr-pm (0.0.11)
+      cabin (> 0)
+    backports (3.21.0)
+    cabin (0.9.0)
+    clamp (1.0.1)
+    dotenv (2.7.6)
+    fpm (1.13.0)
+      arr-pm (~> 0.0.11)
+      backports (>= 2.6.2)
+      cabin (>= 0.6.0)
+      clamp (~> 1.0.0)
+      git (>= 1.3.0, < 2.0)
+      json (>= 1.7.7, < 3.0)
+      pleaserun (~> 0.0.29)
+      rexml
+      stud
+    git (1.8.1)
+      rchardet (~> 1.8)
+    insist (1.0.0)
+    json (2.5.1)
+    mustache (0.99.8)
+    pleaserun (0.0.32)
+      cabin (> 0)
+      clamp
+      dotenv
+      insist
+      mustache (= 0.99.8)
+      stud
+    rchardet (1.8.0)
+    rexml (3.2.5)
+    stud (0.0.23)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  fpm
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/tools/package-management/fpm/default.nix b/nixpkgs/pkgs/tools/package-management/fpm/default.nix
new file mode 100644
index 000000000000..6be2687d67ad
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/fpm/default.nix
@@ -0,0 +1,18 @@
+{ lib, bundlerApp, bundlerUpdateScript }:
+
+bundlerApp {
+  pname = "fpm";
+  gemdir = ./.;
+  exes = [ "fpm" ];
+
+  passthru.updateScript = bundlerUpdateScript "fpm";
+
+  meta = with lib; {
+    description = "Tool to build packages for multiple platforms with ease";
+    homepage    = "https://github.com/jordansissel/fpm";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ manveru nicknovitski ];
+    platforms   = platforms.unix;
+    mainProgram = "fpm";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/fpm/gemset.nix b/nixpkgs/pkgs/tools/package-management/fpm/gemset.nix
new file mode 100644
index 000000000000..dca13598e8cc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/fpm/gemset.nix
@@ -0,0 +1,146 @@
+{
+  arr-pm = {
+    dependencies = ["cabin"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17qssricshzs2ml1jvn4bs2h85gxvrqm074pl5nl8vr74620iazi";
+      type = "gem";
+    };
+    version = "0.0.11";
+  };
+  backports = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xqvwj3mm28g1z4npya51zjcvxaniyyzn3fwgcdwmm8xrdbl8fgr";
+      type = "gem";
+    };
+    version = "3.21.0";
+  };
+  cabin = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b3b8j3iqnagjfn1261b9ncaac9g44zrx1kcg81yg4z9i513kici";
+      type = "gem";
+    };
+    version = "0.9.0";
+  };
+  clamp = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jb6l4scp69xifhicb5sffdixqkw8wgkk9k2q57kh2y36x1px9az";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  dotenv = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94";
+      type = "gem";
+    };
+    version = "2.7.6";
+  };
+  fpm = {
+    dependencies = ["arr-pm" "backports" "cabin" "clamp" "git" "json" "pleaserun" "rexml" "stud"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03ss7yh628f0m6by23q3sniq660gm07mkz6wqjpvr118gc0h53sa";
+      type = "gem";
+    };
+    version = "1.13.0";
+  };
+  git = {
+    dependencies = ["rchardet"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vdcv93s33d9914a9nxrn2y2qv15xk7jx94007cmalp159l08cnl";
+      type = "gem";
+    };
+    version = "1.8.1";
+  };
+  insist = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bw3bdwns14mapbgb8cbjmr0amvwz8y72gyclq04xp43wpp5jrvg";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci";
+      type = "gem";
+    };
+    version = "2.5.1";
+  };
+  mustache = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g5hplm0k06vwxwqzwn1mq5bd02yp0h3rym4zwzw26aqi7drcsl2";
+      type = "gem";
+    };
+    version = "0.99.8";
+  };
+  pleaserun = {
+    dependencies = ["cabin" "clamp" "dotenv" "insist" "mustache" "stud"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1aykf0l8327bqkkf5xd9jcglsib973zpy37cfnlf4j0vp0cdpn2d";
+      type = "gem";
+    };
+    version = "0.0.32";
+  };
+  rchardet = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1isj1b3ywgg2m1vdlnr41lpvpm3dbyarf1lla4dfibfmad9csfk9";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  rexml = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
+      type = "gem";
+    };
+    version = "3.2.5";
+  };
+  stud = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qpb57cbpm9rwgsygqxifca0zma87drnlacv49cqs2n5iyi6z8kb";
+      type = "gem";
+    };
+    version = "0.0.23";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/fusesoc/default.nix b/nixpkgs/pkgs/tools/package-management/fusesoc/default.nix
new file mode 100644
index 000000000000..680cbc020945
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/fusesoc/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, verilog
+, verilator
+, gnumake
+, edalize
+, fastjsonschema
+, pyparsing
+, pyyaml
+, simplesat
+, ipyxact
+, setuptools-scm
+}:
+buildPythonPackage rec {
+  pname = "fusesoc";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-M36bXBgY8hR33AVDlHoH8PZJG2Bi0KOEI07IMns7R4w=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ edalize fastjsonschema pyparsing pyyaml simplesat ipyxact ];
+
+  pythonImportsCheck = [ "fusesoc" ];
+
+  makeWrapperArgs = [ "--suffix PATH : ${lib.makeBinPath [ verilog verilator gnumake ]}"];
+
+  meta = with lib; {
+    homepage = "https://github.com/olofk/fusesoc";
+    description = "A package manager and build tools for HDL code";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.bsd3;
+    mainProgram = "fusesoc";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/gx/default.nix b/nixpkgs/pkgs/tools/package-management/gx/default.nix
new file mode 100644
index 000000000000..3f757dde448c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/gx/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "gx";
+  version = "0.14.3";
+
+  src = fetchFromGitHub {
+    owner = "whyrusleeping";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-jGtUsb2gm8dN45wniD+PYoUlk8m1ssrfj1a7PPYEYuo=";
+  };
+
+  vendorHash = "sha256-6tdVpMztaBjoQRVG2vaUWuvnPq05zjbNAX9HBiC50t0=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "A packaging tool built around IPFS";
+    homepage = "https://github.com/whyrusleeping/gx";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zimbatm ];
+    mainProgram = "gx";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/gx/go/default.nix b/nixpkgs/pkgs/tools/package-management/gx/go/default.nix
new file mode 100644
index 000000000000..22f7d07537a5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/gx/go/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "gx-go";
+  version = "unstable-2020-03-03";
+
+  src = fetchFromGitHub {
+    owner = "whyrusleeping";
+    repo = pname;
+    rev = "9c30fadeac4aee8346d28c36d6bd5063da3d189a";
+    hash = "sha256-lrfAyqAyRnhyw9dPURM1NeFIJW/Zug53ThZiwa89z2M=";
+  };
+
+  vendorHash = "sha256-A3jZYu7+LGCukzlrxgIPmnkcxSoWm5YJZmFG3hliMm4=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "A tool for importing go packages into gx";
+    homepage = "https://github.com/whyrusleeping/gx-go";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/harmonia/default.nix b/nixpkgs/pkgs/tools/package-management/harmonia/default.nix
new file mode 100644
index 000000000000..9830570a07fd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/harmonia/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, boost
+, fetchFromGitHub
+, libsodium
+, nixVersions
+, pkg-config
+, rustPlatform
+, stdenv
+, nix-update-script
+, nixosTests
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "harmonia";
+  version = "0.7.4";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = pname;
+    rev = "refs/tags/${pname}-v${version}";
+    hash = "sha256-72JMrXmxw/FuGjqXXxMIGiAbUUOqXEERdQwch+s3iwU=";
+  };
+
+  cargoHash = "sha256-Q5Y5v7mmJpfZFGRgurTcRBRtbApFRrwqOBHdZTJbyzc=";
+
+  nativeBuildInputs = [
+    pkg-config nixVersions.nix_2_19
+  ];
+
+  buildInputs = [
+    boost
+    libsodium
+    nixVersions.nix_2_19
+  ];
+
+  # Workaround for https://github.com/NixOS/nixpkgs/issues/166205
+  env = lib.optionalAttrs stdenv.cc.isClang {
+    NIX_LDFLAGS = "-l${stdenv.cc.libcxx.cxxabi.libName}";
+  };
+
+  passthru = {
+    updateScript = nix-update-script {
+      extraArgs = [ "--version-regex" "harmonia-v(.*)" ];
+    };
+    tests = { inherit (nixosTests) harmonia; };
+  };
+
+  meta = with lib; {
+    description = "Nix binary cache";
+    homepage = "https://github.com/nix-community/harmonia";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+    mainProgram = "harmonia";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/holo-build/default.nix b/nixpkgs/pkgs/tools/package-management/holo-build/default.nix
new file mode 100644
index 000000000000..41444e8533d5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/holo-build/default.nix
@@ -0,0 +1,60 @@
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles, perl, file }:
+
+buildGoModule rec {
+  pname = "holo-build";
+  version = "1.6.1";
+
+  src = fetchFromGitHub {
+    owner = "holocm";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0lypbgf96bcc4m3968xa4il1zwprsdyc0pw6pl9mqq7djxabikd0";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace 'VERSION :=' 'VERSION ?='
+    substituteInPlace src/holo-build.sh \
+      --replace '/usr/lib/holo/holo-build' '${placeholder "out"}/lib/holo/holo-build'
+  '';
+
+  vendorHash = null;
+
+  nativeBuildInputs = [ installShellFiles perl ];
+
+  subPackages = [ "src/holo-build" ];
+
+  ldflags = [ "-s" "-w" "-X github.com/holocm/holo-build/src/holo-build/common.version=${version}" ];
+
+  postBuild = ''
+    make build/man/holo-build.8 VERSION=${version}
+  '';
+
+  nativeCheckInputs = [ file ];
+
+  checkPhase = ''
+    ln -s ../../go/bin/holo-build build/holo-build
+    go build -ldflags "-s -w -X github.com/holocm/holo-build/src/holo-build/common.version=${version}" -o build/dump-package ./src/dump-package
+    bash test/compiler/run_tests.sh
+    bash test/interface/run_tests.sh
+  '';
+
+  postInstall = ''
+    installManPage build/man/*
+    installShellCompletion --bash --name holo-build util/autocomplete.bash
+    installShellCompletion --zsh --name _holo-build util/autocomplete.zsh
+
+    # install wrapper script
+    mkdir -p $out/lib/holo
+    mv $out/bin/holo-build $out/lib/holo/holo-build
+    cp src/holo-build.sh $out/bin/holo-build
+  '';
+
+  meta = with lib; {
+    description = "Cross-distribution system package compiler";
+    homepage = "https://holocm.org/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+    mainProgram = "holo-build";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/home-manager/default.nix b/nixpkgs/pkgs/tools/package-management/home-manager/default.nix
new file mode 100644
index 000000000000..9a1b3ec59bed
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/home-manager/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitHub
+, bash
+, coreutils
+, findutils
+, gettext
+, gnused
+, less
+, ncurses
+, nixos-option
+, unixtools
+, installShellFiles
+, unstableGitUpdater
+}:
+
+stdenvNoCC.mkDerivation (finalAttrs: {
+  pname = "home-manager";
+  version = "unstable-2024-01-05";
+
+  src = fetchFromGitHub {
+    name = "home-manager-source";
+    owner = "nix-community";
+    repo = "home-manager";
+    rev = "51e44a13acea71b36245e8bd8c7db53e0a3e61ee";
+    hash = "sha256-yINKdShHrtjdiJhov+q0s3Y3B830ujRoSbHduUNyKag=";
+  };
+
+  nativeBuildInputs = [
+    gettext
+    installShellFiles
+  ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D -m755 home-manager/home-manager $out/bin/home-manager
+    install -D -m755 lib/bash/home-manager.sh $out/share/bash/home-manager.sh
+
+    substituteInPlace $out/bin/home-manager \
+      --subst-var-by bash "${bash}" \
+      --subst-var-by DEP_PATH "${
+        lib.makeBinPath [
+          coreutils
+          findutils
+          gettext
+          gnused
+          less
+          ncurses
+          nixos-option
+          unixtools.hostname
+        ]
+      }" \
+      --subst-var-by HOME_MANAGER_LIB '${placeholder "out"}/share/bash/home-manager.sh' \
+      --subst-var-by HOME_MANAGER_PATH "${finalAttrs.src}" \
+      --subst-var-by OUT '${placeholder "out"}'
+
+    installShellCompletion --bash --name home-manager.bash home-manager/completion.bash
+    installShellCompletion --fish --name home-manager.fish home-manager/completion.fish
+    installShellCompletion --zsh --name _home-manager home-manager/completion.zsh
+
+    for pofile in home-manager/po/*.po; do
+      lang="''${pofile##*/}"
+      lang="''${lang%%.*}"
+      mkdir -p "$out/share/locale/$lang/LC_MESSAGES"
+      msgfmt -o "$out/share/locale/$lang/LC_MESSAGES/home-manager.mo" "$pofile"
+    done
+
+    runHook postInstall
+  '';
+
+  passthru.updateScript = unstableGitUpdater {
+    url = "https://github.com/nix-community/home-manager/";
+  };
+
+  meta = {
+    homepage = "https://nix-community.github.io/home-manager/";
+    description = "A Nix-based user environment configurator";
+    longDescription = ''
+      The Home-Manager project provides a basic system for managing a user
+      environment using the Nix package manager together with the Nix libraries
+      found in Nixpkgs. It allows declarative configuration of user specific
+      (non global) packages and dotfiles.
+    '';
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+    platforms = lib.platforms.unix;
+    mainProgram = "home-manager";
+  };
+})
diff --git a/nixpkgs/pkgs/tools/package-management/libcomps/default.nix b/nixpkgs/pkgs/tools/package-management/libcomps/default.nix
new file mode 100644
index 000000000000..89c2982497df
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/libcomps/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, check
+, cmake
+, doxygen
+, expat
+, fetchFromGitHub
+, libxml2
+, python
+, sphinx
+, stdenv
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "libcomps";
+  version = "0.1.20";
+
+  outputs = [ "out" "dev" "py" ];
+
+  src = fetchFromGitHub {
+    owner = "rpm-software-management";
+    repo = "libcomps";
+    rev = version;
+    hash = "sha256-IX4du1+G7lwWrGnllydnBDap2aqK5pzos1Mdyu4MzOU=";
+  };
+
+  patches = [
+    ./fix-python-install-dir.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace libcomps/src/python/src/CMakeLists.txt \
+      --replace "@PYTHON_INSTALL_DIR@" "$out/${python.sitePackages}"
+  '';
+
+  nativeBuildInputs = [
+    check
+    cmake
+    doxygen
+    python
+    sphinx
+  ];
+
+  buildInputs = [
+    expat
+    libxml2
+    zlib
+  ];
+
+  dontUseCmakeBuildDir = true;
+  cmakeDir = "libcomps";
+
+  postFixup = ''
+    ls $out/lib
+    moveToOutput "lib/${python.libPrefix}" "$py"
+  '';
+
+  meta = with lib; {
+    description = "Comps XML file manipulation library";
+    homepage = "https://github.com/rpm-software-management/libcomps";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ katexochen ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/libcomps/fix-python-install-dir.patch b/nixpkgs/pkgs/tools/package-management/libcomps/fix-python-install-dir.patch
new file mode 100644
index 000000000000..958b4c80843c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/libcomps/fix-python-install-dir.patch
@@ -0,0 +1,13 @@
+diff --git a/libcomps/src/python/src/CMakeLists.txt b/libcomps/src/python/src/CMakeLists.txt
+index d22b84e..57bd1c2 100644
+--- a/libcomps/src/python/src/CMakeLists.txt
++++ b/libcomps/src/python/src/CMakeLists.txt
+@@ -85,7 +85,7 @@ IF (SKBUILD)
+     INSTALL(FILES libcomps/__init__.py DESTINATION libcomps/src/python/src/libcomps)
+     INSTALL(TARGETS pycomps LIBRARY DESTINATION libcomps/src/python/src/libcomps)
+ ELSE ()
+-    EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; from sysconfig import get_path; stdout.write(get_path('platlib'))" OUTPUT_VARIABLE PYTHON_INSTALL_DIR)
++    SET(PYTHON_INSTALL_DIR "@PYTHON_INSTALL_DIR@")
+
+     INSTALL(FILES ${pycomps_SRCDIR}/libcomps/__init__.py DESTINATION ${PYTHON_INSTALL_DIR}/libcomps)
+     #INSTALL(FILES ${pycomps_SRCDIR}/tests/__test.py DESTINATION
diff --git a/nixpkgs/pkgs/tools/package-management/libdnf/default.nix b/nixpkgs/pkgs/tools/package-management/libdnf/default.nix
new file mode 100644
index 000000000000..e7ecfc9c94db
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/libdnf/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, gettext
+, pkg-config
+, libsolv
+, openssl
+, check
+, json_c
+, libmodulemd
+, libsmartcols
+, sqlite
+, librepo
+, libyaml
+, rpm
+, zchunk
+, cppunit
+, python
+, swig
+, glib
+, sphinx
+}:
+
+stdenv.mkDerivation rec {
+  pname = "libdnf";
+  version = "0.72.0";
+
+  outputs = [ "out" "dev" "py" ];
+
+  src = fetchFromGitHub {
+    owner = "rpm-software-management";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ou7cXJz4g8cx2KjeX+IFRA2m158PGKcb9jCXFuAOKqU=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    gettext
+    pkg-config
+  ];
+
+  buildInputs = [
+    check
+    cppunit
+    openssl
+    json_c
+    libsmartcols
+    libyaml
+    libmodulemd
+    zchunk
+    python
+    swig
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    sqlite
+    libsolv
+    librepo
+    rpm
+  ];
+
+  # See https://github.com/NixOS/nixpkgs/issues/107430
+  prePatch = ''
+    cp ${libsolv}/share/cmake/Modules/FindLibSolv.cmake cmake/modules/
+  '';
+
+  patches = [
+    ./fix-python-install-dir.patch
+  ];
+
+  postPatch = ''
+    # https://github.com/rpm-software-management/libdnf/issues/1518
+    substituteInPlace libdnf/libdnf.pc.in \
+      --replace '$'{prefix}/@CMAKE_INSTALL_LIBDIR@ @CMAKE_INSTALL_FULL_LIBDIR@
+    substituteInPlace cmake/modules/FindPythonInstDir.cmake \
+      --replace "@PYTHON_INSTALL_DIR@" "$out/${python.sitePackages}"
+  '';
+
+  cmakeFlags = [
+    "-DWITH_GTKDOC=OFF"
+    "-DWITH_HTML=OFF"
+    "-DPYTHON_DESIRED=${lib.head (lib.splitString ["."] python.version)}"
+  ];
+
+  postInstall = ''
+    rm -r $out/${python.sitePackages}/hawkey/test
+  '';
+
+  postFixup = ''
+    moveToOutput "lib/${python.libPrefix}" "$py"
+  '';
+
+  meta = with lib; {
+    description = "Package management library";
+    homepage = "https://github.com/rpm-software-management/libdnf";
+    changelog = "https://github.com/rpm-software-management/libdnf/releases/tag/${version}";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux ++ platforms.darwin;
+    maintainers = with maintainers; [ rb2k katexochen ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/libdnf/fix-python-install-dir.patch b/nixpkgs/pkgs/tools/package-management/libdnf/fix-python-install-dir.patch
new file mode 100644
index 000000000000..d08ec9deec02
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/libdnf/fix-python-install-dir.patch
@@ -0,0 +1,12 @@
+diff --git a/cmake/modules/FindPythonInstDir.cmake b/cmake/modules/FindPythonInstDir.cmake
+index ed098ded..2a2e1543 100644
+--- a/cmake/modules/FindPythonInstDir.cmake
++++ b/cmake/modules/FindPythonInstDir.cmake
+@@ -1,6 +1 @@
+-EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "
+-from sys import stdout
+-from sysconfig import get_path
+-path=get_path(name='platlib', vars={'platbase':'${CMAKE_INSTALL_PREFIX}'})
+-stdout.write(path)"
+-OUTPUT_VARIABLE PYTHON_INSTALL_DIR)
++SET(PYTHON_INSTALL_DIR "@PYTHON_INSTALL_DIR@")
diff --git a/nixpkgs/pkgs/tools/package-management/librepo/default.nix b/nixpkgs/pkgs/tools/package-management/librepo/default.nix
new file mode 100644
index 000000000000..1d43efe3f8af
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/librepo/default.nix
@@ -0,0 +1,64 @@
+{ lib, stdenv
+, fetchFromGitHub
+, cmake
+, python
+, pkg-config
+, libxml2
+, glib
+, openssl
+, zchunk
+, curl
+, check
+, gpgme
+}:
+
+stdenv.mkDerivation rec {
+  version = "1.15.1";
+  pname = "librepo";
+
+  outputs = [ "out" "dev" "py" ];
+
+  src = fetchFromGitHub {
+    owner = "rpm-software-management";
+    repo = "librepo";
+    rev = version;
+    sha256 = "sha256-XVjVu+UTIDbrKHmfJ2zZBLp/h0cLCZFxv/XZ0Iy8VPI=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    python
+    libxml2
+    glib
+    openssl
+    curl
+    check
+    gpgme
+    zchunk
+  ];
+
+  # librepo/fastestmirror.h includes curl/curl.h, and pkg-config specfile refers to others in here
+  propagatedBuildInputs = [
+    curl
+    gpgme
+    libxml2
+  ];
+
+  cmakeFlags = [ "-DPYTHON_DESIRED=${lib.substring 0 1 python.pythonVersion}" ];
+
+  postFixup = ''
+    moveToOutput "lib/${python.libPrefix}" "$py"
+  '';
+
+  meta = with lib; {
+    description = "Library providing C and Python (libcURL like) API for downloading linux repository metadata and packages";
+    homepage = "https://rpm-software-management.github.io/librepo/";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/licensee/Gemfile b/nixpkgs/pkgs/tools/package-management/licensee/Gemfile
new file mode 100644
index 000000000000..a5d0dacfcfae
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/licensee/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'licensee'
diff --git a/nixpkgs/pkgs/tools/package-management/licensee/Gemfile.lock b/nixpkgs/pkgs/tools/package-management/licensee/Gemfile.lock
new file mode 100644
index 000000000000..487224bf5da2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/licensee/Gemfile.lock
@@ -0,0 +1,42 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    addressable (2.8.1)
+      public_suffix (>= 2.0.2, < 6.0)
+    dotenv (2.8.1)
+    faraday (2.7.2)
+      faraday-net_http (>= 2.0, < 3.1)
+      ruby2_keywords (>= 0.0.4)
+    faraday-net_http (3.0.2)
+    licensee (9.16.0)
+      dotenv (~> 2.0)
+      octokit (>= 4.20, < 7.0)
+      reverse_markdown (>= 1, < 3)
+      rugged (>= 0.24, < 2.0)
+      thor (>= 0.19, < 2.0)
+    mini_portile2 (2.8.1)
+    nokogiri (1.13.10)
+      mini_portile2 (~> 2.8.0)
+      racc (~> 1.4)
+    octokit (6.0.1)
+      faraday (>= 1, < 3)
+      sawyer (~> 0.9)
+    public_suffix (5.0.1)
+    racc (1.6.2)
+    reverse_markdown (2.1.1)
+      nokogiri
+    ruby2_keywords (0.0.5)
+    rugged (1.5.0.1)
+    sawyer (0.9.2)
+      addressable (>= 2.3.5)
+      faraday (>= 0.17.3, < 3)
+    thor (1.2.1)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  licensee
+
+BUNDLED WITH
+   2.3.26
diff --git a/nixpkgs/pkgs/tools/package-management/licensee/default.nix b/nixpkgs/pkgs/tools/package-management/licensee/default.nix
new file mode 100644
index 000000000000..b72c218cd16a
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/licensee/default.nix
@@ -0,0 +1,18 @@
+{ lib, bundlerApp, bundlerUpdateScript }:
+
+bundlerApp {
+  pname = "licensee";
+  gemdir = ./.;
+  exes = [ "licensee" ];
+
+  passthru.updateScript = bundlerUpdateScript "licensee";
+
+  meta = with lib; {
+    description = "A Ruby Gem to detect under what license a project is distributed";
+    homepage    = "https://licensee.github.io/licensee/";
+    license     = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+    platforms   = platforms.unix;
+    mainProgram = "licensee";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/licensee/gemset.nix b/nixpkgs/pkgs/tools/package-management/licensee/gemset.nix
new file mode 100644
index 000000000000..25726d2ac5c2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/licensee/gemset.nix
@@ -0,0 +1,159 @@
+{
+  addressable = {
+    dependencies = ["public_suffix"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ypdmpdn20hxp5vwxz3zc04r5xcwqc25qszdlg41h8ghdqbllwmw";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  dotenv = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1n0pi8x8ql5h1mijvm8lgn6bhq4xjb5a500p5r1krq4s6j9lg565";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  faraday = {
+    dependencies = ["faraday-net_http" "ruby2_keywords"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17lacy6n0hsayafvgxgzmngfq2x62b2arbn32bj2yyzmgxwyxhqn";
+      type = "gem";
+    };
+    version = "2.7.2";
+  };
+  faraday-net_http = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13byv3mp1gsjyv8k0ih4612y6vw5kqva6i03wcg4w2fqpsd950k8";
+      type = "gem";
+    };
+    version = "3.0.2";
+  };
+  licensee = {
+    dependencies = ["dotenv" "octokit" "reverse_markdown" "rugged" "thor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i4hs0vbgp0w3pdddr37zhydm16af122rmr0w39v3nqrj1ir65kv";
+      type = "gem";
+    };
+    version = "9.16.0";
+  };
+  mini_portile2 = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1af4yarhbbx62f7qsmgg5fynrik0s36wjy3difkawy536xg343mp";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2" "racc"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0n79k78c5vdcyl0m3y3l5x9kxl6xf5lgriwi2vd665qmdkr01vnk";
+      type = "gem";
+    };
+    version = "1.13.10";
+  };
+  octokit = {
+    dependencies = ["faraday" "sawyer"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0a5iy1v1n8f5ggp6q601mn8dz1n08ffs4gv0zsh5ca68j8dfmpx5";
+      type = "gem";
+    };
+    version = "6.0.1";
+  };
+  public_suffix = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hz0bx2qs2pwb0bwazzsah03ilpf3aai8b7lk7s35jsfzwbkjq35";
+      type = "gem";
+    };
+    version = "5.0.1";
+  };
+  racc = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09jgz6r0f7v84a7jz9an85q8vvmp743dqcsdm3z9c8rqcqv6pljq";
+      type = "gem";
+    };
+    version = "1.6.2";
+  };
+  reverse_markdown = {
+    dependencies = ["nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0087vhw5ik50lxvddicns01clkx800fk5v5qnrvi3b42nrk6885j";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  ruby2_keywords = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
+      type = "gem";
+    };
+    version = "0.0.5";
+  };
+  rugged = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02h1cv73znwfgy61mqmfylcfvwyyp3lddiz3njgivfx234mpz50x";
+      type = "gem";
+    };
+    version = "1.5.0.1";
+  };
+  sawyer = {
+    dependencies = ["addressable" "faraday"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jks1qjbmqm8f9kvwa81vqj39avaj9wdnzc531xm29a55bb74fps";
+      type = "gem";
+    };
+    version = "0.9.2";
+  };
+  thor = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0inl77jh4ia03jw3iqm5ipr76ghal3hyjrd6r8zqsswwvi9j2xdi";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/microdnf/default.nix b/nixpkgs/pkgs/tools/package-management/microdnf/default.nix
new file mode 100644
index 000000000000..79fcdf0300c2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/microdnf/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchFromGitHub, cmake, gettext, libdnf, pkg-config, glib, libpeas, libsmartcols, help2man }:
+
+stdenv.mkDerivation rec {
+  pname = "microdnf";
+  version = "3.10.0";
+
+  src = fetchFromGitHub {
+    owner = "rpm-software-management";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-R7jOeH6pw/THLXxLezp2AmE8lUBagKMRJ0XfXgdLi2E=";
+  };
+
+  nativeBuildInputs = [ pkg-config cmake gettext help2man ];
+  buildInputs = [ libdnf glib libpeas libsmartcols ];
+
+  meta = with lib; {
+    description = "Lightweight implementation of dnf in C";
+    homepage = "https://github.com/rpm-software-management/microdnf";
+    license = licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ rb2k ];
+    platforms = platforms.linux ++ platforms.darwin;
+    mainProgram = "microdnf";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/micromamba/default.nix b/nixpkgs/pkgs/tools/package-management/micromamba/default.nix
new file mode 100644
index 000000000000..5ff23ec7188d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/micromamba/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, bzip2
+, cli11
+, cmake
+, curl
+, ghc_filesystem
+, libarchive
+, libsolv
+, yaml-cpp
+, nlohmann_json
+, python3
+, reproc
+, spdlog
+, tl-expected
+}:
+
+let
+  libsolv' = libsolv.overrideAttrs (oldAttrs: {
+    cmakeFlags = oldAttrs.cmakeFlags ++ [
+      "-DENABLE_CONDA=true"
+    ];
+
+    patches = [
+      # Apply the same patch as in the "official" boa-forge build:
+      # https://github.com/mamba-org/boa-forge/tree/master/libsolv
+      (fetchpatch {
+        url = "https://raw.githubusercontent.com/mamba-org/boa-forge/20530f80e2e15012078d058803b6e2c75ed54224/libsolv/conda_variant_priorization.patch";
+        sha256 = "1iic0yx7h8s662hi2jqx68w5kpyrab4fr017vxd4wyxb6wyk35dd";
+      })
+    ];
+  });
+in
+stdenv.mkDerivation rec {
+  pname = "micromamba";
+  version = "1.5.4";
+
+  src = fetchFromGitHub {
+    owner = "mamba-org";
+    repo = "mamba";
+    rev = "micromamba-" + version;
+    hash = "sha256-29SuR4RDW0+yNR1RHlm3I4avy0CjBTGxv1FKxMDZxO0=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [
+    bzip2
+    cli11
+    nlohmann_json
+    curl
+    libarchive
+    yaml-cpp
+    libsolv'
+    reproc
+    spdlog
+    ghc_filesystem
+    python3
+    tl-expected
+  ];
+
+  cmakeFlags = [
+    "-DBUILD_LIBMAMBA=ON"
+    "-DBUILD_SHARED=ON"
+    "-DBUILD_MICROMAMBA=ON"
+    # "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
+  ];
+
+  meta = with lib; {
+    description = "Reimplementation of the conda package manager";
+    homepage = "https://github.com/mamba-org/mamba";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ mausch ];
+    mainProgram = "micromamba";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/morph/default.nix b/nixpkgs/pkgs/tools/package-management/morph/default.nix
new file mode 100644
index 000000000000..71c9c285f308
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/morph/default.nix
@@ -0,0 +1,38 @@
+{ buildGoModule, fetchFromGitHub, lib, makeWrapper, openssh }:
+
+buildGoModule rec {
+  pname = "morph";
+  version = "1.7.0";
+
+  src = fetchFromGitHub {
+    owner = "dbcdk";
+    repo = "morph";
+    rev = "v${version}";
+    hash = "sha256-0CHmjqPxBgALGZYjfJFLoLBnoI0U7oZ8WyCtu1bkzZg=";
+  };
+
+  vendorHash = "sha256-KV+djwUYNfD7NqmYkanRVeKj2lAGfMjJhCUSRiC4/yM=";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  ldflags = [
+    "-X main.version=${version}"
+    "-X main.assetRoot=${placeholder "lib"}"
+  ];
+
+  postInstall = ''
+    mkdir -p $lib
+    cp -v ./data/*.nix $lib
+    wrapProgram $out/bin/morph --prefix PATH : ${lib.makeBinPath [ openssh ]};
+  '';
+
+  outputs = [ "out" "lib" ];
+
+  meta = with lib; {
+    description = "A NixOS host manager written in Golang";
+    license = licenses.mit;
+    homepage = "https://github.com/dbcdk/morph";
+    maintainers = with maintainers; [adamt johanot];
+    mainProgram = "morph";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/mynewt-newt/default.nix b/nixpkgs/pkgs/tools/package-management/mynewt-newt/default.nix
new file mode 100644
index 000000000000..789a48655436
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/mynewt-newt/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, stdenv
+}:
+
+buildGoModule rec {
+  pname = "mynewt-newt";
+  version = "1.10.0";
+
+  src = fetchFromGitHub {
+    owner = "apache";
+    repo = "mynewt-newt";
+    rev = "mynewt_${builtins.replaceStrings ["."] ["_"] version}_tag";
+    sha256 = "sha256-HWZDs4kYWveEqzPRNGNbghc1Yg6hy/Pq3eU5jW8WdHc=";
+  };
+
+  vendorHash = "sha256-/LK+NSs7YZkw6TRvBQcn6/SszIwAfXN0rt2AKSBV7CE=";
+
+  doCheck = false;
+
+  # CGO_ENABLED=0 required for mac - "error: 'TARGET_OS_MAC' is not defined, evaluates to 0"
+  # https://github.com/shirou/gopsutil/issues/976
+  CGO_ENABLED = if stdenv.isLinux then 1 else 0;
+
+  meta = with lib; {
+    homepage = "https://mynewt.apache.org/";
+    description = "Build and package management tool for embedded development";
+    longDescription = ''
+      Apache Newt is a smart build and package management tool,
+      designed for C and C++ applications in embedded contexts. Newt
+      was developed as a part of the Apache Mynewt Operating System.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pjones ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nfpm/default.nix b/nixpkgs/pkgs/tools/package-management/nfpm/default.nix
new file mode 100644
index 000000000000..12facbb5fdba
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nfpm/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+, buildPackages
+}:
+
+buildGoModule rec {
+  pname = "nfpm";
+  version = "2.35.2";
+
+  src = fetchFromGitHub {
+    owner = "goreleaser";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ic6SOgIE+g7ccvg163xCwTmz960mWYcxN8ghEdB11To=";
+  };
+
+  vendorHash = "sha256-rIgEctBGff5/pzbPPaDgqZCwmIVDjF98wmLBD17KXTM=";
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall =
+    let emulator = stdenv.hostPlatform.emulator buildPackages;
+    in ''
+      ${emulator} $out/bin/nfpm man > nfpm.1
+      installManPage ./nfpm.1
+      installShellCompletion --cmd nfpm \
+        --bash <(${emulator} $out/bin/nfpm completion bash) \
+        --fish <(${emulator} $out/bin/nfpm completion fish) \
+        --zsh  <(${emulator} $out/bin/nfpm completion zsh)
+    '';
+
+  meta = with lib; {
+    description = "A simple deb and rpm packager written in Go";
+    homepage = "https://github.com/goreleaser/nfpm";
+    changelog = "https://github.com/goreleaser/nfpm/releases/tag/v${version}";
+    maintainers = with maintainers; [ marsam techknowlogick caarlos0 ];
+    license = with licenses; [ mit ];
+    mainProgram = "nfpm";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/niff/default.nix b/nixpkgs/pkgs/tools/package-management/niff/default.nix
new file mode 100644
index 000000000000..827d4353f283
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/niff/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, python3
+, fetchFromGitHub
+}:
+
+let
+  pname = "niff";
+  version = "0.1";
+in stdenv.mkDerivation {
+  name = "${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "FRidh";
+    repo = "niff";
+    rev = "v${version}";
+    sha256 = "1ziv5r57jzg2qg61izvkkyq1bz4p5nb6652dzwykfj3l2r3db4bi";
+  };
+
+  buildInputs = [ python3 ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp niff $out/bin/niff
+  '';
+
+  meta = {
+    description = "A program that compares two Nix expressions and determines which attributes changed";
+    homepage = "https://github.com/FRidh/niff";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.fridh ];
+    mainProgram = "niff";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-bundle/default.nix b/nixpkgs/pkgs/tools/package-management/nix-bundle/default.nix
new file mode 100644
index 000000000000..a32f788bf4dc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-bundle/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, bzip2
+, coreutils
+, gnutar
+, gzip
+, makeWrapper
+, nix
+}:
+
+stdenv.mkDerivation rec {
+  pname = "nix-bundle";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "matthewbauer";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0js8spwjvw6kjxz1i072scd035fhiyazixvn84ibdnw8dx087gjv";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  # coreutils, gnutar are needed by nix for bootstrap
+  buildInputs = [
+    bzip2
+    coreutils
+    gnutar
+    gzip
+    nix
+  ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postInstall = ''
+    mkdir -p $out/bin
+    makeWrapper $out/share/nix-bundle/nix-bundle.sh $out/bin/nix-bundle \
+      --prefix PATH : ${lib.makeBinPath buildInputs}
+    ln -s $out/share/nix-bundle/nix-run.sh $out/bin/nix-run
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/matthewbauer/nix-bundle";
+    description = "Create bundles from Nixpkgs attributes";
+    longDescription = ''
+      nix-bundle is a way to package Nix attributes into single-file
+      executables.
+
+      Benefits:
+      - Single-file output
+      - Can be run by non-root users
+      - No runtime
+      - Distro agnostic
+      - No installation
+    '';
+    license = licenses.mit;
+    maintainers = [ maintainers.matthewbauer ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-doc/default.nix b/nixpkgs/pkgs/tools/package-management/nix-doc/default.nix
new file mode 100644
index 000000000000..8a4e523e98b5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-doc/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, rustPlatform, fetchFromGitHub, boost, nix, pkg-config }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nix-doc";
+  version = "0.6.4";
+
+  src = fetchFromGitHub {
+    rev = "v${version}";
+    owner = "lf-";
+    repo = "nix-doc";
+    sha256 = "sha256-yL0oG0NiQ7OdGQ/kZxQbSbNphKapu5HBFNP5E2fVe+Y=";
+  };
+
+  doCheck = true;
+  buildInputs = [ boost nix ];
+
+  nativeBuildInputs = [ pkg-config nix ];
+
+  # Packaging support for making the nix-doc plugin load cleanly as a no-op on
+  # the wrong Nix version (disabling bindnow permits loading libraries
+  # requiring unavailable symbols if they are unreached)
+  hardeningDisable = [ "bindnow" ];
+  # Due to a Rust bug, setting -Z relro-level to anything including "off" on
+  # macOS will cause link errors
+  env = lib.optionalAttrs stdenv.isLinux {
+    # nix-doc does not use nightly features, however, there is no other way to
+    # set relro-level
+    RUSTC_BOOTSTRAP = 1;
+    RUSTFLAGS = "-Z relro-level=partial";
+  };
+
+  cargoSha256 = "sha256-4bzLZt45ZLTZyZPZ4Nkvz7mNe4oqOIoaZUbCbNWBKG0=";
+
+  meta = with lib; {
+    description = "An interactive Nix documentation tool";
+    longDescription = "An interactive Nix documentation tool providing a CLI for function search, a Nix plugin for docs in the REPL, and a ctags implementation for Nix script";
+    homepage = "https://github.com/lf-/nix-doc";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.lf- ];
+    platforms = platforms.unix;
+    mainProgram = "nix-doc";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-du/default.nix b/nixpkgs/pkgs/tools/package-management/nix-du/default.nix
new file mode 100644
index 000000000000..a3a1f0d97108
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-du/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, nix
+, nlohmann_json
+, boost
+, graphviz
+, Security
+, pkg-config
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nix-du";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "symphorien";
+    repo = "nix-du";
+    rev = "v${version}";
+    sha256 = "sha256-HfmMZVlsdg9hTWGUihl6OlQAp/n1XRvPLfAKJ8as8Ew=";
+  };
+
+  cargoSha256 = "sha256-oUxxuBqec4aI2h8BAn1WSA44UU7f5APkv0DIwuSun0M=";
+
+  doCheck = true;
+  nativeCheckInputs = [ nix graphviz ];
+
+  buildInputs = [
+    boost
+    nix
+    nlohmann_json
+  ] ++ lib.optionals stdenv.isDarwin [ Security ];
+
+  nativeBuildInputs = [ pkg-config rustPlatform.bindgenHook ];
+
+  # Workaround for https://github.com/NixOS/nixpkgs/issues/166205
+  env = lib.optionalAttrs stdenv.cc.isClang {
+    NIX_LDFLAGS = "-l${stdenv.cc.libcxx.cxxabi.libName}";
+  };
+
+  meta = with lib; {
+    description = "A tool to determine which gc-roots take space in your nix store";
+    homepage = "https://github.com/symphorien/nix-du";
+    license = licenses.lgpl3Only;
+    maintainers = [ maintainers.symphorien ];
+    platforms = platforms.unix;
+    mainProgram = "nix-du";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-eval-jobs/default.nix b/nixpkgs/pkgs/tools/package-management/nix-eval-jobs/default.nix
new file mode 100644
index 000000000000..bf2d48e4adfb
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-eval-jobs/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, boost
+, cmake
+, fetchFromGitHub
+, meson
+, ninja
+, nix
+, nlohmann_json
+, pkg-config
+, stdenv
+}:
+stdenv.mkDerivation rec {
+  pname = "nix-eval-jobs";
+  version = "2.19.4";
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-97ZqhTMqnAr1rzEy96faceWzFyWexnYbH1aTfc1y0JE=";
+  };
+  buildInputs = [
+    boost
+    nix
+    nlohmann_json
+  ];
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    # nlohmann_json can be only discovered via cmake files
+    cmake
+  ];
+
+  # Since this package is intimately tied to a specific Nix release, we
+  # propagate the Nix used for building it to make it easier for users
+  # downstream to reference it.
+  passthru = { inherit nix; };
+
+  meta = {
+    description = "Hydra's builtin hydra-eval-jobs as a standalone";
+    homepage = "https://github.com/nix-community/nix-eval-jobs";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ adisbladis mic92 ];
+    platforms = lib.platforms.unix;
+    mainProgram = "nix-eval-jobs";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-index/default.nix b/nixpkgs/pkgs/tools/package-management/nix-index/default.nix
new file mode 100644
index 000000000000..35df4f9674d6
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-index/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, rustPlatform, fetchFromGitHub, pkg-config, openssl, curl, sqlite
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nix-index";
+  version = "0.1.7";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = "nix-index";
+    rev = "v${version}";
+    hash = "sha256-WPWd2aMuP4L17UDFz7SI6lqyrCzrPV8c88vGyO6r6jk=";
+  };
+
+  cargoHash = "sha256-zZhQ3pOid7BCGzcyCrl6sDm0q6IEVKF7K+d6nVs9flk=";
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ openssl curl sqlite ]
+    ++ lib.optional stdenv.isDarwin Security;
+
+  postInstall = ''
+    substituteInPlace command-not-found.sh \
+      --subst-var out
+    install -Dm555 command-not-found.sh -t $out/etc/profile.d
+  '';
+
+  meta = with lib; {
+    description = "A files database for nixpkgs";
+    homepage = "https://github.com/nix-community/nix-index";
+    changelog = "https://github.com/nix-community/nix-index/blob/${src.rev}/CHANGELOG.md";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ bennofs figsoda ncfavier ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-index/wrapper.nix b/nixpkgs/pkgs/tools/package-management/nix-index/wrapper.nix
new file mode 100644
index 000000000000..94611e74c2a5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-index/wrapper.nix
@@ -0,0 +1,14 @@
+{ lib, symlinkJoin, nix-index-unwrapped, makeWrapper, nix }:
+
+symlinkJoin {
+  inherit (nix-index-unwrapped) name meta;
+
+  paths = [ nix-index-unwrapped ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postBuild = ''
+    wrapProgram $out/bin/nix-index \
+      --prefix PATH : ${lib.makeBinPath [ nix ]}
+  '';
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-pin/default.nix b/nixpkgs/pkgs/tools/package-management/nix-pin/default.nix
new file mode 100644
index 000000000000..59422ff22cc2
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-pin/default.nix
@@ -0,0 +1,51 @@
+{ lib, pkgs, stdenv, fetchFromGitHub, python3, nix, git, makeWrapper
+, runtimeShell }:
+let self = stdenv.mkDerivation rec {
+  pname = "nix-pin";
+  version = "0.4.0";
+  src = fetchFromGitHub {
+    owner = "timbertson";
+    repo = "nix-pin";
+    rev = "version-${version}";
+    sha256 = "1pccvc0iqapms7kidrh09g5fdx44x622r5l9k7bkmssp3v4c68vy";
+  };
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ python3 ];
+  installPhase = ''
+    mkdir "$out"
+    cp -r bin share "$out"
+    wrapProgram $out/bin/nix-pin \
+      --prefix PATH : "${lib.makeBinPath [ nix git ]}"
+  '';
+  passthru =
+    let
+      defaults = import "${self}/share/nix/defaults.nix";
+    in {
+      api = { pinConfig ? defaults.pinConfig }:
+        let impl = import "${self}/share/nix/api.nix" { inherit pkgs pinConfig; }; in
+        { inherit (impl) augmentedPkgs pins callPackage; };
+      updateScript = ''
+        #!${runtimeShell}
+        set -e
+        echo
+        cd ${toString ./.}
+        ${pkgs.nix-update-source}/bin/nix-update-source \
+          --prompt version \
+          --replace-attr version \
+          --set owner timbertson \
+          --set repo nix-pin \
+          --set type fetchFromGitHub \
+          --set rev 'version-{version}' \
+          --substitute rev 'version-''${{version}}' \
+          --modify-nix default.nix
+      '';
+    };
+  meta = with lib; {
+    homepage = "https://github.com/timbertson/nix-pin";
+    description = "nixpkgs development utility";
+    license = licenses.mit;
+    maintainers = [ maintainers.timbertson ];
+    platforms = platforms.all;
+    mainProgram = "nix-pin";
+  };
+}; in self
diff --git a/nixpkgs/pkgs/tools/package-management/nix-prefetch-scripts/default.nix b/nixpkgs/pkgs/tools/package-management/nix-prefetch-scripts/default.nix
new file mode 100644
index 000000000000..aca8c2fbb4de
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-prefetch-scripts/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, makeWrapper, buildEnv
+, breezy, coreutils, cvs, findutils, gawk, git, git-lfs, gnused, mercurial, nix, subversion
+}:
+
+let mkPrefetchScript = tool: src: deps:
+  stdenv.mkDerivation {
+    name = "nix-prefetch-${tool}";
+
+    nativeBuildInputs = [ makeWrapper ];
+
+    dontUnpack = true;
+
+    installPhase = ''
+      install -vD ${src} $out/bin/$name;
+      wrapProgram $out/bin/$name \
+        --prefix PATH : ${lib.makeBinPath (deps ++ [ gnused nix ])} \
+        --set HOME /homeless-shelter
+    '';
+
+    preferLocalBuild = true;
+
+    meta = with lib; {
+      description = "Script used to obtain source hashes for fetch${tool}";
+      maintainers = with maintainers; [ bennofs ];
+      platforms = platforms.unix;
+    };
+  };
+in rec {
+  nix-prefetch-bzr = mkPrefetchScript "bzr" ../../../build-support/fetchbzr/nix-prefetch-bzr [ breezy ];
+  nix-prefetch-cvs = mkPrefetchScript "cvs" ../../../build-support/fetchcvs/nix-prefetch-cvs [ cvs ];
+  nix-prefetch-git = mkPrefetchScript "git" ../../../build-support/fetchgit/nix-prefetch-git [ coreutils findutils gawk git git-lfs ];
+  nix-prefetch-hg  = mkPrefetchScript "hg"  ../../../build-support/fetchhg/nix-prefetch-hg   [ mercurial ];
+  nix-prefetch-svn = mkPrefetchScript "svn" ../../../build-support/fetchsvn/nix-prefetch-svn [ subversion ];
+
+  nix-prefetch-scripts = buildEnv {
+    name = "nix-prefetch-scripts";
+
+    paths = [ nix-prefetch-bzr nix-prefetch-cvs nix-prefetch-git nix-prefetch-hg nix-prefetch-svn ];
+
+    meta = with lib; {
+      description = "Collection of all the nix-prefetch-* scripts which may be used to obtain source hashes";
+      maintainers = with maintainers; [ bennofs ];
+      platforms = platforms.unix;
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-prefetch/default.nix b/nixpkgs/pkgs/tools/package-management/nix-prefetch/default.nix
new file mode 100644
index 000000000000..8ed71d078b78
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-prefetch/default.nix
@@ -0,0 +1,81 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, installShellFiles, makeWrapper, asciidoc
+, docbook_xml_dtd_45, git, docbook_xsl, libxml2, libxslt, coreutils, gawk
+, gnugrep, gnused, jq, nix }:
+
+stdenv.mkDerivation rec {
+  pname = "nix-prefetch";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "msteen";
+    repo = "nix-prefetch";
+    rev = version;
+    sha256 = "0bwv6x651gyq703pywrhb7lfby6xwnd1iwnrzzjihipn7x3v2hz9";
+    # the stat call has to be in a subshell or we get the current date
+    postFetch = ''
+      echo $(stat -c %Y $out) > $out/.timestamp
+    '';
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-prefetching-hash-key.patch";
+      url = "https://github.com/msteen/nix-prefetch/commit/508237f48f7e2d8496ce54f38abbe57f44d0cbca.patch";
+      hash = "sha256-9SYPcRFZaVyNjMUVdXbef5eGvLp/kr379eU9lG5GgE0=";
+    })
+  ];
+
+  postPatch = ''
+    lib=$out/lib/${pname}
+
+    substituteInPlace doc/nix-prefetch.1.asciidoc \
+      --subst-var-by version $version
+
+    substituteInPlace src/main.sh \
+      --subst-var-by lib $lib \
+      --subst-var-by version $version
+
+    substituteInPlace src/tests.sh \
+      --subst-var-by bin $out/bin
+  '';
+
+  nativeBuildInputs = [
+    asciidoc
+    docbook_xml_dtd_45
+    docbook_xsl
+    installShellFiles
+    libxml2
+    libxslt
+    makeWrapper
+  ];
+
+  dontConfigure = true;
+
+  buildPhase = ''
+    a2x -a revdate=$(date --utc --date=@$(cat $src/.timestamp) +%d/%m/%Y) \
+      -f manpage doc/nix-prefetch.1.asciidoc
+  '';
+
+  installPhase = ''
+    install -Dm555 -t $lib src/*.sh
+    install -Dm444 -t $lib lib/*
+    makeWrapper $lib/main.sh $out/bin/${pname} \
+      --prefix PATH : ${lib.makeBinPath [ coreutils gawk git gnugrep gnused jq nix ]}
+
+    installManPage doc/nix-prefetch.?
+
+    installShellCompletion --name ${pname} contrib/nix-prefetch-completion.{bash,zsh}
+
+    mkdir -p $out/share/doc/${pname}/contrib
+    cp -r contrib/hello_rs $out/share/doc/${pname}/contrib
+  '';
+
+  meta = with lib; {
+    description = "Prefetch any fetcher function call, e.g. package sources";
+    license = licenses.mit;
+    maintainers = with maintainers; [ msteen ];
+    homepage = "https://github.com/msteen/nix-prefetch";
+    platforms = platforms.all;
+    mainProgram = "nix-prefetch";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-serve/default.nix b/nixpkgs/pkgs/tools/package-management/nix-serve/default.nix
new file mode 100644
index 000000000000..a149b490f5aa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-serve/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, bzip2
+, nix
+, perl
+, makeWrapper
+, nixosTests
+}:
+
+let
+  rev = "e4675e38ab54942e351c7686e40fabec822120b9";
+  sha256 = "1wm24p6pkxl1d7hrvf4ph6mwzawvqi22c60z9xzndn5xfyr4v0yr";
+in
+
+stdenv.mkDerivation {
+  pname = "nix-serve";
+  version = "0.2-${lib.substring 0 7 rev}";
+
+  src = fetchFromGitHub {
+    owner = "edolstra";
+    repo = "nix-serve";
+    inherit rev sha256;
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    install -Dm0755 nix-serve.psgi $out/libexec/nix-serve/nix-serve.psgi
+
+    makeWrapper ${perl.withPackages(p: [ p.DBDSQLite p.Plack p.Starman nix.perl-bindings ])}/bin/starman $out/bin/nix-serve \
+                --prefix PATH : "${lib.makeBinPath [ bzip2 nix ]}" \
+                --add-flags $out/libexec/nix-serve/nix-serve.psgi
+  '';
+
+  passthru.tests = {
+    nix-serve = nixosTests.nix-serve;
+    nix-serve-ssh = nixosTests.nix-serve-ssh;
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/edolstra/nix-serve";
+    description = "A utility for sharing a Nix store as a binary cache";
+    maintainers = [ maintainers.eelco ];
+    license = licenses.lgpl21;
+    platforms = nix.meta.platforms;
+    mainProgram = "nix-serve";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-simple-deploy/default.nix b/nixpkgs/pkgs/tools/package-management/nix-simple-deploy/default.nix
new file mode 100644
index 000000000000..647a11b01fdc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-simple-deploy/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchFromGitHub, rustPlatform, makeWrapper, openssh, nix-serve }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nix-simple-deploy";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "misuzu";
+    repo = pname;
+    rev = version;
+    sha256 = "1qq4fbsd2mvxblsggwbnh88mj18f3vrfzv1kgc7a92pfiwxznq8r";
+  };
+
+  cargoSha256 = "1r6dl7qipbyyvjcd3l9ynawjln1g1qzvw5za6nyjcf41dzv48m8x";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/nix-simple-deploy" \
+      --prefix PATH : "${lib.makeBinPath [ openssh nix-serve ]}"
+  '';
+
+  meta = with lib; {
+    description = "Deploy software or an entire NixOS system configuration to another NixOS system";
+    homepage = "https://github.com/misuzu/nix-simple-deploy";
+    platforms = platforms.unix;
+    license = with licenses; [ asl20 /* OR */ mit ];
+    maintainers = with maintainers; [ misuzu ];
+    mainProgram = "nix-simple-deploy";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-template/default.nix b/nixpkgs/pkgs/tools/package-management/nix-template/default.nix
new file mode 100644
index 000000000000..e1431532f857
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-template/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, rustPlatform, fetchFromGitHub
+, installShellFiles
+, makeWrapper
+, nix
+, openssl
+, pkg-config
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nix-template";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    name = "${pname}-${version}-src";
+    owner = "jonringer";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-42u5FmTIKHpfQ2zZQXIrFkAN2/XvU0wWnCRrQkQzcNI=";
+  };
+
+  cargoSha256 = "sha256-f8Th6SbV66Uukqh1Cb5uQVa844qw1PmBB9W7EMXMU4E=";
+
+  nativeBuildInputs = [
+    installShellFiles
+    makeWrapper
+    pkg-config
+  ];
+
+  buildInputs = [ openssl ]
+    ++ lib.optional stdenv.isDarwin Security;
+
+  # needed for nix-prefetch-url
+  postInstall = ''
+    wrapProgram $out/bin/nix-template \
+      --prefix PATH : ${lib.makeBinPath [ nix ]}
+
+    installShellCompletion --cmd nix-template \
+      --bash <($out/bin/nix-template completions bash) \
+      --fish <($out/bin/nix-template completions fish) \
+      --zsh <($out/bin/nix-template completions zsh)
+  '';
+
+  meta = with lib; {
+    description = "Make creating nix expressions easy";
+    homepage = "https://github.com/jonringer/nix-template/";
+    changelog = "https://github.com/jonringer/nix-template/releases/tag/v${version}";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ jonringer ];
+    mainProgram = "nix-template";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-top/default.nix b/nixpkgs/pkgs/tools/package-management/nix-top/default.nix
new file mode 100644
index 000000000000..dc49f2a739e9
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-top/default.nix
@@ -0,0 +1,53 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, ruby
+, makeWrapper
+, getent               # /etc/passwd
+, ncurses              # tput
+, binutils-unwrapped   # strings
+, coreutils
+, findutils
+}:
+
+# No gems used, so mkDerivation is fine.
+let
+  additionalPath = lib.makeBinPath [ getent ncurses binutils-unwrapped coreutils findutils ];
+in
+stdenv.mkDerivation rec {
+  pname = "nix-top";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "samueldr";
+    repo = "nix-top";
+    rev = "v${version}";
+    sha256 = "sha256-w/TKzbZmMt4CX2KnLwPvR1ydp5NNlp9nNx78jJvhp54=";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  buildInputs = [
+    ruby
+  ];
+
+  installPhase = ''
+    mkdir -p $out/libexec/nix-top
+    install -D -m755 ./nix-top $out/bin/nix-top
+    wrapProgram $out/bin/nix-top \
+      --prefix PATH : "$out/libexec/nix-top:${additionalPath}"
+  '' + lib.optionalString stdenv.isDarwin ''
+    ln -s /bin/stty $out/libexec/nix-top
+  '';
+
+  meta = with lib; {
+    description = "Tracks what nix is building";
+    homepage = "https://github.com/samueldr/nix-top";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samueldr ];
+    platforms = platforms.linux ++ platforms.darwin;
+    mainProgram = "nix-top";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-universal-prefetch/default.nix b/nixpkgs/pkgs/tools/package-management/nix-universal-prefetch/default.nix
new file mode 100644
index 000000000000..be31ca34ad60
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-universal-prefetch/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, fetchFromGitHub
+, ruby
+}:
+
+# No gems used, so mkDerivation is fine.
+stdenv.mkDerivation rec {
+  pname = "nix-universal-prefetch";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "samueldr";
+    repo = "nix-universal-prefetch";
+    rev = "v${version}";
+    sha256 = "sha256-HGn4qHWqpUwlS3yQrD3j5oH0yOlphsoSPD2vkyyRv+0=";
+  };
+
+  installPhase = ''
+    mkdir -pv $out/bin
+    cp nix-universal-prefetch $out/bin/nix-universal-prefetch
+    substituteInPlace "$out/bin/nix-universal-prefetch" \
+      --replace "/usr/bin/env nix-shell" "${ruby}/bin/ruby"
+  '';
+
+  meta = with lib; {
+    description = "Uses nixpkgs fetchers to figure out hashes";
+    homepage = "https://github.com/samueldr/nix-universal-prefetch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samueldr ];
+    platforms = platforms.linux ++ platforms.darwin;
+    mainProgram = "nix-universal-prefetch";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-update-source/default.nix b/nixpkgs/pkgs/tools/package-management/nix-update-source/default.nix
new file mode 100644
index 000000000000..533f487e3974
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-update-source/default.nix
@@ -0,0 +1,59 @@
+{ lib, pkgs, fetchFromGitHub, python3Packages, nix-prefetch-scripts, runtimeShell }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "nix-update-source";
+  version = "0.6.3";
+
+  src = fetchFromGitHub {
+    owner = "timbertson";
+    repo = "nix-update-source";
+    rev = "version-${version}";
+    sha256 = "157wvv9vnaszzwbj68jpdc0imcm1hdab3z760bx2axbsgfpqqilz";
+  };
+
+  propagatedBuildInputs = [ nix-prefetch-scripts ];
+
+  doCheck = false;
+
+  passthru = {
+    # NOTE: `fetch` should not be used within nixpkgs because it
+    # uses a non-idiomatic structure. It is provided for use by
+    # out-of-tree nix derivations.
+    fetch = path:
+      let
+        fetchers = {
+          # whitelist of allowed fetchers
+          inherit (pkgs) fetchgit fetchurl fetchFromGitHub;
+        };
+        json = lib.importJSON path;
+        fetchFn = builtins.getAttr json.fetch.fn fetchers;
+        src = fetchFn json.fetch.args;
+      in
+      json // json.fetch // {
+        inherit src;
+        overrideSrc = drv: lib.overrideDerivation drv (orig: { inherit src; });
+      };
+
+    updateScript = ''
+      #!${runtimeShell}
+      set -e
+      echo
+      cd ${toString ./.}
+      ${pkgs.nix-update-source}/bin/nix-update-source \
+        --prompt version \
+        --replace-attr version \
+        --set owner timbertson \
+        --set repo nix-update-source \
+        --set type fetchFromGitHub \
+        --set rev 'version-{version}' \
+        --modify-nix default.nix
+    '';
+  };
+
+  meta = {
+    description = "Utility to automate updating of nix derivation sources";
+    maintainers = with lib.maintainers; [ timbertson ];
+    license = lib.licenses.mit;
+    mainProgram = "nix-update-source";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix-update/default.nix b/nixpkgs/pkgs/tools/package-management/nix-update/default.nix
new file mode 100644
index 000000000000..20d5c3105e97
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix-update/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, python3
+, fetchFromGitHub
+, nix
+, nix-prefetch-git
+, nixpkgs-fmt
+, nixpkgs-review
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "nix-update";
+  version = "1.0.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "Mic92";
+    repo = pname;
+    rev = version;
+    hash = "sha256-C7ke51QlBcTR98ovQi5NcxToEPP6s9gqnxWO1eBw/sI=";
+  };
+
+  nativeBuildInputs = [
+    python3.pkgs.setuptools
+  ];
+
+  makeWrapperArgs = [
+    "--prefix" "PATH" ":" (lib.makeBinPath [ nix nix-prefetch-git nixpkgs-fmt nixpkgs-review ])
+  ];
+
+  checkPhase = ''
+    $out/bin/nix-update --help >/dev/null
+  '';
+
+  meta = with lib; {
+    description = "Swiss-knife for updating nix packages";
+    inherit (src.meta) homepage;
+    changelog = "https://github.com/Mic92/nix-update/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda mic92 zowoq ];
+    mainProgram = "nix-update";
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix/common.nix b/nixpkgs/pkgs/tools/package-management/nix/common.nix
new file mode 100644
index 000000000000..0ea47dd7e17c
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix/common.nix
@@ -0,0 +1,252 @@
+{ lib
+, fetchFromGitHub
+, version
+, suffix ? ""
+, hash ? null
+, src ? fetchFromGitHub { owner = "NixOS"; repo = "nix"; rev = version; inherit hash; }
+, patches ? [ ]
+, maintainers ? with lib.maintainers; [ eelco lovesegfault artturin ]
+}:
+assert (hash == null) -> (src != null);
+let
+  atLeast24 = lib.versionAtLeast version "2.4pre";
+  atLeast25 = lib.versionAtLeast version "2.5pre";
+  atLeast27 = lib.versionAtLeast version "2.7pre";
+  atLeast210 = lib.versionAtLeast version "2.10pre";
+  atLeast213 = lib.versionAtLeast version "2.13pre";
+  atLeast214 = lib.versionAtLeast version "2.14pre";
+in
+{ stdenv
+, autoconf-archive
+, autoreconfHook
+, bash
+, bison
+, boehmgc
+, boost
+, brotli
+, busybox-sandbox-shell
+, bzip2
+, callPackage
+, coreutils
+, curl
+, docbook_xsl_ns
+, docbook5
+, editline
+, flex
+, gnutar
+, gtest
+, gzip
+, jq
+, lib
+, libarchive
+, libcpuid
+, libsodium
+, libxml2
+, libxslt
+, lowdown
+, mdbook
+, mdbook-linkcheck
+, nlohmann_json
+, openssl
+, perl
+, pkg-config
+, rapidcheck
+, Security
+, sqlite
+, util-linuxMinimal
+, xz
+
+, enableDocumentation ? !atLeast24 || (
+    (stdenv.hostPlatform == stdenv.buildPlatform) &&
+    # mdbook errors out on risc-v due to a rustc bug
+    # https://github.com/NixOS/nixpkgs/pull/242019
+    # https://github.com/rust-lang/rust/issues/114473
+    !stdenv.buildPlatform.isRiscV
+  )
+, enableStatic ? stdenv.hostPlatform.isStatic
+, withAWS ? !enableStatic && (stdenv.isLinux || stdenv.isDarwin), aws-sdk-cpp
+, withLibseccomp ? lib.meta.availableOn stdenv.hostPlatform libseccomp, libseccomp
+
+, confDir
+, stateDir
+, storeDir
+
+  # passthru tests
+, pkgsi686Linux
+}: let
+self = stdenv.mkDerivation {
+  pname = "nix";
+
+  version = "${version}${suffix}";
+  VERSION_SUFFIX = suffix;
+
+  inherit src patches;
+
+  outputs =
+    [ "out" "dev" ]
+    ++ lib.optionals enableDocumentation [ "man" "doc" ];
+
+  hardeningEnable = lib.optionals (!stdenv.isDarwin) [ "pie" ];
+
+  hardeningDisable = lib.optional stdenv.hostPlatform.isMusl "fortify";
+
+  nativeBuildInputs = [
+    pkg-config
+    autoconf-archive
+    autoreconfHook
+    bison
+    flex
+    jq
+  ] ++ lib.optionals (enableDocumentation && !atLeast24) [
+    libxslt
+    libxml2
+    docbook_xsl_ns
+    docbook5
+  ] ++ lib.optionals (enableDocumentation && atLeast24) [
+    (lib.getBin lowdown)
+    mdbook
+  ] ++ lib.optionals (atLeast213 && enableDocumentation) [
+    mdbook-linkcheck
+  ] ++ lib.optionals stdenv.isLinux [
+    util-linuxMinimal
+  ];
+
+  buildInputs = [
+    boost
+    brotli
+    bzip2
+    curl
+    editline
+    libsodium
+    openssl
+    sqlite
+    xz
+    gtest
+    libarchive
+    lowdown
+  ] ++ lib.optionals stdenv.isDarwin [
+    Security
+  ] ++ lib.optionals (stdenv.isx86_64) [
+    libcpuid
+  ] ++ lib.optionals atLeast214 [
+    rapidcheck
+  ] ++ lib.optionals withLibseccomp [
+    libseccomp
+  ] ++ lib.optionals withAWS [
+    aws-sdk-cpp
+  ];
+
+  propagatedBuildInputs = [
+    boehmgc
+  ] ++ lib.optionals (atLeast27) [
+    nlohmann_json
+  ];
+
+  postPatch = ''
+    patchShebangs --build tests
+  '';
+
+  preConfigure =
+    # Copy libboost_context so we don't get all of Boost in our closure.
+    # https://github.com/NixOS/nixpkgs/issues/45462
+    lib.optionalString (!enableStatic) ''
+      mkdir -p $out/lib
+      cp -pd ${boost}/lib/{libboost_context*,libboost_thread*,libboost_system*} $out/lib
+      rm -f $out/lib/*.a
+      ${lib.optionalString stdenv.isLinux ''
+        chmod u+w $out/lib/*.so.*
+        patchelf --set-rpath $out/lib:${stdenv.cc.cc.lib}/lib $out/lib/libboost_thread.so.*
+      ''}
+    '' +
+    # On all versions before c9f51e87057652db0013289a95deffba495b35e7, which
+    # removes config.nix entirely and is not present in 2.3.x, we need to
+    # patch around an issue where the Nix configure step pulls in the build
+    # system's bash and other utilities when cross-compiling.
+    lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform && !atLeast24) ''
+      mkdir tmp/
+      substitute corepkgs/config.nix.in tmp/config.nix.in \
+        --subst-var-by bash ${bash}/bin/bash \
+        --subst-var-by coreutils ${coreutils}/bin \
+        --subst-var-by bzip2 ${bzip2}/bin/bzip2 \
+        --subst-var-by gzip ${gzip}/bin/gzip \
+        --subst-var-by xz ${xz}/bin/xz \
+        --subst-var-by tar ${gnutar}/bin/tar \
+        --subst-var-by tr ${coreutils}/bin/tr
+      mv tmp/config.nix.in corepkgs/config.nix.in
+    '';
+
+  configureFlags = [
+    "--with-store-dir=${storeDir}"
+    "--localstatedir=${stateDir}"
+    "--sysconfdir=${confDir}"
+    "--enable-gc"
+  ] ++ lib.optionals (!enableDocumentation) [
+    "--disable-doc-gen"
+  ] ++ lib.optionals stdenv.isLinux [
+    "--with-sandbox-shell=${busybox-sandbox-shell}/bin/busybox"
+  ] ++ lib.optionals (atLeast210 && stdenv.isLinux && stdenv.hostPlatform.isStatic) [
+    "--enable-embedded-sandbox-shell"
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform ? nix && stdenv.hostPlatform.nix ? system) [
+    "--with-system=${stdenv.hostPlatform.nix.system}"
+  ] ++ lib.optionals (!withLibseccomp) [
+    # RISC-V support in progress https://github.com/seccomp/libseccomp/pull/50
+    "--disable-seccomp-sandboxing"
+  ] ++ lib.optionals (atLeast210 && stdenv.cc.isGNU && !enableStatic) [
+    "--enable-lto"
+  ];
+
+  makeFlags = [
+    # gcc runs multi-threaded LTO using make and does not yet detect the new fifo:/path style
+    # of make jobserver. until gcc adds support for this we have to instruct make to use this
+    # old style or LTO builds will run their linking on only one thread, which takes forever.
+    "--jobserver-style=pipe"
+    "profiledir=$(out)/etc/profile.d"
+  ] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "PRECOMPILE_HEADERS=0"
+    ++ lib.optional (stdenv.hostPlatform.isDarwin) "PRECOMPILE_HEADERS=1";
+
+  installFlags = [ "sysconfdir=$(out)/etc" ];
+
+  doInstallCheck = true;
+  installCheckTarget = if atLeast210 then "installcheck" else null;
+
+  # socket path becomes too long otherwise
+  preInstallCheck = lib.optionalString stdenv.isDarwin ''
+    export TMPDIR=$NIX_BUILD_TOP
+  ''
+  # See https://github.com/NixOS/nix/issues/5687
+  + lib.optionalString (atLeast25 && stdenv.isDarwin) ''
+    echo "exit 99" > tests/gc-non-blocking.sh
+  '';
+
+  separateDebugInfo = stdenv.isLinux && (atLeast24 -> !enableStatic);
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    inherit aws-sdk-cpp boehmgc;
+
+    perl-bindings = perl.pkgs.toPerlModule (callPackage ./nix-perl.nix { nix = self; inherit Security; });
+
+    tests = {
+      nixi686 = pkgsi686Linux.nixVersions.${"nix_${lib.versions.major version}_${lib.versions.minor version}"};
+    };
+  };
+
+  meta = with lib; {
+    description = "Powerful package manager that makes package management reliable and reproducible";
+    longDescription = ''
+      Nix is a powerful package manager for Linux and other Unix systems that
+      makes package management reliable and reproducible. It provides atomic
+      upgrades and rollbacks, side-by-side installation of multiple versions of
+      a package, multi-user package management and easy setup of build
+      environments.
+    '';
+    homepage = "https://nixos.org/";
+    license = licenses.lgpl2Plus;
+    inherit maintainers;
+    platforms = platforms.unix;
+    outputsToInstall = [ "out" ] ++ optional enableDocumentation "man";
+    mainProgram = "nix";
+  };
+};
+in self
diff --git a/nixpkgs/pkgs/tools/package-management/nix/default.nix b/nixpkgs/pkgs/tools/package-management/nix/default.nix
new file mode 100644
index 000000000000..4652ddb76a5b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix/default.nix
@@ -0,0 +1,277 @@
+{ lib
+, config
+, aws-sdk-cpp
+, boehmgc
+, callPackage
+, fetchFromGitHub
+, fetchpatch
+, fetchpatch2
+, runCommand
+, Security
+
+, storeDir ? "/nix/store"
+, stateDir ? "/nix/var"
+, confDir ? "/etc"
+}:
+let
+  boehmgc-nix_2_3 = boehmgc.override { enableLargeConfig = true; };
+
+  boehmgc-nix = boehmgc-nix_2_3.overrideAttrs (drv: {
+    # Part of the GC solution in https://github.com/NixOS/nix/pull/4944
+    patches = (drv.patches or [ ]) ++ [ ./patches/boehmgc-coroutine-sp-fallback.patch ];
+  });
+
+  # old nix fails to build with newer aws-sdk-cpp and the patch doesn't apply
+  aws-sdk-cpp-old-nix = (aws-sdk-cpp.override {
+    apis = [ "s3" "transfer" ];
+    customMemoryManagement = false;
+  }).overrideAttrs (args: rec {
+    # intentionally overriding postPatch
+    version = "1.9.294";
+
+    src = fetchFromGitHub {
+      owner = "aws";
+      repo = "aws-sdk-cpp";
+      rev = version;
+      hash = "sha256-Z1eRKW+8nVD53GkNyYlZjCcT74MqFqqRMeMc33eIQ9g=";
+    };
+    postPatch = ''
+      # Avoid blanket -Werror to evade build failures on less
+      # tested compilers.
+      substituteInPlace cmake/compiler_settings.cmake \
+        --replace '"-Werror"' ' '
+
+      # Missing includes for GCC11
+      sed '5i#include <thread>' -i \
+        aws-cpp-sdk-cloudfront-integration-tests/CloudfrontOperationTest.cpp \
+        aws-cpp-sdk-cognitoidentity-integration-tests/IdentityPoolOperationTest.cpp \
+        aws-cpp-sdk-dynamodb-integration-tests/TableOperationTest.cpp \
+        aws-cpp-sdk-elasticfilesystem-integration-tests/ElasticFileSystemTest.cpp \
+        aws-cpp-sdk-lambda-integration-tests/FunctionTest.cpp \
+        aws-cpp-sdk-mediastore-data-integration-tests/MediaStoreDataTest.cpp \
+        aws-cpp-sdk-queues/source/sqs/SQSQueue.cpp \
+        aws-cpp-sdk-redshift-integration-tests/RedshiftClientTest.cpp \
+        aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp \
+        aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp \
+        aws-cpp-sdk-s3control-integration-tests/S3ControlTest.cpp \
+        aws-cpp-sdk-sqs-integration-tests/QueueOperationTest.cpp \
+        aws-cpp-sdk-transfer-tests/TransferTests.cpp
+      # Flaky on Hydra
+      rm aws-cpp-sdk-core-tests/aws/auth/AWSCredentialsProviderTest.cpp
+      # Includes aws-c-auth private headers, so only works with submodule build
+      rm aws-cpp-sdk-core-tests/aws/auth/AWSAuthSignerTest.cpp
+      # TestRandomURLMultiThreaded fails
+      rm aws-cpp-sdk-core-tests/http/HttpClientTest.cpp
+    '' + lib.optionalString aws-sdk-cpp.stdenv.isi686 ''
+      # EPSILON is exceeded
+      rm aws-cpp-sdk-core-tests/aws/client/AdaptiveRetryStrategyTest.cpp
+    '';
+
+    patches = (args.patches or [ ]) ++ [ ./patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch ];
+
+    # only a stripped down version is build which takes a lot less resources to build
+    requiredSystemFeatures = [ ];
+  });
+
+  aws-sdk-cpp-nix = (aws-sdk-cpp.override {
+    apis = [ "s3" "transfer" ];
+    customMemoryManagement = false;
+  }).overrideAttrs {
+    # only a stripped down version is build which takes a lot less resources to build
+    requiredSystemFeatures = [ ];
+  };
+
+
+  common = args:
+    callPackage
+      (import ./common.nix ({ inherit lib fetchFromGitHub; } // args))
+      {
+        inherit Security storeDir stateDir confDir;
+        boehmgc = boehmgc-nix;
+        aws-sdk-cpp = if lib.versionAtLeast args.version "2.12pre" then aws-sdk-cpp-nix else aws-sdk-cpp-old-nix;
+      };
+
+  # https://github.com/NixOS/nix/pull/7585
+  patch-monitorfdhup = fetchpatch2 {
+    name = "nix-7585-monitor-fd-hup.patch";
+    url = "https://github.com/NixOS/nix/commit/1df3d62c769dc68c279e89f68fdd3723ed3bcb5a.patch";
+    hash = "sha256-f+F0fUO+bqyPXjt+IXJtISVr589hdc3y+Cdrxznb+Nk=";
+  };
+
+  # https://github.com/NixOS/nix/pull/7473
+  patch-sqlite-exception = fetchpatch2 {
+    name = "nix-7473-sqlite-exception-add-message.patch";
+    url = "https://github.com/hercules-ci/nix/commit/c965f35de71cc9d88f912f6b90fd7213601e6eb8.patch";
+    hash = "sha256-tI5nKU7SZgsJrxiskJ5nHZyfrWf5aZyKYExM0792N80=";
+  };
+
+  patch-non-existing-output = fetchpatch {
+    # https://github.com/NixOS/nix/pull/7283
+    name = "fix-requires-non-existing-output.patch";
+    url = "https://github.com/NixOS/nix/commit/3ade5f5d6026b825a80bdcc221058c4f14e10a27.patch";
+    hash = "sha256-s1ybRFCjQaSGj7LKu0Z5g7UiHqdJGeD+iPoQL0vaiS0=";
+  };
+
+  patch-rapidcheck-shared = fetchpatch2 {
+    # https://github.com/NixOS/nix/pull/9431
+    name = "fix-missing-librapidcheck.patch";
+    url = "https://github.com/NixOS/nix/commit/46131567da96ffac298b9ec54016b37114b0dfd5.patch";
+    hash = "sha256-lShYxYKRDWwBqCysAFmFBudhhAL1eendWcL8sEFLCGg=";
+  };
+
+  # Intentionally does not support overrideAttrs etc
+  # Use only for tests that are about the package relation to `pkgs` and/or NixOS.
+  addTestsShallowly = tests: pkg: pkg // {
+    tests = pkg.tests // tests;
+    # In case someone reads the wrong attribute
+    passthru.tests = pkg.tests // tests;
+  };
+
+  addFallbackPathsCheck = pkg: addTestsShallowly
+    { nix-fallback-paths =
+        runCommand "test-nix-fallback-paths-version-equals-nix-stable" {
+          paths = lib.concatStringsSep "\n" (builtins.attrValues (import ../../../../nixos/modules/installer/tools/nix-fallback-paths.nix));
+        } ''
+          if [[ "" != $(grep -v 'nix-${pkg.version}$' <<< "$paths") ]]; then
+            echo "nix-fallback-paths not up to date with nixVersions.stable (nix-${pkg.version})"
+            echo "The following paths are not up to date:"
+            grep -v 'nix-${pkg.version}$' <<< "$paths"
+            echo
+            echo "Fix it by running in nixpkgs:"
+            echo
+            echo "curl https://releases.nixos.org/nix/nix-${pkg.version}/fallback-paths.nix >nixos/modules/installer/tools/nix-fallback-paths.nix"
+            echo
+            exit 1
+          else
+            echo "nix-fallback-paths versions up to date"
+            touch $out
+          fi
+        '';
+    }
+    pkg;
+
+in lib.makeExtensible (self: ({
+  nix_2_3 = (common {
+    version = "2.3.17";
+    hash = "sha256-EK0pgHDekJFqr0oMj+8ANIjq96WPjICe2s0m4xkUdH4=";
+    patches = [
+      patch-monitorfdhup
+    ];
+    maintainers = with lib.maintainers; [ flokli raitobezarius ];
+  }).override { boehmgc = boehmgc-nix_2_3; };
+
+  nix_2_10 = common {
+    version = "2.10.3";
+    hash = "sha256-B9EyDUz/9tlcWwf24lwxCFmkxuPTVW7HFYvp0C4xGbc=";
+    patches = [
+      ./patches/flaky-tests.patch
+      patch-non-existing-output
+      patch-monitorfdhup
+      patch-sqlite-exception
+    ];
+  };
+
+  nix_2_11 = common {
+    version = "2.11.1";
+    hash = "sha256-qCV65kw09AG+EkdchDPq7RoeBznX0Q6Qa4yzPqobdOk=";
+    patches = [
+      ./patches/flaky-tests.patch
+      patch-non-existing-output
+      patch-monitorfdhup
+      patch-sqlite-exception
+    ];
+  };
+
+  nix_2_12 = common {
+    version = "2.12.1";
+    hash = "sha256-GmHKhq0uFtdOiJnuBwj2YwlZjvh6YTkfQZgeu4e0dLU=";
+    patches = [
+      ./patches/flaky-tests.patch
+      patch-monitorfdhup
+      patch-sqlite-exception
+    ];
+  };
+
+  nix_2_13 = common {
+    version = "2.13.6";
+    hash = "sha256-pd2yGmHWn4njfbrSP6cMJx8qL+yeGieqcbLNICzcRFs=";
+  };
+
+  nix_2_14 = common {
+    version = "2.14.1";
+    hash = "sha256-5aCmGZbsFcLIckCDfvnPD4clGPQI7qYAqHYlttN/Wkg=";
+    patches = [
+      patch-rapidcheck-shared
+    ];
+  };
+
+  nix_2_15 = common {
+    version = "2.15.3";
+    hash = "sha256-sfFXbjC5iIdSAbctZIuFozxX0uux/KFBNr9oh33xINs=";
+    patches = [
+      patch-rapidcheck-shared
+    ];
+  };
+
+  nix_2_16 = common {
+    version = "2.16.2";
+    hash = "sha256-VXIYCDkvAWeMoU0W2ZI0TeOszCZA1o8trz6YCPFD5ac=";
+    patches = [
+      patch-rapidcheck-shared
+    ];
+  };
+
+  nix_2_17 = common {
+    version = "2.17.1";
+    hash = "sha256-Q5L+rHzjp0bYuR2ogg+YPCn6isjmlQ4CJVT0zpn/hFc=";
+    patches = [
+      patch-rapidcheck-shared
+    ];
+  };
+
+  nix_2_18 = common {
+    version = "2.18.1";
+    hash = "sha256-WNmifcTsN9aG1ONkv+l2BC4sHZZxtNKy0keqBHXXQ7w=";
+    patches = [
+      patch-rapidcheck-shared
+    ];
+  };
+
+  nix_2_19 = common {
+    version = "2.19.2";
+    hash = "sha256-iA8DqS+W2fWTfR+nNJSvMHqQ+4NpYMRT3b+2zS6JTvE=";
+  };
+
+  # The minimum Nix version supported by Nixpkgs
+  # Note that some functionality *might* have been backported into this Nix version,
+  # making this package an inaccurate representation of what features are available
+  # in the actual lowest minver.nix *patch* version.
+  minimum =
+    let
+      minver = import ../../../../lib/minver.nix;
+      major = lib.versions.major minver;
+      minor = lib.versions.minor minver;
+      attribute = "nix_${major}_${minor}";
+      nix = self.${attribute};
+    in
+    if ! self ? ${attribute} then
+      throw "The minimum supported Nix version is ${minver} (declared in lib/minver.nix), but pkgs.nixVersions.${attribute} does not exist."
+    else
+      nix;
+
+  stable = addFallbackPathsCheck self.nix_2_18;
+
+  unstable = self.nix_2_19;
+} // lib.optionalAttrs config.allowAliases {
+  nix_2_4 = throw "nixVersions.nix_2_4 has been removed";
+
+  nix_2_5 = throw "nixVersions.nix_2_5 has been removed";
+
+  nix_2_6 = throw "nixVersions.nix_2_6 has been removed";
+
+  nix_2_7 = throw "nixVersions.nix_2_7 has been removed";
+
+  nix_2_8 = throw "nixVersions.nix_2_8 has been removed";
+
+  nix_2_9 = throw "nixVersions.nix_2_9 has been removed";
+}))
diff --git a/nixpkgs/pkgs/tools/package-management/nix/nix-perl.nix b/nixpkgs/pkgs/tools/package-management/nix/nix-perl.nix
new file mode 100644
index 000000000000..0796a0914f1f
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix/nix-perl.nix
@@ -0,0 +1,43 @@
+{ stdenv
+, lib
+, perl
+, pkg-config
+, curl
+, nix
+, libsodium
+, boost
+, autoreconfHook
+, autoconf-archive
+, nlohmann_json
+, Security
+}:
+
+stdenv.mkDerivation {
+  pname = "nix-perl";
+  inherit (nix) version src;
+
+  postUnpack = "sourceRoot=$sourceRoot/perl";
+
+  buildInputs = lib.optional (stdenv.isDarwin) Security;
+
+  # This is not cross-compile safe, don't have time to fix right now
+  # but noting for future travellers.
+  nativeBuildInputs = [
+    autoconf-archive
+    autoreconfHook
+    boost
+    curl
+    libsodium
+    nix
+    nlohmann_json
+    perl
+    pkg-config
+  ];
+
+  configureFlags = [
+    "--with-dbi=${perl.pkgs.DBI}/${perl.libPrefix}"
+    "--with-dbd-sqlite=${perl.pkgs.DBDSQLite}/${perl.libPrefix}"
+  ];
+
+  preConfigure = "export NIX_STATE_DIR=$TMPDIR";
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch b/nixpkgs/pkgs/tools/package-management/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch
new file mode 100644
index 000000000000..59cc305a60bc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix/patches/aws-sdk-cpp-TransferManager-ContentEncoding.patch
@@ -0,0 +1,127 @@
+From 7d58e303159b2fb343af9a1ec4512238efa147c7 Mon Sep 17 00:00:00 2001
+From: Eelco Dolstra <edolstra@gmail.com>
+Date: Mon, 6 Aug 2018 17:15:04 +0200
+Subject: [PATCH] TransferManager: Allow setting a content-encoding for S3 uploads
+
+--- a/aws-cpp-sdk-transfer/include/aws/transfer/TransferHandle.h
++++ b/aws-cpp-sdk-transfer/include/aws/transfer/TransferHandle.h
+@@ -297,6 +297,14 @@ namespace Aws
+              * Content type of the object being transferred
+              */
+             inline void SetContentType(const Aws::String& value) { std::lock_guard<std::mutex> locker(m_getterSetterLock); m_contentType = value; }
++            /**
++             * Content encoding of the object being transferred
++             */
++            inline const Aws::String GetContentEncoding() const { std::lock_guard<std::mutex> locker(m_getterSetterLock); return m_contentEncoding; }
++            /**
++             * Content type of the object being transferred
++             */
++            inline void SetContentEncoding(const Aws::String& value) { std::lock_guard<std::mutex> locker(m_getterSetterLock); m_contentEncoding = value; }
+             /**
+              * In case of an upload, this is the metadata that was placed on the object when it was uploaded.
+              * In the case of a download, this is the object metadata from the GetObject operation.
+@@ -383,6 +391,7 @@ namespace Aws
+             Aws::String m_key;
+             Aws::String m_fileName;
+             Aws::String m_contentType;
++            Aws::String m_contentEncoding;
+             Aws::String m_versionId;
+             Aws::Map<Aws::String, Aws::String> m_metadata;
+             TransferStatus m_status;
+--- a/aws-cpp-sdk-transfer/include/aws/transfer/TransferManager.h
++++ b/aws-cpp-sdk-transfer/include/aws/transfer/TransferManager.h
+@@ -154,7 +154,8 @@ namespace Aws
+                                                        const Aws::String& keyName,
+                                                        const Aws::String& contentType, 
+                                                        const Aws::Map<Aws::String, Aws::String>& metadata,
+-                                                       const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr);
++                                                       const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr,
++                                                       const Aws::String& contentEncoding = "");
+ 
+             /**
+              * Downloads the contents of bucketName/keyName in S3 to the file specified by writeToFile. This will perform a GetObject operation.
+@@ -246,7 +247,8 @@ namespace Aws
+                                                                    const Aws::Map<Aws::String,
+                                                                    Aws::String>& metadata,
+                                                                    const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
+-                                                                   const Aws::String& fileName = "");
++                                                                   const Aws::String& fileName = "",
++                                                                   const Aws::String& contentEncoding = "");
+ 
+             /**
+              * Submits the actual task to task schecduler
+@@ -262,7 +264,8 @@ namespace Aws
+                                                          const Aws::String& keyName,
+                                                          const Aws::String& contentType,
+                                                          const Aws::Map<Aws::String, Aws::String>& metadata,
+-                                                         const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context);
++                                                         const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
++                                                         const Aws::String& contentEncoding);
+ 
+             /**
+              * Uploads the contents of file, to bucketName/keyName in S3. contentType and metadata will be added to the object. If the object is larger than the configured bufferSize,
+--- a/aws-cpp-sdk-transfer/source/transfer/TransferManager.cpp
++++ b/aws-cpp-sdk-transfer/source/transfer/TransferManager.cpp
+@@ -87,9 +87,10 @@ namespace Aws
+                                                                     const Aws::String& bucketName,
+                                                                     const Aws::String& keyName, const Aws::String& contentType,
+                                                                     const Aws::Map<Aws::String, Aws::String>& metadata,
+-                                                                    const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context)
++                                                                    const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
++                                                                    const Aws::String& contentEncoding)
+         {
+-            return this->DoUploadFile(fileStream, bucketName, keyName, contentType, metadata, context);
++            return this->DoUploadFile(fileStream, bucketName, keyName, contentType, metadata, context, contentEncoding);
+         }
+ 
+         std::shared_ptr<TransferHandle> TransferManager::DownloadFile(const Aws::String& bucketName,
+@@ -286,6 +287,9 @@ namespace Aws
+                 createMultipartRequest.WithKey(handle->GetKey());
+                 createMultipartRequest.WithMetadata(handle->GetMetadata());
+ 
++                if (handle->GetContentEncoding() != "")
++                    createMultipartRequest.WithContentEncoding(handle->GetContentEncoding());
++
+                 auto createMultipartResponse = m_transferConfig.s3Client->CreateMultipartUpload(createMultipartRequest);
+                 if (createMultipartResponse.IsSuccess())
+                 {
+@@ -441,6 +445,9 @@ namespace Aws
+ 
+             putObjectRequest.SetContentType(handle->GetContentType());
+ 
++            if (handle->GetContentEncoding() != "")
++                putObjectRequest.SetContentEncoding(handle->GetContentEncoding());
++
+             auto buffer = m_bufferManager.Acquire();
+ 
+             auto lengthToWrite = (std::min)(m_transferConfig.bufferSize, handle->GetBytesTotalSize());
+@@ -1140,12 +1147,15 @@ namespace Aws
+                                                                                 const Aws::String& contentType,
+                                                                                 const Aws::Map<Aws::String, Aws::String>& metadata,
+                                                                                 const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
+-                                                                                const Aws::String& fileName)
++                                                                                const Aws::String& fileName,
++                                                                                const Aws::String& contentEncoding)
+         {
+             auto handle = Aws::MakeShared<TransferHandle>(CLASS_TAG, bucketName, keyName, 0, fileName);
+             handle->SetContentType(contentType);
+             handle->SetMetadata(metadata);
+             handle->SetContext(context);
++            if (contentEncoding != "")
++                handle->SetContentEncoding(contentEncoding);
+ 
+             if (!fileStream->good())
+             {
+@@ -1213,9 +1223,10 @@ namespace Aws
+                                                                       const Aws::String& keyName,
+                                                                       const Aws::String& contentType,
+                                                                       const Aws::Map<Aws::String, Aws::String>& metadata,
+-                                                                      const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context)
++                                                                      const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context,
++                                                                      const Aws::String& contentEncoding)
+         {
+-            auto handle = CreateUploadFileHandle(fileStream.get(), bucketName, keyName, contentType, metadata, context);
++            auto handle = CreateUploadFileHandle(fileStream.get(), bucketName, keyName, contentType, metadata, context, "", contentEncoding);
+             return SubmitUpload(handle, fileStream);
+         }
+ 
diff --git a/nixpkgs/pkgs/tools/package-management/nix/patches/boehmgc-coroutine-sp-fallback.patch b/nixpkgs/pkgs/tools/package-management/nix/patches/boehmgc-coroutine-sp-fallback.patch
new file mode 100644
index 000000000000..e4e2b3858ad5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix/patches/boehmgc-coroutine-sp-fallback.patch
@@ -0,0 +1,45 @@
+diff --git a/pthread_stop_world.c b/pthread_stop_world.c
+index b5d71e62..aed7b0bf 100644
+--- a/pthread_stop_world.c
++++ b/pthread_stop_world.c
+@@ -768,6 +768,8 @@ STATIC void GC_restart_handler(int sig)
+ /* world is stopped.  Should not fail if it isn't.                      */
+ GC_INNER void GC_push_all_stacks(void)
+ {
++    size_t stack_limit;
++    pthread_attr_t pattr;
+     GC_bool found_me = FALSE;
+     size_t nthreads = 0;
+     int i;
+@@ -851,6 +853,31 @@ GC_INNER void GC_push_all_stacks(void)
+           hi = p->altstack + p->altstack_size;
+           /* FIXME: Need to scan the normal stack too, but how ? */
+           /* FIXME: Assume stack grows down */
++        } else {
++          if (pthread_getattr_np(p->id, &pattr)) {
++            ABORT("GC_push_all_stacks: pthread_getattr_np failed!");
++          }
++          if (pthread_attr_getstacksize(&pattr, &stack_limit)) {
++            ABORT("GC_push_all_stacks: pthread_attr_getstacksize failed!");
++          }
++          if (pthread_attr_destroy(&pattr)) {
++            ABORT("GC_push_all_stacks: pthread_attr_destroy failed!");
++          }
++          // When a thread goes into a coroutine, we lose its original sp until
++          // control flow returns to the thread.
++          // While in the coroutine, the sp points outside the thread stack,
++          // so we can detect this and push the entire thread stack instead,
++          // as an approximation.
++          // We assume that the coroutine has similarly added its entire stack.
++          // This could be made accurate by cooperating with the application
++          // via new functions and/or callbacks.
++          #ifndef STACK_GROWS_UP
++            if (lo >= hi || lo < hi - stack_limit) { // sp outside stack
++              lo = hi - stack_limit;
++            }
++          #else
++          #error "STACK_GROWS_UP not supported in boost_coroutine2 (as of june 2021), so we don't support it in Nix."
++          #endif
+         }
+         GC_push_all_stack_sections(lo, hi, traced_stack_sect);
+ #       ifdef STACK_GROWS_UP
diff --git a/nixpkgs/pkgs/tools/package-management/nix/patches/flaky-tests.patch b/nixpkgs/pkgs/tools/package-management/nix/patches/flaky-tests.patch
new file mode 100644
index 000000000000..3684b09f6ffa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nix/patches/flaky-tests.patch
@@ -0,0 +1,12 @@
+diff --git a/mk/run_test.sh b/mk/run_test.sh
+index 7e95df2ac..58420c317 100755
+--- a/mk/run_test.sh
++++ b/mk/run_test.sh
+@@ -27,7 +27,6 @@ run_test "$1"
+ # appear randomly without anyone knowing why.
+ # See https://github.com/NixOS/nix/issues/3605 for more info
+ if [[ $status -ne 0 && $status -ne 99 && \
+-    "$(uname)" == "Darwin" && \
+     "$log" =~ "unexpected EOF reading a line" \
+ ]]; then
+     echo "$post_run_msg [${yellow}FAIL$normal] (possibly flaky, so will be retried)"
diff --git a/nixpkgs/pkgs/tools/package-management/nixpkgs-review/default.nix b/nixpkgs/pkgs/tools/package-management/nixpkgs-review/default.nix
new file mode 100644
index 000000000000..5e57c6964238
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nixpkgs-review/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, python3
+, fetchFromGitHub
+
+, installShellFiles
+, bubblewrap
+, nix-output-monitor
+, cacert
+, git
+, nix
+
+, withAutocomplete ? true
+, withSandboxSupport ? false
+, withNom ? false
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "nixpkgs-review";
+  version = "2.10.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Mic92";
+    repo = "nixpkgs-review";
+    rev = version;
+    hash = "sha256-iO+B/4UsMi+vf85oyLwZTigZ+mmt7Sk3qGba20/0XBs=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    python3.pkgs.setuptools
+  ] ++ lib.optionals withAutocomplete [
+    python3.pkgs.argcomplete
+  ];
+
+  propagatedBuildInputs = [ python3.pkgs.argcomplete ];
+
+  makeWrapperArgs =
+    let
+      binPath = [ nix git ]
+        ++ lib.optional withSandboxSupport bubblewrap
+        ++ lib.optional withNom nix-output-monitor;
+    in
+    [
+      "--prefix PATH : ${lib.makeBinPath binPath}"
+      "--set-default NIX_SSL_CERT_FILE ${cacert}/etc/ssl/certs/ca-bundle.crt"
+      # we don't have any runtime deps but nix-review shells might inject unwanted dependencies
+      "--unset PYTHONPATH"
+    ];
+
+  doCheck = false;
+
+  postInstall = lib.optionalString withAutocomplete ''
+    for cmd in nix-review nixpkgs-review; do
+      installShellCompletion --cmd $cmd \
+        --bash <(register-python-argcomplete $out/bin/$cmd) \
+        --fish <(register-python-argcomplete $out/bin/$cmd -s fish) \
+        --zsh <(register-python-argcomplete $out/bin/$cmd -s zsh)
+    done
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/Mic92/nixpkgs-review/releases/tag/${version}";
+    description = "Review pull-requests on https://github.com/NixOS/nixpkgs";
+    homepage = "https://github.com/Mic92/nixpkgs-review";
+    license = licenses.mit;
+    mainProgram = "nixpkgs-review";
+    maintainers = with maintainers; [ figsoda mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nox/default.nix b/nixpkgs/pkgs/tools/package-management/nox/default.nix
new file mode 100644
index 000000000000..b215a8e1d285
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nox/default.nix
@@ -0,0 +1,32 @@
+{ lib, python3Packages, fetchurl, git }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "nox";
+  version = "0.0.6";
+  namePrefix = "";
+
+  src = fetchurl {
+    url = "mirror://pypi/n/nix-nox/nix-nox-${version}.tar.gz";
+    sha256 = "1qcbhdnhdhhv7q6cqdgv0q55ic8fk18526zn2yb12x9r1s0lfp9z";
+  };
+
+  patches = [ ./nox-review-wip.patch ];
+
+  buildInputs = [ python3Packages.pbr git ];
+
+  propagatedBuildInputs = with python3Packages; [
+      dogpile-cache
+      click
+      requests
+      characteristic
+      setuptools
+    ];
+
+  meta = {
+    homepage = "https://github.com/madjar/nox";
+    description = "Tools to make nix nicer to use";
+    maintainers = [ lib.maintainers.madjar ];
+    license = lib.licenses.mit;
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nox/nox-review-wip.patch b/nixpkgs/pkgs/tools/package-management/nox/nox-review-wip.patch
new file mode 100644
index 000000000000..e82dc7a2c266
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nox/nox-review-wip.patch
@@ -0,0 +1,11 @@
+--- a/nox/review.py	2017-09-23 04:04:37.322484753 +0200
++++ a/nox/review.py	2017-09-23 04:18:31.582692181 +0200
+@@ -84,7 +84,7 @@
+     ctx.obj['dry_run'] = dry_run
+ 
+ 
+-@cli.command(short_help='difference between working tree and a commit')
++@cli.command('wip', short_help='difference between working tree and a commit')
+ @click.option('--against', default='HEAD')
+ @click.pass_context
+ @setup_nixpkgs_config
diff --git a/nixpkgs/pkgs/tools/package-management/npm-check-updates/default.nix b/nixpkgs/pkgs/tools/package-management/npm-check-updates/default.nix
new file mode 100644
index 000000000000..6e01d4415efc
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/npm-check-updates/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "npm-check-updates";
+  version = "16.14.0";
+
+  src = fetchFromGitHub {
+    owner = "raineorshine";
+    repo = "npm-check-updates";
+    rev = "v${version}";
+    hash = "sha256-X8Mu4Fd650H7eA2nfoefmr4jW974qLBLurmj2H4t7xY=";
+  };
+
+  npmDepsHash = "sha256-wm7/WlzqfE7DOT0jUTXBivlC9J8dyHa/OVSgi2SdO5w=";
+
+  meta = {
+    changelog = "https://github.com/raineorshine/npm-check-updates/blob/${src.rev}/CHANGELOG.md";
+    description = "Find newer versions of package dependencies than what your package.json allows";
+    homepage = "https://github.com/raineorshine/npm-check-updates";
+    license = lib.licenses.asl20;
+    mainProgram = "ncu";
+    maintainers = with lib.maintainers; [ flosse ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/nvd/default.nix b/nixpkgs/pkgs/tools/package-management/nvd/default.nix
new file mode 100644
index 000000000000..8f33b4a5fbfa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/nvd/default.nix
@@ -0,0 +1,42 @@
+{ fetchFromGitLab
+, installShellFiles
+, lib
+, python3
+, stdenv
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "nvd";
+  version = "0.2.3";
+
+  src = fetchFromGitLab {
+    owner = "khumba";
+    repo = "nvd";
+    rev = "refs/tags/v${finalAttrs.version}";
+    hash = "sha256-TmaXsyJLRkmIN9D77jOXd8fLj7kYPCBLg0AHIImAtgA=";
+  };
+
+  buildInputs = [
+    python3
+  ];
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    install -m555 -Dt $out/bin src/nvd
+    installManPage src/nvd.1
+    runHook postInstall
+  '';
+
+  meta = {
+    description = "Nix/NixOS package version diff tool";
+    homepage = "https://gitlab.com/khumba/nvd";
+    license = lib.licenses.asl20;
+    mainProgram = "nvd";
+    maintainers = with lib.maintainers; [ khumba ];
+    platforms = lib.platforms.all;
+  };
+})
diff --git a/nixpkgs/pkgs/tools/package-management/opkg-utils/default.nix b/nixpkgs/pkgs/tools/package-management/opkg-utils/default.nix
new file mode 100644
index 000000000000..922fa4c93e1e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/opkg-utils/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchgit }:
+
+stdenv.mkDerivation {
+  pname = "opkg-utils";
+  version = "unstable-2014-10-30";
+
+  # No releases, only a git tree
+  src = fetchgit {
+    url = "git://git.yoctoproject.org/opkg-utils";
+    rev = "762d9dadce548108d4204c2113461a7dd6f57e60";
+    sha256 = "09jfkq2p5wv0ifxkw62f4m7pkvpaalh74j2skymi8lh4268krfwz";
+  };
+
+  preBuild = ''
+    makeFlagsArray+=(PREFIX="$out")
+  '';
+
+  meta = with lib; {
+    description = "Helper scripts for use with the opkg package manager";
+    homepage = "http://git.yoctoproject.org/cgit/cgit.cgi/opkg-utils/";
+    license = licenses.gpl2;
+    platforms = platforms.all;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/opkg/default.nix b/nixpkgs/pkgs/tools/package-management/opkg/default.nix
new file mode 100644
index 000000000000..6a85e4bb9e88
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/opkg/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, curl
+, gpgme
+, libarchive
+, bzip2
+, xz
+, attr
+, acl
+, libxml2
+, autoreconfHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "opkg";
+  version = "0.6.2";
+
+  src = fetchurl {
+    url = "https://downloads.yoctoproject.org/releases/opkg/opkg-${version}.tar.gz";
+    hash = "sha256-rHOpCiVJzQSUjlY9kVkSx44bi6D0OvdcWlP8ykdK29U=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    autoreconfHook
+  ];
+
+  buildInputs = [
+    curl
+    gpgme
+    libarchive
+    bzip2
+    xz
+    attr
+    acl
+    libxml2
+  ];
+
+  configureFlags = [
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+  ];
+
+  meta = with lib; {
+    description = "A lightweight package management system based upon ipkg";
+    homepage = "https://git.yoctoproject.org/cgit/cgit.cgi/opkg/";
+    changelog = "https://git.yoctoproject.org/opkg/tree/NEWS?h=v${version}";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/packagekit/default.nix b/nixpkgs/pkgs/tools/package-management/packagekit/default.nix
new file mode 100644
index 000000000000..b51a51da84f5
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/packagekit/default.nix
@@ -0,0 +1,112 @@
+{ stdenv
+, fetchFromGitHub
+, lib
+, gettext
+, glib
+, pkg-config
+, polkit
+, python3
+, sqlite
+, gobject-introspection
+, vala
+, gtk-doc
+, boost
+, meson
+, ninja
+, libxslt
+, docbook-xsl-nons
+, docbook_xml_dtd_42
+, libxml2
+, gst_all_1
+, gtk3
+, enableCommandNotFound ? false
+, enableBashCompletion ? false
+, bash-completion ? null
+, enableSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd
+, systemd
+}:
+
+stdenv.mkDerivation rec {
+  pname = "packagekit";
+  version = "1.2.5.1pre";
+
+  outputs = [ "out" "dev" "devdoc" ];
+
+  src = fetchFromGitHub {
+    owner = "PackageKit";
+    repo = "PackageKit";
+    rev = "30bb82da8d4161330a6d7a20c9989149303421a1";
+    sha256 = "k2osc2v0OuGrNjwxdqn785RsbHEJP3p79PG9YqnVE3U=";
+  };
+
+  buildInputs = [
+    glib
+    polkit
+    python3
+    gst_all_1.gstreamer
+    gst_all_1.gst-plugins-base
+    gtk3
+    sqlite
+    boost
+  ] ++ lib.optional enableSystemd systemd
+  ++ lib.optional enableBashCompletion bash-completion;
+  nativeBuildInputs = [
+    gobject-introspection
+    glib
+    vala
+    gettext
+    pkg-config
+    gtk-doc
+    meson
+    libxslt
+    docbook-xsl-nons
+    docbook_xml_dtd_42
+    libxml2
+    ninja
+  ];
+
+  mesonFlags = [
+    (if enableSystemd then "-Dsystemd=true" else "-Dsystem=false")
+    # often fails to build with nix updates
+    # and remounts /nix/store as rw
+    # https://github.com/NixOS/nixpkgs/issues/177946
+    #"-Dpackaging_backend=nix"
+    "-Ddbus_sys=${placeholder "out"}/share/dbus-1/system.d"
+    "-Ddbus_services=${placeholder "out"}/share/dbus-1/system-services"
+    "-Dsystemdsystemunitdir=${placeholder "out"}/lib/systemd/system"
+    "-Dcron=false"
+    "-Dgtk_doc=true"
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+  ]
+  ++ lib.optional (!enableBashCompletion) "-Dbash_completion=false"
+  ++ lib.optional (!enableCommandNotFound) "-Dbash_command_not_found=false";
+
+  postPatch = ''
+    # HACK: we want packagekit to look in /etc for configs but install
+    # those files in $out/etc ; we just override the runtime paths here
+    # same for /var & $out/var
+    substituteInPlace etc/meson.build \
+      --replace "install_dir: join_paths(get_option('sysconfdir'), 'PackageKit')" "install_dir: join_paths('$out', 'etc', 'PackageKit')"
+    substituteInPlace data/meson.build \
+      --replace "install_dir: join_paths(get_option('localstatedir'), 'lib', 'PackageKit')," "install_dir: join_paths('$out', 'var', 'lib', 'PackageKit'),"
+  '';
+
+  meta = with lib; {
+    description = "System to facilitate installing and updating packages";
+    longDescription = ''
+      PackageKit is a system designed to make installing and updating software
+      on your computer easier. The primary design goal is to unify all the
+      software graphical tools used in different distributions, and use some of
+      the latest technology like PolicyKit. The actual nuts-and-bolts distro
+      tool (dnf, apt, etc) is used by PackageKit using compiled and scripted
+      helpers. PackageKit isn't meant to replace these tools, instead providing
+      a common set of abstractions that can be used by standard GUI and text
+      mode package managers.
+    '';
+    homepage = "https://github.com/PackageKit/PackageKit";
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ matthewbauer ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/packagekit/qt.nix b/nixpkgs/pkgs/tools/package-management/packagekit/qt.nix
new file mode 100644
index 000000000000..72045735cba3
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/packagekit/qt.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchFromGitHub, cmake, pkg-config
+, qttools, packagekit }:
+
+stdenv.mkDerivation rec {
+  pname = "packagekit-qt";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner  = "hughsie";
+    repo   = "PackageKit-Qt";
+    rev    = "v${version}";
+    sha256 = "sha256-pwDMLd+Gpl0P2ImPjGeZpKAOJ4dH5+P1se0l1qm5Ui0=";
+  };
+
+  buildInputs = [ packagekit ];
+
+  nativeBuildInputs = [ cmake pkg-config qttools ];
+
+  dontWrapQtApps = true;
+
+  meta = packagekit.meta // {
+    description = "System to facilitate installing and updating packages - Qt";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/pacman/default.nix b/nixpkgs/pkgs/tools/package-management/pacman/default.nix
new file mode 100644
index 000000000000..f9a7fcdcde59
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/pacman/default.nix
@@ -0,0 +1,134 @@
+{ lib
+, stdenv
+, fetchpatch
+, fetchurl
+, asciidoc
+, binutils
+, coreutils
+, curl
+, gpgme
+, installShellFiles
+, libarchive
+, makeWrapper
+, meson
+, ninja
+, openssl
+, perl
+, pkg-config
+, zlib
+
+# Compression tools in scripts/libmakepkg/util/compress.sh.in
+, gzip
+, bzip2
+, xz
+, zstd
+, lrzip
+, lzop
+, ncompress
+, lz4
+, lzip
+
+# pacman-key runtime dependencies
+, gawk
+, gettext
+, gnugrep
+, gnupg
+
+# Tells pacman where to find ALPM hooks provided by packages.
+# This path is very likely to be used in an Arch-like root.
+, sysHookDir ? "/usr/share/libalpm/hooks/"
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pacman";
+  version = "6.0.2";
+
+  src = fetchurl {
+    url = "https://sources.archlinux.org/other/${pname}/${pname}-${version}.tar.xz";
+    hash = "sha256-fY4+jFEhrsCWXfcfWb7fRgUsbPFPljZcRBHsPeCkwaU=";
+  };
+
+  nativeBuildInputs = [
+    asciidoc
+    installShellFiles
+    makeWrapper
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    curl
+    gpgme
+    libarchive
+    openssl
+    perl
+    zlib
+  ];
+
+  patches = [
+    ./dont-create-empty-dirs.patch
+    # Add keyringdir meson option to configure the keyring directory
+    (fetchpatch {
+      url = "https://gitlab.archlinux.org/pacman/pacman/-/commit/79bd512181af12ec80fd8f79486fc9508fa4a1b3.patch";
+      hash = "sha256-ivTPwWe06Q5shn++R6EY0x3GC0P4X0SuC+F5sndfAtM=";
+    })
+  ];
+
+  postPatch = let compressionTools = [
+    gzip
+    bzip2
+    xz
+    zstd
+    lrzip
+    lzop
+    ncompress
+    lz4
+    lzip
+  ]; in ''
+    echo 'export PATH=${lib.makeBinPath compressionTools}:$PATH' >> scripts/libmakepkg/util/compress.sh.in
+    substituteInPlace meson.build \
+      --replace "install_dir : SYSCONFDIR" "install_dir : '$out/etc'" \
+      --replace "join_paths(DATAROOTDIR, 'libalpm/hooks/')" "'${sysHookDir}'" \
+      --replace "join_paths(PREFIX, DATAROOTDIR, get_option('keyringdir'))" "'\$KEYRING_IMPORT_DIR'"
+    substituteInPlace doc/meson.build \
+      --replace "/bin/true" "${coreutils}/bin/true"
+    substituteInPlace scripts/repo-add.sh.in \
+      --replace bsdtar "${libarchive}/bin/bsdtar"
+    substituteInPlace scripts/pacman-key.sh.in \
+      --replace "local KEYRING_IMPORT_DIR='@keyringdir@'" "" \
+      --subst-var-by keyringdir '\$KEYRING_IMPORT_DIR' \
+      --replace "--batch --check-trustdb" "--batch --check-trustdb --allow-weak-key-signatures"
+  ''; # the line above should be removed once Arch migrates to gnupg 2.3.x
+
+  mesonFlags = [
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+  ];
+
+  hardeningDisable = [ "fortify3" ];
+
+  postInstall = ''
+    installShellCompletion --bash scripts/pacman --zsh scripts/_pacman
+    wrapProgram $out/bin/makepkg \
+      --prefix PATH : ${lib.makeBinPath [ binutils ]}
+    wrapProgram $out/bin/pacman-key \
+      --prefix PATH : ${lib.makeBinPath [
+        "${placeholder "out"}"
+        coreutils
+        gawk
+        gettext
+        gnugrep
+        gnupg
+      ]}
+  '';
+
+  meta = with lib; {
+    description = "A simple library-based package manager";
+    homepage = "https://archlinux.org/pacman/";
+    changelog = "https://gitlab.archlinux.org/pacman/pacman/-/raw/v${version}/NEWS";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ samlukeyes123 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/pacman/dont-create-empty-dirs.patch b/nixpkgs/pkgs/tools/package-management/pacman/dont-create-empty-dirs.patch
new file mode 100644
index 000000000000..59deb947bb5d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/pacman/dont-create-empty-dirs.patch
@@ -0,0 +1,20 @@
+diff --git a/meson.build b/meson.build
+index c8ee42fd..610401ca 100644
+--- a/meson.build
++++ b/meson.build
+@@ -414,15 +414,6 @@ install_data(
+   'proto/proto.install',
+   install_dir : join_paths(DATAROOTDIR, 'pacman'))
+ 
+-foreach path : [
+-	join_paths(LOCALSTATEDIR, 'lib/pacman/'),
+-	join_paths(LOCALSTATEDIR, 'cache/pacman/pkg/'),
+-	join_paths(DATAROOTDIR, 'makepkg-template/'),
+-	join_paths(DATAROOTDIR, 'libalpm/hooks/'),
+-	]
+-	meson.add_install_script('sh', '-c', 'mkdir -p "$DESTDIR/@0@"'.format(path))
+-endforeach
+-
+ TEST_ENV = environment()
+ TEST_ENV.set('PMTEST_SCRIPTLIB_DIR', join_paths(meson.project_source_root(), 'scripts/library/'))
+ TEST_ENV.set('PMTEST_LIBMAKEPKG_DIR', join_paths(meson.project_build_root(), 'scripts/libmakepkg/'))
diff --git a/nixpkgs/pkgs/tools/package-management/pacup/default.nix b/nixpkgs/pkgs/tools/package-management/pacup/default.nix
new file mode 100644
index 000000000000..7afd4eb815d7
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/pacup/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  name = "pacup";
+  version = "2.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pacstall";
+    repo = name;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ItO38QyxNHftKPQZAPO7596ddBfX0a1nfVVqgx7BfwI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'httpx = ">=0.24,<0.25"' 'httpx = "*"'
+  '';
+
+  nativeBuildInputs = with python3.pkgs; [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    httpx
+    rich
+    typer
+    packaging
+  ];
+
+  meta = with lib; {
+    description = "Help maintainers update pacscripts";
+    longDescription = ''
+      Pacup (Pacscript Updater) is a maintainer helper tool to help maintainers update their pacscripts.
+      It semi-automates the tedious task of updating pacscripts, and aims to make it a fun process for the maintainer!
+    '';
+    homepage = "https://github.com/pacstall/pacup";
+    changelog = "https://github.com/pacstall/pacup/releases/tag/${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ zahrun ];
+    mainProgram = "pacup";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/pdm/default.nix b/nixpkgs/pkgs/tools/package-management/pdm/default.nix
new file mode 100644
index 000000000000..0bf1cb88be68
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/pdm/default.nix
@@ -0,0 +1,112 @@
+{ lib
+, stdenv
+, python3
+, fetchFromGitHub
+, fetchpatch
+, fetchPypi
+, nix-update-script
+, runtimeShell
+}:
+let
+  python = python3.override {
+    # override resolvelib due to
+    # 1. pdm requiring a later version of resolvelib
+    # 2. Ansible being packaged as a library
+    # 3. Ansible being unable to upgrade to a later version of resolvelib
+    # see here for more details: https://github.com/NixOS/nixpkgs/pull/155380/files#r786255738
+    packageOverrides = self: super: {
+      resolvelib = super.resolvelib.overridePythonAttrs rec {
+        version = "1.0.1";
+        src = fetchFromGitHub {
+          owner = "sarugaku";
+          repo = "resolvelib";
+          rev = "/refs/tags/${version}";
+          hash = "sha256-oxyPn3aFPOyx/2aP7Eg2ThtPbyzrFT1JzWqy6GqNbzM=";
+        };
+      };
+    };
+    self = python;
+  };
+in
+
+with python.pkgs;
+buildPythonApplication rec {
+  pname = "pdm";
+  version = "2.10.4";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bf2dTLWQQ+3sstC0fSCOVdidMzunGX3rBcyi37x6S/s=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    blinker
+    certifi
+    cachecontrol
+    findpython
+    installer
+    packaging
+    platformdirs
+    pyproject-hooks
+    python-dotenv
+    requests-toolbelt
+    resolvelib
+    rich
+    shellingham
+    tomlkit
+    unearth
+    virtualenv
+  ]
+  ++ cachecontrol.optional-dependencies.filecache
+  ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ]
+  ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-rerunfailures
+    pytest-xdist
+    pytest-httpserver
+  ] ++ lib.optional stdenv.isLinux first;
+
+  pytestFlagsArray = [
+    "-m 'not network'"
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    substituteInPlace tests/cli/test_run.py \
+      --replace "/bin/bash" "${runtimeShell}"
+  '';
+
+  disabledTests = [
+    # fails to locate setuptools (maybe upstream bug)
+    "test_convert_setup_py_project"
+    # pythonfinder isn't aware of nix's python infrastructure
+    "test_use_wrapper_python"
+    "test_use_invalid_wrapper_python"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    homepage = "https://pdm-project.org";
+    changelog = "https://github.com/pdm-project/pdm/releases/tag/${version}";
+    description = "A modern Python package manager with PEP 582 support";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+    mainProgram = "pdm";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/pkg/default.nix b/nixpkgs/pkgs/tools/package-management/pkg/default.nix
new file mode 100644
index 000000000000..b100b9984915
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/pkg/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchFromGitHub, m4, pkg-config, tcl
+, bzip2, elfutils, libarchive, libbsd, xz, openssl, zlib
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "pkg";
+  version = "1.20.8";
+
+  src = fetchFromGitHub {
+    owner = "freebsd";
+    repo = "pkg";
+    rev = finalAttrs.version;
+    sha256 = "sha256-pQgZMCd4PEjNZKm9V35Rca7Miblv1EgkH+CxaiKvhpY=";
+  };
+
+  setOutputFlags = false;
+  separateDebugInfo = true;
+
+  nativeBuildInputs = [ m4 pkg-config tcl ];
+  buildInputs = [ bzip2 elfutils libarchive openssl xz zlib ]
+    ++ lib.optional stdenv.isLinux libbsd;
+
+  enableParallelBuilding = true;
+
+  preInstall = ''
+    mkdir -p $out/etc
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/freebsd/pkg";
+    description = "Package management tool for FreeBSD";
+    maintainers = with maintainers; [ qyliss ];
+    platforms = with platforms; darwin ++ freebsd ++ linux ++ netbsd ++ openbsd;
+    license = licenses.bsd2;
+    mainProgram = "pkg";
+  };
+})
diff --git a/nixpkgs/pkgs/tools/package-management/poetry/default.nix b/nixpkgs/pkgs/tools/package-management/poetry/default.nix
new file mode 100644
index 000000000000..6de9219529bd
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/poetry/default.nix
@@ -0,0 +1,53 @@
+{ python3, fetchFromGitHub }:
+
+let
+  python = python3.override {
+    packageOverrides = self: super: rec {
+      poetry = self.callPackage ./unwrapped.nix { };
+
+      # The versions of Poetry and poetry-core need to match exactly,
+      # and poetry-core in nixpkgs requires a staging cycle to be updated,
+      # so apply an override here.
+      #
+      # We keep the override around even when the versions match, as
+      # it's likely to become relevant again after the next Poetry update.
+      poetry-core = super.poetry-core.overridePythonAttrs (old: rec {
+        version = "1.8.1";
+        src = fetchFromGitHub {
+          owner = "python-poetry";
+          repo = "poetry-core";
+          rev = version;
+          hash = "sha256-RnCJ67jaL2knwv+Uo7p0zOejHAT73f40weaJnfqOYoM=";
+        };
+      });
+    } // (plugins self);
+  };
+
+  plugins = ps: with ps; {
+    poetry-audit-plugin = callPackage ./plugins/poetry-audit-plugin.nix { };
+    poetry-plugin-export = callPackage ./plugins/poetry-plugin-export.nix { };
+    poetry-plugin-up = callPackage ./plugins/poetry-plugin-up.nix { };
+  };
+
+  # selector is a function mapping pythonPackages to a list of plugins
+  # e.g. poetry.withPlugins (ps: with ps; [ poetry-plugin-up ])
+  withPlugins = selector: let
+    selected = selector (plugins python.pkgs);
+  in python.pkgs.toPythonApplication (python.pkgs.poetry.overridePythonAttrs (old: {
+    propagatedBuildInputs = old.propagatedBuildInputs ++ selected;
+
+    # save some build time when adding plugins by disabling tests
+    doCheck = selected == [ ];
+
+    # Propagating dependencies leaks them through $PYTHONPATH which causes issues
+    # when used in nix-shell.
+    postFixup = ''
+      rm $out/nix-support/propagated-build-inputs
+    '';
+
+    passthru = {
+      plugins = plugins python.pkgs;
+      inherit withPlugins python;
+    };
+  }));
+in withPlugins (ps: [ ])
diff --git a/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-audit-plugin.nix b/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-audit-plugin.nix
new file mode 100644
index 000000000000..85eb0b5d19b1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-audit-plugin.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, poetry
+, safety
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-audit-plugin";
+  version = "0.3.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "opeco17";
+    repo = "poetry-audit-plugin";
+    rev = "refs/tags/${version}";
+    hash = "sha256-49OnYz3EFiqOe+cLgfynjy14Ve4Ga6OUrLdM8HhZuKQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    poetry
+  ];
+
+  propagatedBuildInputs = [
+    safety
+  ];
+
+  pythonImportsCheck = [ "poetry_audit_plugin" ];
+
+  nativeCheckInputs = [
+    poetry  # for the executable
+    pytestCheckHook
+  ];
+
+  # requires networking
+  doCheck = false;
+
+  meta = {
+    description = "Poetry plugin for checking security vulnerabilities in dependencies";
+    homepage = "https://github.com/opeco17/poetry-audit-plugin";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-export.nix b/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-export.nix
new file mode 100644
index 000000000000..b4ede0bdedaa
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-export.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-plugin-export";
+  version = "1.6.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-6U96O0mCQpviBr4I67ZfHytsooXG4oCNTx8YqrrIzYo=";
+  };
+
+  postPatch = ''
+    sed -i '/poetry =/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # infinite recursion with poetry
+  doCheck = false;
+  pythonImportsCheck = [];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-poetry/poetry-plugin-export/blob/${src.rev}/CHANGELOG.md";
+    description = "Poetry plugin to export the dependencies to various formats";
+    license = licenses.mit;
+    homepage = "https://github.com/python-poetry/poetry-plugin-export";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-up.nix b/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-up.nix
new file mode 100644
index 000000000000..77b6e44c9273
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/poetry/plugins/poetry-plugin-up.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, poetry-core
+, pytestCheckHook
+, pytest-mock
+, poetry
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-plugin-up";
+  version = "0.7.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "MousaZeidBaker";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ProwMnkg8LaPvb4aYyO1PR30iMSNE9oyKgCIX4O5j+E=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    poetry
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    description = "Poetry plugin to simplify package updates";
+    homepage = "https://github.com/MousaZeidBaker/poetry-plugin-up";
+    changelog = "https://github.com/MousaZeidBaker/poetry-plugin-up/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = [ maintainers.k900 ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/poetry/unwrapped.nix b/nixpkgs/pkgs/tools/package-management/poetry/unwrapped.nix
new file mode 100644
index 000000000000..33fcb8e6f46d
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/poetry/unwrapped.nix
@@ -0,0 +1,171 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, installShellFiles
+, pythonRelaxDepsHook
+, build
+, cachecontrol
+, cleo
+, crashtest
+, dulwich
+, installer
+, jsonschema
+, keyring
+, packaging
+, pexpect
+, pkginfo
+, platformdirs
+, poetry-core
+, poetry-plugin-export
+, pyproject-hooks
+, requests
+, requests-toolbelt
+, shellingham
+, tomlkit
+, trove-classifiers
+, virtualenv
+, xattr
+, tomli
+, importlib-metadata
+, cachy
+, deepdiff
+, flatdict
+, pytestCheckHook
+, httpretty
+, pytest-mock
+, pytest-xdist
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "poetry";
+  version = "1.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-PM3FIZYso7p0Oe0RpiPuxHrQrgnMlkT5SVeaJPK/J94=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    # only pinned to avoid dependency on Rust
+    "jsonschema"
+  ];
+
+  propagatedBuildInputs = [
+    build
+    cachecontrol
+    cleo
+    crashtest
+    dulwich
+    installer
+    jsonschema
+    keyring
+    packaging
+    pexpect
+    pkginfo
+    platformdirs
+    poetry-core
+    poetry-plugin-export
+    pyproject-hooks
+    requests
+    requests-toolbelt
+    shellingham
+    tomlkit
+    trove-classifiers
+    virtualenv
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    xattr
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ] ++ cachecontrol.optional-dependencies.filecache;
+
+  postInstall = ''
+    installShellCompletion --cmd poetry \
+      --bash <($out/bin/poetry completions bash) \
+      --fish <($out/bin/poetry completions fish) \
+      --zsh <($out/bin/poetry completions zsh) \
+  '';
+
+  nativeCheckInputs = [
+    cachy
+    deepdiff
+    flatdict
+    pytestCheckHook
+    httpretty
+    pytest-mock
+    pytest-xdist
+  ];
+
+  preCheck = (''
+    export HOME=$TMPDIR
+  '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    # https://github.com/python/cpython/issues/74570#issuecomment-1093748531
+    export no_proxy='*';
+  '');
+
+  postCheck = lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    unset no_proxy
+  '';
+
+  disabledTests = [
+    "test_env_system_packages_are_relative_to_lib"
+    "test_install_warning_corrupt_root"
+    "test_installer_with_pypi_repository"
+    # touches network
+    "git"
+    "solver"
+    "load"
+    "vcs"
+    "prereleases_if_they_are_compatible"
+    "test_builder_setup_generation_runs_with_pip_editable"
+    "test_executor"
+    # requires git history to work correctly
+    "default_with_excluded_data"
+    # toml ordering has changed
+    "lock"
+    # fs permission errors
+    "test_builder_should_execute_build_scripts"
+    # poetry.installation.chef.ChefBuildError: Backend 'poetry.core.masonry.api' is not available.
+    "test_isolated_env_install_success"
+    "test_prepare_sdist"
+    "test_prepare_directory"
+    "test_prepare_directory_with_extensions"
+    "test_prepare_directory_editable"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    # RuntimeError: 'auto_spec' might be a typo; use unsafe=True if this is intended
+    "test_info_setup_complex_pep517_error"
+  ];
+
+  # Allow for package to use pep420's native namespaces
+  pythonNamespaces = [
+    "poetry"
+  ];
+
+  # Unset ambient PYTHONPATH in the wrapper, so Poetry only ever runs with its own,
+  # isolated set of dependencies. This works because the correct PYTHONPATH is set
+  # in the Python script, which runs after the wrapper.
+  makeWrapperArgs = ["--unset PYTHONPATH"];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-poetry/poetry/blob/${src.rev}/CHANGELOG.md";
+    homepage = "https://python-poetry.org/";
+    description = "Python dependency management and packaging made easy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum dotlambda ];
+    mainProgram = "poetry";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/poetry2conda/default.nix b/nixpkgs/pkgs/tools/package-management/poetry2conda/default.nix
new file mode 100644
index 000000000000..7aa821d678ac
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/poetry2conda/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, python3
+}:
+
+with python3.pkgs; buildPythonApplication rec {
+  pname = "poetry2conda";
+  version = "0.3.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dojeda";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-UqNoEGgStvqtxhYwExk7wO4SvATaM2kGaFbB5ViJa7U=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "use-poetry-core.patch";
+      url = "https://github.com/dojeda/poetry2conda/commit/b127090498c89fbd8bbcbac45d03178a1e1c4219.patch";
+      hash = "sha256-J26NhVPG1vD/QNXi5irtGW05CYsIYvZNQIi8YvHwCLc=";
+    })
+  ];
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    poetry-semver
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    pyyaml
+  ];
+
+  meta = with lib; {
+    description = "A script to convert a Python project declared on a pyproject.toml to a conda environment";
+    homepage = "https://github.com/dojeda/poetry2conda";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+    mainProgram = "poetry2conda";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/protontricks/default.nix b/nixpkgs/pkgs/tools/package-management/protontricks/default.nix
new file mode 100644
index 000000000000..b8689fdf9966
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/protontricks/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, setuptools-scm
+, setuptools
+, vdf
+, bash
+, steam-run
+, winetricks
+, yad
+, pytestCheckHook
+, nix-update-script
+}:
+
+buildPythonApplication rec {
+  pname = "protontricks";
+  version = "1.10.1";
+
+  src = fetchFromGitHub {
+    owner = "Matoking";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-gKrdUwX5TzeHHXuwhUyI4REPE6TNiZ6lhonyMCHcBCA=";
+  };
+
+  patches = [
+    # Use steam-run to run Proton binaries
+    ./steam-run.patch
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    setuptools # implicit dependency, used to find data/icon_placeholder.png
+    vdf
+  ];
+
+  makeWrapperArgs = [
+    "--prefix PATH : ${lib.makeBinPath [
+      bash
+      steam-run
+      winetricks
+      yad
+    ]}"
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # From 1.6.0 release notes (https://github.com/Matoking/protontricks/releases/tag/1.6.0):
+  # In most cases the script is unnecessary and should be removed as part of the packaging process.
+  postInstall = ''
+    rm "$out/bin/protontricks-desktop-install"
+  '';
+
+  pythonImportsCheck = [ "protontricks" ];
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "A simple wrapper for running Winetricks commands for Proton-enabled games";
+    homepage = "https://github.com/Matoking/protontricks";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ kira-bruneau ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/protontricks/steam-run.patch b/nixpkgs/pkgs/tools/package-management/protontricks/steam-run.patch
new file mode 100644
index 000000000000..bcc1fc989836
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/protontricks/steam-run.patch
@@ -0,0 +1,470 @@
+diff --git a/src/protontricks/cli/main.py b/src/protontricks/cli/main.py
+index c77d287..236c2a9 100755
+--- a/src/protontricks/cli/main.py
++++ b/src/protontricks/cli/main.py
+@@ -17,8 +17,7 @@ from ..flatpak import (FLATPAK_BWRAP_COMPATIBLE_VERSION,
+                        get_running_flatpak_version)
+ from ..gui import (prompt_filesystem_access, select_steam_app_with_gui,
+                    select_steam_installation)
+-from ..steam import (find_legacy_steam_runtime_path, find_proton_app,
+-                     find_steam_installations, get_steam_apps,
++from ..steam import (find_proton_app, find_steam_installations, get_steam_apps,
+                      get_steam_lib_paths)
+ from ..util import run_command
+ from ..winetricks import get_winetricks_path
+@@ -67,8 +66,7 @@ def main(args=None, steam_path=None, steam_root=None):
+             "WINE: path to a custom 'wine' executable\n"
+             "WINESERVER: path to a custom 'wineserver' executable\n"
+             "STEAM_RUNTIME: 1 = enable Steam Runtime, 0 = disable Steam "
+-            "Runtime, valid path = custom Steam Runtime path, "
+-            "empty = enable automatically (default)\n"
++            "Runtime, empty = enable automatically (default)\n"
+             "PROTONTRICKS_GUI: GUI provider to use, accepts either 'yad' "
+             "or 'zenity'"
+         ),
+@@ -204,17 +202,9 @@ def main(args=None, steam_path=None, steam_root=None):
+         if not steam_path:
+             exit_("No Steam installation was selected.")
+ 
+-    # 2. Find the pre-installed legacy Steam Runtime if enabled
+-    legacy_steam_runtime_path = None
+-    use_steam_runtime = True
+-
++    # 2. Use Steam Runtime if enabled
+     if os.environ.get("STEAM_RUNTIME", "") != "0" and not args.no_runtime:
+-        legacy_steam_runtime_path = find_legacy_steam_runtime_path(
+-            steam_root=steam_root
+-        )
+-
+-        if not legacy_steam_runtime_path:
+-            exit_("Steam Runtime was enabled but couldn't be found!")
++        use_steam_runtime = True
+     else:
+         use_steam_runtime = False
+         logger.info("Steam Runtime disabled.")
+@@ -281,7 +271,6 @@ def main(args=None, steam_path=None, steam_root=None):
+             proton_app=proton_app,
+             steam_app=steam_app,
+             use_steam_runtime=use_steam_runtime,
+-            legacy_steam_runtime_path=legacy_steam_runtime_path,
+             command=[str(winetricks_path), "--gui"],
+             use_bwrap=use_bwrap,
+             start_wineserver=start_background_wineserver
+@@ -361,7 +350,6 @@ def main(args=None, steam_path=None, steam_root=None):
+             proton_app=proton_app,
+             steam_app=steam_app,
+             use_steam_runtime=use_steam_runtime,
+-            legacy_steam_runtime_path=legacy_steam_runtime_path,
+             use_bwrap=use_bwrap,
+             start_wineserver=start_background_wineserver,
+             command=[str(winetricks_path)] + args.winetricks_command
+@@ -373,7 +361,6 @@ def main(args=None, steam_path=None, steam_root=None):
+             steam_app=steam_app,
+             command=args.command,
+             use_steam_runtime=use_steam_runtime,
+-            legacy_steam_runtime_path=legacy_steam_runtime_path,
+             use_bwrap=use_bwrap,
+             start_wineserver=start_background_wineserver,
+             # Pass the command directly into the shell *without*
+diff --git a/src/protontricks/data/scripts/bwrap_launcher.sh b/src/protontricks/data/scripts/bwrap_launcher.sh
+index b5552e1..b11bc99 100644
+--- a/src/protontricks/data/scripts/bwrap_launcher.sh
++++ b/src/protontricks/data/scripts/bwrap_launcher.sh
+@@ -1,4 +1,4 @@
+-#!/bin/bash
++#!/usr/bin/env bash
+ # Helper script
+ set -o errexit
+ 
+@@ -80,6 +80,8 @@ done
+ log_info "Following directories will be mounted inside container: ${mount_dirs[*]}"
+ log_info "Using temporary directory: $PROTONTRICKS_TEMP_PATH"
+ 
+-exec "$STEAM_RUNTIME_PATH"/run --share-pid --launcher \
++exec steam-run "$STEAM_RUNTIME_PATH"/pressure-vessel/bin/pressure-vessel-wrap \
++--variable-dir="${PRESSURE_VESSEL_VARIABLE_DIR:-$STEAM_RUNTIME_PATH/var}" \
++--share-pid --launcher \
+ "${mount_params[@]}" -- \
+ --bus-name="com.github.Matoking.protontricks.App${STEAM_APPID}_${PROTONTRICKS_SESSION_ID}"
+diff --git a/src/protontricks/data/scripts/wine_launch.sh b/src/protontricks/data/scripts/wine_launch.sh
+index 1f8a432..2d82f2b 100644
+--- a/src/protontricks/data/scripts/wine_launch.sh
++++ b/src/protontricks/data/scripts/wine_launch.sh
+@@ -1,4 +1,4 @@
+-#!/bin/bash
++#!/usr/bin/env -S steam-run bash
+ # Helper script created by Protontricks to run Wine binaries using Steam Runtime
+ set -o errexit
+ 
+@@ -158,8 +158,8 @@ if [[ -n "$PROTONTRICKS_INSIDE_STEAM_RUNTIME"
+         export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PROTON_LD_LIBRARY_PATH"
+         log_info "Appending to LD_LIBRARY_PATH: $PROTON_LD_LIBRARY_PATH"
+     elif [[ "$PROTONTRICKS_STEAM_RUNTIME" = "legacy" ]]; then
+-        export LD_LIBRARY_PATH="$PROTON_LD_LIBRARY_PATH"
+-        log_info "LD_LIBRARY_PATH set to $LD_LIBRARY_PATH"
++        export LD_LIBRARY_PATH="$PROTON_LD_LIBRARY_PATH":"$LD_LIBRARY_PATH"
++        log_info "Inserting to head of LD_LIBRARY_PATH: $PROTON_LD_LIBRARY_PATH"
+     fi
+     exec "$PROTON_DIST_PATH"/bin/@@name@@ "$@" || :
+ elif [[ "$PROTONTRICKS_STEAM_RUNTIME" = "bwrap" ]]; then
+diff --git a/src/protontricks/data/scripts/wineserver_keepalive.sh b/src/protontricks/data/scripts/wineserver_keepalive.sh
+index 8168dae..559de33 100644
+--- a/src/protontricks/data/scripts/wineserver_keepalive.sh
++++ b/src/protontricks/data/scripts/wineserver_keepalive.sh
+@@ -1,4 +1,4 @@
+-#!/bin/bash
++#!/usr/bin/env bash
+ # A simple keepalive script that will ensure a wineserver process is kept alive
+ # for the duration of the Protontricks session.
+ # This is accomplished by launching a simple Windows batch script that will
+diff --git a/src/protontricks/steam.py b/src/protontricks/steam.py
+index c39b51d..79de098 100644
+--- a/src/protontricks/steam.py
++++ b/src/protontricks/steam.py
+@@ -14,9 +14,8 @@ from .util import lower_dict
+ 
+ __all__ = (
+     "COMMON_STEAM_DIRS", "SteamApp", "find_steam_installations",
+-    "find_steam_path", "find_legacy_steam_runtime_path",
+-    "iter_appinfo_sections", "get_appinfo_sections", "get_tool_appid",
+-    "find_steam_compat_tool_app", "find_appid_proton_prefix",
++    "find_steam_path", "iter_appinfo_sections", "get_appinfo_sections",
++    "get_tool_appid", "find_steam_compat_tool_app", "find_appid_proton_prefix",
+     "find_proton_app", "get_steam_lib_paths", "get_compat_tool_dirs",
+     "get_custom_compat_tool_installations_in_dir",
+     "get_custom_compat_tool_installations", "find_current_steamid3",
+@@ -393,37 +392,6 @@ def find_steam_path():
+         return None, None
+ 
+ 
+-def find_legacy_steam_runtime_path(steam_root):
+-    """
+-    Find the legacy Steam Runtime either using the STEAM_RUNTIME env or
+-    steam_root
+-    """
+-    env_steam_runtime = os.environ.get("STEAM_RUNTIME", "")
+-
+-    if env_steam_runtime == "0":
+-        # User has disabled Steam Runtime
+-        logger.info("STEAM_RUNTIME is 0. Disabling Steam Runtime.")
+-        return None
+-    elif env_steam_runtime and Path(env_steam_runtime).is_dir():
+-        # User has a custom Steam Runtime
+-        logger.info(
+-            "Using custom Steam Runtime at %s", env_steam_runtime)
+-        return Path(env_steam_runtime)
+-    elif env_steam_runtime in ["1", ""]:
+-        # User has enabled Steam Runtime or doesn't have STEAM_RUNTIME set;
+-        # default to enabled Steam Runtime in either case
+-        steam_runtime_path = steam_root / "ubuntu12_32" / "steam-runtime"
+-
+-        logger.info(
+-            "Using default Steam Runtime at %s", str(steam_runtime_path))
+-        return steam_runtime_path
+-
+-    logger.error(
+-        "Path in STEAM_RUNTIME doesn't point to a valid Steam Runtime!")
+-
+-    return None
+-
+-
+ APPINFO_STRUCT_HEADER = "<4sL"
+ APPINFO_V27_STRUCT_SECTION = "<LLLLQ20sL"
+ APPINFO_V28_STRUCT_SECTION = "<LLLLQ20sL20s"
+diff --git a/src/protontricks/util.py b/src/protontricks/util.py
+index 7e95af5..7dc9a29 100644
+--- a/src/protontricks/util.py
++++ b/src/protontricks/util.py
+@@ -8,14 +8,14 @@ import shutil
+ import tempfile
+ import re
+ from pathlib import Path
+-from subprocess import PIPE, check_output, run, Popen, DEVNULL
++from subprocess import PIPE, run, Popen, DEVNULL
+ 
+ import pkg_resources
+ 
+ __all__ = (
+     "SUPPORTED_STEAM_RUNTIMES", "lower_dict",
+-    "get_legacy_runtime_library_paths", "get_host_library_paths",
+-    "RUNTIME_ROOT_GLOB_PATTERNS", "get_runtime_library_paths",
++    "get_host_library_paths", "RUNTIME_ROOT_GLOB_PATTERNS",
++    "get_runtime_library_paths",
+     "WINE_SCRIPT_TEMPLATE", "create_wine_bin_dir", "run_command"
+ )
+ 
+@@ -43,24 +43,6 @@ def lower_dict(d):
+     return {k.lower(): _lower_value(v) for k, v in d.items()}
+ 
+ 
+-def get_legacy_runtime_library_paths(legacy_steam_runtime_path, proton_app):
+-    """
+-    Get LD_LIBRARY_PATH value to use when running a command using Steam Runtime
+-    """
+-    steam_runtime_paths = check_output([
+-        str(legacy_steam_runtime_path / "run.sh"),
+-        "--print-steam-runtime-library-paths"
+-    ])
+-    steam_runtime_paths = str(steam_runtime_paths, "utf-8")
+-    # Add Proton installation directory first into LD_LIBRARY_PATH
+-    # so that libwine.so.1 is picked up correctly (see issue #3)
+-    return "".join([
+-        str(proton_app.proton_dist_path / "lib"), os.pathsep,
+-        str(proton_app.proton_dist_path / "lib64"), os.pathsep,
+-        steam_runtime_paths
+-    ])
+-
+-
+ def get_host_library_paths():
+     """
+     Get host library paths to use when creating the LD_LIBRARY_PATH environment
+@@ -72,7 +54,7 @@ def get_host_library_paths():
+     # Since that command is unavailable with newer Steam Runtime releases,
+     # do it ourselves here.
+     result = run(
+-        ["/sbin/ldconfig", "-XNv"],
++        ["steam-run", "ldconfig", "-XNv"],
+         check=True, stdout=PIPE, stderr=PIPE
+     )
+     lines = result.stdout.decode("utf-8").split("\n")
+@@ -90,7 +72,7 @@ RUNTIME_ROOT_GLOB_PATTERNS = (
+ )
+ 
+ 
+-def get_runtime_library_paths(proton_app, use_bwrap=True):
++def get_runtime_library_paths(proton_app, proton_app_only=True):
+     """
+     Get LD_LIBRARY_PATH value to use when running a command using Steam Runtime
+     """
+@@ -111,7 +93,7 @@ def get_runtime_library_paths(proton_app, use_bwrap=True):
+             f"Could not find Steam Runtime runtime root for {runtime_app.name}"
+         )
+ 
+-    if use_bwrap:
++    if proton_app_only:
+         return "".join([
+             str(proton_app.proton_dist_path / "lib"), os.pathsep,
+             str(proton_app.proton_dist_path / "lib64"), os.pathsep
+@@ -313,7 +295,7 @@ def run_command(
+             wine_environ["STEAM_RUNTIME_PATH"] = \
+                 str(proton_app.required_tool_app.install_path)
+             wine_environ["PROTON_LD_LIBRARY_PATH"] = \
+-                get_runtime_library_paths(proton_app, use_bwrap=use_bwrap)
++                get_runtime_library_paths(proton_app, proton_app_only=use_bwrap)
+ 
+             runtime_name = proton_app.required_tool_app.name
+             logger.info(
+@@ -337,13 +319,9 @@ def run_command(
+                     "Current Steam Runtime not recognized by Protontricks."
+                 )
+         else:
+-            # Legacy Steam Runtime requires a different LD_LIBRARY_PATH
+-            # that is produced by a script.
+             wine_environ["PROTONTRICKS_STEAM_RUNTIME"] = "legacy"
+             wine_environ["PROTON_LD_LIBRARY_PATH"] = \
+-                get_legacy_runtime_library_paths(
+-                    legacy_steam_runtime_path, proton_app
+-                )
++                get_runtime_library_paths(proton_app, proton_app_only=True)
+ 
+             # bwrap is not available, so ensure it is not launched even if the
+             # user configured it so
+@@ -353,7 +331,6 @@ def run_command(
+     # configuring the environment and Wine before launching the underlying
+     # Wine binaries.
+     wine_bin_dir = create_wine_bin_dir(proton_app)
+-    wine_environ["LEGACY_STEAM_RUNTIME_PATH"] = str(legacy_steam_runtime_path)
+     wine_environ["PATH"] = os.pathsep.join(
+         [str(wine_bin_dir), wine_environ["PATH"]]
+     )
+diff --git a/tests/cli/test_main.py b/tests/cli/test_main.py
+index 0a35f8d..9b96629 100644
+--- a/tests/cli/test_main.py
++++ b/tests/cli/test_main.py
+@@ -121,15 +121,10 @@ class TestCLIRun:
+         assert str(command.args[0]).endswith(".local/bin/winetricks")
+         assert command.args[1] == "winecfg"
+         assert command.env["PATH"].startswith(str(wine_bin_dir))
+-        assert (
+-            "fake_steam_runtime/lib64" in command.env["PROTON_LD_LIBRARY_PATH"]
+-        )
+         assert command.env["WINE"] == str(wine_bin_dir / "wine")
+         assert command.env["WINELOADER"] == str(wine_bin_dir / "wine")
+         assert command.env["WINESERVER"] == str(wine_bin_dir / "wineserver")
+ 
+-        assert command.env["LEGACY_STEAM_RUNTIME_PATH"] == \
+-            str(steam_runtime_dir / "steam-runtime")
+         assert command.env["PROTONTRICKS_STEAM_RUNTIME"] == "legacy"
+         assert "STEAM_RUNTIME_PATH" not in command.env
+ 
+@@ -180,16 +175,14 @@ class TestCLIRun:
+         assert command.env["PATH"].startswith(str(wine_bin_dir))
+ 
+         # Compared to the traditional Steam Runtime, PROTON_LD_LIBRARY_PATH
+-        # will be different
++        # will be the same (it would be different without steam-run.patch)
+         proton_install_path = Path(proton_app.install_path)
+         assert command.env["PROTON_LD_LIBRARY_PATH"] == "".join([
+             str(proton_install_path / "dist" / "lib"), os.pathsep,
+             str(proton_install_path / "dist" / "lib64"), os.pathsep
+         ])
+ 
+-        # Environment variables for both legacy and new Steam Runtime exist
+-        assert command.env["LEGACY_STEAM_RUNTIME_PATH"] == \
+-            str(steam_runtime_dir / "steam-runtime")
++        # Environment variable for new Steam Runtime exists
+         assert command.env["STEAM_RUNTIME_PATH"] == \
+             str(steam_runtime_soldier.install_path)
+         assert command.env["PROTONTRICKS_STEAM_RUNTIME"] == "bwrap"
+@@ -254,9 +247,7 @@ class TestCLIRun:
+             str(runtime_root / "lib" / "x86_64-linux-gnu")
+         ]))
+ 
+-        # Environment variables for both legacy and new Steam Runtime exist
+-        assert command.env["LEGACY_STEAM_RUNTIME_PATH"] == \
+-            str(steam_runtime_dir / "steam-runtime")
++        # Environment variable for new Steam Runtime exists
+         assert command.env["STEAM_RUNTIME_PATH"] == \
+             str(steam_runtime_soldier.install_path)
+         assert command.env["PROTONTRICKS_STEAM_RUNTIME"] == "legacy"
+@@ -407,7 +398,6 @@ class TestCLIRun:
+ 
+         # Also ensure log messages are included in the error message
+         assert b"Found Steam directory at" in message
+-        assert b"Using default Steam Runtime" in message
+ 
+     def test_run_gui_provider_not_found(self, cli, home_dir, steam_app_factory):
+         """
+@@ -421,20 +411,6 @@ class TestCLIRun:
+ 
+         assert "YAD or Zenity is not installed" in result
+ 
+-    def test_run_steam_runtime_not_found(
+-            self, cli, steam_dir, steam_app_factory):
+-        """
+-        Try performing a command with Steam Runtime enabled but no
+-        available Steam Runtime installation
+-        """
+-        steam_app_factory(name="Fake game 1", appid=10)
+-        result = cli(
+-            ["10", "winecfg"], env={"STEAM_RUNTIME": "invalid/path"},
+-            expect_returncode=1
+-        )
+-
+-        assert "Steam Runtime was enabled but couldn't be found" in result
+-
+     def test_run_proton_not_found(self, cli, steam_dir, steam_app_factory):
+         steam_app_factory(name="Fake game 1", appid=10)
+         result = cli(["10", "winecfg"], expect_returncode=1)
+diff --git a/tests/conftest.py b/tests/conftest.py
+index 106e0d9..8236f3a 100644
+--- a/tests/conftest.py
++++ b/tests/conftest.py
+@@ -169,7 +169,7 @@ def steam_runtime_dir(steam_dir):
+     """
+     (steam_dir.parent / "root" / "ubuntu12_32" / "steam-runtime").mkdir(parents=True)
+     (steam_dir.parent / "root" / "ubuntu12_32" / "steam-runtime" / "run.sh").write_text(
+-        "#!/bin/bash\n"
++        "#!/usr/bin/env -S steam-run bash\n"
+         """if [ "$1" = "--print-steam-runtime-library-paths" ]; then\n"""
+         "    echo 'fake_steam_runtime/lib:fake_steam_runtime/lib64'\n"
+         "fi"
+@@ -735,7 +735,7 @@ def xdg_user_dir_bin(home_dir):
+     # Only mock PICTURES and DOWNLOAD; mocking everything isn't necessary
+     # for the tests.
+     (home_dir / ".local" / "bin" / "xdg-user-dir").write_text(
+-        '#!/bin/bash\n'
++        '#!/usr/bin/env -S steam-run bash\n'
+         'if [[ "$1" == "PICTURES" ]]; then\n'
+         '    echo "$HOME/Pictures"\n'
+         'elif [[ "$1" == "DOWNLOAD" ]]; then\n'
+diff --git a/tests/test_flatpak.py b/tests/test_flatpak.py
+index cb2b9bb..440b704 100644
+--- a/tests/test_flatpak.py
++++ b/tests/test_flatpak.py
+@@ -159,36 +159,6 @@ class TestGetInaccessiblePaths:
+ 
+         assert len(inaccessible_paths) == 0
+ 
+-    @pytest.mark.usefixtures("xdg_user_dir_bin")
+-    def test_flatpak_xdg_user_dir(self, monkeypatch, tmp_path, home_dir):
+-        """
+-        Test that XDG filesystem permissions such as 'xdg-pictures' and
+-        'xdg-download' are detected correctly
+-        """
+-        flatpak_info_path = tmp_path / "flatpak-info"
+-
+-        flatpak_info_path.write_text(
+-            "[Application]\n"
+-            "name=fake.flatpak.Protontricks\n"
+-            "\n"
+-            "[Instance]\n"
+-            "flatpak-version=1.12.1\n"
+-            "\n"
+-            "[Context]\n"
+-            "filesystems=xdg-pictures;"
+-        )
+-        monkeypatch.setattr(
+-            "protontricks.flatpak.FLATPAK_INFO_PATH", str(flatpak_info_path)
+-        )
+-
+-        inaccessible_paths = get_inaccessible_paths([
+-            str(home_dir / "Pictures"),
+-            str(home_dir / "Download")
+-        ])
+-
+-        assert len(inaccessible_paths) == 1
+-        assert str(inaccessible_paths[0]) == str(home_dir / "Download")
+-
+     def test_flatpak_unknown_permission(self, monkeypatch, tmp_path, caplog):
+         """
+         Test that unknown filesystem permissions are ignored
+diff --git a/tests/test_util.py b/tests/test_util.py
+index ec5f4f3..0b0a66c 100644
+--- a/tests/test_util.py
++++ b/tests/test_util.py
+@@ -98,44 +98,6 @@ class TestRunCommand:
+         assert command.env["WINELOADER"] == "/fake/wine"
+         assert command.env["WINESERVER"] == "/fake/wineserver"
+ 
+-    def test_unknown_steam_runtime_detected(
+-            self, home_dir, proton_factory, runtime_app_factory,
+-            steam_app_factory, caplog):
+-        """
+-        Test that Protontricks will log a warning if it encounters a Steam
+-        Runtime it does not recognize
+-        """
+-        steam_runtime_medic = runtime_app_factory(
+-            name="Steam Linux Runtime - Medic",
+-            appid=14242420,
+-            runtime_dir_name="medic"
+-        )
+-        proton_app = proton_factory(
+-            name="Proton 5.20", appid=100, compat_tool_name="proton_520",
+-            is_default_proton=True, required_tool_app=steam_runtime_medic
+-        )
+-        steam_app = steam_app_factory(name="Fake game", appid=10)
+-
+-        run_command(
+-            winetricks_path=Path("/usr/bin/winetricks"),
+-            proton_app=proton_app,
+-            steam_app=steam_app,
+-            command=["echo", "nothing"],
+-            shell=True,
+-            use_steam_runtime=True
+-        )
+-
+-        # Warning will be logged since Protontricks does not recognize
+-        # Steam Runtime Medic and can't ensure it's being configured correctly
+-        warning = next(
+-            record for record in caplog.records
+-            if record.levelname == "WARNING"
+-            and "not recognized" in record.getMessage()
+-        )
+-        assert warning.getMessage() == \
+-            "Current Steam Runtime not recognized by Protontricks."
+-
+-
+ class TestLowerDict:
+     def test_lower_nested_dict(self):
+         """
diff --git a/nixpkgs/pkgs/tools/package-management/repro-get/default.nix b/nixpkgs/pkgs/tools/package-management/repro-get/default.nix
new file mode 100644
index 000000000000..95d5902be006
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/repro-get/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+, testers
+, repro-get
+, cacert
+}:
+
+buildGoModule rec {
+  pname = "repro-get";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "reproducible-containers";
+    repo = "repro-get";
+    rev = "v${version}";
+    sha256 = "sha256-qLu9SZuHCkKAOhzrBPEEev1iD5mcIBvrbXspHtifsq4=";
+  };
+
+  vendorHash = "sha256-clpQLRozXFeUGrItL2pfNft2hUNyuyeCP9oMQxagAWs=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  # The pkg/version test requires internet access, so disable it here and run it
+  # in passthru.pkg-version
+  preCheck = ''
+    rm -rf pkg/version
+  '';
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X github.com/reproducible-containers/${pname}/pkg/version.Version=v${version}"
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd repro-get \
+      --bash <($out/bin/repro-get completion bash) \
+      --fish <($out/bin/repro-get completion fish) \
+      --zsh <($out/bin/repro-get completion zsh)
+  '';
+
+  passthru.tests = {
+    "pkg-version" = repro-get.overrideAttrs (old: {
+      # see invalidateFetcherByDrvHash
+      name = "${repro-get.pname}-${builtins.unsafeDiscardStringContext (lib.substring 0 12 (baseNameOf repro-get.drvPath))}";
+      subPackages = [ "pkg/version" ];
+      installPhase = ''
+        rm -rf $out
+        touch $out
+      '';
+      preCheck = "";
+      outputHash = "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=";
+      outputHashAlgo = "sha256";
+      outputHashMode = "flat";
+      outputs = [ "out" ];
+      nativeBuildInputs = old.nativeBuildInputs ++ [ cacert ];
+    });
+    version = testers.testVersion {
+      package = repro-get;
+      command = "HOME=$(mktemp -d) repro-get -v";
+      inherit version;
+    };
+  };
+
+  meta = with lib; {
+    description = "Reproducible apt/dnf/apk/pacman, with content-addressing";
+    homepage = "https://github.com/reproducible-containers/repro-get";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ matthewcroughan ];
+    mainProgram = "repro-get";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/rpm/default.nix b/nixpkgs/pkgs/tools/package-management/rpm/default.nix
new file mode 100644
index 000000000000..541787942a0e
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/rpm/default.nix
@@ -0,0 +1,100 @@
+{ stdenv
+, lib
+, pkg-config
+, autoreconfHook
+, pandoc
+, fetchurl
+, cpio
+, zlib
+, bzip2
+, file
+, elfutils
+, libbfd
+, libgcrypt
+, libarchive
+, nspr
+, nss
+, popt
+, db
+, xz
+, python
+, lua
+, llvmPackages
+, sqlite
+, zstd
+, libcap
+}:
+
+stdenv.mkDerivation rec {
+  pname = "rpm";
+  version = "4.18.1";
+
+  src = fetchurl {
+    url = "https://ftp.osuosl.org/pub/rpm/releases/rpm-${lib.versions.majorMinor version}.x/rpm-${version}.tar.bz2";
+    hash = "sha256-N/O0LAlmlB4q0/EP3jY5gkplkdBxl7qP0IacoHeeH1Y=";
+  };
+
+  outputs = [ "out" "dev" "man" ];
+  separateDebugInfo = true;
+
+  nativeBuildInputs = [ autoreconfHook pkg-config pandoc ];
+  buildInputs = [ cpio zlib zstd bzip2 file libarchive libgcrypt nspr nss db xz python lua sqlite ]
+    ++ lib.optional stdenv.cc.isClang llvmPackages.openmp
+    ++ lib.optional stdenv.isLinux libcap;
+
+  # rpm/rpmlib.h includes popt.h, and then the pkg-config file mentions these as linkage requirements
+  propagatedBuildInputs = [ popt nss db bzip2 libarchive libbfd ]
+    ++ lib.optional stdenv.isLinux elfutils;
+
+  env.NIX_CFLAGS_COMPILE = "-I${nspr.dev}/include/nspr -I${nss.dev}/include/nss";
+
+  configureFlags = [
+    "--with-external-db"
+    "--with-lua"
+    "--enable-python"
+    "--enable-ndb"
+    "--enable-sqlite"
+    "--enable-zstd"
+    "--localstatedir=/var"
+    "--sharedstatedir=/com"
+  ] ++ lib.optional stdenv.isLinux "--with-cap";
+
+  postPatch = ''
+    substituteInPlace Makefile.am --replace '@$(MKDIR_P) $(DESTDIR)$(localstatedir)/tmp' ""
+  '';
+
+  preFixup = ''
+    # Don't keep a reference to RPM headers or manpages
+    for f in $out/lib/rpm/platform/*/macros; do
+      substituteInPlace $f --replace "$dev" "/rpm-dev-path-was-here"
+      substituteInPlace $f --replace "$man" "/rpm-man-path-was-here"
+    done
+
+    # Avoid macros like '%__ld' pointing to absolute paths
+    for tool in ld nm objcopy objdump strip; do
+      sed -i $out/lib/rpm/macros -e "s/^%__$tool.*/%__$tool $tool/"
+    done
+
+    # Avoid helper scripts pointing to absolute paths
+    for tool in find-provides find-requires; do
+      sed -i $out/lib/rpm/$tool -e "s#/usr/lib/rpm/#$out/lib/rpm/#"
+    done
+
+    # symlinks produced by build are incorrect
+    ln -sf $out/bin/{rpm,rpmquery}
+    ln -sf $out/bin/{rpm,rpmverify}
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://www.rpm.org/";
+    license = with licenses; [ gpl2Plus lgpl21Plus ];
+    description = "The RPM Package Manager";
+    maintainers = with maintainers; [ copumpkin ];
+    platforms = platforms.linux;
+    # Support for darwin was removed in https://github.com/NixOS/nixpkgs/pull/196350.
+    # This can be re-enables for apple_sdk.version >= 13.0.
+    badPlatforms = platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/smlpkg/default.nix b/nixpkgs/pkgs/tools/package-management/smlpkg/default.nix
new file mode 100644
index 000000000000..be7592c1c6d8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/smlpkg/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchFromGitHub, mlton, unzip }:
+
+stdenv.mkDerivation rec {
+  pname = "smlpkg";
+  version = "0.1.5";
+
+  src = fetchFromGitHub {
+    owner = "diku-dk";
+    repo = "smlpkg";
+    rev = "v${version}";
+    sha256 = "1xmbdnfc34ia0a78dhkfv5jyadxndinhw8c47l1mjd4l7n8vqnph";
+  };
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [ mlton ];
+
+  # Set as an environment variable in all the phase scripts.
+  MLCOMP = "mlton";
+
+  buildFlags = ["all"];
+  installFlags = ["prefix=$(out)"];
+
+  doCheck = true;
+
+  nativeCheckInputs = [ unzip ];
+
+  # We cannot run the pkgtests, as Nix does not allow network
+  # connections.
+  checkPhase = ''
+    runHook preCheck
+    make -C src test
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Generic package manager for Standard ML libraries and programs";
+    homepage = "https://github.com/diku-dk/smlpkg";
+    license = licenses.mit;
+    platforms = mlton.meta.platforms;
+    maintainers = with maintainers; [ athas ];
+    mainProgram = "smlpkg";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/wapm/cli/default.nix b/nixpkgs/pkgs/tools/package-management/wapm/cli/default.nix
new file mode 100644
index 000000000000..f1feebdbb0c4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/wapm/cli/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchFromGitHub
+, perl
+, libiconv
+, openssl
+, rustPlatform
+, Security
+, stdenv
+, SystemConfiguration
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "wapm-cli";
+  version = "0.5.9";
+
+  src = fetchFromGitHub {
+    owner = "wasmerio";
+    repo = "wapm-cli";
+    rev = "v${version}";
+    sha256 = "sha256-T7YEe8xg5iwI/npisW0m+6FLi+eaAQVgYNe6TvMlhAs=";
+  };
+
+  cargoSha256 = "sha256-r4123NJ+nxNOVIg6svWr636xbxOJQ7tp76JoAi2m9p8=";
+
+  nativeBuildInputs = [ perl ];
+
+  buildInputs = [ libiconv openssl ]
+    ++ lib.optionals stdenv.isDarwin [ Security SystemConfiguration ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A package manager for WebAssembly modules";
+    homepage = "https://docs.wasmer.io/ecosystem/wapm";
+    license = with licenses; [ mit ];
+    maintainers = [ maintainers.lucperkins ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/xbps/cert-paths.patch b/nixpkgs/pkgs/tools/package-management/xbps/cert-paths.patch
new file mode 100644
index 000000000000..569161d9f2e4
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/xbps/cert-paths.patch
@@ -0,0 +1,25 @@
+From d13a550dbc8876c35b912fe3e0eadd45b278be27 Mon Sep 17 00:00:00 2001
+From: Will Dietz <w@wdtz.org>
+Date: Fri, 18 May 2018 09:51:48 -0500
+Subject: [PATCH] add certificate path fallbacks
+
+---
+ lib/fetch/common.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/fetch/common.c b/lib/fetch/common.c
+index 94fb2651..79b50115 100644
+--- a/lib/fetch/common.c
++++ b/lib/fetch/common.c
+@@ -1012,6 +1012,8 @@ fetch_ssl_setup_peer_verification(SSL_CTX *ctx, int verbose)
+ 
+ 	if (getenv("SSL_NO_VERIFY_PEER") == NULL) {
+ 		ca_cert_file = getenv("SSL_CA_CERT_FILE");
++		ca_cert_file = ca_cert_file ? ca_cert_file : getenv("NIX_SSL_CERT_FILE");
++		ca_cert_file = ca_cert_file ? ca_cert_file : "/etc/ssl/certs/ca-certificates.crt";
+ 		ca_cert_path = getenv("SSL_CA_CERT_PATH") != NULL ?
+ 		    getenv("SSL_CA_CERT_PATH") : X509_get_default_cert_dir();
+ 		if (verbose) {
+-- 
+2.17.0
+
diff --git a/nixpkgs/pkgs/tools/package-management/xbps/default.nix b/nixpkgs/pkgs/tools/package-management/xbps/default.nix
new file mode 100644
index 000000000000..07aa1a7accc1
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/xbps/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, which, zlib, openssl, libarchive }:
+
+stdenv.mkDerivation rec {
+  pname = "xbps";
+  version = "0.59.2";
+
+  src = fetchFromGitHub {
+    owner = "void-linux";
+    repo = "xbps";
+    rev = version;
+    hash = "sha256-3+LzFLDZ1zfRPBETMlpEn66zsfHRHQLlgeZPdMtmA14=";
+  };
+
+  nativeBuildInputs = [ pkg-config which ];
+
+  buildInputs = [ zlib openssl libarchive ];
+
+  patches = [
+    ./cert-paths.patch
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-Wno-error=unused-result -Wno-error=deprecated-declarations";
+
+  postPatch = ''
+    # _BSD_SOURCE causes cpp warning
+    # https://github.com/void-linux/xbps/issues/576
+    substituteInPlace bin/xbps-fbulk/main.c lib/util.c lib/external/dewey.c lib/external/fexec.c \
+      --replace 'define _BSD_SOURCE' 'define _DEFAULT_SOURCE' \
+      --replace '# define _BSD_SOURCE' '#define _DEFAULT_SOURCE'
+
+    # fix unprefixed ranlib (needed on cross)
+    substituteInPlace lib/Makefile \
+      --replace 'SILENT}ranlib ' 'SILENT}$(RANLIB) '
+
+    # Don't try to install keys to /var/db/xbps, put in $out/share for now
+    substituteInPlace data/Makefile \
+      --replace '$(DESTDIR)/$(DBDIR)' '$(DESTDIR)/$(SHAREDIR)'
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/void-linux/xbps";
+    description = "The X Binary Package System";
+    platforms = platforms.linux; # known to not work on Darwin, at least
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ dtzWill ];
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/default.nix b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/default.nix
new file mode 100644
index 000000000000..70f5b143ebe8
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildNpmPackage
+, fetchurl
+, nodejs
+, testers
+, yarn-lock-converter
+}:
+
+let
+  source = lib.importJSON ./source.json;
+in
+buildNpmPackage rec {
+  pname = "yarn-lock-converter";
+  inherit (source) version;
+
+  src = fetchurl {
+    url = "https://registry.npmjs.org/@vht/yarn-lock-converter/-/yarn-lock-converter-${version}.tgz";
+    hash = "sha256-CP1wI33fgtp4GSjasktbfWuUjGzCuK3XR+p64aPAryQ=";
+  };
+
+  npmDepsHash = source.deps;
+
+  dontBuild = true;
+
+  nativeBuildInputs = [ nodejs ];
+
+  postPatch = ''
+    # Use generated package-lock.json as upstream does not provide one
+    ln -s ${./package-lock.json} package-lock.json
+  '';
+
+  postInstall = ''
+    mv $out/bin/@vht/yarn-lock-converter $out/bin/yarn-lock-converter
+    rmdir $out/bin/@vht
+  '';
+  passthru = {
+    tests.version = testers.testVersion {
+      package = yarn-lock-converter;
+    };
+    updateScript = ./update.sh;
+  };
+
+  meta = with lib; {
+    description = "Converts modern Yarn v2+ yarn.lock files into a Yarn v1 format";
+    homepage = "https://github.com/VHT/yarn-lock-converter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+    mainProgram = "yarn-lock-converter";
+  };
+}
diff --git a/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/package-lock.json b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/package-lock.json
new file mode 100644
index 000000000000..aa50ffec8d5b
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/package-lock.json
@@ -0,0 +1,592 @@
+{
+  "name": "@vht/yarn-lock-converter",
+  "version": "0.0.2",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "@vht/yarn-lock-converter",
+      "version": "0.0.2",
+      "license": "MIT",
+      "dependencies": {
+        "@yarnpkg/lockfile": "^1.1.0",
+        "cacache": "^15.3.0",
+        "js-yaml": "^4.1.0",
+        "yargs": "^17.3.1"
+      },
+      "bin": {
+        "yarn-lock-converter": "index.js"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/@gar/promisify": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+      "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="
+    },
+    "node_modules/@npmcli/fs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
+      "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
+      "dependencies": {
+        "@gar/promisify": "^1.0.1",
+        "semver": "^7.3.5"
+      }
+    },
+    "node_modules/@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "deprecated": "This functionality has been moved to @npmcli/fs",
+      "dependencies": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@yarnpkg/lockfile": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+    },
+    "node_modules/aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dependencies": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/cacache": {
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
+      "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
+      "dependencies": {
+        "@npmcli/fs": "^1.0.0",
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.1",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "dependencies": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dependencies": {
+        "aggregate-error": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ssri": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "dependencies": {
+        "minipass": "^3.1.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/tar": {
+      "version": "6.1.14",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz",
+      "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==",
+      "dependencies": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^5.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/tar/node_modules/minipass": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dependencies": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "node_modules/unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "dependencies": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "engines": {
+        "node": ">=12"
+      }
+    }
+  }
+}
diff --git a/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/source.json b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/source.json
new file mode 100644
index 000000000000..a897b7c9fb67
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/source.json
@@ -0,0 +1,6 @@
+{
+  "version": "0.0.2",
+  "integrity": "sha512-58Oy9qP081Jr+h9EOYB0ItCQ7IfU0RBbkHN4AQR3h6aPDjIOPYTiEyczmTfsLQcAyCFl0MV1kU8QL1xBALKkYw==",
+  "filename": "vht-yarn-lock-converter-0.0.2.tgz",
+  "deps": "sha256-GCTjZ3x+ZgE762yUWQZzEOOwfAr7W0z/cySlehRILf4="
+}
diff --git a/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/update.sh b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/update.sh
new file mode 100755
index 000000000000..72d46b470f28
--- /dev/null
+++ b/nixpkgs/pkgs/tools/package-management/yarn-lock-converter/update.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env nix-shell
+#! nix-shell -i bash -p nodejs libarchive prefetch-npm-deps moreutils
+# shellcheck shell=bash
+
+set -exuo pipefail
+
+cd -- "$(dirname -- "${BASH_SOURCE[0]}")"
+
+TMPDIR="$(mktemp -d)"
+trap 'rm -r -- "$TMPDIR"' EXIT
+
+pushd -- "$TMPDIR"
+npm pack "@vht/yarn-lock-converter" --json | jq '.[0] | { version, integrity, filename }' > source.json
+bsdtar -x -f "$(jq -r .filename source.json)"
+
+pushd package
+npm install --package-lock-only
+popd
+
+DEPS="$(prefetch-npm-deps package/package-lock.json)"
+jq ".deps = \"$DEPS\"" source.json | sponge source.json
+
+popd
+
+cp -t . -- "$TMPDIR/source.json" "$TMPDIR/package/package-lock.json"