| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- # SPDX-FileCopyrightText: 2024 Christina Sørensen
- # SPDX-License-Identifier: EUPL-1.2
- #
- # SPDX-FileCopyrightText: 2014-2024 Christina Sørensen, eza contributors
- # SPDX-License-Identifier: MIT
- {
- description = "eza: a modern, maintained replacement for ls";
- inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
- systems.url = "github:nix-systems/default";
- flake-utils = {
- url = "github:numtide/flake-utils";
- inputs = {
- systems.follows = "systems";
- };
- };
- naersk = {
- url = "github:nix-community/naersk";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- rust-overlay = {
- url = "github:oxalica/rust-overlay";
- inputs = {
- nixpkgs.follows = "nixpkgs";
- };
- };
- treefmt-nix = {
- url = "github:numtide/treefmt-nix";
- inputs = {
- nixpkgs.follows = "nixpkgs";
- };
- };
- powertest = {
- url = "github:eza-community/powertest";
- inputs = {
- nixpkgs.follows = "nixpkgs";
- flake-utils.follows = "flake-utils";
- naersk.follows = "naersk";
- treefmt-nix.follows = "treefmt-nix";
- rust-overlay.follows = "rust-overlay";
- };
- };
- pre-commit-hooks = {
- url = "github:cachix/pre-commit-hooks.nix";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- advisory-db = {
- url = "github:rustsec/advisory-db";
- flake = false;
- };
- };
- outputs =
- {
- self,
- flake-utils,
- naersk,
- nixpkgs,
- treefmt-nix,
- rust-overlay,
- powertest,
- pre-commit-hooks,
- ...
- }:
- flake-utils.lib.eachDefaultSystem (
- system:
- let
- overlays = [ (import rust-overlay) ];
- pkgs = (import nixpkgs) {
- inherit system overlays;
- };
- toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
- naersk' = pkgs.callPackage naersk {
- cargo = toolchain;
- rustc = toolchain;
- clippy = toolchain;
- };
- treefmtEval = treefmt-nix.lib.evalModule pkgs .config/treefmt.nix;
- darwinBuildInputs = pkgs.lib.optionals pkgs.stdenv.isDarwin [
- pkgs.libiconv
- pkgs.darwin.apple_sdk.frameworks.Security
- ];
- buildInputs = [ pkgs.zlib ] ++ darwinBuildInputs;
- in
- rec {
- # For `nix fmt`
- formatter = treefmtEval.config.build.wrapper;
- packages = {
- # For `nix build` `nix run`, & `nix profile install`:
- default = naersk'.buildPackage rec {
- pname = "eza";
- version = "latest";
- src = ./.;
- doCheck = true; # run `cargo test` on build
- inherit buildInputs;
- nativeBuildInputs = with pkgs; [
- cmake
- pkg-config
- installShellFiles
- pandoc
- ];
- buildNoDefaultFeatures = true;
- buildFeatures = "git";
- postInstall = ''
- pandoc --standalone -f markdown -t man <(cat "man/eza.1.md" | sed "s/\$version/${version}/g") > man/eza.1
- pandoc --standalone -f markdown -t man <(cat "man/eza_colors.5.md" | sed "s/\$version/${version}/g") > man/eza_colors.5
- pandoc --standalone -f markdown -t man <(cat "man/eza_colors-explanation.5.md" | sed "s/\$version/${version}/g")> man/eza_colors-explanation.5
- installManPage man/eza.1 man/eza_colors.5 man/eza_colors-explanation.5
- installShellCompletion \
- --bash completions/bash/eza \
- --fish completions/fish/eza.fish \
- --zsh completions/zsh/_eza
- '';
- meta = with pkgs.lib; {
- description = "A modern, maintained replacement for ls";
- longDescription = ''
- eza is a modern replacement for ls. It uses colours for information by
- default, helping you distinguish between many types of files, such as
- whether you are the owner, or in the owning group. It also has extra
- features not present in the original ls, such as viewing the Git status
- for a directory, or recursing into directories with a tree view. eza is
- written in Rust, so it’s small, fast, and portable.
- '';
- homepage = "https://github.com/eza-community/eza";
- license = licenses.mit;
- mainProgram = "eza";
- maintainers = with maintainers; [ cafkafk ];
- };
- };
- # Run `nix build .#check` to check code
- check = naersk'.buildPackage {
- src = ./.;
- mode = "check";
- inherit buildInputs;
- };
- # Run `nix build .#test` to run tests
- test = naersk'.buildPackage {
- src = ./.;
- mode = "test";
- inherit buildInputs;
- };
- # Run `nix build .#clippy` to lint code
- clippy = naersk'.buildPackage {
- src = ./.;
- mode = "clippy";
- inherit buildInputs;
- };
- # Run `nix build .#trycmd` to run integration tests
- trycmd = naersk'.buildPackage {
- src = ./.;
- mode = "test";
- doCheck = true;
- # No reason to wait for release build
- release = false;
- # buildPhase files differ between dep and main phase
- singleStep = true;
- # generate testing files
- buildPhase = ''
- bash devtools/dir-generator.sh tests/test_dir && echo "Dir generated"
- bash devtools/generate-timestamp-test-dir.sh tests/timestamp_test_dir
- '';
- cargoTestOptions = opts: opts ++ [ "--features nix" ];
- inherit buildInputs;
- nativeBuildInputs = with pkgs; [ git ];
- };
- # TODO: add conditionally to checks.
- # Run `nix build .#trycmd` to run integration tests
- trycmd-local = naersk'.buildPackage {
- src = ./.;
- mode = "test";
- doCheck = true;
- # No reason to wait for release build
- release = false;
- # buildPhase files differ between dep and main phase
- singleStep = true;
- # set itests files creation date to unix epoch
- buildPhase = ''
- bash devtools/dir-generator.sh tests/test_dir
- bash devtools/generate-timestamp-test-dir.sh tests/timestamp_test_dir
- touch --date=@0 tests/itest/*
- touch --date=@0 tests/ptests/*;
- fd -e stdout -e stderr -H -t file -X sed -i 's/[CWD]\//\/build\/source\//g'
- '';
- cargoTestOptions =
- opts:
- opts
- ++ [
- "--features nix"
- "--features nix-local"
- "--features powertest"
- ];
- inherit buildInputs;
- nativeBuildInputs = with pkgs; [ git ];
- };
- # Run `nix build .#trydump` to dump testing files
- trydump = naersk'.buildPackage rec {
- src = ./.;
- mode = "test";
- doCheck = true;
- # No reason to wait for release build
- release = false;
- # buildPhase files differ between dep and main phase
- singleStep = true;
- # set itests files creation date to unix epoch
- buildPhase = ''
- bash devtools/dir-generator.sh tests/test_dir
- bash devtools/generate-timestamp-test-dir.sh tests/timestamp_test_dir
- touch --date=@0 tests/itest/*;
- rm tests/cmd/*.stdout || echo;
- rm tests/cmd/*.stderr || echo;
- touch --date=@0 tests/ptests/*;
- rm tests/ptests/*.stdout || echo;
- rm tests/ptests/*.stderr || echo;
- '';
- cargoTestOptions =
- opts:
- opts
- ++ [
- "--features nix"
- "--features nix-local"
- "--features powertest"
- #"-F trycmd/debug"
- ];
- TRYCMD = "dump";
- postInstall = ''
- fd -e stdout -e stderr -H -t file -X sed -i 's/\/build\/source\//[CWD]\//g'
- cp dump $out -r
- '';
- inherit buildInputs;
- nativeBuildInputs = with pkgs; [
- fd
- gnused
- git
- ];
- };
- };
- # For `nix develop`:
- devShells.default = pkgs.mkShell {
- inherit (self.checks.${system}.pre-commit-check) shellHook;
- nativeBuildInputs =
- with pkgs;
- [
- toolchain
- rustup
- just
- pandoc
- convco
- zip
- reuse
- # For releases
- b3sum
- cargo-bump
- # For generating demo
- vhs
- powertest.packages.${pkgs.system}.default
- cargo-hack
- cargo-udeps
- cargo-outdated
- ]
- ++ darwinBuildInputs;
- };
- # For `nix flake check`
- checks = {
- pre-commit-check =
- let
- # some treefmt formatters are not supported in pre-commit-hooks we
- # filter them out for now.
- toFilter = [
- "yamlfmt"
- "nixfmt"
- "taplo"
- ];
- filterFn = n: _v: (!builtins.elem n toFilter);
- treefmtFormatters = pkgs.lib.mapAttrs (_n: v: { inherit (v) enable; }) (
- pkgs.lib.filterAttrs filterFn (import .config/treefmt.nix).programs
- );
- in
- pre-commit-hooks.lib.${system}.run {
- src = ./.;
- hooks = treefmtFormatters // {
- nixfmt-rfc-style.enable = true;
- convco.enable = true; # not in treefmt
- reuse = {
- enable = true;
- name = "reuse";
- entry = with pkgs; "${reuse}/bin/reuse lint";
- pass_filenames = false;
- };
- };
- };
- formatting = treefmtEval.config.build.check self;
- build = packages.check;
- inherit (packages)
- default
- test
- trycmd
- ;
- lint = packages.clippy;
- };
- }
- );
- }
|