5 个不稳定版本
0.3.2 | 2024年6月13日 |
---|---|
0.3.1 | 2024年4月21日 |
0.3.0 | 2024年4月20日 |
0.2.0 | 2024年4月19日 |
0.1.0 | 2024年4月19日 |
#490 in 文件系统
67KB
1.5K SLoC
if-changed
if-changed
是一个命令行工具,它检查仓库差异中是否存在 "if-changed"
和 "then-change"
注释,如果依赖文件需要更改则报错。
安装
cargo install if-changed
用法
Usage: if-changed [OPTIONS] [PATTERNS]...
Arguments:
[PATTERNS]...
Git patterns defining the set of files to check. By default, this will be all changed files between revisions.
This list follows the same rules as [`.gitignore`](https://git.js.cn/docs/gitignore) except relative paths/patterns are always matched against the repository root, even if the paths/patterns don't contain `/`. In particular, a leading `!` before a pattern will reinclude the pattern if it was excluded by a previous pattern.
Options:
--from-ref <FROM_REF>
The revision to compare against. By default, HEAD is used
[env: PRE_COMMIT_FROM_REF=]
--to-ref <TO_REF>
The revision to compare with. By default, the current working tree is used
[env: PRE_COMMIT_TO_REF=]
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
要与 pre-commit
一起使用,请将以下内容添加到您的 .pre-commit-config.yaml
repos:
- repo: https://github.com/mathematic-inc/if-changed
rev: v0.3.1
hooks:
- id: if-changed
动机示例
假设你有以下内容
// lib.rs
enum ErrorCode {
A,
B,
C,
}
// lib.ts
const enum ErrorCode {
A,
B,
C,
}
通常,为了同步这些枚举,一种常见的方法是将枚举值提取到一个“事实来源”文件中。这通常需要使用构建系统或脚本生成枚举,并确保一切正常工作。如果这项工作是临时性的,那么成本将远远超过收益。
这就是 if-changed
的用武之地。而不是上面那样,假设我们有
// lib.rs
+// if-changed(ecrs)
enum ErrorCode {
A,
B,
C,
}
+// then-change(lib.ts:ects)
// lib.ts
+// if-changed(ects)
const enum ErrorCode {
A,
B,
C,
}
+// then-change(lib.rs:ecrs)
一旦提交,下次更改 lib.rs
(或 lib.ts
)中由 "if-changed"
和 "then-change"
包围的行时,如果引用的另一个文件(在 "then-change"
注释中)在相应的命名块中没有任何更改,则 if-changed
会报错。
[!TIP]
如果你只想断言文件中的任何更改都是可以的,那么只需引用文件而不指定名称。例如,
// lib.ts // if-changed(ects) const enum ErrorCode { A, B, C, } -// then-change(lib.rs:ecrs) +// then-change(lib.rs)
文件列表
如果一个块需要指定多个文件,可以使用逗号和/或换行符来分隔路径/模式。例如,
// then-change(foo/bar, baz)
/// OR
// then-change(
// foo/bar
// bar
// )
这些列表遵循与.gitignore
相同的规则,但有一个例外,即相对路径/模式始终与它们所编写的文件中的文件进行匹配,即使路径/模式不包含/
。使用起始/
来匹配仓库根目录,例如/*/bar
。
长路径
如果路径太长,您可以使用shell续行符\
将其拆分到多行。例如,对于路径this/is/a/really/long/path/to/some/very/far/away/file
,您可以这样做
// then-change(
// this/is/a/really/long/path/to/some/very/far/ \
// away/file
// )
禁用if-changed
要在提交过程中禁用特定文件的if-changed
,请将Ignore-if-changed: <path>, ... -- [REASON]
添加到提交页脚。在这里,<path>
应该是文件路径。一般来说,<path>
可以是fnmatch允许的任何模式。
[!注意]
如果您想在比较工作树时禁用
if-changed
,可以执行以下操作if-changed '*' !<path-or-pattern>
其中
<path-or-pattern>
是要忽略的路径/模式。
贡献
欢迎为if-changed
做出贡献!请在GitHub仓库中提交拉取请求或创建问题。
依赖项
~11MB
~282K SLoC