From e68bc410f770256270a6937f4dd995c1e02143ee Mon Sep 17 00:00:00 2001 From: winebarrel Date: Sun, 1 Oct 2023 21:48:03 +0900 Subject: [PATCH] Add crongrep --- .goreleaser.yml | 31 +++++++++++++++++++++ CHANGELOG.md | 6 ++++ README.md | 29 ++++++++++++++++++++ cmd/crongrep/flags.go | 64 +++++++++++++++++++++++++++++++++++++++++++ cmd/crongrep/main.go | 39 ++++++++++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 cmd/crongrep/flags.go create mode 100644 cmd/crongrep/main.go diff --git a/.goreleaser.yml b/.goreleaser.yml index 6e5a4dc..5b3d1c8 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -23,6 +23,13 @@ builds: - -X main.version={{.Version}} env: - CGO_ENABLED=0 + - id: crongrep + binary: crongrep + main: ./cmd/crongrep + ldflags: + - -X main.version={{.Version}} + env: + - CGO_ENABLED=0 checksum: name_template: "checksums.txt" archives: @@ -35,6 +42,9 @@ archives: - id: cronviz builds: [cronviz] name_template: "{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" + - id: crongrep + builds: [crongrep] + name_template: "{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" brews: - name: cronplan ids: [cronplan] @@ -66,6 +76,16 @@ brews: license: MIT install: | bin.install 'cronviz' + - name: crongrep + ids: [crongrep] + tap: + owner: winebarrel + name: homebrew-cronplan + homepage: https://github.com/winebarrel/cronplan + description: crongrep is a tool to grep with cron expression. + license: MIT + install: | + bin.install 'crongrep' nfpms: - id: cronplan-nfpms builds: [cronplan] @@ -100,3 +120,14 @@ nfpms: - deb - rpm bindir: /usr/bin + - id: crongrep-nfpms + builds: [crongrep] + file_name_template: "{{ .Binary }}_{{ .Version }}_{{ .Arch }}" + homepage: https://github.com/winebarrel/cronplan + maintainer: Genki Sugawara + description: crongrep is a tool to visualize cron schedule. + license: MIT + formats: + - deb + - rpm + bindir: /usr/bin diff --git a/CHANGELOG.md b/CHANGELOG.md index 2330916..c5f8cf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ N/A +## [1.10.1] - 2023-10-01 + +### Added + +* Add crongrep CLI. + ## [1.10.0] - 2023-10-01 ### Added diff --git a/README.md b/README.md index 1f2b919..b50fd6a 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,35 @@ $ open output.html cf. https://raw.githack.com/winebarrel/cronplan/main/_example/timeline.html +# crongrep CLI + +CLI to grep with cron expression. + +## Installation + +``` +brew install winebarrel/cronplan/crongrep +``` + +## Usage + +``` +Usage: crongrep [OPTION] CRON_EXPR + -version + print version and exit +``` + +``` +$ for i in {1..5}; do +LANG=C date +done | crongrep '0 * * * ? *' +Sun Oct 1 21:00:00 JST 2023 +Sun Oct 1 21:00:00 JST 2023 +Sun Oct 1 21:00:00 JST 2023 +Sun Oct 1 21:00:00 JST 2023 +Sun Oct 1 21:00:00 JST 2023 +``` + ## Related Links * [Cron expressions reference - Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-cron-expressions.html) diff --git a/cmd/crongrep/flags.go b/cmd/crongrep/flags.go new file mode 100644 index 0000000..ab7eab8 --- /dev/null +++ b/cmd/crongrep/flags.go @@ -0,0 +1,64 @@ +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + "strings" +) + +var ( + version string +) + +type flags struct { + expr string +} + +func init() { + cmdLine := flag.NewFlagSet(filepath.Base(os.Args[0]), flag.ExitOnError) + + cmdLine.Usage = func() { + fmt.Fprintf(cmdLine.Output(), "Usage: %s [OPTION] CRON_EXPR\n", cmdLine.Name()) + cmdLine.PrintDefaults() + } + + flag.CommandLine = cmdLine +} + +func parseFlags() *flags { + flags := &flags{} + showVersion := flag.Bool("version", false, "print version and exit") + flag.Parse() + + if *showVersion { + printVersionAndExit() + } + + args := flag.Args() + + if len(args) != 1 { + printUsageAndExit() + } + + flags.expr = strings.TrimSpace(args[0]) + + return flags +} + +func printVersionAndExit() { + v := version + + if v == "" { + v = "" + } + + fmt.Fprintln(flag.CommandLine.Output(), v) + os.Exit(0) +} + +func printUsageAndExit() { + flag.CommandLine.Usage() + os.Exit(0) +} diff --git a/cmd/crongrep/main.go b/cmd/crongrep/main.go new file mode 100644 index 0000000..303f613 --- /dev/null +++ b/cmd/crongrep/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + + "github.com/araddon/dateparse" + "github.com/winebarrel/cronplan" +) + +func init() { + log.SetFlags(0) +} + +func main() { + flags := parseFlags() + cron, err := cronplan.Parse(flags.expr) + + if err != nil { + log.Fatal(err) + } + + scanner := bufio.NewScanner(os.Stdin) + + for scanner.Scan() { + line := scanner.Text() + t, err := dateparse.ParseAny(line) + + if err != nil { + log.Fatal(err) + } + + if cron.Match(t) { + fmt.Println(line) + } + } +}