mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-11 04:15:48 +02:00
Use go:generate for generating cheatsheets
This has several benefits: - it's less code - we're using the same mechanism to generate all our auto-generated files, so if someone wants to add a new one, it's clear which pattern to follow - we can re-generate all generated files with a single command ("go generate ./...", or "make generate") - we only need a single check on CI to check that all files are up to date (see previous commit)
This commit is contained in:
parent
5ccc95b76f
commit
7af371701d
14 changed files with 31 additions and 125 deletions
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
|
@ -127,9 +127,6 @@ jobs:
|
||||||
uses: actions/setup-go@v4
|
uses: actions/setup-go@v4
|
||||||
with:
|
with:
|
||||||
go-version: 1.20.x
|
go-version: 1.20.x
|
||||||
- name: Check Cheatsheet
|
|
||||||
run: |
|
|
||||||
go run scripts/cheatsheet/main.go check
|
|
||||||
- name: Check Vendor Directory
|
- name: Check Vendor Directory
|
||||||
# ensure our vendor directory matches up with our go modules
|
# ensure our vendor directory matches up with our go modules
|
||||||
run: |
|
run: |
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -29,6 +29,7 @@ unit-test:
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: unit-test integration-test-all
|
test: unit-test integration-test-all
|
||||||
|
|
||||||
|
# Generate all our auto-generated files (test list, cheatsheets, maybe other things in the future)
|
||||||
.PHONY: generate
|
.PHONY: generate
|
||||||
generate:
|
generate:
|
||||||
go generate ./...
|
go generate ./...
|
||||||
|
@ -37,10 +38,6 @@ generate:
|
||||||
format:
|
format:
|
||||||
gofumpt -l -w .
|
gofumpt -l -w .
|
||||||
|
|
||||||
.PHONY: update-cheatsheet
|
|
||||||
update-cheatsheet:
|
|
||||||
go run scripts/cheatsheet/main.go generate
|
|
||||||
|
|
||||||
# For more details about integration test, see https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md.
|
# For more details about integration test, see https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md.
|
||||||
.PHONY: integration-test-tui
|
.PHONY: integration-test-tui
|
||||||
integration-test-tui:
|
integration-test-tui:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit Keybindings
|
# Lazygit Keybindings
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit キーバインド
|
# Lazygit キーバインド
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit 키 바인딩
|
# Lazygit 키 바인딩
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit Sneltoetsen
|
# Lazygit Sneltoetsen
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit Keybindings
|
# Lazygit Keybindings
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit Связки клавиш
|
# Lazygit Связки клавиш
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit 按键绑定
|
# Lazygit 按键绑定
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go run scripts/cheatsheet/main.go generate` from the project root._
|
_This file is auto-generated. To update, make the changes in the pkg/i18n directory and then run `go generate ./...` from the project root._
|
||||||
|
|
||||||
# Lazygit 鍵盤快捷鍵
|
# Lazygit 鍵盤快捷鍵
|
||||||
|
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
package cheatsheet
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/fs"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"regexp"
|
|
||||||
|
|
||||||
"github.com/pmezard/go-difflib/difflib"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Check() {
|
|
||||||
dir := GetKeybindingsDir()
|
|
||||||
tmpDir := filepath.Join(os.TempDir(), "lazygit_cheatsheet")
|
|
||||||
err := os.RemoveAll(tmpDir)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
|
||||||
}
|
|
||||||
err = os.Mkdir(tmpDir, 0o700)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
generateAtDir(tmpDir)
|
|
||||||
defer os.RemoveAll(tmpDir)
|
|
||||||
|
|
||||||
actualContent := obtainContent(dir)
|
|
||||||
expectedContent := obtainContent(tmpDir)
|
|
||||||
|
|
||||||
if expectedContent == "" {
|
|
||||||
log.Fatal("empty expected content")
|
|
||||||
}
|
|
||||||
|
|
||||||
if actualContent != expectedContent {
|
|
||||||
err := difflib.WriteUnifiedDiff(os.Stdout, difflib.UnifiedDiff{
|
|
||||||
A: difflib.SplitLines(expectedContent),
|
|
||||||
B: difflib.SplitLines(actualContent),
|
|
||||||
FromFile: "Expected",
|
|
||||||
FromDate: "",
|
|
||||||
ToFile: "Actual",
|
|
||||||
ToDate: "",
|
|
||||||
Context: 1,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("\nCheatsheets are out of date. Please run `%s` at the project root and commit the changes. If you run the script and no keybindings files are updated as a result, try rebasing onto master and trying again.\n", CommandToRun())
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("\nCheatsheets are up to date")
|
|
||||||
}
|
|
||||||
|
|
||||||
func obtainContent(dir string) string {
|
|
||||||
re := regexp.MustCompile(`Keybindings_\w+\.md$`)
|
|
||||||
|
|
||||||
content := ""
|
|
||||||
err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
|
|
||||||
if re.MatchString(path) {
|
|
||||||
bytes, err := os.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
|
||||||
}
|
|
||||||
content += fmt.Sprintf("\n%s\n\n", filepath.Base(path))
|
|
||||||
content += string(bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return content
|
|
||||||
}
|
|
|
@ -1,10 +1,12 @@
|
||||||
// This "script" generates a file called Keybindings_{{.LANG}}.md
|
//go:generate go run generator.go
|
||||||
// in current working directory.
|
|
||||||
|
// This "script" generates files called Keybindings_{{.LANG}}.md
|
||||||
|
// in the docs/keybindings directory.
|
||||||
//
|
//
|
||||||
// The content of this generated file is a keybindings cheatsheet.
|
// The content of these generated files is a keybindings cheatsheet.
|
||||||
//
|
//
|
||||||
// To generate cheatsheet in english run:
|
// To generate the cheatsheets, run:
|
||||||
// go run scripts/generate_cheatsheet.go
|
// go generate pkg/cheatsheet/generate.go
|
||||||
|
|
||||||
package cheatsheet
|
package cheatsheet
|
||||||
|
|
||||||
|
@ -42,7 +44,7 @@ type headerWithBindings struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func CommandToRun() string {
|
func CommandToRun() string {
|
||||||
return "go run scripts/cheatsheet/main.go generate"
|
return "go generate ./..."
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetKeybindingsDir() string {
|
func GetKeybindingsDir() string {
|
||||||
|
|
14
pkg/cheatsheet/generator.go
Normal file
14
pkg/cheatsheet/generator.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/cheatsheet"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Printf("Generating cheatsheets in %s...\n", cheatsheet.GetKeybindingsDir())
|
||||||
|
cheatsheet.Generate()
|
||||||
|
}
|
|
@ -1,27 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/cheatsheet"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
if len(os.Args) < 2 {
|
|
||||||
log.Fatal("Please provide a command: one of 'generate', 'check'")
|
|
||||||
}
|
|
||||||
|
|
||||||
command := os.Args[1]
|
|
||||||
|
|
||||||
switch command {
|
|
||||||
case "generate":
|
|
||||||
cheatsheet.Generate()
|
|
||||||
fmt.Printf("\nGenerated cheatsheets in %s\n", cheatsheet.GetKeybindingsDir())
|
|
||||||
case "check":
|
|
||||||
cheatsheet.Check()
|
|
||||||
default:
|
|
||||||
log.Fatal("\nUnknown command. Expected one of 'generate', 'check'")
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue