cmd.go

 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}