Nixpkgs/Reviewing changes

Revision as of 22:04, 29 November 2021 by imported>Artturin

Guides and examples for reviewing nixpkgs pull requests

Packages

Pre-flakes

nixpkgs.overlays = let 
  owner = "Artturin";
  branchname = "cups-filters-update"; # branchname or rev
  pkgsReview = pkgs.fetchzip {
    url = "https://github.com/${owner}/nixpkgs/archive/${branchname}.tar.gz";
    # Change to 52 zeroes when the archive needs to be redownloaded
    sha256 = "sha256-/OR/uEqCy4QlManW9LcySsDXoTXFJ8G/xjhIsEpM4zM=";
  };
  # local checkout
  #pkgsReview = /home/artturin/nixgits/my-nixpkgs;
in [
  (self: super: {
    review = import pkgsReview { overlays = []; config = super.config; };
    cups-filters = self.review.cups-filters;
  })
];


Modules

Pre-flakes

You may use the rev instead of the branchname, the rev will get redownloaded when changed but the branch wont be redownloaded

# if it is not a new module
disabledModules = [ "module.nix" ];

imports = let
  pkgsReview = builtins.fetchTarball {
    url = "https://github.com/USERNAME/nixpkgs/archive/BRANCHNAME.tar.gz";
  #pkgsReview = ../nixpkgs;
  };
in [
  (import "${pkgsReview}/nixos/modules/module.nix")
];


for example

disabledModules = [ "config/swap.nix" "tasks/filesystems.nix" ];

imports = let
  pkgsReview = builtins.fetchTarball {
    url = "https://github.com/Artturin/nixpkgs/archive/add-swap-options.tar.gz";
  #pkgsReview = ../nixpkgs
  };
in [
  (import "${pkgsReview}/nixos/modules/config/swap.nix")
  (import "${pkgsReview}/nixos/modules/tasks/filesystems.nix")
];

  swapDevices = [
    { "device" = "/swapfile"; "options" = [ "nofail" "noatime" ]; "priority" =  0; "discardPolicy" = "once"; }
  ];

Flakes

Vm example

run with

$ nix run

When the pull request is updated or forcepushed, run

$ nix run --update-input pkgsReview

To update the commit hash

{
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  inputs.pkgsReview.url = "github:Artturin/nixpkgs/pipewirejackldpath";
  #inputs.pkgsReview.url = "/home/artturin/nixgits/my-nixpkgs";

  outputs = inputs@{ self, nixpkgs, pkgsReview }: {

    nixosConfigurations.vm = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      specialArgs = { inherit inputs; };
      modules = [
        ({ pkgs, ... }: {
          disabledModules = [ "services/desktops/pipewire/pipewire.nix" ];
          imports = [ 
            "${inputs.pkgsReview}/nixos/modules/services/desktops/pipewire/pipewire.nix"

            # For virtualisation settings
            "${inputs.nixpkgs}/nixos/modules/virtualisation/qemu-vm.nix"
          ];

          services.pipewire.enable = true;

          # Documentation for these is in nixos/modules/virtualisation/qemu-vm.nix
          virtualisation = {
            memorySize = 1024 * 3;
            diskSize = 1024 * 3;
            cores = 4;
            msize = 104857600;
          };

          users.mutableUsers = false;
          users.users.root = {
            password = "root";
          };
          users.users.user = {
            password = "user";
            isNormalUser = true;
            extraGroups = [ "wheel" ];
          };
        })
      ];
    };
    # So that we can just run 'nix run' instead of 
    # 'nix build ".#nixosConfigurations.vm.config.system.build.vm" && ./result/bin/run-nixos-vm'
    defaultPackage.x86_64-linux = self.nixosConfigurations.vm.config.system.build.vm;
    defaultApp.x86_64-linux = {
      type = "app";
      program = "${self.defaultPackage.x86_64-linux}/bin/run-nixos-vm";
    };
  };
}

Testing the cross-compilation of modules

For example

an improved version can be found at https://github.com/NixOS/nixpkgs/pull/142273#issuecomment-948225922

$ nix build .#nixosConfigurations.nixos.config.services.xserver.displayManager.sessionData.desktops
{
  inputs = {
    nixpkgs.url = "github:ju1m/nixpkgs/display-managers";
  };

  outputs = inputs@{ self, nixpkgs }: {

    nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        ({ pkgs, lib, config, ... }: {
          nixpkgs.crossSystem = lib.systems.examples.aarch64-multiplatform;
          services.xserver = {
            enable = true;
            desktopManager.session = [
              { name = "home-manager";
                start = ''
                  ${pkgs.runtimeShell} $HOME/.hm-xsession &
                  waitPID=$!
                '';
                bgSupport = true;
              }
            ];
          };
        })
      ];
    };
  };
}