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 文件系统

MIT/Apache

67KB
1.5K SLoC

if-changed

crates.io license ci docs

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