Implement proper "reset" that reads snapshots from database
This commit is contained in:
13
utils/db.go
13
utils/db.go
@@ -14,6 +14,7 @@ type DB interface {
|
||||
DB() *gorm.DB
|
||||
Raw(sql string, args ...any) *gorm.DB
|
||||
SaveFile(filePath string, fileData []byte) error
|
||||
GetFile(filePath string) ([]byte, error)
|
||||
}
|
||||
|
||||
type FileSnapshot struct {
|
||||
@@ -80,3 +81,15 @@ func (db *DBWrapper) SaveFile(filePath string, fileData []byte) error {
|
||||
FileData: fileData,
|
||||
}).Error
|
||||
}
|
||||
|
||||
func (db *DBWrapper) GetFile(filePath string) ([]byte, error) {
|
||||
log := cylogger.Default.WithPrefix(fmt.Sprintf("GetFile: %q", filePath))
|
||||
log.Debug("Getting file from database")
|
||||
var fileSnapshot FileSnapshot
|
||||
err := db.db.Model(&FileSnapshot{}).Where("file_path = ?", filePath).First(&fileSnapshot).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
log.Debug("File found in database")
|
||||
return fileSnapshot.FileData, nil
|
||||
}
|
||||
|
@@ -33,3 +33,41 @@ func ToAbs(path string) string {
|
||||
log.Trace("Cwd: %q", cwd)
|
||||
return CleanPath(filepath.Join(cwd, path))
|
||||
}
|
||||
|
||||
func ResetWhereNecessary(associations map[string]FileCommandAssociation, db DB) error {
|
||||
log := cylogger.Default.WithPrefix("ResetWhereNecessary")
|
||||
log.Debug("Start")
|
||||
dirtyFiles := make(map[string]struct{})
|
||||
for _, association := range associations {
|
||||
for _, command := range association.Commands {
|
||||
log.Debug("Checking command %q for file %q", command.Name, association.File)
|
||||
if command.Reset {
|
||||
log.Debug("Command %q requires reset for file %q", command.Name, association.File)
|
||||
dirtyFiles[association.File] = struct{}{}
|
||||
}
|
||||
}
|
||||
for _, command := range association.IsolateCommands {
|
||||
log.Debug("Checking isolate command %q for file %q", command.Name, association.File)
|
||||
if command.Reset {
|
||||
log.Debug("Isolate command %q requires reset for file %q", command.Name, association.File)
|
||||
dirtyFiles[association.File] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Debug("Dirty files: %v", dirtyFiles)
|
||||
for file := range dirtyFiles {
|
||||
log.Debug("Resetting file %q", file)
|
||||
fileData, err := db.GetFile(file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Debug("Writing file %q to disk", file)
|
||||
err = os.WriteFile(file, fileData, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Debug("File %q written to disk", file)
|
||||
}
|
||||
log.Debug("Done")
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user