target / lorri

Your project's nix-env
Apache License 2.0
993 stars 69 forks source link

A way to exclude directory from watch? #6

Open danbst opened 5 years ago

danbst commented 5 years ago

I have a little postgresql state dir inside my project's dot files, and when PG is running, it does changes some files regularly

[2019-03-29T06:46:35Z DEBUG lorri::watch] Event path ("/home/danbst/dev/jobs/_build/pgdata/base/13393/2601") parent ("/home/danbst/dev/jobs/_build/pgdata/base/13393") matches watched path
[2019-03-29T06:46:35Z DEBUG lorri::watch] Watch Event: RawEvent {
    path: Some(
        "/home/danbst/dev/jobs/_build/pgdata/base/13393/2601"
    ),
    op: Ok(
        CLOSE_WRITE
    ),
    cookie: None
}
[2019-03-29T06:46:35Z DEBUG lorri::watch] watch event: (
    Ok(
        CLOSE_WRITE
    ),
    Some(
        "/home/danbst/dev/jobs/_build/pgdata/base/13393/2601"
    )
)
[2019-03-29T06:46:35Z DEBUG lorri::watch] Received event: RawEvent {
    path: Some(
        "/home/danbst/dev/jobs/_build/pgdata/base/13393/2601"
    ),
    op: Ok(
        CLOSE_WRITE
    ),
    cookie: None
}
[2019-03-29T06:46:35Z INFO  lorri::watch] Found 28 events
Started
[2019-03-29T06:46:36Z DEBUG lorri::build_loop] original paths: 1235
[2019-03-29T06:46:36Z DEBUG lorri::build_loop]   -> reduced to: 4
[2019-03-29T06:46:36Z DEBUG lorri::build_loop] named drvs: {
    "shell_gc_root": "/nix/store/dhziglbpkwx0ssmq21lckcwc394wb623-lorri-keep-env-hack-shell.drv",
    "shell": "/nix/store/4w3nl3h4x0gl3q6myf6x0nl6hy8ldfsj-shell.drv"
}

It causes regular direnv reloads, like every 10 seconds and direnv debug log on each trivial command.

Is there way to exclude files from watching, probably even use .gitignore?

Profpatsch commented 5 years ago

If it is inside your project, you can use https://github.com/siers/nix-gitignore (which went into nixpkgs master a month or so ago) or https://github.com/Profpatsch/nixperiments/blob/master/filterSourceGitignore.nix (which is a bit more restrictive but should have less corner cases).

If it is from a transitive dependency lorri picks up, we’ll have to think of something and this is likely a bug.

danbst commented 5 years ago

No, it is the problem with source-less nix-shells

$ cat shell.nix 
with import <nixpkgs> {};
mkShell {
  buildInputs = [ hello ];
}

$ touch bla
direnv: loading .envrc
direnv: using nix
direnv: export +AR +AS +CC +CONFIG_SHELL +CXX +HOST_PATH +IN_NIX_SHELL +LD +NIX_BINTOOLS +NIX_BINTOOLS_WRAPPER_x86_64_unknown_linux_gnu_TARGET_HOST +NIX_BUILD_CORES +NIX_BUILD_TOP +NIX_CC +NIX_CC_WRAPPER_x86_64_unknown_linux_gnu_TARGET_HOST +NIX_ENFORCE_NO_NATIVE +NIX_HARDENING_ENABLE +NIX_INDENT_MAKE +NIX_LDFLAGS +NIX_LOG_FD +NIX_STORE +NM +OBJCOPY +OBJDUMP +RANLIB +READELF +SIZE +SOURCE_DATE_EPOCH +STRINGS +STRIP +_PATH +buildInputs +builder +configureFlags +depsBuildBuild +depsBuildBuildPropagated +depsBuildTarget +depsBuildTargetPropagated +depsHostHost +depsHostHostPropagated +depsTargetTarget +depsTargetTargetPropagated +doCheck +doInstallCheck +name +nativeBuildInputs +nobuildPhase +origArgs +origBuilder +origPATH +origSystem +out +outputs +phases +propagatedBuildInputs +propagatedNativeBuildInputs +shell +stdenv +strictDeps +system ~PATH

