nim-lang / nimble

Package manager for the Nim programming language.
Other
1.25k stars 188 forks source link

Modern techniques for dependency resolution #890

Open mratsim opened 3 years ago

mratsim commented 3 years ago

Just a recap of a short discussion with @haxscramper and @FedericoCeratto on modern dependency resolution.

Nimble found a certain combination of dependencies impossible to resolve even though there is actually a solution.

Modern package managers that handles tens of thousands of packages and/or multiversioning are gradually delegating dependency resolution to SAT solvers as this is a problem that can be modelled as a Satisfiability problem.

Writeups:

TLDR;

Note: I think there are other approaches possible from writing that ourselves or using alternative theories like Integer Linear Programming (ILP) but it's more pragmatic to reuse existing blocks that were optimized and stabilized over years of usage here and regarding ILP, I tried to wrap the one for LLVM (http://isl.gforge.inria.fr/) or write one myself (https://github.com/mratsim/hydra) but those are really complex.

FedericoCeratto commented 3 years ago

Datapoints regarding distributing Z3: it is packaged in most distributions, it appears to be stable, without concerning dependencies, and runs on most architectures.

Then a valid solution is impossible, the dependency solver in apt/aptitude can suggest multiple alternative solutions that break/ignore one or more constraint each, starting with the less "aggressive" first. Z3 might help doing the same easily.

Also, https://ci.debian.net/doc/ runs automated tests against multiple solutions and across multiple packages to spot incorrect dependency constraints. Z3 could help doing local compilation tests against combinations of dependencies to spot similar issues.

haxscramper commented 3 years ago

Current implementation of dependency resolution does not construct explicit dependency graph, and instead just loops https://github.com/nim-lang/nimble/blob/95e6870f60655e81ff488779c7f589fe649061ec/src/nimble.nim#L64 though requirements, almost immediately installing them https://github.com/nim-lang/nimble/blob/95e6870f60655e81ff488779c7f589fe649061ec/src/nimble.nim#L84-L86 which I believe to be the source of such bugs as https://github.com/nim-lang/nimble/issues/505 and https://github.com/nim-lang/nimble/issues/887 (could be prevented with explicit dependency graph construction).

Maybe we could adopt an approach similar to https://hal.archives-ouvertes.fr/hal-00149566/document for mapping dependency requirements to something that is fed into z3

Related links:

stefantalpalaru commented 3 years ago

Both are looking into SAT solver

For good reasons: https://research.swtch.com/version-sat

dom96 commented 3 years ago

For good reasons: https://research.swtch.com/version-sat

This is a classic, if you haven't already then check out the "Alternatives?" section. Some of the suggestions may sound familiar.

image

Specifying a concrete version in a Nimble file has always been a bad idea and largely discouraged. I think that once lock files are merged into Nimble that we should look into disallowing concrete versions in "requires" completely (without lock files this is the only way you can hope to get reproducible builds).

Nim should also grow the ability to compile a package with a dependency on two different versions of the same package. I think I may have finally convinced Araq that this is necessary :)

haxscramper commented 3 years ago

Approximate current stats for nimble package requirement specifications:

total package count:      1565
processing ok:            1382
not using github:         51
http error when getting:  87
configuration parse fail: 19

