@@ -38,7 +38,7 @@ import (
38
38
)
39
39
40
40
// writeVersionFile updates the version file info
41
- func writeVersionFile (path string , info * Entries ) error {
41
+ func writeVersionFile (path string , info * VFile ) error {
42
42
var bytes []byte
43
43
44
44
log .Debugf ("writeVersionFile: %+#v" , info )
@@ -73,8 +73,9 @@ func writeVersionFile(path string, info *Entries) error {
73
73
}
74
74
75
75
// readVersionFile gets the version file info
76
- func readVersionFile (path string ) (Entries , error ) {
77
- info := make (Entries )
76
+ func readVersionFile (path string ) (* VFile , error ) {
77
+ var info VFile
78
+
78
79
p , err := filepath .Abs (path )
79
80
if err != nil {
80
81
return nil , err
@@ -100,7 +101,7 @@ func readVersionFile(path string) (Entries, error) {
100
101
default :
101
102
return nil , fmt .Errorf ("unsupported file type" )
102
103
}
103
- return info , nil
104
+ return & info , nil
104
105
}
105
106
106
107
// Open a version entries file.
@@ -123,7 +124,10 @@ func Open(path string, creat bool) (*VEntry, error) {
123
124
defer f .Close ()
124
125
ve .path = p
125
126
ve .lck = flock .New (p + ".lck" )
126
- ve .ent = make (Entries )
127
+ ve .ent = & VFile {
128
+ Version : make (Entries ),
129
+ Prev : make (Rollback ),
130
+ }
127
131
log .Debugf ("Open(): path->%s VEntry->%+#v" , path , ve )
128
132
return & ve , nil
129
133
}
@@ -141,13 +145,20 @@ func (v *VEntry) LPath() string {
141
145
// Add will update/add an entry
142
146
func (v * VEntry ) Add (name string , ent * Vers ) {
143
147
log .Debugf ("Add(): enrty->%s values->%+#v" , name , ent )
144
- v .ent [name ] = ent
148
+ // push current values to history
149
+ if ve , ok := v .ent .Version [name ]; ok {
150
+ v .ent .Prev [name ] = * ve
151
+ }
152
+ v .ent .Version [name ] = ent
145
153
}
146
154
147
155
// Rm will remove an entry
148
156
func (v * VEntry ) Rm (name string ) {
149
- if _ , ok := v .ent [name ]; ok {
150
- delete (v .ent , name )
157
+ if _ , ok := v .ent .Version [name ]; ok {
158
+ delete (v .ent .Version , name )
159
+ }
160
+ if _ , ok := v .ent .Prev [name ]; ok {
161
+ delete (v .ent .Prev , name )
151
162
}
152
163
}
153
164
@@ -158,19 +169,19 @@ func (v *VEntry) Dump(format string) error {
158
169
case "str" :
159
170
fallthrough
160
171
case "shell" :
161
- for name , _ := range v .ent {
172
+ for name , _ := range v .ent . Version {
162
173
v .Print (name , format )
163
174
}
164
175
case "json" :
165
- out , err := json .MarshalIndent (v .ent , "" , " " )
176
+ out , err := json .MarshalIndent (v .ent . Version , "" , " " )
166
177
if err != nil {
167
178
return err
168
179
}
169
180
fmt .Println (string (out ))
170
181
case "yml" :
171
182
fallthrough
172
183
case "yaml" :
173
- out , err := yaml .Marshal (v .ent )
184
+ out , err := yaml .Marshal (v .ent . Version )
174
185
if err != nil {
175
186
return err
176
187
}
@@ -183,7 +194,7 @@ func (v *VEntry) Dump(format string) error {
183
194
184
195
// Print will dump name(d) entries
185
196
func (v * VEntry ) Print (name , format string ) error {
186
- ve , ok := v .ent [name ]
197
+ ve , ok := v .ent . Version [name ]
187
198
if ! ok {
188
199
return fmt .Errorf ("%s; does not exist" , name )
189
200
}
@@ -251,7 +262,7 @@ func (v *VEntry) Write(retry int) error {
251
262
}
252
263
if ok {
253
264
defer v .lck .Unlock ()
254
- return writeVersionFile (v .path , & v .ent )
265
+ return writeVersionFile (v .path , v .ent )
255
266
}
256
267
time .Sleep (100 * time .Millisecond )
257
268
}
@@ -271,10 +282,12 @@ func (v *VEntry) Bump(name, what string) error {
271
282
if ok {
272
283
defer v .lck .Unlock ()
273
284
v .ent , err = readVersionFile (v .path )
274
- ve , ok := v .ent [name ]
285
+ ve , ok := v .ent . Version [name ]
275
286
if ! ok {
276
287
return fmt .Errorf ("%s; does not exist" , name )
277
288
}
289
+ // push current values to history
290
+ v .ent .Prev [name ] = * ve
278
291
switch what {
279
292
case "major" :
280
293
ve .Major ++
@@ -288,7 +301,36 @@ func (v *VEntry) Bump(name, what string) error {
288
301
default :
289
302
return errors .New ("Invalid bump setting" )
290
303
}
291
- return writeVersionFile (v .path , & v .ent )
304
+ return writeVersionFile (v .path , v .ent )
305
+ }
306
+ time .Sleep (100 * time .Millisecond )
307
+ }
308
+ log .Debugf ("Bump(): did not lock file" , v .Path ())
309
+ return errors .New ("Did not obtain lock" )
310
+ }
311
+
312
+ // Undo restore previous value
313
+ func (v * VEntry ) Undo (name string ) error {
314
+ var rt int
315
+ for rt < 10 {
316
+ rt ++
317
+ ok , err := v .lck .TryLock ()
318
+ if err != nil {
319
+ return err
320
+ }
321
+ if ok {
322
+ defer v .lck .Unlock ()
323
+ v .ent , err = readVersionFile (v .path )
324
+ if _ , ok := v .ent .Version [name ]; ! ok {
325
+ return fmt .Errorf ("%s; does not exist" , name )
326
+ }
327
+
328
+ if ve , ok := v .ent .Prev [name ]; ok {
329
+ v .ent .Version [name ] = & ve
330
+ delete (v .ent .Prev , name )
331
+ return writeVersionFile (v .path , v .ent )
332
+ }
333
+ return fmt .Errorf ("%s; previous value does not exist" , name )
292
334
}
293
335
time .Sleep (100 * time .Millisecond )
294
336
}
@@ -308,12 +350,12 @@ func (v *VEntry) Delete(name string) error {
308
350
if ok {
309
351
defer v .lck .Unlock ()
310
352
v .ent , err = readVersionFile (v .path )
311
- _ , ok := v .ent [name ]
353
+ _ , ok := v .ent . Version [name ]
312
354
if ! ok {
313
355
return fmt .Errorf ("%s; does not exist" , name )
314
356
}
315
357
v .Rm (name )
316
- return writeVersionFile (v .path , & v .ent )
358
+ return writeVersionFile (v .path , v .ent )
317
359
}
318
360
time .Sleep (100 * time .Millisecond )
319
361
}
0 commit comments