In my case something like touch bla occures quite often to make those envrc reloadings annoying.

EDIT: wait, this works just fine. I have still to extract the problem

infinisil commented 5 years ago

I've just tried lorri with my small Haskell project. It uses nixpkgs' lib.sourceByRegex to filter what gets included:

{
    soph = (self.callCabal2nix "soph" (lib.sourceByRegex ./. [
      "^\\src.*$"
      "^.*\\.cabal$"
      "^LICENSE$"
    ]) {}).overrideAttrs (/** ... **/);
}

However this ends up including probably every file in that directory, as seen from the debug output:

``` [2019-03-29T23:43:50Z DEBUG lorri] Input options: Arguments { verbosity: 0, command: Watch } Started [2019-03-29T23:43:53Z DEBUG lorri::build_loop] original paths: 2200 [2019-03-29T23:43:53Z DEBUG lorri::build_loop] -> reduced to: 3 [2019-03-29T23:43:53Z DEBUG lorri::build_loop] named drvs: { "shell_gc_root": "/nix/store/a9pk62bspr6gyyd2fvzpjc7y35yksrkq-lorri-keep-env-hack-ghc-shell-for-soph-0.1.0.0.drv", "shell": "/nix/store/vp2815qa2hiq55v13db1gilr45g4kasx-ghc-shell-for-soph-0.1.0.0.drv" } [2019-03-29T23:43:53Z DEBUG lorri::roots] Adding root from "/nix/store/a9pk62bspr6gyyd2fvzpjc7y35yksrkq-lorri-keep-env-hack-ghc-shell-for-soph-0.1.0.0.drv" to "/home/infinisil/.cache/lorri/soph/gc_root/attr-shell_gc_root" [2019-03-29T23:43:53Z DEBUG lorri::roots] Connecting root from "/home/infinisil/.cache/lorri/soph/gc_root/attr-shell_gc_root" to "/nix/var/nix/gcroots/per-user/infinisil/e6ac3dbbabb84a2c7278d7bc89fbceab-6e3035ad701422ecf26b4a2fc73eb320-attr-shell_gc_root" [2019-03-29T23:43:53Z DEBUG lorri::roots] Adding root from "/nix/store/vp2815qa2hiq55v13db1gilr45g4kasx-ghc-shell-for-soph-0.1.0.0.drv" to "/home/infinisil/.cache/lorri/soph/gc_root/attr-shell" [2019-03-29T23:43:53Z DEBUG lorri::roots] Connecting root from "/home/infinisil/.cache/lorri/soph/gc_root/attr-shell" to "/nix/var/nix/gcroots/per-user/infinisil/e6ac3dbbabb84a2c7278d7bc89fbceab-6e3035ad701422ecf26b4a2fc73eb320-attr-shell" [2019-03-29T23:43:53Z DEBUG lorri::roots] Adding root from "/nix/store/hwid4kk5bcpg8xiyzyq4n8w2f5k7x8hv-lorri-keep-env-hack-ghc-shell-for-soph-0.1.0.0" to "/home/infinisil/.cache/lorri/soph/gc_root/build-0" [2019-03-29T23:43:53Z DEBUG lorri::roots] Connecting root from "/home/infinisil/.cache/lorri/soph/gc_root/build-0" to "/nix/var/nix/gcroots/per-user/infinisil/e6ac3dbbabb84a2c7278d7bc89fbceab-6e3035ad701422ecf26b4a2fc73eb320-build-0" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/.config/nixpkgs/config.nix" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching parent path "/home/infinisil/.config/nixpkgs" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/.config/nixpkgs/overlays" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching parent path "/home/infinisil/.config/nixpkgs" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching parent path "/home/infinisil/prj" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/src" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/result" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/branches" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/17" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/60" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ec" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/bd" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/3f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/4a" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/84" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/25" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/af" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/fa" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/5b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/97" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/79" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/04" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e9" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/41" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/36" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/b4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/31" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/46" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/b3" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/5e" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/2b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/09" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/90" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/pack" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f6" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/74" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/03" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d7" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c0" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/55" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/28" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/0c" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/7d" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/89" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/67" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/10" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/bc" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/4f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/3a" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/83" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/69" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/87" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/4b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/3e" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/fb" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ae" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d9" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/26" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/51" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/70" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a5" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f8" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/94" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/2f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e0" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/35" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/6c" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/48" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e7" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/45" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/32" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/6d" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/38" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/00" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/77" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/99" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f5" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a2" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a8" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/dd" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/2a" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ab" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c9" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/9c" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/21" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c3" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/80" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/19" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/3b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/13" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/64" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/29" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/7e" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/0b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/54" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/9a" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d6" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/82" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ee" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/bb" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/88" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/66" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/b2" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e5" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/30" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f7" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a0" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/df" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/2c" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/5d" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/72" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/05" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a7" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/5c" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/2d" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/96" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/78" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e2" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/37" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/8e" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/1f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/info" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e8" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/85" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/eb" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/61" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/16" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/59" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/7b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/9f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c6" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c2" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/9b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/20" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/7f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ac" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c8" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/12" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ba" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/81" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/18" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/3c" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/1b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/39" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/8a" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/33" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/44" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/b1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/92" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a9" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/cb" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/76" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f9" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/f3" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/a4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/06" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/6b" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/49" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/8f" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/43" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/34" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/b6" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/e1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/15" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/ea" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/bf" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/86" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/3d" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/c5" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d2" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/50" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/27" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/fc" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/objects/d8" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/logs" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/logs/refs" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/logs/refs/heads" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/logs/refs/remotes" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/logs/refs/remotes/origin" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/info" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/hooks" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/refs" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/refs/tags" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/refs/remotes" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/refs/remotes/origin" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.git/refs/heads" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/doc" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/doc/blockhash-0.1.0.0" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/doc/soph-0.1.0.0" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/doc/bktrees-0.3.1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/doc/broadcast-chan-conduit-0.2.0.1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/doc/broadcast-chan-0.2.0.1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/installed-packages" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/broadcast-chan-0.2.0.1-KURtMSj4dP5DHqzso29DFD" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/broadcast-chan-0.2.0.1-KURtMSj4dP5DHqzso29DFD/BroadcastChan" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/broadcast-chan-conduit-0.2.0.1-LGgrVN27zhk7n0w8a84OEZ" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/broadcast-chan-conduit-0.2.0.1-LGgrVN27zhk7n0w8a84OEZ/BroadcastChan" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/broadcast-chan-conduit-0.2.0.1-LGgrVN27zhk7n0w8a84OEZ/BroadcastChan/Conduit" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/blockhash-0.1.0.0-9o9RiZwMsT7HoLE98rUT7M" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/blockhash-0.1.0.0-9o9RiZwMsT7HoLE98rUT7M/Data" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/bktrees-0.3.1-7uVUOiNKgFTH5YH8xQfVSp" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/bktrees-0.3.1-7uVUOiNKgFTH5YH8xQfVSp/Data" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/bktrees-0.3.1-7uVUOiNKgFTH5YH8xQfVSp/Data/Set" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/lib/x86_64-linux-ghc-8.4.4/bktrees-0.3.1-7uVUOiNKgFTH5YH8xQfVSp/Data/Set/BKTree" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/pkgdb" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/bin" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/install/x86_64-linux-nix/lts-12.16/8.4.4/flag-cache" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/logs" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/stack-build-caches" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/package.conf.inplace" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/build" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/build/soph" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/build/soph/autogen" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/build/soph/soph-tmp" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/.stack-work/dist/x86_64-linux-nix/Cabal-2.2.0.1/build/soph/soph-tmp/src" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/dist" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/dist/package.conf.inplace" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/dist/build" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/dist/build/soph" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/dist/build/soph/autogen" [2019-03-29T23:43:53Z DEBUG lorri::watch] Watching path "/home/infinisil/prj/soph/dist/build/soph/soph-tmp" Completed( BuildResults { drvs: { 0: "/home/infinisil/.cache/lorri/soph/gc_root/build-0" }, named_drvs: { "shell": "/home/infinisil/.cache/lorri/soph/gc_root/attr-shell", "shell_gc_root": "/home/infinisil/.cache/lorri/soph/gc_root/attr-shell_gc_root" } } ) ```
infinisil commented 5 years ago

