89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// applyReplaceAllPatch performs global string replacements in all files
|
|
func applyReplaceAllPatch(rootPath string, modifications []string) error {
|
|
replacements := [][2]string{}
|
|
for _, mod := range modifications {
|
|
parts := strings.SplitN(mod, "=>", 2)
|
|
if len(parts) != 2 {
|
|
continue
|
|
}
|
|
from := strings.TrimSpace(parts[0])
|
|
to := strings.TrimSpace(parts[1])
|
|
replacements = append(replacements, [2]string{from, to})
|
|
}
|
|
|
|
// Get absolute path of the patcher's own directory
|
|
selfPath, err := os.Executable()
|
|
if err != nil {
|
|
return fmt.Errorf("cannot resolve own path: %v", err)
|
|
}
|
|
patcherDir := filepath.Dir(selfPath)
|
|
|
|
return filepath.WalkDir(rootPath, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Skip patcher's own dir and subdirs
|
|
if strings.HasPrefix(path, patcherDir) {
|
|
if d.IsDir() {
|
|
return fs.SkipDir
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Skip any obj-* folders inside mozilla-release
|
|
if strings.Contains(path, "mozilla-release/obj-") {
|
|
if d.IsDir() {
|
|
return fs.SkipDir
|
|
}
|
|
return nil
|
|
}
|
|
|
|
if d.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
// Only patch known text/code files
|
|
if strings.HasSuffix(path, ".cpp") || strings.HasSuffix(path, ".h") ||
|
|
strings.HasSuffix(path, ".c") || strings.HasSuffix(path, ".go") ||
|
|
strings.HasSuffix(path, ".js") || strings.HasSuffix(path, ".ts") ||
|
|
strings.HasSuffix(path, ".html") || strings.HasSuffix(path, ".in") ||
|
|
strings.HasSuffix(path, ".mjs") || strings.HasSuffix(path, ".txt") {
|
|
return replaceInFile(path, replacements)
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
// replaceInFile performs replacements in one file
|
|
func replaceInFile(filePath string, replacements [][2]string) error {
|
|
content, err := os.ReadFile(filePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
text := string(content)
|
|
original := text
|
|
|
|
for _, repl := range replacements {
|
|
text = strings.ReplaceAll(text, repl[0], repl[1])
|
|
}
|
|
|
|
if text != original {
|
|
err = os.WriteFile(filePath, []byte(text), 0644)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to write modified file: %v", err)
|
|
}
|
|
fmt.Printf("Replaced content in: %s\n", filePath)
|
|
}
|
|
return nil
|
|
}
|