Patcher/standard.go

96 lines
2.3 KiB
Go
Raw Normal View History

2024-12-08 17:51:31 +01:00
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
// applyStandardModifications applies standard modifications
func applyStandardModifications(targetFilePath string, modifications []string) error {
// Open the target file
targetFile, err := os.Open(targetFilePath)
if err != nil {
return fmt.Errorf("failed to open target file: %v", err)
}
defer targetFile.Close()
// Prepare a temporary file for output
tempFilePath := targetFilePath + ".tmp"
tempFile, err := os.Create(tempFilePath)
if err != nil {
return fmt.Errorf("failed to create temp file: %v", err)
}
defer tempFile.Close()
scanner := bufio.NewScanner(targetFile)
var targetLines []string
for scanner.Scan() {
targetLines = append(targetLines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("failed to read target file: %v", err)
}
// Apply the modifications
updatedLines, err := applyModifications(targetLines, modifications)
if err != nil {
return err
}
// Write the updated lines to the temporary file
for _, line := range updatedLines {
_, err := fmt.Fprintln(tempFile, line)
if err != nil {
return fmt.Errorf("failed to write to temp file: %v", err)
}
}
// Replace the original file with the updated file
err = os.Rename(tempFilePath, targetFilePath)
if err != nil {
return fmt.Errorf("failed to replace target file: %v", err)
}
return nil
}
// applyModifications applies the changes from the patch file to the target lines
func applyModifications(targetLines, modifications []string) ([]string, error) {
var result []string
i := 0
for _, mod := range modifications {
switch {
case strings.HasPrefix(mod, "-"): // Delete or replace
mod = strings.TrimPrefix(mod, "-")
for i < len(targetLines) {
if strings.TrimSpace(targetLines[i]) == strings.TrimSpace(mod) {
i++ // Skip this line (delete)
break
}
result = append(result, targetLines[i])
i++
}
case strings.HasPrefix(mod, "+"): // Add or replace
mod = strings.TrimPrefix(mod, "+")
result = append(result, mod)
default: // Keep existing lines
if i < len(targetLines) {
result = append(result, targetLines[i])
i++
}
}
}
// Append remaining lines from the original file
for i < len(targetLines) {
result = append(result, targetLines[i])
i++
}
return result, nil
}