package main import ( "context" "flag" "log" "os" "os/signal" "syscall" ) var ( hostDir = flag.String("host", "/host", "Host source directory (read-only)") dataDir = flag.String("data", "/data", "Data destination directory") verbose = flag.Bool("verbose", false, "Enable verbose logging") dryRun = flag.Bool("dry-run", false, "Preview what would be synced without copying") ) func main() { flag.Parse() log.SetFlags(log.LstdFlags | log.Lshortfile) if *verbose { log.Println("sourcewatch starting...") log.Printf("host: %s, data: %s, dry-run: %v", *hostDir, *dataDir, *dryRun) } rules, err := loadGitignore(*hostDir) if err != nil { log.Fatalf("failed to load .gitignore: %v", err) } manifest, err := initialSync(*hostDir, *dataDir, rules, *dryRun) if err != nil { log.Fatalf("initial sync failed: %v", err) } ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer cancel() if err := watch(ctx, *hostDir, *dataDir, manifest, rules, *dryRun, *verbose); err != nil { log.Fatalf("watcher failed: %v", err) } }