mirror of
https://github.com/jesseduffield/lazydocker.git
synced 2026-07-25 08:31:03 +00:00
Check if cheatsheets are up to date on CI
This commit is contained in:
parent
0e0997d41a
commit
119835c64d
10 changed files with 162 additions and 9 deletions
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
|
|
@ -35,6 +35,9 @@ jobs:
|
||||||
key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-test
|
key: ${{runner.os}}-go-${{hashFiles('**/go.sum')}}-test
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{runner.os}}-go-
|
${{runner.os}}-go-
|
||||||
|
- name: Check Cheatsheet
|
||||||
|
run: |
|
||||||
|
go run scripts/cheatsheet/main.go check
|
||||||
- name: Test code
|
- name: Test code
|
||||||
run: |
|
run: |
|
||||||
bash ./test.sh
|
bash ./test.sh
|
||||||
|
|
|
||||||
|
|
@ -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/generate_cheatsheet.go` from the project root._
|
_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._
|
||||||
|
|
||||||
# Lazydocker menü
|
# Lazydocker menü
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/generate_cheatsheet.go` from the project root._
|
_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._
|
||||||
|
|
||||||
# Lazydocker menu
|
# Lazydocker menu
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/generate_cheatsheet.go` from the project root._
|
_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._
|
||||||
|
|
||||||
# Lazydocker menu
|
# Lazydocker menu
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/generate_cheatsheet.go` from the project root._
|
_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._
|
||||||
|
|
||||||
# Lazydocker menu
|
# Lazydocker menu
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/generate_cheatsheet.go` from the project root._
|
_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._
|
||||||
|
|
||||||
# Lazydocker menü
|
# Lazydocker menü
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
// To generate cheatsheet in english run:
|
// To generate cheatsheet in english run:
|
||||||
// LANG=en go run scripts/generate_cheatsheet.go
|
// LANG=en go run scripts/generate_cheatsheet.go
|
||||||
|
|
||||||
package main
|
package cheatsheet
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -20,7 +20,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
generateCheatsheetCmd = "go run scripts/generate_cheatsheet.go"
|
generateCheatsheetCmd = "go run scripts/cheatsheet/main.go generate"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bindingSection struct {
|
type bindingSection struct {
|
||||||
|
|
@ -28,7 +28,11 @@ type bindingSection struct {
|
||||||
bindings []*gui.Binding
|
bindings []*gui.Binding
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func Generate() {
|
||||||
|
generateAtDir(GetKeybindingsDir())
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateAtDir(dir string) {
|
||||||
mConfig, err := config.NewAppConfig("lazydocker", "", "", "", "", true, nil, "")
|
mConfig, err := config.NewAppConfig("lazydocker", "", "", "", "", true, nil, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|
@ -37,7 +41,8 @@ func main() {
|
||||||
for lang := range i18n.GetTranslationSets() {
|
for lang := range i18n.GetTranslationSets() {
|
||||||
os.Setenv("LC_ALL", lang)
|
os.Setenv("LC_ALL", lang)
|
||||||
mApp, _ := app.NewApp(mConfig)
|
mApp, _ := app.NewApp(mConfig)
|
||||||
file, err := os.Create("./docs/keybindings/Keybindings_" + lang + ".md")
|
|
||||||
|
file, err := os.Create(dir + "/Keybindings_" + lang + ".md")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
87
pkg/cheatsheet/validate.go
Normal file
87
pkg/cheatsheet/validate.go
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
package cheatsheet
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
|
"github.com/jesseduffield/lazydocker/pkg/utils"
|
||||||
|
"github.com/pmezard/go-difflib/difflib"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Check() {
|
||||||
|
dir := GetKeybindingsDir()
|
||||||
|
tmpDir := filepath.Join(os.TempDir(), "lazydocker_cheatsheet")
|
||||||
|
|
||||||
|
err := os.RemoveAll(tmpDir)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
if err = os.Mkdir(tmpDir, 0o700); err != nil {
|
||||||
|
log.Fatalf("Error occurred while checking if cheatsheets are up to date: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
generateAtDir(tmpDir)
|
||||||
|
|
||||||
|
actualContent := obtainContent(dir)
|
||||||
|
expectedContent := obtainContent(tmpDir)
|
||||||
|
|
||||||
|
if expectedContent == "" {
|
||||||
|
log.Fatal("empty expected content")
|
||||||
|
}
|
||||||
|
|
||||||
|
if actualContent != expectedContent {
|
||||||
|
if err := difflib.WriteUnifiedDiff(os.Stdout, difflib.UnifiedDiff{
|
||||||
|
A: difflib.SplitLines(expectedContent),
|
||||||
|
B: difflib.SplitLines(actualContent),
|
||||||
|
FromFile: "Expected",
|
||||||
|
FromDate: "",
|
||||||
|
ToFile: "Actual",
|
||||||
|
ToDate: "",
|
||||||
|
Context: 1,
|
||||||
|
}); 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",
|
||||||
|
generateCheatsheetCmd,
|
||||||
|
)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("\nCheatsheets are up to date")
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetKeybindingsDir() string {
|
||||||
|
return utils.GetLazydockerRootDirectory() + "/docs/keybindings"
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"io"
|
"io"
|
||||||
|
"log"
|
||||||
"math"
|
"math"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
@ -408,3 +411,31 @@ func IsValidHexValue(v string) bool {
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLazydockerRootDirectory finds lazydocker root directory.
|
||||||
|
//
|
||||||
|
// It's used for our cheatsheet script and integration tests. Not to be confused with finding the
|
||||||
|
// root directory of _any_ random repo.
|
||||||
|
func GetLazydockerRootDirectory() string {
|
||||||
|
path, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
_, err := os.Stat(filepath.Join(path, ".git"))
|
||||||
|
if err == nil {
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
path = filepath.Dir(path)
|
||||||
|
|
||||||
|
if path == "/" {
|
||||||
|
log.Fatal("must run in lazydocker folder or child folder")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
27
scripts/cheatsheet/main.go
Normal file
27
scripts/cheatsheet/main.go
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/jesseduffield/lazydocker/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
Reference in a new issue