NixOS / nixpkgs

Nix Packages collection & NixOS
MIT License
16.53k stars 13.01k forks source link

Package request: repology #312744

Open panicgh opened 1 month ago

panicgh commented 1 month ago

Project description

Repology is a packaging hub, providing users with comparisons of statistics of packages. For example, which pkgs are available in which versions and repositories.

I would find it interesting to run my own instance of repology, scraping e.g. company internal (RPM, DEB) repositories, GitLab for new version tags etc. This would allow for easy comparison of available packages and versions. For example the organization may run its own customized Linux distro (e.g. spun-off Debian; using regular snapshots of upstream repos) with branches for the integration of internal software (e.g. stable, testing/development versions of the distro).

This would need packaging of the software components of repology as well as NixOS modules.

Metadata


Add a :+1: reaction to issues you find important.

jopejoe1 commented 1 month ago

I created a basic flake for repology for dev testing, could probably be of help while creating a package in nixpkgs

{
  description = "Build Repology with nix";

  inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";
  inputs.repology-webapp = {
    url = "github:repology/repology-webapp";
    flake = false;
  };
  inputs.repology-updater = {
    url = "github:repology/repology-updater";
    flake = false;
  };
  inputs.repology-rules = {
    url = "github:repology/repology-rules";
    flake = false;
  };
  inputs.repology-linkchecker = {
    url = "github:repology/repology-linkchecker";
    flake = false;
  };

  outputs = { self, nixpkgs, flake-utils, repology-rules, repology-updater, repology-webapp, repology-linkchecker }:
    flake-utils.lib.eachDefaultSystem (system:
      let

        pkgs = import nixpkgs { inherit system; };
      in rec {
        packages = flake-utils.lib.flattenTree {
          update = pkgs.stdenv.mkDerivation {
            pname = "repology-updater";
            version = "unstable-2023-12-11";

            src = repology-updater;

            propagatedBuildInputs = with pkgs; [
              (python3.withPackages
                (python3Packages: with python3Packages; [
                  jinja2
                  libversion
                  psycopg2
                  pyyaml
                  xxhash
                  pydantic
                  jsonslicer
                  lxml
                  protobuf
                  pyparsing
                  requests
                  rpm
                  rubymarshal
                  tomli
                  yarl
                  zstandard
                  brotli
                ])
              )
              git
              subversion
              rsync
            ];
            dontUnpack = true;
            installPhase = ''
              runHook preInstall

              mkdir -p $out/
              cp -r $src/* $out/
              cp $out/repology.conf.default $out/repology.conf
              substituteInPlace $out/repology.conf \
                --replace "repos.d" "$out/repos.d" \
                --replace "sql.d" "$out/sql.d" \
                --replace "rules.d" "${repology-rules}" \
                --replace "repology.org" "test.local" \
                --replace "_state" "/home/jopejoe1/dev/repology/_state" \
                --replace "_parsed" "/home/jopejoe1/dev/repology/_parsed" \
                --replace "production" "nix" \
                --replace "None" "'/home/jopejoe1/.cache/repology/'"

              runHook postInstall
            '';
          };
          web = pkgs.stdenv.mkDerivation {
            pname = "repology-webapp";
            version = "unstable-2023-12-11";

            src = "${repology-webapp}";

            propagatedBuildInputs = with pkgs; [
              (python3.withPackages
                (python3Packages: with python3Packages; [
                  flask
                  libversion
                  pillow
                  psycopg2
                ])
              )
            ];
            dontUnpack = true;
            installPhase = ''
              runHook preInstall

              mkdir -p $out/
              cp -r $src/* $out/
              cp $out/repology.conf.default $out/repology.conf
              substituteInPlace $out/repology.conf \
                --replace "sql.d" "$out/sql.d" \
                --replace "#SECRET_KEY = ${"''"}" "SECRET_KEY = '192b9bdd22ba9ed4d12e236c43afcb9a393ec15f71bbf5dc987d54727823bcbf'" \
                --replace "https://repology.org" "http://127.0.0.1:5000"

              runHook postInstall
            '';
          };
        };
        defaultPackage = packages.update;
        apps = {
          update = flake-utils.lib.mkApp {
            drv = packages.update;
            exePath = "/repology-update.py";
          };
          web = flake-utils.lib.mkApp {
            drv = packages.web;
            exePath = "/repology-app.py";
          };
        };
        defaultApp = apps.update;
      });
}