From f57231bdea0af79996ff1613ab251a87004cfde3 Mon Sep 17 00:00:00 2001 From: Matthew Knight Date: Fri, 6 Mar 2026 17:08:13 -0800 Subject: [PATCH] Crash group link --- cmd/cairn-server/main.go | 1 + internal/config/config.go | 1 + internal/forgejo/sync.go | 13 ++++++++++--- internal/web/routes.go | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cmd/cairn-server/main.go b/cmd/cairn-server/main.go index 92d31fa..9cbc71c 100644 --- a/cmd/cairn-server/main.go +++ b/cmd/cairn-server/main.go @@ -58,6 +58,7 @@ func main() { Store: store, ForgejoClient: forgejoClient, ForgejoURL: cfg.ForgejoURL, + CairnURL: cfg.ExternalURL, WebhookSecret: cfg.ForgejoWebhookSecret, }) if err != nil { diff --git a/internal/config/config.go b/internal/config/config.go index 743c130..a00ae19 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -17,6 +17,7 @@ type Config struct { S3SecretKey string `envconfig:"CAIRN_S3_SECRET_KEY" default:"minioadmin"` S3UseSSL bool `envconfig:"CAIRN_S3_USE_SSL" default:"false"` + ExternalURL string `envconfig:"CAIRN_EXTERNAL_URL"` ForgejoURL string `envconfig:"CAIRN_FORGEJO_URL"` ForgejoToken string `envconfig:"CAIRN_FORGEJO_TOKEN"` ForgejoWebhookSecret string `envconfig:"CAIRN_FORGEJO_WEBHOOK_SECRET"` diff --git a/internal/forgejo/sync.go b/internal/forgejo/sync.go index 892ebff..4986de1 100644 --- a/internal/forgejo/sync.go +++ b/internal/forgejo/sync.go @@ -14,8 +14,9 @@ import ( // Sync handles bidirectional state synchronization between Cairn and Forgejo. type Sync struct { - Client *Client - DB *gorm.DB + Client *Client + DB *gorm.DB + CairnURL string } // CreateIssueForCrashGroup creates a Forgejo issue for a new crash group. @@ -29,8 +30,14 @@ func (s *Sync) CreateIssueForCrashGroup(ctx context.Context, group *cairnapi.Cra return fmt.Errorf("getting repository: %w", err) } + crashGroupLink := fmt.Sprintf("%d", group.ID) + if s.CairnURL != "" { + crashGroupLink = fmt.Sprintf("[%d](%s/crashgroups/%d)", group.ID, strings.TrimRight(s.CairnURL, "/"), group.ID) + } + body := fmt.Sprintf(`## Crash Group +**Crash Group:** %s **Fingerprint:** `+"`%s`"+` **First seen:** %s **Type:** %s @@ -43,7 +50,7 @@ func (s *Sync) CreateIssueForCrashGroup(ctx context.Context, group *cairnapi.Cra --- *Auto-created by [Cairn](/) — crash artifact aggregator* -`, group.Fingerprint, group.FirstSeenAt.Format("2006-01-02 15:04:05"), group.Title, sampleTrace) +`, crashGroupLink, group.Fingerprint, group.FirstSeenAt.Format("2006-01-02 15:04:05"), group.Title, sampleTrace) issue, err := s.Client.CreateIssue(ctx, repo.Owner, repo.Name, CreateIssueRequest{ Title: "[Cairn] " + group.Title, diff --git a/internal/web/routes.go b/internal/web/routes.go index c76a0c4..9f1a57a 100644 --- a/internal/web/routes.go +++ b/internal/web/routes.go @@ -17,6 +17,7 @@ type RouterConfig struct { Store blob.Store ForgejoClient *forgejo.Client ForgejoURL string + CairnURL string WebhookSecret string } @@ -26,7 +27,7 @@ func NewRouter(cfg RouterConfig) (*gin.Engine, error) { return nil, err } - forgejoSync := &forgejo.Sync{Client: cfg.ForgejoClient, DB: cfg.DB} + forgejoSync := &forgejo.Sync{Client: cfg.ForgejoClient, DB: cfg.DB, CairnURL: cfg.CairnURL} pages := &PageHandler{DB: cfg.DB, Templates: templates, ForgejoURL: cfg.ForgejoURL} ingest := &handler.IngestHandler{DB: cfg.DB, Store: cfg.Store, ForgejoSync: forgejoSync}