Implement proper "reset" that reads snapshots from database

This commit is contained in:
2025-07-20 11:43:25 +02:00
parent b785d24a08
commit 774ac0f0ca
3 changed files with 63 additions and 6 deletions

View File

@@ -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
}

View File

@@ -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
}