1个不稳定版本
0.4.0 | 2019年11月20日 |
---|
#1026 在 文件系统
90KB
2K SLoC
说明
警告计数器(wcnt)是一个小型的命令行工具,用于统计日志文件中的警告数量,并将它们与定义的限制进行比较。在CI环境中,如果您想确保警告的数量不会增加,这非常有用。
警告的类型在Wcnt.toml
中定义,该文件应位于项目的根目录。限制在Limits.toml
中定义,然后对该文件系统中该目录树中的源文件有效。您可以有多个Limits.toml
文件,并将它们放在您认为合适的位置。也许每个组件或子系统一个,或者最适合您的项目。如果系统在搜索设置限制时找不到Limits.toml
文件,它将使用0作为限制,因此请确保您指定了限制!
示例 Wcnt.toml
以下是一个示例Wcnt.toml
文件,定义了两种类型gcc
和flake8
的规则。
[gcc]
regex = "^(?P<file>[^:]+):(?P<line>\\d+):(?P<column>\\d+): warning: (?P<description>.+) \\[(?P<category>.+)\\]"
files = ["**/compilation.log", "**/build.log"]
[flake8]
regex = "^(?P<file>[^:]+):(?P<line>\\d+):(?P<column>\\d+): (?P<category>[^\\s]+) (?P<description>.+)$"
files = ["**/lint.log"]
在Wcnt.toml
中,您为要搜索的每种“警告类型”定义一个映射,以及如何搜索它。每个必需的设置是regex
和files
。regex
的值必须定义一个file
捕获组,这样我们就可以知道哪个文件导致了每个特定的警告,因此,应该使用哪个Limits.toml
。
捕获组line
、column
、category
和description
是可选的,允许系统忽略相同的警告的多个实例(对于头文件很有用)。category
键还允许您为不同的类别定义单独的限制。
为了能够使用按类别限制,您的正则表达式必须定义一个category
捕获组。否则,系统在解析Limits.toml
文件时会终止。这是为了防止产生错误的安全感。
示例 Limits.toml
以下是一个示例Limits.toml
文件,其中flake8
警告限制在300个,而gcc
警告被分为几个不同的类别。您可以使用inf
允许任意数量的警告,而_
是通配符类别。它匹配您尚未定义的任何类别。在使用按类别限制时,始终包括通配符类别是明智的,否则限制为零。
flake8 = 300
[gcc]
-Wpedantic = 3
-Wcomment = inf
-Wunused-variable = 2
_ = 0
注意:按类别定义必须位于文件末尾,因为这是由TOML的工作方式决定的。
如果不使用按类别限制,所有类别都会计入相同的限制中。换句话说,这两种定义限制的方法是等效的。
kind = 1
和
[kind]
_ = 1
您可以有多个 Limits.toml
文件
来自源文件的每个警告都会计入与之最近的 Limits.toml
文件,沿着文件系统树向上。在下面的示例中,component_a
和 component_b
共享 project/src/Limit.toml
中定义的限制,而 component_c
有自己的限制。这对于您有一些需要额外严格或宽松规则的功能组件非常有用,例如新开发的代码,或者一个 vendored 的第三方依赖项或旧代码。
project
├── Wcnt.toml
├── src
│ ├── Limits.toml
│ ├── component_a
│ │ ├── source.c
│ │ ├── interface.h
│ │ └── utility.py
│ ├── component_b
│ │ ├── binary.c
│ │ ├── code.c
│ │ └── interface.h
│ └── component_c
│ ├── Limits.toml
│ ├── rustmodule.rs
│ └── glue.c
└── build
├── compilation.log
└── lint.log
无限限制
如果您对代码库的某个特定部分不希望关注某种警告,您可以将限制指定为 inf
,如下所示
[kind]
-Wbothersome = inf
如果您有 vendored 代码或实验性代码,这些代码不需要或不能与生产代码保持相同的标准,但仍然希望以相同的设置进行编译,这将非常有用。
修剪
该工具可以自动更新/降低并修剪您的 Limits.toml
文件。当您没有警告时,使用 --update-limits
标志,以下限制
[gcc]
-Wpedantic = 3
-Wcomment = 3
-Wunused-variable = 2
变为
[gcc]
-Wpedantic = 0
-Wcomment = 0
-Wunused-variable = 0
注意: --update-limits
不会修改设置为 inf
的限制。
添加 --prune
后,上述限制减少到
gcc = 0
注意: --prune
也不会修改设置为 inf
的限制。
强烈建议您设置一个自动重复的任务,该任务运行 wcnt --update-limits [--prune]
并将结果提交到您的仓库,以确保限制确实随着时间的推移而降低。
部分运行
在某些情况下,您可能不想(或不能)一次获取所有警告。例如,如果您使用 GCC 和 MSVC/XCode 编译 C 代码。然后您可以通过使用 --only
标志传递参数,仅为此或此类警告运行工具。此功能与 --update-limits
集成,并且不会从您的 Limits.toml
文件中删除限制。如果您有自动提交以降低限制的重复性工作,您将必须自己处理任何合并冲突。
从 --help 输出的内容
$ wcnt --help
Warning Counter (wcnt) 0.4.0
Mikael Silvén <[email protected]>
A program to count your warnings inside log files and comparing them against defined limits.
USAGE:
wcnt [FLAGS] [OPTIONS]
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
--update-limits Update the Limit.toml files with lower values if no violations were found.
--prune Also aggressively prune Limits.toml files to more minimal forms (requires --update-limits).
-v Be more verbose. (-vv for very verbose)
--all Also print non-violating warnings. (if verbose or very verbose)
OPTIONS:
--only <KIND>... Run the check only for these kinds of warnings.
--start <DIR> Start search in this directory (instead of cwd)
--config <Wcnt.toml> Use this config file. (Instead of <start>/Wcnt.toml)
设计目标
- Wcnt 尽量不做太多的事情。
- 它确实试图保持灵活,因此您的构建系统不需要。
- Wcnt 不应该给人以虚假的安全感。
开放问题
- 我还没有决定如何处理来自代码库外部的警告。希望您可以使用
-isystem
来处理这些事情。 - Windows 路径很麻烦,如果您的工具输出
\\?\
样式的路径,您可能遇到麻烦。 - 我希望有一个“重映射”功能,这样即使警告使用绝对路径,也可以分析警告,即使它们在您分析它们的不同系统上生成。
安装和构建
在我将 Wcnt 发布到 crates.io 之前,您可以在 Github 发布页面 找到二进制文件。对此表示歉意。
Wcnt 也应该使用 cargo 正常构建。
cargo build --release
许可证
警告计数器(Wcnt)遵循Apache 2.0 (http://www.apache.org/licenses/LICENSE2.0) 许可协议。它可以在免费软件以及封闭源代码应用中使用,包括商业和非商业用途,前提是符合许可协议中的条件。
贡献
任何有意提交以包含在本作品中的贡献都必须也采用Apache2许可。
依赖
~7–17MB
~207K SLoC