verLater        (   > V    ): 28
verEarlier      (   < V    ): 4
verEqLater      (   >= V   ): 1759
verEqEarlier    (   <= V   ): 2
verIntersect    (> V & < V ): 37
verEq           (    V     ): 24
verAny          (    *     ): 319
verSpecial      (  #head   ): 34
haxscramper commented 3 years ago

I think it should be explicitly noted that while the addition of SAT solver might be considered debatable, the dependency resolution step of nimble should be refactored into explicit dependency graph construction with subsequent full download of packages to be installed. Current solution of resolving-packages-while-installing-packages-wile-resolving packages leads to overly verbose output where each dependency can be repeated, makes resolution dependent on order of requires statements, and makes it hardly possible to do things like nimble build and nimble test without installing anything.

Package can appear multiple times in the output if it is required by more than one package, but each additional encounter will have useless 'requirement already satisfied' message, cluttering output and making it much harder to determine what went wrong.

It is possible to get all necessary dependency information by parsing .nimble file, but without evaluating it, and while this might seem like an overly fragile approach it worked successfully for approximately 96% of the [processed] packages. It is not possible to account for all possible ways of writing package specification of course, but things like

  version       = pkgVersion # fae

  # paravim
  installExt    = @[
    "nim", "txt", "ttf", "glsl", "c", "h",
    when defined(windows):
      "dll"
    elif defined(macosx):
      "dylib"
    elif defined(linux):
      "so"
  ]

  # metar
  include metar/version

  version = metarVersion

  # plz
  version     = CompileDate.replace("-", ".")

Are extremely rare, and for these cases fully downloading packages before resolving it is the only solution (as well as non-github hostings (account for 3% of all packages).

haxscramper commented 3 years ago

Related nim forum discussion https://forum.nim-lang.org/t/7671

additional edit (not separate comment to avoid pings)

Current solution of resolving-packages-while-installing-packages-wile-resolving packages leads to overly verbose output

Encountered this absolute masterpiece of readable user output (only lines with Dependency are show, sorted to illustrate the point. Actual output is x2 longer due to Verifying dependencies for hmisc@0.11.5)

      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on benchy@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on cligen@any version already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on compiler@>= 1.4.0 already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on fusion@any version already satisfied
      Info: Dependency on hcparse@any version already satisfied
      Info: Dependency on hdrawing@>= 0.1.3 already satisfied
      Info: Dependency on hdrawing@>= 0.1.3 already satisfied
      Info: Dependency on hdrawing@>= 0.1.3 already satisfied
      Info: Dependency on hdrawing@>= 0.1.3 already satisfied
      Info: Dependency on hdrawing@>= 0.1.3 already satisfied
      Info: Dependency on hdrawing@>= 0.1.3 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.1 already satisfied
      Info: Dependency on hmisc@>= 0.10.4 already satisfied
      Info: Dependency on hmisc@>= 0.10.7 already satisfied
      Info: Dependency on hmisc@>= 0.11.3 already satisfied
      Info: Dependency on hmisc@>= 0.11.3 already satisfied
      Info: Dependency on hmisc@>= 0.4.0 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.15 already satisfied
      Info: Dependency on hmisc@>= 0.9.16 already satisfied
      Info: Dependency on hmisc@>= 0.9.1 already satisfied
      Info: Dependency on hmisc@>= 0.9.1 already satisfied
      Info: Dependency on hnimast@>= 0.3.18 already satisfied
      Info: Dependency on hnimast@>= 0.3.18 already satisfied
      Info: Dependency on hnimast@>= 0.3.18 already satisfied
      Info: Dependency on hnimast@>= 0.3.18 already satisfied
      Info: Dependency on hnimast@>= 0.3.18 already satisfied
      Info: Dependency on hnimast@>= 0.3.18 already satisfied
      Info: Dependency on hnimast@>= 0.3.19 already satisfied
      Info: Dependency on hnimast@>= 0.3.20 already satisfied
      Info: Dependency on hnimast@any version already satisfied
      Info: Dependency on hnimast@#head already satisfied
      Info: Dependency on hpprint@>= 0.2.11 already satisfied
      Info: Dependency on hpprint@>= 0.2.11 already satisfied
      Info: Dependency on hpprint@>= 0.2.12 already satisfied
      Info: Dependency on hpprint@any version already satisfied
      Info: Dependency on hpprint@any version already satisfied
      Info: Dependency on hpprint@any version already satisfied
      Info: Dependency on https://github.com/disruptek/balls@>= 2.0.0 & < 3.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/balls@>= 2.0.0 & < 3.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/criterion@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/criterion@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/gram@>= 0.3.2 already satisfied
      Info: Dependency on https://github.com/disruptek/grok@>= 0.5.0 & < 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/grok@>= 0.5.0 & < 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/grok@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/grok@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/skiplists@>= 0.5.1 & < 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/ups@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/disruptek/ups@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/haxscramper/cxxstd.git@any version already satisfied
      Info: Dependency on https://github.com/haxscramper/cxxstd.git@any version already satisfied
      Info: Dependency on https://github.com/haxscramper/fusion.git@#matching-fixup already satisfied
      Info: Dependency on https://github.com/haxscramper/fusion.git@#matching-fixup already satisfied
      Info: Dependency on https://github.com/haxscramper/hasts@< 1.0.0 already satisfied
      Info: Dependency on https://github.com/haxscramper/nimtrail.git@>= 0.1.1 already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on macroutils@any version already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimble@<= 0.13.0 already satisfied
      Info: Dependency on nimspell@any version already satisfied
      Info: Dependency on nimspell@any version already satisfied
      Info: Dependency on nimtraits@any version already satisfied
      Info: Dependency on npeg@>= 0.23.2 & < 1.0.0 already satisfied
      Info: Dependency on npeg@>= 0.23.2 & < 1.0.0 already satisfied
Not to mention this `nimble test` command errored out and provided me with a following error message (as seen in terminal). Each `--path` is duplicated as many times as particular package was encountered. ``` /home/test/.nimble/bin/nim cpp --noNimblePath -d:NimblePkgVersion=0.1.2 --path:/ mnt/workspace/github/hnimast/src --path:/mnt/workspace/github/hmisc/src --path:/ home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusi on/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/home/test/.nimble/pkg s/macroutils-1.0.0 --path:/home/test/.nimble/pkgs/compiler-1.4.6 --path:/home/te st/.nimble/pkgs/nimble-0.13.0 --path:/mnt/workspace/github/hmisc/src --path:/hom e/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/ src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/hpp rint/src --path:/mnt/workspace/github/hdrawing/src --path:/mnt/workspace/github/ hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspac e/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt /workspace/github/hnimast/src --path:/mnt/workspace/github/hmisc/src --path:/hom e/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/ src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/home/test/.nimble/pkgs/m acroutils-1.0.0 --path:/home/test/.nimble/pkgs/compiler-1.4.6 --path:/home/test/ .nimble/pkgs/nimble-0.13.0 --path:/mnt/workspace/github/hmisc/src --path:/home/t est/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/nimspe ll/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cli gen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/test/. nimble/pkgs/benchy-0.0.1 --path:'/home/test/.nimble/pkgs/fusion-#matching-fixup' --path:/home/test/.nimble/pkgs/haxorg-0.1.2 --path:'/home/test/.nimble/pkgs/nim trail-#head' --path:/mnt/workspace/github/hcparse/src --path:/mnt/workspace/gith ub/hnimast/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/ pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/hom e/test/.nimble/pkgs/benchy-0.0.1 --path:/home/test/.nimble/pkgs/macroutils-1.0.0 --path:/home/test/.nimble/pkgs/compiler-1.4.6 --path:/home/test/.nimble/pkgs/ni mble-0.13.0 --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkg s/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/t est/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/hpprint/src --path:/m nt/workspace/github/hdrawing/src --path:/mnt/workspace/github/hmisc/src --path:/ home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusi on/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/ hnimast/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkg s/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/t est/.nimble/pkgs/benchy-0.0.1 --path:/home/test/.nimble/pkgs/macroutils-1.0.0 -- path:/home/test/.nimble/pkgs/compiler-1.4.6 --path:/home/test/.nimble/pkgs/nimbl e-0.13.0 --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/c ligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/test /.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/nimtraits/src --path:/mn t/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path: /home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/bench y-0.0.1 --path:/mnt/workspace/github/hpprint/src --path:/mnt/workspace/github/hd rawing/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs /cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/te st/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/hnimast/src --path:/mn t/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path: /home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/bench y-0.0.1 --path:/home/test/.nimble/pkgs/macroutils-1.0.0 --path:/home/test/.nimbl e/pkgs/compiler-1.4.6 --path:/home/test/.nimble/pkgs/nimble-0.13.0 --path:/mnt/w orkspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/ho me/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0 .0.1 --path:/mnt/workspace/github/hnimast/src --path:/mnt/workspace/github/hmisc /src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git -sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/home/tes t/.nimble/pkgs/macroutils-1.0.0 --path:/home/test/.nimble/pkgs/compiler-1.4.6 -- path:/home/test/.nimble/pkgs/nimble-0.13.0 --path:/home/test/.nimble/pkgs/gram-0 .3.2 --path:/home/test/.nimble/pkgs/skiplists-0.5.1 --path:/home/test/.nimble/pk gs/grok-0.5.0 --path:/home/test/.nimble/pkgs/balls-2.4.5 --path:/home/test/.nimb le/pkgs/grok-0.5.0 --path:/home/test/.nimble/pkgs/ups-0.0.6 --path:/home/test/.n imble/pkgs/npeg-0.24.1 --path:/home/test/.nimble/pkgs/criterion-0.2.0 --path:/ho me/test/.nimble/pkgs/grok-0.5.0 --path:/home/test/.nimble/pkgs/hasts-0.1.6 --pat h:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 -- path:/home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/ benchy-0.0.1 --path:/home/test/.nimble/pkgs/balls-2.4.5 --path:/home/test/.nimbl e/pkgs/grok-0.5.0 --path:/home/test/.nimble/pkgs/ups-0.0.6 --path:/home/test/.ni mble/pkgs/npeg-0.24.1 --path:/home/test/.nimble/pkgs/criterion-0.2.0 --path:/mnt /workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/ home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy -0.0.1 --path:/mnt/workspace/github/hpprint/src --path:/mnt/workspace/github/hdr awing/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/ cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/tes t/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/hnimast/src --path:/mnt /workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/ home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy -0.0.1 --path:/home/test/.nimble/pkgs/macroutils-1.0.0 --path:/home/test/.nimble /pkgs/compiler-1.4.6 --path:/home/test/.nimble/pkgs/nimble-0.13.0 --path:/mnt/wo rkspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/hom e/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0. 0.1 --path:/mnt/workspace/github/hnimast/src --path:/mnt/workspace/github/hmisc/ src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git- sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/home/test /.nimble/pkgs/macroutils-1.0.0 --path:/home/test/.nimble/pkgs/compiler-1.4.6 --p ath:/home/test/.nimble/pkgs/nimble-0.13.0 --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-san dbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspac e/github/hpprint/src --path:/mnt/workspace/github/hdrawing/src --path:/mnt/works pace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/t est/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/github/hnimast/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-san dbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/home/test/.n imble/pkgs/macroutils-1.0.0 --path:/home/test/.nimble/pkgs/compiler-1.4.6 --path :/home/test/.nimble/pkgs/nimble-0.13.0 --path:/mnt/workspace/github/hmisc/src -- path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbo x/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/mnt/workspace/g ithub/nimspell/src --path:/mnt/workspace/github/hmisc/src --path:/home/test/.nim ble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path: /home/test/.nimble/pkgs/benchy-0.0.1 --path:'/home/test/.nimble/pkgs/fusion-#mat ching-fixup' --path:/home/test/.nimble/pkgs/cxxstd-0.1.0 --path:/mnt/workspace/g ithub/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/wo rkspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --pat h:/mnt/workspace/github/hpprint/src --path:/mnt/workspace/github/hdrawing/src -- path:/mnt/workspace/github/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/workspace/git-sandbox/fusion/src --path:/home/test/.nimble/pk gs/benchy-0.0.1 --path:/mnt/workspace/github/hnimast/src --path:/mnt/workspace/g ithub/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/wo rkspace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --pat h:/home/test/.nimble/pkgs/macroutils-1.0.0 --path:/home/test/.nimble/pkgs/compil er-1.4.6 --path:/home/test/.nimble/pkgs/nimble-0.13.0 --path:/mnt/workspace/gith ub/hmisc/src --path:/home/test/.nimble/pkgs/cligen-1.2.2 --path:/home/test/works pace/git-sandbox/fusion/src --path:/home/test/.nimble/pkgs/benchy-0.0.1 --path:/ home/test/.nimble/pkgs/nimble-0.13.0 --path:/home/test/workspace/git-sandbox/fus ion/src --path:/home/test/.nimble/pkgs/cxxstd-0.1.0 --hints:off -r --path:. /mnt /workspace/github/haxdoc/tests/tFilterD ```