Adds a flexible hook system to the `borg collect` commands, allowing users to run custom scripts at various stages of the collection lifecycle. This feature introduces a new `pkg/hooks` package that encapsulates the core logic for parsing a `.borg-hooks.yaml` configuration file and executing external scripts. Key features: - Four hook events are supported: `on_file_collected`, `on_url_found`, `on_collection_complete`, and `on_error`. - A `--hooks` flag has been added to the `collect website` and `collect pwa` commands. - The system automatically detects and loads a `.borg-hooks.yaml` file from the current directory if the `--hooks` flag is not provided. - File-based hooks (`on_file_collected`) support glob pattern matching against the base filename. - Hook scripts receive a JSON payload on stdin with relevant event context. - Commands with arguments are correctly handled by executing them through `sh -c`. The implementation includes a comprehensive test suite with both unit tests for the new `hooks` package and integration tests to validate the end-to-end functionality. All existing tests and examples have been updated to reflect the necessary function signature changes. Co-authored-by: Snider <631881+Snider@users.noreply.github.com>
38 lines
846 B
Go
38 lines
846 B
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/Snider/Borg/pkg/hooks"
|
|
"github.com/Snider/Borg/pkg/website"
|
|
)
|
|
|
|
func main() {
|
|
log.Println("Collecting website...")
|
|
|
|
hookRunner, err := hooks.NewHookRunner("")
|
|
if err != nil {
|
|
log.Fatalf("Failed to create hook runner: %v", err)
|
|
}
|
|
|
|
// Download and package the website.
|
|
dn, err := website.DownloadAndPackageWebsite("https://example.com", 2, nil, hookRunner)
|
|
if err != nil {
|
|
log.Fatalf("Failed to collect website: %v", err)
|
|
}
|
|
|
|
// Serialize the DataNode to a tarball.
|
|
tarball, err := dn.ToTar()
|
|
if err != nil {
|
|
log.Fatalf("Failed to serialize datanode to tar: %v", err)
|
|
}
|
|
|
|
// Write the tarball to a file.
|
|
err = os.WriteFile("website.dat", tarball, 0644)
|
|
if err != nil {
|
|
log.Fatalf("Failed to write datanode file: %v", err)
|
|
}
|
|
|
|
log.Println("Successfully created website.dat")
|
|
}
|