Some more info:

$ nix-instantiate --eval --strict --read-write-mode -A src
{ _isLibCleanSourceWith = true; filter = <LAMBDA>; origSrc = /home/infinisil/prj/soph;
  outPath = "/nix/store/9blqrn193vmlvzrv5y612rhkrmn77yrj-soph"; }
$ tree -A /nix/store/9blqrn193vmlvzrv5y612rhkrmn77yrj-soph
/nix/store/9blqrn193vmlvzrv5y612rhkrmn77yrj-soph
├── LICENSE
├── soph.cabal
└── src
    ├── Config.hs
    ├── Hashing.hs
    ├── Log.hs
    └── Main.hs

1 directory, 6 files
anka-213 commented 5 years ago

I have the same problem as @Infinisil with the added detail that every time the git lockfile .git/index.lock is touched, lorri will rebuild the environment. Since my shell prompt checks the git status at every prompt, this is every time any command is run.

infinisil commented 5 years ago

@anka-213 Yeah I'm having that problem as well :(

dudebout commented 5 years ago

@Infinisil, your problem stems from the first line in your shell.nix file:

with import ./. {};

Because it imports "the current directory", that directory ends up being watched recursively by lorri. By changing this line to:

with import ./default.nix {};

you can bypass the issue.

dudebout commented 5 years ago

