This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / appview / pulls / pulls.go
2.9 kB 117 lines
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}