1// Package cmd provides common command functionality for soft-serve.
2package cmd
3
4import (
5 "context"
6 "errors"
7 "fmt"
8 "io/fs"
9 "os"
10
11 "github.com/charmbracelet/soft-serve/pkg/backend"
12 "github.com/charmbracelet/soft-serve/pkg/config"
13 "github.com/charmbracelet/soft-serve/pkg/db"
14 "github.com/charmbracelet/soft-serve/pkg/hooks"
15 "github.com/charmbracelet/soft-serve/pkg/store"
16 "github.com/charmbracelet/soft-serve/pkg/store/database"
17 "github.com/spf13/cobra"
18)
19
20// InitBackendContext initializes the backend context.
21func InitBackendContext(cmd *cobra.Command, _ []string) error {
22 ctx := cmd.Context()
23 cfg := config.FromContext(ctx)
24 if _, err := os.Stat(cfg.DataPath); errors.Is(err, fs.ErrNotExist) {
25 if err := os.MkdirAll(cfg.DataPath, os.ModePerm); err != nil { //nolint:gosec
26 return fmt.Errorf("create data directory: %w", err)
27 }
28 }
29 dbx, err := db.Open(ctx, cfg.DB.Driver, cfg.DB.DataSource)
30 if err != nil {
31 return fmt.Errorf("open database: %w", err)
32 }
33
34 ctx = db.WithContext(ctx, dbx)
35 dbstore := database.New(ctx, dbx)
36 ctx = store.WithContext(ctx, dbstore)
37 be := backend.New(ctx, cfg, dbx, dbstore)
38 ctx = backend.WithContext(ctx, be)
39
40 cmd.SetContext(ctx)
41
42 return nil
43}
44
45// CloseDBContext closes the database context.
46func CloseDBContext(cmd *cobra.Command, _ []string) error {
47 ctx := cmd.Context()
48 dbx := db.FromContext(ctx)
49 if dbx != nil {
50 if err := dbx.Close(); err != nil {
51 return fmt.Errorf("close database: %w", err)
52 }
53 }
54
55 return nil
56}
57
58// InitializeHooks initializes the hooks.
59func InitializeHooks(ctx context.Context, cfg *config.Config, be *backend.Backend) error {
60 repos, err := be.Repositories(ctx)
61 if err != nil {
62 return fmt.Errorf("failed to get repositories: %w", err)
63 }
64
65 for _, repo := range repos {
66 if err := hooks.GenerateHooks(ctx, cfg, repo.Name()); err != nil {
67 return fmt.Errorf("failed to generate hooks for repo %s: %w", repo.Name(), err)
68 }
69 }
70
71 return nil
72}