aboutsummaryrefslogtreecommitdiffstats
path: root/cmd_windows.go
diff options
context:
space:
mode:
authorBernhard Guillon <Bernhard.Guillon@begu.org>2026-07-07 18:54:02 +0200
committerBernhard Guillon <Bernhard.Guillon@begu.org>2026-07-07 18:54:02 +0200
commited8cac4ac29250ae8c34c82452a5e02425a8e3ba (patch)
tree203f53e393230e6739b42c7d061b575035d8821c /cmd_windows.go
parent4b592f3a3b59eeb81591d868599886c6d7b34b00 (diff)
downloadsourcewatch-ed8cac4ac29250ae8c34c82452a5e02425a8e3ba.tar.gz
sourcewatch-ed8cac4ac29250ae8c34c82452a5e02425a8e3ba.zip
Add sync_done handshake: server signals when ready, client waits before watching
Diffstat (limited to 'cmd_windows.go')
-rw-r--r--cmd_windows.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/cmd_windows.go b/cmd_windows.go
index f728182..f722b47 100644
--- a/cmd_windows.go
+++ b/cmd_windows.go
@@ -3,6 +3,7 @@
package main
import (
+ "bufio"
"context"
"flag"
"fmt"
@@ -92,6 +93,14 @@ func run() {
continue
}
+ logInfo("watcher: waiting for server to finish sync ...")
+
+ if err := waitForSyncDone(conn); err != nil {
+ logErrorf("wait for sync_done: %v", err)
+ conn.Close()
+ continue
+ }
+
logInfo("watcher: monitoring for changes ...")
// Heartbeat goroutine to detect disconnects
@@ -387,6 +396,30 @@ func sendEvent(conn net.Conn, evt FileEvent) error {
return err
}
+func waitForSyncDone(conn net.Conn) error {
+ scanner := bufio.NewScanner(conn)
+ scanner.Buffer(make([]byte, 0, 1024*1024), 1024*1024)
+ conn.SetReadDeadline(time.Now().Add(10 * time.Minute)) // large repos can take a while
+ defer conn.SetReadDeadline(time.Time{})
+ for scanner.Scan() {
+ msg, err := DecodeMessage(scanner.Bytes())
+ if err != nil {
+ continue
+ }
+ switch msg.Type {
+ case "sync_done":
+ return nil
+ case "ping":
+ // respond to heartbeats during long sync
+ pong := &ProtocolMessage{Type: "pong"}
+ data, _ := EncodeMessage(pong)
+ data = append(data, '\n')
+ conn.Write(data)
+ }
+ }
+ return fmt.Errorf("connection closed before sync_done")
+}
+
func addWatchersRecursively(watcher *fsnotify.Watcher, root string, stack *GitignoreStack) error {
var count, failCount, skippedCount int
bufBytes := *bufSizeKB * 1024