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