diff --git a/cmd/git-sync/main.go b/cmd/git-sync/main.go index 8eacaa3..b1a1134 100644 --- a/cmd/git-sync/main.go +++ b/cmd/git-sync/main.go @@ -200,13 +200,14 @@ func main() { log.V(0).Infof("starting up: %q", os.Args) // Startup webhooks goroutine - go ServeWebhooks() + webhookTriggerChan := make(chan struct{}) + go ServeWebhooks(webhookTriggerChan) initialSync := true failCount := 0 for { ctx, cancel := context.WithTimeout(context.Background(), time.Second*time.Duration(*flSyncTimeout)) - if err := syncRepo(ctx, *flRepo, *flBranch, *flRev, *flDepth, *flRoot, *flDest); err != nil { + if changed, err := syncRepo(ctx, *flRepo, *flBranch, *flRev, *flDepth, *flRoot, *flDest); err != nil { if initialSync || (*flMaxSyncFailures != -1 && failCount >= *flMaxSyncFailures) { log.Errorf("error syncing repo: %v", err) os.Exit(1) @@ -218,6 +219,9 @@ func main() { cancel() time.Sleep(waitTime(*flWait)) continue + } else if changed { + // Trigger webhooks to be called + webhookTriggerChan <- struct{}{} } if initialSync { if *flOneTime { @@ -304,9 +308,6 @@ func updateSymlink(ctx context.Context, gitRoot, link, newDir string) error { log.V(1).Infof("pruned old worktrees") } - // Trigger webhooks to be called - WebhookCallTriggerChannel <- struct{}{} - return nil } @@ -407,7 +408,8 @@ func revIsHash(ctx context.Context, rev, gitRoot string) (bool, error) { } // syncRepo syncs the branch of a given repository to the destination at the given rev. -func syncRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot, dest string) error { +// returns (1) whether a change occured and (2) an error if one happened +func syncRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot, dest string) (bool, error) { target := path.Join(gitRoot, dest) gitRepoPath := path.Join(target, ".git") hash := rev @@ -416,18 +418,18 @@ func syncRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot, case os.IsNotExist(err): err = cloneRepo(ctx, repo, branch, rev, depth, gitRoot) if err != nil { - return err + return false, err } hash, err = hashForRev(ctx, rev, gitRoot) if err != nil { - return err + return false, err } case err != nil: - return fmt.Errorf("error checking if repo exists %q: %v", gitRepoPath, err) + return false, fmt.Errorf("error checking if repo exists %q: %v", gitRepoPath, err) default: local, remote, err := getRevs(ctx, target, branch, rev) if err != nil { - return err + return false, err } log.V(2).Infof("local hash: %s", local) log.V(2).Infof("remote hash: %s", remote) @@ -436,11 +438,11 @@ func syncRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot, hash = remote } else { log.V(1).Infof("no update required") - return nil + return false, nil } } - return addWorktreeAndSwap(ctx, gitRoot, dest, branch, rev, hash) + return true, addWorktreeAndSwap(ctx, gitRoot, dest, branch, rev, hash) } // getRevs returns the local and upstream hashes for rev. diff --git a/cmd/git-sync/webhooks.go b/cmd/git-sync/webhooks.go index 8dd6297..5b8141e 100644 --- a/cmd/git-sync/webhooks.go +++ b/cmd/git-sync/webhooks.go @@ -8,10 +8,6 @@ import ( "time" ) -// Trigger channel for webhook requests. If anything is received into this channel -// it triggers the webhook goroutine to send new requests. -var WebhookCallTriggerChannel = make(chan struct{}) - // Webhook collection var WebhookArray = []Webhook{} @@ -66,10 +62,10 @@ func (w *Webhook) Do() error { } // Wait for trigger events from the channel, and send webhooks when triggered -func ServeWebhooks() { +func ServeWebhooks(ch chan struct{}) { for { // Wait for trigger - <-WebhookCallTriggerChannel + <-ch // Calling webhook - one after another for _, v := range WebhookArray {