summaryrefslogtreecommitdiffstats
path: root/pkg/cheatsheet/check.go
blob: ebcd0629fcd8b29e2dbb8eb643061dd499876f61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package cheatsheet

import (
	"fmt"
	"io/fs"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"regexp"

	"github.com/pmezard/go-difflib/difflib"
)

func Check() {
	dir := GetDir()
	tmpDir := filepath.Join(os.TempDir(), "lazygit_cheatsheet")
	err := os.RemoveAll(tmpDir)
	if err != nil {
		log.Fatalf("Error occured while checking if cheatsheets are up to date: %v", err)
	}
	err = os.Mkdir(tmpDir, 0o700)
	if err != nil {
		log.Fatalf("Error occured 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 occured 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\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 := ioutil.ReadFile(path)
			if err != nil {
				log.Fatalf("Error occured 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 occured while checking if cheatsheets are up to date: %v", err)
	}

	return content
}