No description
Find a file
Jonas Chevalier 1b2f687ea0
Update README.md
Fix gitignore repo references
2021-01-26 15:40:29 +01:00
docs Clarify gitignoreFilter example 2020-06-10 09:17:01 +02:00
nix Update nix/ci.nix 2019-09-17 16:59:46 +02:00
tests Fix character class parsing 2020-05-12 16:06:42 +02:00
.gitignore Add IFD-free gitignoreSource implementation 2019-05-12 13:48:32 +02:00
default.nix Update default.nix 2019-09-12 11:09:23 +02:00
find-files.nix Make git config lookups case insensitive 2020-06-05 19:09:57 +02:00
LICENSE Initialize with rules, test data and license from nix-gitignore 2019-05-12 12:03:30 +02:00
parse-git-config.nix Remove hasInfix usage for compatibility with older nixpkgs 2019-09-05 17:10:52 +02:00
README.md Update README.md 2021-01-26 15:40:29 +01:00
rules.nix Fix character class parsing 2020-05-12 16:06:42 +02:00
shell.nix Pin nixpkgs and add CI 2019-05-12 16:37:34 +02:00

Make Nix precisely emulate gitignore

This goal of this project lets you include local sources in your Nix projects, while taking gitignore files into account.

Note that although this project does a good job at emulating git's behavior, it is not the same implementation!

Installation

nix-env -iA niv -f https://github.com/nmattia/niv/tarball/master
niv init
niv add hercules-ci/gitignore.nix

Plain Nix way

let
  gitignoreSrc = pkgs.fetchFromGitHub { 
    owner = "hercules-ci";
    repo = "gitignore.nix";
    # put the latest commit sha of gitignore Nix library here:
    rev = "";
    # use what nix suggests in the mismatch message here:
    sha256 = "sha256:0000000000000000000000000000000000000000000000000000";
  };
  inherit (import gitignoreSrc { inherit (pkgs) lib; }) gitignoreSource;
in
  <your nix expression>

Or using only nixpkgs/lib and only evaluation-time fetching:

import (builtins.fetchTarball "https://github.com/hercules-ci/gitignore.nix/archive/000000000000000000000000000000000000000000000000000".tar.gz") {
  lib = import (builtins.fetchTarball "https://github.com/NixOS/nixpkgs/archive/000000000000000000000000000000000000000000000000000".tar.gz" + "/lib");
}

Usage

mkDerivation {
  name = "hello";
  src = gitignoreSource ./vendored/hello;
}
gitignoreSource :: path -> path

Returns result of cleanSourceWith, usable as a path but also composable.

gitignoreFilter :: path -> (path -> type -> bool)

f = gitignoreFilter path

Parentheses in the type emphasize that a partial application memoizes the git metadata. You can use Nixpkgs' cleanSourceWith to compose with other filters (by logical and) or to set a name.

path: a path being the root or a subdirectory of a local git repository

f: a function that returns false for files that should be ignored according to gitignore rules, but only for paths at or below path.

See gitignoreFilter for an example.

Features

  • Reads parent gitignores even if only pointed at a subdirectory
  • Source hashes only change when output changes
  • Not impacted by large or inaccessible ignored directories
  • Composes with cleanSourceWith
  • Reads user git configuration; no need to bother your team with your tool config.
  • Also works with restrict-eval enabled (if avoiding fetchFromGitHub)
  • No import from derivation ("IFD")
  • Name and hash are not sensitive to checkout location

Comparison

Feature \ Implementation cleanSource siers siers recursive icetan Profpatsch numtide this project
Ignores .git ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
No special Nix configuration ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
No import from derivation ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Uses subdirectory gitignores ✔️ ✔️ ✔️
Uses parent gitignores ✔️ ? ✔️
Uses user gitignores ✔️ ✔️
Has a test suite ✔️ ✔️ ✔️ ? ✔️
Works with restrict-eval / Hydra ✔️ ✔️ ✔️ ✔️ ✔️
Descends into submodule correctly ? ? ? ? ✔️ ? ? #8
Included in nixpkgs ✔️ ✔️ ✔️
Legend
✔️ Supported
✔️ ? Probably supported
Not supported
? Probably not supported
- Not applicable or depends

Please open a PR if you've found another feature, determined any of the '?' or found an inaccuracy!

Security

Files not matched by gitignore rules will end up in the Nix store, which is readable by any process.

gitignore.nix does not yet understand git-crypt's metadata, so don't call gitignoreSource on directories containing such secrets or their parent directories. This applies to any Nix function that uses the builtins.path or builtins.filterSource functions.

Contributing

This project isn't perfect (yet) so please submit test cases and fixes as pull requests. Before doing anything drastic, it's a good idea to open an issue first to discuss and optimize the approach.

Thanks

A great shoutout to @siers for writing the intial test suite and rule translation code!