@@ -17,12 +17,10 @@ import (
17
17
)
18
18
19
19
var (
20
- watcher * fsnotify.Watcher
20
+ watcher * fsnotify.Watcher
21
21
api * slack.Client
22
22
onlyOnce sync.Once
23
23
envList = []string {".env" , ".env.test" , ".env.development" , ".env.production" }
24
- customList = []string {}
25
- slackChannelList = []string {"" }
26
24
)
27
25
28
26
func nilChecker (err error ) {
@@ -39,20 +37,16 @@ func initWatcher() {
39
37
watcher = _watcher
40
38
}
41
39
42
- func getEnvList () []string {
40
+ func getEnvList () []string {
43
41
return envList
44
42
}
45
43
46
- func getCustomList () []string {
47
- return customList
48
- }
49
-
50
44
// @dev start watching multiple envs
51
45
func registerEnvs () {
52
46
for _ , v := range getEnvList () {
53
47
wd , _ := os .Getwd ()
54
48
filePath := strings .Join ([]string {wd , "\\ " , v }, "" )
55
- log . Println ( filePath )
49
+
56
50
wErr := watcher .Add (filePath )
57
51
nilChecker (wErr )
58
52
color .Blue (fmt .Sprintf ("watching: %v" , v ))
@@ -76,77 +70,96 @@ func initSlack() {
76
70
api = _api
77
71
}
78
72
79
- func updateEnvs () {
73
+ func updateEnvs () {
80
74
wd , _ := os .Getwd ()
81
-
75
+
82
76
for _ , v := range getEnvList () {
83
77
data , rErr := os .ReadFile (v )
84
78
nilChecker (rErr )
85
-
79
+
86
80
wrapDirName := "config"
87
81
wrapDirPath := strings .Join ([]string {wd , "\\ " , wrapDirName , "\\ " }, "" )
88
82
wrapEnvName := strings .Join ([]string {v , "." , wrapDirName }, "" )
89
83
wrapEnvFile := strings .Join ([]string {wrapDirPath , wrapEnvName }, "" )
90
-
84
+
91
85
// @dev owning user has a read and write permission: 0644
92
86
os .WriteFile (wrapEnvFile , data , fs .FileMode (config .OWNER_PERM ))
93
87
}
94
88
}
95
89
96
- func updateAndNotify () {
97
- var fullPath string
90
+ func cleanupEnvs () {
91
+ wd , _ := os .Getwd ()
92
+ for _ , v := range getEnvList () {
93
+ fullPathForWrapEnv := strings .Join ([]string {wd , "\\ " , "config" , "\\ " , v , ".config" }, "" )
94
+ _ , sErr := os .Stat (fullPathForWrapEnv )
98
95
99
- for _ , v := range envList {
100
- path , _ := os .Getwd ()
101
- fullPath = strings .Join ([]string {path , "\\ config\\ " , v , ".config" }, "" )
102
- log .Println ("path is: " , fullPath )
103
- bytes , readErr := os .ReadFile (fullPath )
104
- nilChecker (readErr )
105
-
106
- // TODO fix not writing file bug
107
- filePermission := 0644
108
- writeErr := os .WriteFile (fullPath , bytes , fs .FileMode (filePermission ))
109
- nilChecker (writeErr )
110
- }
96
+ if ok := os .IsExist (sErr ); ok {
97
+ rErr := os .Remove (fullPathForWrapEnv )
98
+ nilChecker (rErr )
99
+ }
100
+
101
+ _ , cErr := os .Create (fullPathForWrapEnv )
102
+ nilChecker (cErr )
103
+
104
+ _data , rErr := os .ReadFile (v )
105
+ nilChecker (rErr )
111
106
112
- // if done send a DM to slack channel
113
- if isDone := isUpdateFinished (); isDone {
114
- envString := convertEnvMapToString (fullPath )
115
- onlyOnce .Do (func () {
116
- notifyEnvChange (envString )
117
- })
107
+ wErr := os .WriteFile (fullPathForWrapEnv , _data , fs .FileMode (config .OWNER_PERM ))
108
+ nilChecker (wErr )
118
109
}
110
+
111
+ color .Red ("envs config setup done" )
119
112
}
120
113
121
- func isUpdateFinished () bool {
122
- var isDone bool
114
+ func sendSlackDM () {
115
+ wd , _ := os .Getwd ()
116
+
117
+ // has
118
+ envStringMapForWrapEnv := make (map [string ]string )
119
+ envStringForWrapEnv := "DEFAULT_VALUE"
120
+
121
+ for _ , v := range getEnvList () {
122
+ if isDone := isUpdateFinished (); isDone [v ] {
123
+ fullPathForWrapEnv := strings .Join ([]string {wd , "\\ " , "config" , "\\ " , v , ".config" }, "" )
124
+ wrapEnvName := strings .Join ([]string {v , ".config" }, "" )
123
125
124
- for _ , v := range envList {
125
- dir , _ := os .Getwd ()
126
- fullPath := strings .Join ([]string {dir , "\\ " , v }, "" )
127
- _data , _readErr := os .ReadFile (fullPath )
126
+ envStringForWrapEnv = convertEnvMapToString (fullPathForWrapEnv , wrapEnvName )
127
+ envStringMapForWrapEnv [wrapEnvName ] = envStringForWrapEnv
128
128
129
- nilChecker (_readErr )
129
+ notifyEnvChange (envStringMapForWrapEnv [wrapEnvName ], v )
130
+ }
131
+ }
132
+ }
133
+
134
+ func isUpdateFinished () map [string ]bool {
135
+ // @dev initialze a map with make
136
+ isDone := make (map [string ]bool )
130
137
138
+ for _ , v := range getEnvList () {
139
+ wd , _ := os .Getwd ()
140
+ fullPath := strings .Join ([]string {wd , "\\ " , v }, "" )
141
+
142
+ _data , _rErr := os .ReadFile (fullPath )
143
+ nilChecker (_rErr )
131
144
data := string (_data )
132
- isDone = strings .Contains (data , config .RESERVED )
133
145
134
- log .Printf (".env in root DONE value: %v" , isDone )
146
+ hasOwllyTrigger := strings .Contains (data , config .RESERVED )
147
+ isDone [v ] = hasOwllyTrigger
135
148
}
136
149
137
150
return isDone
138
151
}
139
152
140
- /// @dev textify
141
- func convertEnvMapToString (envPath string ) string {
153
+ func convertEnvMapToString (envPath string , wrapEnvName string ) string {
142
154
dotenvMap , readErr := godotenv .Read (envPath )
143
155
nilChecker (readErr )
144
156
145
157
// marshaling map: ascending sort
146
158
marshalMsg , marshalErr := godotenv .Marshal (dotenvMap )
147
159
nilChecker (marshalErr )
148
160
149
- color .Green (marshalMsg )
161
+ parsedMsg := fmt .Sprintf ("file parsed: %v" , wrapEnvName )
162
+ color .Green (parsedMsg )
150
163
151
164
return marshalMsg
152
165
}
@@ -162,11 +175,12 @@ func getUpdateMetadata() (string, string) {
162
175
return date , dirPath // yyyy-mm-dd hh-mm
163
176
}
164
177
165
- func notifyEnvChange (envString string ) {
178
+ func notifyEnvChange (envString string , envFileName string ) {
166
179
date , dirPath := getUpdateMetadata ()
167
- dateMsg := fmt .Sprintf (".env updated at: %v" , date )
168
- pathMsg := fmt .Sprintf (".env directory is: %v" , dirPath )
180
+ dateMsg := fmt .Sprintf ("%v updated at: %v" , envFileName , date )
181
+ pathMsg := fmt .Sprintf ("directory is: %v" , dirPath )
169
182
183
+ // @dev assert a parsed env value is thread-safe
170
184
attachedEnv := slack.AttachmentField {
171
185
Title : "Copy and paste below texts to update" ,
172
186
Value : envString ,
@@ -197,10 +211,12 @@ func notifyEnvChange(envString string) {
197
211
}
198
212
199
213
func main () {
214
+ cleanupEnvs ()
200
215
201
-
202
- initSlack ()
203
- initWatcher ()
216
+ onlyOnce .Do (func () {
217
+ initSlack ()
218
+ initWatcher ()
219
+ })
204
220
205
221
/// @dev starts monitoring the path for changes.
206
222
registerEnvs ()
@@ -214,8 +230,6 @@ func main() {
214
230
}
215
231
if event .Has (fsnotify .Write ) {
216
232
log .Println ("modified file: " , event .Name )
217
- // TODO split update and notify
218
- // updateAndNotify()
219
233
updateEnvs ()
220
234
}
221
235
case err , ok := <- watcher .Errors :
@@ -227,6 +241,7 @@ func main() {
227
241
}
228
242
}()
229
243
230
- // Block main goroutine forever.
231
- <- make (chan struct {})
244
+ sendSlackDM ()
245
+ color .Blue ("WORK DONE! Exit Owlly 👋" )
246
+ os .Exit (1 )
232
247
}
0 commit comments