This repository has no description
1package pulls
2
3import (
4 "bytes"
5 "compress/gzip"
6 "fmt"
7 "io"
8 "log/slog"
9 "strings"
10 "time"
11
12 "tangled.org/core/appview/config"
13 "tangled.org/core/appview/db"
14 pulls_indexer "tangled.org/core/appview/indexer/pulls"
15 "tangled.org/core/appview/knotacl"
16 "tangled.org/core/appview/mentions"
17 "tangled.org/core/appview/models"
18 "tangled.org/core/appview/notify"
19 "tangled.org/core/appview/oauth"
20 "tangled.org/core/appview/pages"
21 "tangled.org/core/appview/reporesolver"
22 "tangled.org/core/idresolver"
23 "tangled.org/core/ogre"
24 "tangled.org/core/patchutil"
25 "tangled.org/core/types"
26
27 indigoxrpc "github.com/bluesky-social/indigo/xrpc"
28 "github.com/hashicorp/golang-lru/v2/expirable"
29)
30
31const ApplicationGzip = "application/gzip"
32
33const (
34 diffCacheSize = 128
35 diffCacheTTL = 15 * time.Minute
36)
37
38type Pulls struct {
39 oauth *oauth.OAuth
40 repoResolver *reporesolver.RepoResolver
41 pages *pages.Pages
42 idResolver *idresolver.Resolver
43 mentionsResolver *mentions.Resolver
44 db *db.DB
45 config *config.Config
46 notifier notify.Notifier
47 acl *knotacl.Service
48 logger *slog.Logger
49 indexer *pulls_indexer.Indexer
50 ogreClient *ogre.Client
51 diffCache *expirable.LRU[string, types.DiffRenderer]
52}
53
54func New(
55 oauth *oauth.OAuth,
56 repoResolver *reporesolver.RepoResolver,
57 pages *pages.Pages,
58 resolver *idresolver.Resolver,
59 mentionsResolver *mentions.Resolver,
60 db *db.DB,
61 config *config.Config,
62 notifier notify.Notifier,
63 acl *knotacl.Service,
64 indexer *pulls_indexer.Indexer,
65 logger *slog.Logger,
66) *Pulls {
67 return &Pulls{
68 oauth: oauth,
69 repoResolver: repoResolver,
70 pages: pages,
71 idResolver: resolver,
72 mentionsResolver: mentionsResolver,
73 db: db,
74 config: config,
75 notifier: notifier,
76 acl: acl,
77 logger: logger,
78 indexer: indexer,
79 ogreClient: ogre.NewClient(config.Ogre.Host),
80 diffCache: expirable.NewLRU[string, types.DiffRenderer](diffCacheSize, nil, diffCacheTTL),
81 }
82}
83
84func (s *Pulls) knotClient(host string) *indigoxrpc.Client {
85 scheme := "https"
86 if s.config.Core.Dev {
87 scheme = "http"
88 }
89 return &indigoxrpc.Client{Host: fmt.Sprintf("%s://%s", scheme, host)}
90}
91
92func gz(s string) io.Reader {
93 var b bytes.Buffer
94 w := gzip.NewWriter(&b)
95 w.Write([]byte(s))
96 w.Close()
97 return &b
98}
99
100func ptrPullState(s models.PullState) *models.PullState { return &s }
101
102func validatePatch(patch *string) error {
103 if patch == nil || *patch == "" {
104 return fmt.Errorf("patch is empty")
105 }
106
107 // add newline if not present to diff style patches
108 if !patchutil.IsFormatPatch(*patch) && !strings.HasSuffix(*patch, "\n") {
109 *patch = *patch + "\n"
110 }
111
112 if err := patchutil.IsPatchValid(*patch); err != nil {
113 return err
114 }
115
116 return nil
117}