A vibe coded tangled fork which supports pijul.

appview/knotstream: check for repo existience before permitting events

Signed-off-by: oppiliappan <me@oppi.li>

+26 -20
+26 -20
appview/state/knotstream.go
··· 96 96 return fmt.Errorf("%s does not belong to %s, something is fishy", record.CommitterDid, source.Key()) 97 97 } 98 98 99 + repo, err := db.GetRepo( 100 + d, 101 + orm.FilterEq("did", record.RepoDid), 102 + orm.FilterEq("name", record.RepoName), 103 + orm.FilterEq("knot", source.Key()), 104 + ) 105 + if err != nil { 106 + return fmt.Errorf("repo %s/%s on knot %s not found", record.RepoDid, record.RepoName, source.Key()) 107 + } 108 + 99 109 logger.Info("processing gitRefUpdate event", 100 110 "repo_did", record.RepoDid, 101 111 "repo_name", record.RepoName, ··· 103 113 "old_sha", record.OldSha, 104 114 "new_sha", record.NewSha) 105 115 106 - // trigger webhook notifications first (before other ops that might fail) 107 - var errWebhook error 108 - repos, err := db.GetRepos( 109 - d, 110 - orm.FilterEq("did", record.RepoDid), 111 - orm.FilterEq("name", record.RepoName), 112 - ) 113 - if err != nil { 114 - errWebhook = fmt.Errorf("failed to lookup repo for webhooks: %w", err) 115 - } else if len(repos) == 1 { 116 - notifier.Push(ctx, &repos[0], record.Ref, record.OldSha, record.NewSha, record.CommitterDid) 117 - } 116 + notifier.Push(ctx, repo, record.Ref, record.OldSha, record.NewSha, record.CommitterDid) 118 117 119 118 errPunchcard := populatePunchcard(d, record) 120 119 errLanguages := updateRepoLanguages(d, record) ··· 132 131 go triggerSitesDeployIfNeeded(ctx, d, cfClient, c, record, source) 133 132 } 134 133 135 - return errors.Join(errWebhook, errPunchcard, errLanguages, errPosthog) 134 + return errors.Join(errPunchcard, errLanguages, errPosthog) 136 135 } 137 136 138 137 // triggerSitesDeployIfNeeded checks whether the pushed ref matches the sites ··· 301 300 return fmt.Errorf("empty repo: nsid %s, rkey %s", msg.Nsid, msg.Rkey) 302 301 } 303 302 304 - // does this repo have a spindle configured? 305 - repos, err := db.GetRepos( 303 + repo, err := db.GetRepo( 306 304 d, 307 305 orm.FilterEq("did", record.TriggerMetadata.Repo.Did), 308 306 orm.FilterEq("name", record.TriggerMetadata.Repo.Repo), 307 + orm.FilterEq("knot", source.Key()), 309 308 ) 310 309 if err != nil { 311 - return fmt.Errorf("failed to look for repo in DB: nsid %s, rkey %s, %w", msg.Nsid, msg.Rkey, err) 312 - } 313 - if len(repos) != 1 { 314 - return fmt.Errorf("incorrect number of repos returned: %d (expected 1)", len(repos)) 310 + return fmt.Errorf( 311 + "failed to look for repo in DB: nsid %s, rkey %s, %s/%s, knot %s, %w", 312 + msg.Nsid, 313 + msg.Rkey, 314 + record.TriggerMetadata.Repo.Did, 315 + record.TriggerMetadata.Repo.Did, 316 + source.Key(), 317 + err, 318 + ) 315 319 } 316 - if repos[0].Spindle == "" { 320 + 321 + // does this repo have a spindle configured? 322 + if repo.Spindle == "" { 317 323 return fmt.Errorf("repo does not have a spindle configured yet: nsid %s, rkey %s", msg.Nsid, msg.Rkey) 318 324 } 319 325