Init
This commit is contained in:
commit
ef6baeddb0
4 changed files with 233 additions and 0 deletions
31
README.md
Normal file
31
README.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://weforge.xyz/Spitfire/Branding/raw/branch/main/active/search/icon-alt4.svg" alt="Logo" width="64" height="64">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center" style="font-size: 32px;">
|
||||||
|
<strong>Spitfire Patcher</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
This is a custom patcher for applying modifications to firefox source code. It processes patch files located in the `./patches` directory and applies them to files in a specified root path.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
1. Place your patch files in the `./patches` directory. Example of patch file:
|
||||||
|
|
||||||
|
```patch
|
||||||
|
--- /browser/branding/official/configure.sh
|
||||||
|
+++ /browser/branding/official/configure.sh
|
||||||
|
|
||||||
|
-MOZ_APP_DISPLAYNAME=Firefox
|
||||||
|
+MOZ_APP_DISPLAYNAME=Spitfire
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Run the patcher with the `--path` flag:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go run patch.go --path=./mozilla-central
|
||||||
|
```
|
||||||
|
|
||||||
|
*Root path will be resolved to an absolute path, and patches will be applied relative to this path.*
|
191
apply.go
Executable file
191
apply.go
Executable file
|
@ -0,0 +1,191 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Define the --path flag
|
||||||
|
rootPath := flag.String("path", ".", "Root path for patch application")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
// Convert root path to an absolute path
|
||||||
|
absoluteRootPath, err := filepath.Abs(*rootPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to resolve absolute path for root: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Starting custom patcher...\nRoot path: %s\n", absoluteRootPath)
|
||||||
|
|
||||||
|
patchDir := "./patches"
|
||||||
|
var successfulPatches, failedPatches []string
|
||||||
|
|
||||||
|
err = filepath.Walk(patchDir, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !info.IsDir() && strings.HasSuffix(info.Name(), ".patch") {
|
||||||
|
fmt.Printf("Applying patch: %s\n", path)
|
||||||
|
err := applyPatch(path, absoluteRootPath)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to apply patch %s: %v\n", path, err)
|
||||||
|
failedPatches = append(failedPatches, path)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Successfully applied patch: %s\n", path)
|
||||||
|
successfulPatches = append(successfulPatches, path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error reading patches: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the summary
|
||||||
|
fmt.Println("\nSummary:")
|
||||||
|
fmt.Printf("Successful patches (%d):\n", len(successfulPatches))
|
||||||
|
for _, patch := range successfulPatches {
|
||||||
|
fmt.Printf(" - %s\n", patch)
|
||||||
|
}
|
||||||
|
fmt.Printf("Failed patches (%d):\n", len(failedPatches))
|
||||||
|
for _, patch := range failedPatches {
|
||||||
|
fmt.Printf(" - %s\n", patch)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exit with appropriate status for Forgejo/Gitea runners
|
||||||
|
if len(failedPatches) > 0 {
|
||||||
|
fmt.Println("\nPatch process completed with failures.")
|
||||||
|
os.Exit(1)
|
||||||
|
} else {
|
||||||
|
fmt.Println("\nAll patches applied successfully.")
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// applyPatch processes a single patch file
|
||||||
|
func applyPatch(patchPath, rootPath string) error {
|
||||||
|
// Open the patch file
|
||||||
|
file, err := os.Open(patchPath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to open patch file: %v", err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
var targetFilePath, tempFilePath string
|
||||||
|
var modifications []string
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
isReadingChanges := false
|
||||||
|
|
||||||
|
// Parse the patch file
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
|
||||||
|
// Detect the target file
|
||||||
|
if strings.HasPrefix(line, "--- ") {
|
||||||
|
relativePath := strings.TrimSpace(strings.TrimPrefix(line, "--- "))
|
||||||
|
targetFilePath = filepath.Join(rootPath, relativePath)
|
||||||
|
isReadingChanges = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start processing modifications
|
||||||
|
if isReadingChanges {
|
||||||
|
modifications = append(modifications, line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
return fmt.Errorf("failed to read patch file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the target file for reading
|
||||||
|
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
|
||||||
|
}
|
5
patches/branding.patch
Normal file
5
patches/branding.patch
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
--- /browser/branding/official/configure.sh
|
||||||
|
+++ /browser/branding/official/configure.sh
|
||||||
|
|
||||||
|
-MOZ_APP_DISPLAYNAME=Firefox
|
||||||
|
+MOZ_APP_DISPLAYNAME=Spitfire
|
6
patches/name.patch
Normal file
6
patches/name.patch
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
--- /browser/app/profile/firefox.js
|
||||||
|
+++ /browser/app/profile/firefox.js
|
||||||
|
|
||||||
|
-pref("browser.startup.homepage", "about:home");
|
||||||
|
+pref("browser.startup.homepage", "https://qgato.xyz");
|
||||||
|
+pref("browser.search.defaultenginename", "QGato");
|
Loading…
Add table
Reference in a new issue