-
Notifications
You must be signed in to change notification settings - Fork 0
/
cw.go
130 lines (113 loc) Β· 5.82 KB
/
cw.go
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// The following Golang code must stay simple, readable and straightforward. No π.
package main
import (
"fmt"
"github.com/mitchellh/colorstring"
"github.com/strangebuzz/cache-watcher/structs"
"github.com/strangebuzz/cache-watcher/symfony"
"github.com/strangebuzz/cache-watcher/system"
"github.com/strangebuzz/cache-watcher/tools"
"os"
"reflect"
"strings"
"time"
)
const accronym = "CacheWatcher"
const binary = "cw"
const version = "0.5.1"
const separator = "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"
const repository = "https://github.com/strangebuzz/cache-watcher"
func main() {
var config structs.Config
var err error
config.Init()
// ββ 1. Hello world! ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
welcome()
// ββ 2. No argument then display the help and exit ββββββββββββββββββββββββ
if len(os.Args) == 1 {
help()
os.Exit(0)
}
// ββ 2.1. Otherwise at least an argument has been specified...
// ββ 3. Test if the specified directory exists ββββββββββββββββββββββββββββ
config.SymfonyProjectDir, err = system.GetSymfonyProjectDir()
if err != nil {
tools.PrintError(fmt.Errorf("Project directory not found."))
tools.PrintError(err)
os.Exit(1)
}
_, _ = colorstring.Println(" > Project directory: [green]" + config.SymfonyProjectDir)
// ββ 4. Test if we have a custom config file and load it ββββββββββββββββββ
config, err = symfony.CheckCustomConfig(config)
if err != nil {
tools.PrintError(fmt.Errorf("Error while checking the custom config."))
tools.PrintError(err)
os.Exit(1)
}
// ββ 5. Test if it is a Symfony project βββββββββββββββββββββββββββββββββββ
err = symfony.CheckSymfonyConsole(config)
if err != nil {
tools.PrintError(fmt.Errorf("Symfony console not found."))
tools.PrintError(err)
os.Exit(1)
}
_, _ = colorstring.Println(" > Symfony console path: [green]" + config.SymfonyConsolePath)
// ββ 6. Test the Symfony console with the version command βββββββββββββββββ
out, err := symfony.Version(config)
if err != nil {
tools.PrintError(fmt.Errorf("Error while running the Symfony version command."))
tools.PrintError(err)
os.Exit(1)
}
_, _ = colorstring.Println(" > Symfony env: [green]" + strings.Trim(fmt.Sprintf("%s", out), "\n"))
// ββ 7. Get the files to watch ββββββββββββββββββββββββββββββββββββββββββββ
start := time.Now()
filesToWatch, _ := symfony.GetWatchMap(config)
//tools.PrettyPrint(filesToWatch)
end := time.Now()
elapsed := end.Sub(start)
// ββ 7.1 No error, but no file was found ββββββββββββββββββββββββββββββββββ
if len(filesToWatch) == 0 {
errorNothingtoWatch()
}
_, _ = colorstring.Println(fmt.Sprintf(" > [yellow]%d [white]file(s) watched in [yellow]%s[white] in [yellow]%d[white] millisecond(s).", len(filesToWatch), config.SymfonyProjectDir, elapsed.Milliseconds()))
_, _ = colorstring.Println(fmt.Sprintf(" > [green]CTRL+C[white] to stop watching or run [green]kill -9 [yellow]%d[white].", os.Getpid()))
// ββ 6. Main loop βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
mainLoop(config, filesToWatch)
}
func mainLoop(config structs.Config, filesToWatch map[string]string) {
for {
updatedFiles, _ := symfony.GetWatchMap(config)
if !reflect.DeepEqual(filesToWatch, updatedFiles) {
start := time.Now()
_, _ = colorstring.Println(fmt.Sprintf(" [yellow] β¬ Update detected[white] at [green]%s[white] > refreshing cache...", start.Format("15:04:05")))
_, _ = symfony.CacheWarmup(config) // handle errors
end := time.Now()
elapsed := end.Sub(start)
_, _ = colorstring.Println(fmt.Sprintf(" [green]β
Done![white] in [yellow]%.2f[white] second(s).", elapsed.Seconds()))
filesToWatch = updatedFiles
} else {
time.Sleep(config.SleepTime)
}
}
}
func errorNothingtoWatch() {
tools.PrintError(fmt.Errorf("No file to watch found."))
_, _ = colorstring.Println("[yellow][π‘][white] If you are using an \"old\" Symfony project directory structure")
_, _ = colorstring.Println(" you have to customize the watched directories with a [yellow].cw.yaml [white]file")
_, _ = colorstring.Println(fmt.Sprintf(" at the root of your Symfony project. Check out the doc: [magenta]%s", repository))
os.Exit(0)
}
func welcome() {
fmt.Println(separator)
_, _ = colorstring.Println(fmt.Sprintf(" [bold][green]%s [white]version [yellow]v%s[white] by [blue]COil - https://www.strangebuzz.com π [white]", accronym, version))
fmt.Println(separator)
_, _ = colorstring.Println(fmt.Sprintf("[green]%s[white] watches your files (.env, YAML, Twig) and automatically refreshes your application cache.", accronym))
fmt.Println(separator)
}
func help() {
_, _ = colorstring.Println(fmt.Sprintf("Call [green]%s[white] with the path of your Symfony project as the first argument.", binary))
_, _ = colorstring.Println(fmt.Sprintf("Example: \"[green]%s [yellow]../strangebuzz.com[white]\"", binary))
_, _ = colorstring.Println(fmt.Sprintf("Or even: \"[green]%s [yellow].[white]\" if you call it from the root of your Symfony project directory.", binary))
_, _ = colorstring.Println("[yellow][π‘][white] Add it to your $PATH if not done already.")
}