检查以确定是否已格式化代码

时间:2016-09-30 13:31:14

标签: go

我的目标是在提交时强制执行go源代码的格式化。有没有办法找出在文件/文件集上运行go fmt是否会进行任何更改?我能想到的唯一技术是:

  • 存储当前时间 t
  • 在源上运行fmt
  • 迭代源文件以查看是否有任何最后的mod日期>

我可以编写一个工具/脚本来执行此操作并在循环CI构建期间执行。在我开始之前,我想检查一下我是不是要重新发明轮子。

3 个答案:

答案 0 :(得分:5)

根据gofmt -h,您可以使用-l选项:

  

-l列出格式与gofmt的`

不同的文件

类似的东西:

> gofmt -l .

并进一步传递收到的文件列表。

答案 1 :(得分:2)

我找到了这个预提交挂钩enter link description here

1   #!/bin/sh
 2  # Copyright 2012 The Go Authors. All rights reserved.
 3  # Use of this source code is governed by a BSD-style
 4  # license that can be found in the LICENSE file.
 5  
 6  # git gofmt pre-commit hook
 7  #
 8  # To use, store as .git/hooks/pre-commit inside your repository and make sure
 9  # it has execute permissions.
10  #
11  # This script does not handle file names that contain spaces.
12  
13  gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '\.go$')
14  [ -z "$gofiles" ] && exit 0
15  
16  unformatted=$(gofmt -l $gofiles)
17  [ -z "$unformatted" ] && exit 0
18  
19  # Some files are not gofmt'd. Print message and fail.
20  
21  echo >&2 "Go files must be formatted with gofmt. Please run:"
22  for fn in $unformatted; do
23      echo >&2 "  gofmt -w $PWD/$fn"
24  done
25  
26  exit 1

答案 2 :(得分:0)

为@u_mulder 的回答添加其他信息。

如果您希望退出代码在失败时为 1,则可以使用

type

这对 CI 很有帮助。但是,这不会列出不同文件的列表。