You work on a new task, encounter a difficult problem or something you don't want to implement yet, you drop a TODO
and move on, then some time later production break because you forgot about it... has this ever happened to you?
gofixit
is a language-agnostic linter which enforces that your TODOs and FIXMEs are dealt with in time, very similar to this eslint plugin.
File (examples/example1.c
):
#include <stdio.h>
void doSomething() {
// TODO[2022-06-15]: implement later
assert(("unimplemented", 0));
}
int main() {
doSomething()
}
Result (with gofixit --files examples/example1.c --strict
as of 2022-06-19):
examples/example1.c:4 TODO now overdue for 4 days 13 hours
examples/example1.c:12 FIXME missing expiry date
go install github.com/LouisBrunner/gofixit@latest
gofixit
The program will log all issues to stdout and return status code:
1
if it failed because there was one or more issue2
when it failed for an internal reason (including when using-h
or--help
)
gofixit
supports getting settings through:
- Environment variables: all env vars must be prefixed with
GOFIXIT_
and be in all caps - Configuration file: any file named
.gofixit.config.toml
in the current directory or any parent will be used, it must be a TOML formatted file - Command-line arguments: flag names use
kebab-case
instead ofPascalCase
as for the configuration file
All settings can be set through any of those sources, they are ordered by ascending priority (environment variables < configuration file < command line arguments).
Settings:
CommentPrefixes
: strings which define what a comment definition looks like (default[//,#,/*]
)Prefixes
: strings which define what a TODO looks like (default[TODO,FIXME]
)CaseSensitive
: should prefixes be matched as case sensitive or not (defaulttrue
)ExpiryPattern
: Go template used to generate a regex to match the prefix and expiry date together, careful of escaping any regex character in here (default"{{.Prefix}}(?:\\[{{.Date}}\\])?"
), see here for details about Go templating and here for details about Go regexDateLayout
: date layout format, as specified by Golang's date parsing (default"2006-01-02"
), see here for more details about formatStrict
: will force all matched comments to have an expiry dateNoRecursive
: disable processing directories recursively (defaultfalse
)Files
: list of files to parse (default[.]
)FilesExcludePatterns
: list of patterns used to exclude files or directoriesLoggingLevel
: logrus log level for internal debugging (default"fatal"
)
Example:
# CommentPrefixes can be set through all these mechanisms
# Environment variable
GOFIXIT_COMMENTPREFIXES='//,/*' gofixit
# Configuration file
cat > .gofixit.config.toml <<HEREDOC
CommentPrefixes = ['//', '/*']
HEREDOC
gofixit
# Command-line argument
gofixit --comment-prefixes='//,/*'
- Using date layout with variable amount of digits (e.g.
6
instead of06
) or with letters (e.g.Jun
instead of06
) is currently broken - No way to configure the utility