Skip to content

Commit

Permalink
typos: fix unexpected behaviour
Browse files Browse the repository at this point in the history
Enable typos.configPath to be of type path. This way, we can
use excludes from .typos.toml when running
`pre-commit run typos --all-files`. Otherwise, the execution
differs from a normal invocation of typos, which is unexpected
and leads to wrong results.

To not break anything, and to be compliant with the existing
API, I modified configPath to be either a Nix path or a string.

[0]: #387 (comment)
  • Loading branch information
phip1611 committed Apr 8, 2024
1 parent 70f5040 commit 7e6fcae
Showing 1 changed file with 51 additions and 6 deletions.
57 changes: 51 additions & 6 deletions modules/hooks.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1430,7 +1430,7 @@ in
configuration =
mkOption {
type = types.str;
description = lib.mdDoc "Multiline-string configuration passed as config file. If set, config set in `typos.settings.configPath` gets ignored.";
description = lib.mdDoc "Multiline-string configuration passed as config file. It is recommended to use `configPath` instead for a more natural experience of typos.";
default = "";
example = ''
[files]
Expand All @@ -1444,11 +1444,14 @@ in
'';
};

# It is recommended to use a Nix path here as this way, the excludes
# from the config file can be taken into account by pre-commit when
# running `$ pre-commit run --all-files`.
configPath =
mkOption {
type = types.str;
description = lib.mdDoc "Path to a custom config file.";
default = "";
type = types.nullOr (types.either types.str types.path);
description = lib.mdDoc "Path to a typos config file (recommended) or a string (deprecated).";
default = null;
example = ".typos.toml";
};

Expand Down Expand Up @@ -3300,6 +3303,47 @@ lib.escapeShellArgs (lib.concatMap (ext: [ "--ghc-opt" "-X${ext}" ]) hooks.ormol
entry = "${hooks.treefmt.package}/bin/treefmt --fail-on-change";
};
typos =
let
# Path to config file. May be in Nix store but can also be a relative
# path to a system-dependent file.
#
# After various upstream discussions [0]), the best solution is to
# provide the config file as Nix path but keep the string passing
# as fall-back.
#
# [0]: https://github.com/cachix/pre-commit-hooks.nix/pull/387#issuecomment-1893600631
pathToConfigFile =
if hooks.typos.settings.configPath != null
# Important: If passed as typeOf == "path", this is in Nix store
# which we in fact encourage.
then hooks.typos.settings.configPath
else
builtins.toFile "config.toml"
# Concatenate config in config file with section for ignoring words
# generated from list of words to ignore
(hooks.typos.settings.configuration +
lib.strings.optionalString (hooks.typos.settings.ignored-words != [ ]) "\n\[default.extend-words\]" +
lib.strings.concatMapStrings (x: "\n${x} = \"${x}\"") hooks.typos.settings.ignored-words
)
;
# If the config file path is passed as string and not as path, we
# can't read it from Nix.
excludesFromConfig =
if builtins.typeOf hooks.typos.settings.configPath == "path" # passed directly or as Path
then
(
let
toml = builtins.fromTOML (builtins.readFile pathToConfigFile);
in
/*
The "files.extend-exclude" key comes from
https://github.com/crate-ci/typos/blob/master/docs/reference.md
*/
(toml.files or { }).extend-exclude or [ ]
)
else
[ ];
in
{
name = "typos";
description = "Source code spell checker";
Expand All @@ -3314,8 +3358,8 @@ lib.escapeShellArgs (lib.concatMap (ext: [ "--ghc-opt" "-X${ext}" ]) hooks.ormol
(with hooks.typos.settings; [
[ binary "--binary" ]
[ (color != "auto") "--color ${color}" ]
[ (configuration != "") "--config ${configFile}" ]
[ (configPath != "" && configuration == "") "--config ${configPath}" ]
# Config file always exists (we generate one if not).
[ true "--config ${pathToConfigFile}" ]
[ diff "--diff" ]
[ (exclude != "") "--exclude ${exclude} --force-exclude" ]
[ (format != "long") "--format ${format}" ]
Expand All @@ -3331,6 +3375,7 @@ lib.escapeShellArgs (lib.concatMap (ext: [ "--ghc-opt" "-X${ext}" ]) hooks.ormol
in
"${hooks.typos.package}/bin/typos ${cmdArgs}";
types = [ "text" ];
excludes = excludesFromConfig;
};
typstfmt = {
name = "typstfmt";
Expand Down

0 comments on commit 7e6fcae

Please sign in to comment.