@@ -15,21 +15,68 @@ import (
1515
1616 "cdr.dev/slog"
1717 "cdr.dev/slog/sloggers/sloghuman"
18+ "github.com/coder/code-marketplace/extensionsign"
1819
1920 "github.com/coder/code-marketplace/api"
2021 "github.com/coder/code-marketplace/database"
2122 "github.com/coder/code-marketplace/storage"
2223)
2324
25+ func serverFlags () (addFlags func (cmd * cobra.Command ), opts * storage.Options ) {
26+ opts = & storage.Options {}
27+ var sign bool
28+ return func (cmd * cobra.Command ) {
29+ cmd .Flags ().StringVar (& opts .ExtDir , "extensions-dir" , "" , "The path to extensions." )
30+ cmd .Flags ().StringVar (& opts .Artifactory , "artifactory" , "" , "Artifactory server URL." )
31+ cmd .Flags ().StringVar (& opts .Repo , "repo" , "" , "Artifactory repository." )
32+ cmd .Flags ().BoolVar (& sign , "sign" , false , "Sign extensions." )
33+ _ = cmd .Flags ().MarkHidden ("sign" ) // This flag needs to import a key, not just be a bool
34+
35+ if cmd .Use == "server" {
36+ // Server only flags
37+ cmd .Flags ().DurationVar (& opts .ListCacheDuration , "list-cache-duration" , time .Minute , "The duration of the extension cache." )
38+ }
39+
40+ var before func (cmd * cobra.Command , args []string ) error
41+ if cmd .PreRunE != nil {
42+ before = cmd .PreRunE
43+ }
44+ if cmd .PreRun != nil {
45+ beforeNoE := cmd .PreRun
46+ before = func (cmd * cobra.Command , args []string ) error {
47+ beforeNoE (cmd , args )
48+ return nil
49+ }
50+ }
51+
52+ cmd .PreRunE = func (cmd * cobra.Command , args []string ) error {
53+ opts .Logger = cmdLogger (cmd )
54+ if before != nil {
55+ return before (cmd , args )
56+ }
57+ if sign { // TODO: Remove this for an actual key import
58+ opts .Signer , _ = extensionsign .GenerateKey ()
59+ }
60+ return nil
61+ }
62+ }, opts
63+ }
64+
65+ func cmdLogger (cmd * cobra.Command ) slog.Logger {
66+ verbose , _ := cmd .Flags ().GetBool ("verbose" )
67+ logger := slog .Make (sloghuman .Sink (cmd .ErrOrStderr ()))
68+ if verbose {
69+ logger = logger .Leveled (slog .LevelDebug )
70+ }
71+ return logger
72+ }
73+
2474func server () * cobra.Command {
2575 var (
26- address string
27- artifactory string
28- extdir string
29- repo string
30- listcacheduration time.Duration
31- maxpagesize int
76+ address string
77+ maxpagesize int
3278 )
79+ addFlags , opts := serverFlags ()
3380
3481 cmd := & cobra.Command {
3582 Use : "server" ,
@@ -41,26 +88,12 @@ func server() *cobra.Command {
4188 RunE : func (cmd * cobra.Command , args []string ) error {
4289 ctx , cancel := context .WithCancel (cmd .Context ())
4390 defer cancel ()
91+ logger := opts .Logger
4492
4593 notifyCtx , notifyStop := signal .NotifyContext (ctx , interruptSignals ... )
4694 defer notifyStop ()
4795
48- verbose , err := cmd .Flags ().GetBool ("verbose" )
49- if err != nil {
50- return err
51- }
52- logger := slog .Make (sloghuman .Sink (cmd .ErrOrStderr ()))
53- if verbose {
54- logger = logger .Leveled (slog .LevelDebug )
55- }
56-
57- store , err := storage .NewStorage (ctx , & storage.Options {
58- Artifactory : artifactory ,
59- ExtDir : extdir ,
60- Logger : logger ,
61- Repo : repo ,
62- ListCacheDuration : listcacheduration ,
63- })
96+ store , err := storage .NewStorage (ctx , opts )
6497 if err != nil {
6598 return err
6699 }
@@ -137,12 +170,9 @@ func server() *cobra.Command {
137170 },
138171 }
139172
140- cmd .Flags ().StringVar (& extdir , "extensions-dir" , "" , "The path to extensions." )
141173 cmd .Flags ().IntVar (& maxpagesize , "max-page-size" , api .MaxPageSizeDefault , "The maximum number of pages to request" )
142- cmd .Flags ().StringVar (& artifactory , "artifactory" , "" , "Artifactory server URL." )
143- cmd .Flags ().StringVar (& repo , "repo" , "" , "Artifactory repository." )
144174 cmd .Flags ().StringVar (& address , "address" , "127.0.0.1:3001" , "The address on which to serve the marketplace API." )
145- cmd . Flags (). DurationVar ( & listcacheduration , "list-cache-duration" , time . Minute , "The duration of the extension cache." )
175+ addFlags ( cmd )
146176
147177 return cmd
148178}
0 commit comments