I have noticed two other cases that make lorri watch more directories than one would want:

  1. if you use a git checkout for nixpkgs instead of a channel, then lorri watches every directory in that checkout, including the .git directory and its subdirectories
  2. if you use an src that is not computed from filterSource, then lorri watches all the subdirectories of src. I think this is because:
    • when using filterSource, the src is added to the nix store via primops:addPath which does not echo anything
    • when not using filterSource, the src is added to the nix store via eval:copyPathToStore which echoes "copied source" and leads lorri to watch the directory

(Arguably using 1. and 2. are not good practice, but we should document these corner cases for users and in case the logging in nix changes which could cause changes in behavior)

dudebout commented 5 years ago

Created https://github.com/target/lorri/pull/21 to document my findings.

nyarly commented 5 years ago

One case I think I've discovered: I'm working on a Rubygem, and bundix adds an entry for the gemspec as source = ./.

Profpatsch commented 5 years ago

Update: we have implemented the default.nix logic now.

If you can, please try out the https://github.com/target/lorri/pull/146 branch (you can clone, switch to branch and then use lorri self-upgrade local /path/to/checkout to do that).

There are still more issues with watching the minimal amount of files necessary, so please report any inconsistencies that you see.

masaeedu commented 4 years ago

@dudebout The README currently suggests a workaround for 2. Is there a workaround for 1?

I'm using niv to manage my nixpkgs checkout, and lorri seems to be in an infinite loop:

[2019-11-30T05:17:04Z DEBUG lorri::watch] Event path ("/mnt/data/depot/git/haskell/repos/filterable/.git/index.lock") parent ("/mnt/data/depot/git/haskell/repos/filterable/.git") matches watched path
[2019-11-30T05:17:04Z DEBUG lorri::watch] Watch Event: RawEvent {
    path: Some(
        "/mnt/data/depot/git/haskell/repos/filterable/.git/index.lock",
    ),
    op: Ok(
        REMOVE,
    ),
    cookie: None,
}
[2019-11-30T05:17:04Z INFO  lorri::watch] identified file removal: "/mnt/data/depot/git/haskell/repos/filterable/.git/index.lock"
[2019-11-30T05:17:04Z DEBUG lorri::watch] Received event: RawEvent {
    path: Some(
        "/mnt/data/depot/git/haskell/repos/filterable/.git/index.lock",
    ),
    op: Ok(
        REMOVE,
    ),
    cookie: None,
}
dudebout commented 4 years ago

I am not aware of such a workaround. I have a feeling that in most cases this should not be a problem though, since working on nixpkgs or working on the project backed by lorri are fairly distinct operations. If I remember correctly, I noticed 1) while investigating this issue, but this was not something that was in the way.

Are you sure niv is using a git checkout of nixpkgs? From what niv does, and from reading its README, it does not seem to be the case, at least in its default mode of operation.

On Sat, Nov 30, 2019 at 12:19 AM Asad Saeeduddin notifications@github.com wrote:

@dudebout https://github.com/dudebout The README currently suggests a workaround for 2. Is there a workaround for 1?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/target/lorri/issues/6?email_source=notifications&email_token=AAC5LGSKQDW2NYHERXBEW2TQWHZXHA5CNFSM4HCHAFNKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEFPZW4Y#issuecomment-559913843, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAC5LGTKJRZ6KS4WAIXP6H3QWHZXHANCNFSM4HCHAFNA .

masaeedu commented 4 years ago

@dudebout You're right, it looks like niv uses a tarball. The .git folder that's causing an infinite loop seems to be the actual project I'm working on.

willbush commented 4 years ago

Note regarding the issue where src = ./. causes rebuilding on any file change applies to root when using developPackage.

let
  # ... elided
  haskellPkgs = pkgs.haskell.packages.${compiler};

in haskellPkgs.developPackage rec {
  root = ./.;
  # ... elided
}

If you look at the source it's because root eventually gets passed to src.

Likewise, this can be fixed with root = pkgs.nix-gitignore.gitignoreSource [] ./.;.

However, in that case the name has to be provided (e.g. name = builtins.baseNameOf ./.;) because the default implementation of name uses builtins.baseNameOf root which will result in a store path and give an error: "is not allowed to refer to a store path"

Here is the full (fixed) default.nix where I ran into this issue:

{ compiler ? "ghc865"
, doBenchmark ? false
, doProfiling ? false
, doStrict ? false
}:

let
  sources = import ./nix/sources.nix;
  pkgs = import sources.nixpkgs {
    config.allowUnfree = true;
    config.allowBroken = false;
    overlays = [
      (self: super: {
        haskell = super.haskell // {
          packages = super.haskell.packages // {
            ${compiler} = super.haskell.packages.${compiler} // rec {
              ghc = super.haskell.packages.${compiler}.ghc // {
                withPackages =
                  super.haskell.packages.${compiler}.ghc.withHoogle;
              };
              ghcWithPackages = ghc.withPackages;
            };
          };
        };
      })
    ];
  };
  haskellPkgs = pkgs.haskell.packages.${compiler};

in haskellPkgs.developPackage rec {
  name = builtins.baseNameOf ./.;
  # Must filter root otherwise `src = ./.` and lorri will get its known issue
  # where it rebuilds on any file change
  # (https://github.com/target/lorri/issues/6). When the root is filtered we
  # must provide a name (above) because the default implementation uses:
  # `builtins.baseNameOf root` which results in a name that refers to a store
  # path and end up with the error: "is not allowed to refer to a store path".
  root = pkgs.nix-gitignore.gitignoreSource [] ./.;

  modifier = drv:
    pkgs.haskell.lib.overrideCabal drv (attrs: {
      buildTools = (attrs.buildTools or [ ]) ++ [ haskellPkgs.cabal-install haskellPkgs.ghc ];

      enableLibraryProfiling = doProfiling;
      enableExecutableProfiling = doProfiling;

      testHaskellDepends = (attrs.testHaskellDepends or [ ])
        ++ [ haskellPkgs.criterion ];

      inherit doBenchmark;

      configureFlags =
        pkgs.stdenv.lib.optional doStrict "--ghc-options=-Werror";

      passthru = {
        nixpkgs = pkgs;
        inherit haskellPkgs;
      };
    });

  returnShellEnv = false;
}