0f41cab26632f05c0735af441ccff82809969489

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
GitHub <noreply@github.com>
Date

Message

refactor: rename pkgs (#408)

Diff

This diff is truncated to protect this page.

   1diff --git a/cmd/cmd.go b/cmd/cmd.go
   2new file mode 100644
   3index 0000000000000000000000000000000000000000..9aead6369d7faa2932dcea9d4dcf3ef8766336ee
   4--- /dev/null
   5+++ b/cmd/cmd.go
   6@@ -0,0 +1,71 @@
   7+package cmd
   8+
   9+import (
  10+	"context"
  11+	"errors"
  12+	"fmt"
  13+	"io/fs"
  14+	"os"
  15+
  16+	"github.com/charmbracelet/soft-serve/pkg/backend"
  17+	"github.com/charmbracelet/soft-serve/pkg/config"
  18+	"github.com/charmbracelet/soft-serve/pkg/db"
  19+	"github.com/charmbracelet/soft-serve/pkg/hooks"
  20+	"github.com/charmbracelet/soft-serve/pkg/store"
  21+	"github.com/charmbracelet/soft-serve/pkg/store/database"
  22+	"github.com/spf13/cobra"
  23+)
  24+
  25+// InitBackendContext initializes the backend context.
  26+func InitBackendContext(cmd *cobra.Command, _ []string) error {
  27+	ctx := cmd.Context()
  28+	cfg := config.FromContext(ctx)
  29+	if _, err := os.Stat(cfg.DataPath); errors.Is(err, fs.ErrNotExist) {
  30+		if err := os.MkdirAll(cfg.DataPath, os.ModePerm); err != nil {
  31+			return fmt.Errorf("create data directory: %w", err)
  32+		}
  33+	}
  34+	dbx, err := db.Open(ctx, cfg.DB.Driver, cfg.DB.DataSource)
  35+	if err != nil {
  36+		return fmt.Errorf("open database: %w", err)
  37+	}
  38+
  39+	ctx = db.WithContext(ctx, dbx)
  40+	dbstore := database.New(ctx, dbx)
  41+	ctx = store.WithContext(ctx, dbstore)
  42+	be := backend.New(ctx, cfg, dbx)
  43+	ctx = backend.WithContext(ctx, be)
  44+
  45+	cmd.SetContext(ctx)
  46+
  47+	return nil
  48+}
  49+
  50+// CloseDBContext closes the database context.
  51+func CloseDBContext(cmd *cobra.Command, _ []string) error {
  52+	ctx := cmd.Context()
  53+	dbx := db.FromContext(ctx)
  54+	if dbx != nil {
  55+		if err := dbx.Close(); err != nil {
  56+			return fmt.Errorf("close database: %w", err)
  57+		}
  58+	}
  59+
  60+	return nil
  61+}
  62+
  63+// InitializeHooks initializes the hooks.
  64+func InitializeHooks(ctx context.Context, cfg *config.Config, be *backend.Backend) error {
  65+	repos, err := be.Repositories(ctx)
  66+	if err != nil {
  67+		return err
  68+	}
  69+
  70+	for _, repo := range repos {
  71+		if err := hooks.GenerateHooks(ctx, cfg, repo.Name()); err != nil {
  72+			return err
  73+		}
  74+	}
  75+
  76+	return nil
  77+}
  78diff --git a/cmd/soft/admin.go b/cmd/soft/admin/admin.go
  79rename from cmd/soft/admin.go
  80rename to cmd/soft/admin/admin.go
  81index 16d31f2783026e7ff59fb93b7aa271edfed7dbc8..7138f5754e44c8963733012be0fa80160f99b315 100644
  82--- a/cmd/soft/admin.go
  83+++ b/cmd/soft/admin/admin.go
  84@@ -1,17 +1,19 @@
  85-package main
  86+package admin
  87 
  88 import (
  89 	"fmt"
  90 
  91-	"github.com/charmbracelet/soft-serve/server/backend"
  92-	"github.com/charmbracelet/soft-serve/server/config"
  93-	"github.com/charmbracelet/soft-serve/server/db"
  94-	"github.com/charmbracelet/soft-serve/server/db/migrate"
  95+	"github.com/charmbracelet/soft-serve/cmd"
  96+	"github.com/charmbracelet/soft-serve/pkg/backend"
  97+	"github.com/charmbracelet/soft-serve/pkg/config"
  98+	"github.com/charmbracelet/soft-serve/pkg/db"
  99+	"github.com/charmbracelet/soft-serve/pkg/db/migrate"
 100 	"github.com/spf13/cobra"
 101 )
 102 
 103 var (
 104-	adminCmd = &cobra.Command{
 105+	// Command is the admin command.
 106+	Command = &cobra.Command{
 107 		Use:   "admin",
 108 		Short: "Administrate the server",
 109 	}
 110@@ -19,8 +21,8 @@ var (
 111 	migrateCmd = &cobra.Command{
 112 		Use:                "migrate",
 113 		Short:              "Migrate the database to the latest version",
 114-		PersistentPreRunE:  initBackendContext,
 115-		PersistentPostRunE: closeDBContext,
 116+		PersistentPreRunE:  cmd.InitBackendContext,
 117+		PersistentPostRunE: cmd.CloseDBContext,
 118 		RunE: func(cmd *cobra.Command, _ []string) error {
 119 			ctx := cmd.Context()
 120 			db := db.FromContext(ctx)
 121@@ -35,8 +37,8 @@ var (
 122 	rollbackCmd = &cobra.Command{
 123 		Use:                "rollback",
 124 		Short:              "Rollback the database to the previous version",
 125-		PersistentPreRunE:  initBackendContext,
 126-		PersistentPostRunE: closeDBContext,
 127+		PersistentPreRunE:  cmd.InitBackendContext,
 128+		PersistentPostRunE: cmd.CloseDBContext,
 129 		RunE: func(cmd *cobra.Command, _ []string) error {
 130 			ctx := cmd.Context()
 131 			db := db.FromContext(ctx)
 132@@ -51,13 +53,13 @@ var (
 133 	syncHooksCmd = &cobra.Command{
 134 		Use:                "sync-hooks",
 135 		Short:              "Update repository hooks",
 136-		PersistentPreRunE:  initBackendContext,
 137-		PersistentPostRunE: closeDBContext,
 138-		RunE: func(cmd *cobra.Command, _ []string) error {
 139-			ctx := cmd.Context()
 140+		PersistentPreRunE:  cmd.InitBackendContext,
 141+		PersistentPostRunE: cmd.CloseDBContext,
 142+		RunE: func(c *cobra.Command, _ []string) error {
 143+			ctx := c.Context()
 144 			cfg := config.FromContext(ctx)
 145 			be := backend.FromContext(ctx)
 146-			if err := initializeHooks(ctx, cfg, be); err != nil {
 147+			if err := cmd.InitializeHooks(ctx, cfg, be); err != nil {
 148 				return fmt.Errorf("initialize hooks: %w", err)
 149 			}
 150 
 151@@ -67,7 +69,7 @@ var (
 152 )
 153 
 154 func init() {
 155-	adminCmd.AddCommand(
 156+	Command.AddCommand(
 157 		syncHooksCmd,
 158 		migrateCmd,
 159 		rollbackCmd,
 160diff --git a/cmd/soft/browse.go b/cmd/soft/browse/browse.go
 161rename from cmd/soft/browse.go
 162rename to cmd/soft/browse/browse.go
 163index 8cb760198a989cdf94a23e541d61bffe2ee775f4..43fa3e612036eaa0e36908cac09a9923cf51f366 100644
 164--- a/cmd/soft/browse.go
 165+++ b/cmd/soft/browse/browse.go
 166@@ -1,4 +1,4 @@
 167-package main
 168+package browse
 169 
 170 import (
 171 	"fmt"
 172@@ -9,15 +9,16 @@ import (
 173 	tea "github.com/charmbracelet/bubbletea"
 174 	"github.com/charmbracelet/lipgloss"
 175 	"github.com/charmbracelet/soft-serve/git"
 176-	"github.com/charmbracelet/soft-serve/server/proto"
 177-	"github.com/charmbracelet/soft-serve/server/ui/common"
 178-	"github.com/charmbracelet/soft-serve/server/ui/components/footer"
 179-	"github.com/charmbracelet/soft-serve/server/ui/pages/repo"
 180+	"github.com/charmbracelet/soft-serve/pkg/proto"
 181+	"github.com/charmbracelet/soft-serve/pkg/ui/common"
 182+	"github.com/charmbracelet/soft-serve/pkg/ui/components/footer"
 183+	"github.com/charmbracelet/soft-serve/pkg/ui/pages/repo"
 184 	"github.com/muesli/termenv"
 185 	"github.com/spf13/cobra"
 186 )
 187 
 188-var browseCmd = &cobra.Command{
 189+// Command is the browse command.
 190+var Command = &cobra.Command{
 191 	Use:   "browse PATH",
 192 	Short: "Browse a repository",
 193 	Args:  cobra.MaximumNArgs(1),
 194@@ -72,7 +73,6 @@ func init() {
 195 	// HACK: This is a hack to hide the clone url
 196 	// TODO: Make this configurable
 197 	common.CloneCmd = func(publicURL, name string) string { return "" }
 198-	rootCmd.AddCommand(browseCmd)
 199 }
 200 
 201 type state int
 202diff --git a/cmd/soft/hook.go b/cmd/soft/hook/hook.go
 203rename from cmd/soft/hook.go
 204rename to cmd/soft/hook/hook.go
 205index 1bb32b4eab6e5fd8e981c71f7c6144b296e6d758..43718ed22042e0c9d5c6b84cb9ac1488b3c724eb 100644
 206--- a/cmd/soft/hook.go
 207+++ b/cmd/soft/hook/hook.go
 208@@ -1,4 +1,4 @@
 209-package main
 210+package hook
 211 
 212 import (
 213 	"bufio"
 214@@ -13,9 +13,10 @@ import (
 215 	"strings"
 216 
 217 	"github.com/charmbracelet/log"
 218-	"github.com/charmbracelet/soft-serve/server/backend"
 219-	"github.com/charmbracelet/soft-serve/server/config"
 220-	"github.com/charmbracelet/soft-serve/server/hooks"
 221+	"github.com/charmbracelet/soft-serve/cmd"
 222+	"github.com/charmbracelet/soft-serve/pkg/backend"
 223+	"github.com/charmbracelet/soft-serve/pkg/config"
 224+	"github.com/charmbracelet/soft-serve/pkg/hooks"
 225 	"github.com/spf13/cobra"
 226 )
 227 
 228@@ -26,23 +27,24 @@ var (
 229 	// Deprecated: this flag is ignored.
 230 	configPath string
 231 
 232-	hookCmd = &cobra.Command{
 233+	// Command is the hook command.
 234+	Command = &cobra.Command{
 235 		Use:    "hook",
 236 		Short:  "Run git server hooks",
 237 		Long:   "Handles Soft Serve git server hooks.",
 238 		Hidden: true,
 239-		PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
 240-			logger := log.FromContext(cmd.Context())
 241-			if err := initBackendContext(cmd, args); err != nil {
 242+		PersistentPreRunE: func(c *cobra.Command, args []string) error {
 243+			logger := log.FromContext(c.Context())
 244+			if err := cmd.InitBackendContext(c, args); err != nil {
 245 				logger.Error("failed to initialize backend context", "err", err)
 246 				return ErrInternalServerError
 247 			}
 248 
 249 			return nil
 250 		},
 251-		PersistentPostRunE: func(cmd *cobra.Command, args []string) error {
 252-			logger := log.FromContext(cmd.Context())
 253-			if err := closeDBContext(cmd, args); err != nil {
 254+		PersistentPostRunE: func(c *cobra.Command, args []string) error {
 255+			logger := log.FromContext(c.Context())
 256+			if err := cmd.CloseDBContext(c, args); err != nil {
 257 				logger.Error("failed to close backend", "err", err)
 258 				return ErrInternalServerError
 259 			}
 260@@ -147,8 +149,8 @@ var (
 261 )
 262 
 263 func init() {
 264-	hookCmd.PersistentFlags().StringVar(&configPath, "config", "", "path to config file (deprecated)")
 265-	hookCmd.AddCommand(
 266+	Command.PersistentFlags().StringVar(&configPath, "config", "", "path to config file (deprecated)")
 267+	Command.AddCommand(
 268 		preReceiveCmd,
 269 		updateCmd,
 270 		postReceiveCmd,
 271@@ -163,47 +165,3 @@ func runCommand(ctx context.Context, in io.Reader, out io.Writer, err io.Writer,
 272 	cmd.Stderr = err
 273 	return cmd.Run()
 274 }
 275-
 276-const updateHookExample = `#!/bin/sh
 277-#
 278-# An example hook script to echo information about the push
 279-# and send it to the client.
 280-#
 281-# To enable this hook, rename this file to "update" and make it executable.
 282-
 283-refname="$1"
 284-oldrev="$2"
 285-newrev="$3"
 286-
 287-# Safety check
 288-if [ -z "$GIT_DIR" ]; then
 289-        echo "Don't run this script from the command line." >&2
 290-        echo " (if you want, you could supply GIT_DIR then run" >&2
 291-        echo "  $0 <ref> <oldrev> <newrev>)" >&2
 292-        exit 1
 293-fi
 294-
 295-if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
 296-        echo "usage: $0 <ref> <oldrev> <newrev>" >&2
 297-        exit 1
 298-fi
 299-
 300-# Check types
 301-# if $newrev is 0000...0000, it's a commit to delete a ref.
 302-zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
 303-if [ "$newrev" = "$zero" ]; then
 304-        newrev_type=delete
 305-else
 306-        newrev_type=$(git cat-file -t $newrev)
 307-fi
 308diff --git a/cmd/soft/root.go b/cmd/soft/main.go
 309rename from cmd/soft/root.go
 310rename to cmd/soft/main.go
 311index c47a81f7e35abfcc05f65fd8fec25576d1ed4d19..8264abee8666d1d7424a3139be750a601f5d7f7b 100644
 312--- a/cmd/soft/root.go
 313+++ b/cmd/soft/main.go
 314@@ -2,20 +2,20 @@ package main
 315 
 316 import (
 317 	"context"
 318-	"errors"
 319 	"fmt"
 320-	"io/fs"
 321 	"os"
 322 	"runtime/debug"
 323 
 324 	"github.com/charmbracelet/log"
 325-	"github.com/charmbracelet/soft-serve/server/backend"
 326-	"github.com/charmbracelet/soft-serve/server/config"
 327-	"github.com/charmbracelet/soft-serve/server/db"
 328-	logr "github.com/charmbracelet/soft-serve/server/log"
 329-	"github.com/charmbracelet/soft-serve/server/store"
 330-	"github.com/charmbracelet/soft-serve/server/store/database"
 331-	"github.com/charmbracelet/soft-serve/server/version"
 332+	"github.com/charmbracelet/soft-serve/cmd/soft/admin"
 333+	"github.com/charmbracelet/soft-serve/cmd/soft/browse"
 334+	"github.com/charmbracelet/soft-serve/cmd/soft/hook"
 335+	"github.com/charmbracelet/soft-serve/cmd/soft/serve"
 336+	"github.com/charmbracelet/soft-serve/pkg/config"
 337+	logr "github.com/charmbracelet/soft-serve/pkg/log"
 338+	"github.com/charmbracelet/soft-serve/pkg/version"
 339+	mcobra "github.com/muesli/mango-cobra"
 340+	"github.com/muesli/roff"
 341 	"github.com/spf13/cobra"
 342 	"go.uber.org/automaxprocs/maxprocs"
 343 )
 344@@ -39,18 +39,36 @@ var (
 345 		Long:         "Soft Serve is a self-hostable Git server for the command line.",
 346 		SilenceUsage: true,
 347 		RunE: func(cmd *cobra.Command, args []string) error {
 348-			return browseCmd.RunE(cmd, args)
 349+			return browse.Command.RunE(cmd, args)
 350+		},
 351+	}
 352+
 353+	manCmd = &cobra.Command{
 354+		Use:    "man",
 355+		Short:  "Generate man pages",
 356+		Args:   cobra.NoArgs,
 357+		Hidden: true,
 358+		RunE: func(_ *cobra.Command, _ []string) error {
 359+			manPage, err := mcobra.NewManPage(1, rootCmd) //.
 360+			if err != nil {
 361+				return err
 362+			}
 363+
 364+			manPage = manPage.WithSection("Copyright", "(C) 2021-2023 Charmbracelet, Inc.\n"+
 365+				"Released under MIT license.")
 366+			fmt.Println(manPage.Build(roff.NewDocument()))
 367+			return nil
 368 		},
 369 	}
 370 )
 371 
 372 func init() {
 373 	rootCmd.AddCommand(
 374-		serveCmd,
 375 		manCmd,
 376-		hookCmd,
 377-		migrateConfig,
 378-		adminCmd,
 379+		serve.Command,
 380+		hook.Command,
 381+		admin.Command,
 382+		browse.Command,
 383 	)
 384 	rootCmd.CompletionOptions.HiddenDefaultCmd = true
 385 
 386@@ -114,39 +132,3 @@ func main() {
 387 		os.Exit(1)
 388 	}
 389 }
 390-
 391-func initBackendContext(cmd *cobra.Command, _ []string) error {
 392-	ctx := cmd.Context()
 393-	cfg := config.FromContext(ctx)
 394-	if _, err := os.Stat(cfg.DataPath); errors.Is(err, fs.ErrNotExist) {
 395-		if err := os.MkdirAll(cfg.DataPath, os.ModePerm); err != nil {
 396-			return fmt.Errorf("create data directory: %w", err)
 397-		}
 398-	}
 399-	dbx, err := db.Open(ctx, cfg.DB.Driver, cfg.DB.DataSource)
 400-	if err != nil {
 401-		return fmt.Errorf("open database: %w", err)
 402-	}
 403-
 404-	ctx = db.WithContext(ctx, dbx)
 405-	dbstore := database.New(ctx, dbx)
 406-	ctx = store.WithContext(ctx, dbstore)
 407-	be := backend.New(ctx, cfg, dbx)
 408-	ctx = backend.WithContext(ctx, be)
 409-
 410-	cmd.SetContext(ctx)
 411-
 412-	return nil
 413-}
 414diff --git a/cmd/soft/man.go b/cmd/soft/man.go
 415deleted file mode 100644
 416index 966fe27d349ae11d407ba618dc6d647218ecc692..0000000000000000000000000000000000000000
 417--- a/cmd/soft/man.go
 418+++ /dev/null
 419@@ -1,27 +0,0 @@
 420-package main
 421-
 422-import (
 423-	"fmt"
 424-
 425-	mcobra "github.com/muesli/mango-cobra"
 426-	"github.com/muesli/roff"
 427-	"github.com/spf13/cobra"
 428-)
 429-
 430-var manCmd = &cobra.Command{
 431-	Use:    "man",
 432-	Short:  "Generate man pages",
 433-	Args:   cobra.NoArgs,
 434-	Hidden: true,
 435-	RunE: func(_ *cobra.Command, _ []string) error {
 436-		manPage, err := mcobra.NewManPage(1, rootCmd) //.
 437-		if err != nil {
 438-			return err
 439-		}
 440-
 441-		manPage = manPage.WithSection("Copyright", "(C) 2021-2023 Charmbracelet, Inc.\n"+
 442-			"Released under MIT license.")
 443-		fmt.Println(manPage.Build(roff.NewDocument()))
 444-		return nil
 445-	},
 446-}
 447diff --git a/cmd/soft/migrate_config.go b/cmd/soft/migrate_config.go
 448deleted file mode 100644
 449index 5138e93c0e8195d7dc328d4dc830abdfa1afce63..0000000000000000000000000000000000000000
 450--- a/cmd/soft/migrate_config.go
 451+++ /dev/null
 452@@ -1,434 +0,0 @@
 453-package main
 454-
 455-import (
 456-	"encoding/json"
 457-	"errors"
 458-	"fmt"
 459-	"io"
 460-	"os"
 461-	"path/filepath"
 462-	"strings"
 463-	"time"
 464-
 465-	"github.com/charmbracelet/log"
 466-	"github.com/charmbracelet/soft-serve/git"
 467-	"github.com/charmbracelet/soft-serve/server/access"
 468-	"github.com/charmbracelet/soft-serve/server/backend"
 469-	"github.com/charmbracelet/soft-serve/server/config"
 470-	"github.com/charmbracelet/soft-serve/server/db"
 471-	"github.com/charmbracelet/soft-serve/server/proto"
 472-	"github.com/charmbracelet/soft-serve/server/sshutils"
 473-	"github.com/charmbracelet/soft-serve/server/utils"
 474-	gitm "github.com/gogs/git-module"
 475-	"github.com/spf13/cobra"
 476-	"golang.org/x/crypto/ssh"
 477-	"gopkg.in/yaml.v3"
 478-)
 479-
 480-// Deprecated: will be removed in a future release.
 481-var migrateConfig = &cobra.Command{
 482-	Use:    "migrate-config",
 483-	Short:  "Migrate config to new format",
 484-	Hidden: true,
 485-	RunE: func(cmd *cobra.Command, _ []string) error {
 486-		ctx := cmd.Context()
 487-
 488-		logger := log.FromContext(ctx)
 489-		// Disable logging timestamp
 490-		logger.SetReportTimestamp(false)
 491-
 492-		keyPath := os.Getenv("SOFT_SERVE_KEY_PATH")
 493-		reposPath := os.Getenv("SOFT_SERVE_REPO_PATH")
 494-		bindAddr := os.Getenv("SOFT_SERVE_BIND_ADDRESS")
 495-		cfg := config.DefaultConfig()
 496-		if err := cfg.ParseEnv(); err != nil {
 497-			return fmt.Errorf("parse env: %w", err)
 498-		}
 499-
 500-		ctx = config.WithContext(ctx, cfg)
 501-		db, err := db.Open(ctx, cfg.DB.Driver, cfg.DB.DataSource)
 502-		if err != nil {
 503-			return fmt.Errorf("open database: %w", err)
 504-		}
 505-
 506-		defer db.Close() // nolint: errcheck
 507-		sb := backend.New(ctx, cfg, db)
 508-
 509-		// FIXME: Admin user gets created when the database is created.
 510-		sb.DeleteUser(ctx, "admin") // nolint: errcheck
 511-
 512-		// Set SSH listen address
 513-		logger.Info("Setting SSH listen address...")
 514-		if bindAddr != "" {
 515-			cfg.SSH.ListenAddr = bindAddr
 516-		}
 517-
 518-		// Copy SSH host key
 519-		logger.Info("Copying SSH host key...")
 520-		if keyPath != "" {
 521-			if err := os.MkdirAll(filepath.Join(cfg.DataPath, "ssh"), os.ModePerm); err != nil {
 522-				return fmt.Errorf("failed to create ssh directory: %w", err)
 523-			}
 524-
 525-			if err := copyFile(keyPath, filepath.Join(cfg.DataPath, "ssh", filepath.Base(keyPath))); err != nil {
 526-				return fmt.Errorf("failed to copy ssh key: %w", err)
 527-			}
 528-
 529-			if err := copyFile(keyPath+".pub", filepath.Join(cfg.DataPath, "ssh", filepath.Base(keyPath))+".pub"); err != nil {
 530-				logger.Errorf("failed to copy ssh key: %s", err)
 531-			}
 532-
 533-			cfg.SSH.KeyPath = filepath.Join(cfg.DataPath, "ssh", filepath.Base(keyPath))
 534-		}
 535-
 536-		// Read config
 537-		logger.Info("Reading config repository...")
 538-		r, err := git.Open(filepath.Join(reposPath, "config"))
 539-		if err != nil {
 540-			return fmt.Errorf("failed to open config repo: %w", err)
 541-		}
 542-
 543-		head, err := r.HEAD()
 544-		if err != nil {
 545-			return fmt.Errorf("failed to get head: %w", err)
 546-		}
 547-
 548-		tree, err := r.TreePath(head, "")
 549-		if err != nil {
 550-			return fmt.Errorf("failed to get tree: %w", err)
 551-		}
 552diff --git a/cmd/soft/serve.go b/cmd/soft/serve/serve.go
 553rename from cmd/soft/serve.go
 554rename to cmd/soft/serve/serve.go
 555index 0111f311a71a1eb3d48004a52831811b02f7c86c..7f81dcf0f741085ff41f03229a786b76091d0eb5 100644
 556--- a/cmd/soft/serve.go
 557+++ b/cmd/soft/serve/serve.go
 558@@ -1,4 +1,4 @@
 559-package main
 560+package serve
 561 
 562 import (
 563 	"context"
 564@@ -9,26 +9,26 @@ import (
 565 	"syscall"
 566 	"time"
 567 
 568-	"github.com/charmbracelet/soft-serve/server"
 569-	"github.com/charmbracelet/soft-serve/server/backend"
 570-	"github.com/charmbracelet/soft-serve/server/config"
 571-	"github.com/charmbracelet/soft-serve/server/db"
 572-	"github.com/charmbracelet/soft-serve/server/db/migrate"
 573-	"github.com/charmbracelet/soft-serve/server/hooks"
 574+	"github.com/charmbracelet/soft-serve/cmd"
 575+	"github.com/charmbracelet/soft-serve/pkg/backend"
 576+	"github.com/charmbracelet/soft-serve/pkg/config"
 577+	"github.com/charmbracelet/soft-serve/pkg/db"
 578+	"github.com/charmbracelet/soft-serve/pkg/db/migrate"
 579 	"github.com/spf13/cobra"
 580 )
 581 
 582 var (
 583 	syncHooks bool
 584 
 585-	serveCmd = &cobra.Command{
 586+	// Command is the serve command.
 587+	Command = &cobra.Command{
 588 		Use:                "serve",
 589 		Short:              "Start the server",
 590 		Args:               cobra.NoArgs,
 591-		PersistentPreRunE:  initBackendContext,
 592-		PersistentPostRunE: closeDBContext,
 593-		RunE: func(cmd *cobra.Command, _ []string) error {
 594-			ctx := cmd.Context()
 595+		PersistentPreRunE:  cmd.InitBackendContext,
 596+		PersistentPostRunE: cmd.CloseDBContext,
 597+		RunE: func(c *cobra.Command, _ []string) error {
 598+			ctx := c.Context()
 599 			cfg := config.DefaultConfig()
 600 			if cfg.Exist() {
 601 				if err := cfg.ParseFile(); err != nil {
 602@@ -67,14 +67,14 @@ var (
 603 				return fmt.Errorf("migration error: %w", err)
 604 			}
 605 
 606-			s, err := server.NewServer(ctx)
 607+			s, err := NewServer(ctx)
 608 			if err != nil {
 609 				return fmt.Errorf("start server: %w", err)
 610 			}
 611 
 612 			if syncHooks {
 613 				be := backend.FromContext(ctx)
 614-				if err := initializeHooks(ctx, cfg, be); err != nil {
 615+				if err := cmd.InitializeHooks(ctx, cfg, be); err != nil {
 616 					return fmt.Errorf("initialize hooks: %w", err)
 617 				}
 618 			}
 619@@ -103,20 +103,49 @@ var (
 620 )
 621 
 622 func init() {
 623-	serveCmd.Flags().BoolVarP(&syncHooks, "sync-hooks", "", false, "synchronize hooks for all repositories before running the server")
 624+	Command.Flags().BoolVarP(&syncHooks, "sync-hooks", "", false, "synchronize hooks for all repositories before running the server")
 625 }
 626 
 627-func initializeHooks(ctx context.Context, cfg *config.Config, be *backend.Backend) error {
 628-	repos, err := be.Repositories(ctx)
 629-	if err != nil {
 630-		return err
 631-	}
 632-
 633-	for _, repo := range repos {
 634-		if err := hooks.GenerateHooks(ctx, cfg, repo.Name()); err != nil {
 635-			return err
 636-		}
 637-	}
 638-
 639-	return nil
 640-}
 641+const updateHookExample = `#!/bin/sh
 642+#
 643+# An example hook script to echo information about the push
 644+# and send it to the client.
 645+#
 646+# To enable this hook, rename this file to "update" and make it executable.
 647+
 648+refname="$1"
 649+oldrev="$2"
 650+newrev="$3"
 651+
 652+# Safety check
 653+if [ -z "$GIT_DIR" ]; then
 654+        echo "Don't run this script from the command line." >&2
 655+        echo " (if you want, you could supply GIT_DIR then run" >&2
 656+        echo "  $0 <ref> <oldrev> <newrev>)" >&2
 657+        exit 1
 658diff --git a/server/server.go b/cmd/soft/serve/server.go
 659rename from server/server.go
 660rename to cmd/soft/serve/server.go
 661index 71f796522ecea1169f311ff7bef573e2fbac313e..223e55a69fb5c907feda0b1bb3f657a0216cb2de 100644
 662--- a/server/server.go
 663+++ b/cmd/soft/serve/server.go
 664@@ -1,4 +1,4 @@
 665-package server
 666+package serve
 667 
 668 import (
 669 	"context"
 670@@ -8,15 +8,15 @@ import (
 671 
 672 	"github.com/charmbracelet/log"
 673 
 674-	"github.com/charmbracelet/soft-serve/server/backend"
 675-	"github.com/charmbracelet/soft-serve/server/config"
 676-	"github.com/charmbracelet/soft-serve/server/cron"
 677-	"github.com/charmbracelet/soft-serve/server/daemon"
 678-	"github.com/charmbracelet/soft-serve/server/db"
 679-	"github.com/charmbracelet/soft-serve/server/jobs"
 680-	sshsrv "github.com/charmbracelet/soft-serve/server/ssh"
 681-	"github.com/charmbracelet/soft-serve/server/stats"
 682-	"github.com/charmbracelet/soft-serve/server/web"
 683+	"github.com/charmbracelet/soft-serve/pkg/backend"
 684+	"github.com/charmbracelet/soft-serve/pkg/config"
 685+	"github.com/charmbracelet/soft-serve/pkg/cron"
 686+	"github.com/charmbracelet/soft-serve/pkg/daemon"
 687+	"github.com/charmbracelet/soft-serve/pkg/db"
 688+	"github.com/charmbracelet/soft-serve/pkg/jobs"
 689+	sshsrv "github.com/charmbracelet/soft-serve/pkg/ssh"
 690+	"github.com/charmbracelet/soft-serve/pkg/stats"
 691+	"github.com/charmbracelet/soft-serve/pkg/web"
 692 	"github.com/charmbracelet/ssh"
 693 	"golang.org/x/sync/errgroup"
 694 )
 695diff --git a/server/access/access.go b/pkg/access/access.go
 696rename from server/access/access.go
 697rename to pkg/access/access.go
 698diff --git a/server/access/access_test.go b/pkg/access/access_test.go
 699rename from server/access/access_test.go
 700rename to pkg/access/access_test.go
 701diff --git a/server/access/context.go b/pkg/access/context.go
 702rename from server/access/context.go
 703rename to pkg/access/context.go
 704diff --git a/server/backend/access_token.go b/pkg/backend/access_token.go
 705rename from server/backend/access_token.go
 706rename to pkg/backend/access_token.go
 707index bff3b25ba10474fb2f33b1ee6b1d5230124b566b..281ad8f174a1c67896594485c1958820fd2ac668 100644
 708--- a/server/backend/access_token.go
 709+++ b/pkg/backend/access_token.go
 710@@ -5,8 +5,8 @@ import (
 711 	"errors"
 712 	"time"
 713 
 714-	"github.com/charmbracelet/soft-serve/server/db"
 715-	"github.com/charmbracelet/soft-serve/server/proto"
 716+	"github.com/charmbracelet/soft-serve/pkg/db"
 717+	"github.com/charmbracelet/soft-serve/pkg/proto"
 718 )
 719 
 720 // CreateAccessToken creates an access token for user.
 721diff --git a/server/backend/auth.go b/pkg/backend/auth.go
 722rename from server/backend/auth.go
 723rename to pkg/backend/auth.go
 724diff --git a/server/backend/auth_test.go b/pkg/backend/auth_test.go
 725rename from server/backend/auth_test.go
 726rename to pkg/backend/auth_test.go
 727diff --git a/server/backend/backend.go b/pkg/backend/backend.go
 728rename from server/backend/backend.go
 729rename to pkg/backend/backend.go
 730index ba9ad61d3713dd18f72a8a9e91d989ddcc370fe1..2d9eb2a05538e7a2ffa5ebc568f14d5e610f39f9 100644
 731--- a/server/backend/backend.go
 732+++ b/pkg/backend/backend.go
 733@@ -4,10 +4,10 @@ import (
 734 	"context"
 735 
 736 	"github.com/charmbracelet/log"
 737-	"github.com/charmbracelet/soft-serve/server/config"
 738-	"github.com/charmbracelet/soft-serve/server/db"
 739-	"github.com/charmbracelet/soft-serve/server/store"
 740-	"github.com/charmbracelet/soft-serve/server/task"
 741+	"github.com/charmbracelet/soft-serve/pkg/config"
 742+	"github.com/charmbracelet/soft-serve/pkg/db"
 743+	"github.com/charmbracelet/soft-serve/pkg/store"
 744+	"github.com/charmbracelet/soft-serve/pkg/task"
 745 )
 746 
 747 // Backend is the Soft Serve backend that handles users, repositories, and
 748diff --git a/server/backend/cache.go b/pkg/backend/cache.go
 749rename from server/backend/cache.go
 750rename to pkg/backend/cache.go
 751diff --git a/server/backend/collab.go b/pkg/backend/collab.go
 752rename from server/backend/collab.go
 753rename to pkg/backend/collab.go
 754index 6b03c5d0e038ce03e37d838ec5f6b3a83c75f1a9..c9635ae3712b50c160c9455c31bb510a04bfaac6 100644
 755--- a/server/backend/collab.go
 756+++ b/pkg/backend/collab.go
 757@@ -5,12 +5,12 @@ import (
 758 	"errors"
 759 	"strings"
 760 
 761-	"github.com/charmbracelet/soft-serve/server/access"
 762-	"github.com/charmbracelet/soft-serve/server/db"
 763-	"github.com/charmbracelet/soft-serve/server/db/models"
 764-	"github.com/charmbracelet/soft-serve/server/proto"
 765-	"github.com/charmbracelet/soft-serve/server/utils"
 766-	"github.com/charmbracelet/soft-serve/server/webhook"
 767+	"github.com/charmbracelet/soft-serve/pkg/access"
 768+	"github.com/charmbracelet/soft-serve/pkg/db"
 769+	"github.com/charmbracelet/soft-serve/pkg/db/models"
 770+	"github.com/charmbracelet/soft-serve/pkg/proto"
 771+	"github.com/charmbracelet/soft-serve/pkg/utils"
 772+	"github.com/charmbracelet/soft-serve/pkg/webhook"
 773 )
 774 
 775 // AddCollaborator adds a collaborator to a repository.
 776diff --git a/server/backend/context.go b/pkg/backend/context.go
 777rename from server/backend/context.go
 778rename to pkg/backend/context.go
 779diff --git a/server/backend/hooks.go b/pkg/backend/hooks.go
 780rename from server/backend/hooks.go
 781rename to pkg/backend/hooks.go
 782index 3e5297eb953e0ecab5d790e930254d0939905d25..f6c64467100ac3f3eddb5e8384a787b6b7008c44 100644
 783--- a/server/backend/hooks.go
 784+++ b/pkg/backend/hooks.go
 785@@ -7,10 +7,10 @@ import (
 786 	"sync"
 787 
 788 	"github.com/charmbracelet/soft-serve/git"
 789-	"github.com/charmbracelet/soft-serve/server/hooks"
 790-	"github.com/charmbracelet/soft-serve/server/proto"
 791-	"github.com/charmbracelet/soft-serve/server/sshutils"
 792-	"github.com/charmbracelet/soft-serve/server/webhook"
 793+	"github.com/charmbracelet/soft-serve/pkg/hooks"
 794+	"github.com/charmbracelet/soft-serve/pkg/proto"
 795+	"github.com/charmbracelet/soft-serve/pkg/sshutils"
 796+	"github.com/charmbracelet/soft-serve/pkg/webhook"
 797 )
 798 
 799 var _ hooks.Hooks = (*Backend)(nil)
 800diff --git a/server/backend/lfs.go b/pkg/backend/lfs.go
 801rename from server/backend/lfs.go
 802rename to pkg/backend/lfs.go
 803index 5b0d5a4064ae92d3fe1044ef8a841bbb8e9663a1..b940940bd5c81ebc4f564c054e8a7bff8ed38617 100644
 804--- a/server/backend/lfs.go
 805+++ b/pkg/backend/lfs.go
 806@@ -8,12 +8,12 @@ import (
 807 	"path/filepath"
 808 	"strconv"
 809 
 810-	"github.com/charmbracelet/soft-serve/server/config"
 811-	"github.com/charmbracelet/soft-serve/server/db"
 812-	"github.com/charmbracelet/soft-serve/server/lfs"
 813-	"github.com/charmbracelet/soft-serve/server/proto"
 814-	"github.com/charmbracelet/soft-serve/server/storage"
 815-	"github.com/charmbracelet/soft-serve/server/store"
 816+	"github.com/charmbracelet/soft-serve/pkg/config"
 817+	"github.com/charmbracelet/soft-serve/pkg/db"
 818+	"github.com/charmbracelet/soft-serve/pkg/lfs"
 819+	"github.com/charmbracelet/soft-serve/pkg/proto"
 820+	"github.com/charmbracelet/soft-serve/pkg/storage"
 821+	"github.com/charmbracelet/soft-serve/pkg/store"
 822 )
 823 
 824 // StoreRepoMissingLFSObjects stores missing LFS objects for a repository.
 825diff --git a/server/backend/repo.go b/pkg/backend/repo.go
 826rename from server/backend/repo.go
 827rename to pkg/backend/repo.go
 828index 2a8a8d1be6b13eb3646162255fcd6435f94afaf1..231d94e6f787b779536bf2db0f53817dc53c4f8b 100644
 829--- a/server/backend/repo.go
 830+++ b/pkg/backend/repo.go
 831@@ -13,15 +13,15 @@ import (
 832 	"time"
 833 
 834 	"github.com/charmbracelet/soft-serve/git"
 835-	"github.com/charmbracelet/soft-serve/server/db"
 836-	"github.com/charmbracelet/soft-serve/server/db/models"
 837-	"github.com/charmbracelet/soft-serve/server/hooks"
 838-	"github.com/charmbracelet/soft-serve/server/lfs"
 839-	"github.com/charmbracelet/soft-serve/server/proto"
 840-	"github.com/charmbracelet/soft-serve/server/storage"
 841-	"github.com/charmbracelet/soft-serve/server/task"
 842-	"github.com/charmbracelet/soft-serve/server/utils"
 843-	"github.com/charmbracelet/soft-serve/server/webhook"
 844+	"github.com/charmbracelet/soft-serve/pkg/db"
 845+	"github.com/charmbracelet/soft-serve/pkg/db/models"
 846+	"github.com/charmbracelet/soft-serve/pkg/hooks"
 847+	"github.com/charmbracelet/soft-serve/pkg/lfs"
 848+	"github.com/charmbracelet/soft-serve/pkg/proto"
 849+	"github.com/charmbracelet/soft-serve/pkg/storage"
 850+	"github.com/charmbracelet/soft-serve/pkg/task"
 851+	"github.com/charmbracelet/soft-serve/pkg/utils"
 852+	"github.com/charmbracelet/soft-serve/pkg/webhook"
 853 )
 854 
 855 func (d *Backend) reposPath() string {
 856diff --git a/server/backend/settings.go b/pkg/backend/settings.go
 857rename from server/backend/settings.go
 858rename to pkg/backend/settings.go
 859index 0879aa38d0b23aec92348ec877a4b69657b71320..3b7ddbf186e3450747d67475e536b8c296545a32 100644
 860--- a/server/backend/settings.go
 861+++ b/pkg/backend/settings.go
 862@@ -3,8 +3,8 @@ package backend
 863 import (
 864 	"context"
 865 
 866-	"github.com/charmbracelet/soft-serve/server/access"
 867-	"github.com/charmbracelet/soft-serve/server/db"
 868+	"github.com/charmbracelet/soft-serve/pkg/access"
 869+	"github.com/charmbracelet/soft-serve/pkg/db"
 870 )
 871 
 872 // AllowKeyless returns whether or not keyless access is allowed.
 873diff --git a/server/backend/user.go b/pkg/backend/user.go
 874rename from server/backend/user.go
 875rename to pkg/backend/user.go
 876index d5cf38ca329af86bc2e4487c66abf5990e644aa9..75423048d681a84fcc656e4ba000d26aaab25a50 100644
 877--- a/server/backend/user.go
 878+++ b/pkg/backend/user.go
 879@@ -6,12 +6,12 @@ import (
 880 	"strings"
 881 	"time"
 882 
 883-	"github.com/charmbracelet/soft-serve/server/access"
 884-	"github.com/charmbracelet/soft-serve/server/db"
 885-	"github.com/charmbracelet/soft-serve/server/db/models"
 886-	"github.com/charmbracelet/soft-serve/server/proto"
 887-	"github.com/charmbracelet/soft-serve/server/sshutils"
 888-	"github.com/charmbracelet/soft-serve/server/utils"
 889+	"github.com/charmbracelet/soft-serve/pkg/access"
 890+	"github.com/charmbracelet/soft-serve/pkg/db"
 891+	"github.com/charmbracelet/soft-serve/pkg/db/models"
 892+	"github.com/charmbracelet/soft-serve/pkg/proto"
 893+	"github.com/charmbracelet/soft-serve/pkg/sshutils"
 894+	"github.com/charmbracelet/soft-serve/pkg/utils"
 895 	"golang.org/x/crypto/ssh"
 896 )
 897 
 898diff --git a/server/backend/utils.go b/pkg/backend/utils.go
 899rename from server/backend/utils.go
 900rename to pkg/backend/utils.go
 901index 5e90873e5369615c3fb8eb62ef347995770bd9ae..be1b0b4a78cfd21265ebb809920a8d5a780f6825 100644
 902--- a/server/backend/utils.go
 903+++ b/pkg/backend/utils.go
 904@@ -2,7 +2,7 @@ package backend
 905 
 906 import (
 907 	"github.com/charmbracelet/soft-serve/git"
 908-	"github.com/charmbracelet/soft-serve/server/proto"
 909+	"github.com/charmbracelet/soft-serve/pkg/proto"
 910 )
 911 
 912 // LatestFile returns the contents of the latest file at the specified path in
 913diff --git a/server/backend/webhooks.go b/pkg/backend/webhooks.go
 914rename from server/backend/webhooks.go
 915rename to pkg/backend/webhooks.go
 916index 6d676d35655f62a69bc1497191b2eea4c3d59ef6..78126b2ee84e8f49c93cba422af3c7e588f62195 100644
 917--- a/server/backend/webhooks.go
 918+++ b/pkg/backend/webhooks.go
 919@@ -5,11 +5,11 @@ import (
 920 	"encoding/json"
 921 
 922 	"github.com/charmbracelet/log"
 923-	"github.com/charmbracelet/soft-serve/server/db"
 924-	"github.com/charmbracelet/soft-serve/server/db/models"
 925-	"github.com/charmbracelet/soft-serve/server/proto"
 926-	"github.com/charmbracelet/soft-serve/server/store"
 927-	"github.com/charmbracelet/soft-serve/server/webhook"
 928+	"github.com/charmbracelet/soft-serve/pkg/db"
 929+	"github.com/charmbracelet/soft-serve/pkg/db/models"
 930+	"github.com/charmbracelet/soft-serve/pkg/proto"
 931+	"github.com/charmbracelet/soft-serve/pkg/store"
 932+	"github.com/charmbracelet/soft-serve/pkg/webhook"
 933 	"github.com/google/uuid"
 934 )
 935 
 936diff --git a/server/config/config.go b/pkg/config/config.go
 937rename from server/config/config.go
 938rename to pkg/config/config.go
 939index 4707cc452befbbb27a28e92485e3e03a6ba49924..e1124204faebef4e42f5ca53a1d965641dc48c9b 100644
 940--- a/server/config/config.go
 941+++ b/pkg/config/config.go
 942@@ -9,7 +9,7 @@ import (
 943 	"time"
 944 
 945 	"github.com/caarlos0/env/v8"
 946-	"github.com/charmbracelet/soft-serve/server/sshutils"
 947+	"github.com/charmbracelet/soft-serve/pkg/sshutils"
 948 	"golang.org/x/crypto/ssh"
 949 	"gopkg.in/yaml.v3"
 950 )
 951diff --git a/server/config/config_test.go b/pkg/config/config_test.go
 952rename from server/config/config_test.go
 953rename to pkg/config/config_test.go
 954diff --git a/server/config/context.go b/pkg/config/context.go
 955rename from server/config/context.go
 956rename to pkg/config/context.go
 957diff --git a/server/config/file.go b/pkg/config/file.go
 958rename from server/config/file.go
 959rename to pkg/config/file.go
 960diff --git a/server/config/ssh.go b/pkg/config/ssh.go
 961rename from server/config/ssh.go
 962rename to pkg/config/ssh.go
 963diff --git a/server/config/testdata/k1.pub b/pkg/config/testdata/k1.pub
 964rename from server/config/testdata/k1.pub
 965rename to pkg/config/testdata/k1.pub
 966diff --git a/server/cron/cron.go b/pkg/cron/cron.go
 967rename from server/cron/cron.go
 968rename to pkg/cron/cron.go
 969diff --git a/server/daemon/conn.go b/pkg/daemon/conn.go
 970rename from server/daemon/conn.go
 971rename to pkg/daemon/conn.go
 972diff --git a/server/daemon/daemon.go b/pkg/daemon/daemon.go
 973rename from server/daemon/daemon.go
 974rename to pkg/daemon/daemon.go
 975index 1a6070abc70af43e1f8281a7f1563c9b428093b8..eee10ec525754cd7007fd9c77b71ac833e7b8bc4 100644
 976--- a/server/daemon/daemon.go
 977+++ b/pkg/daemon/daemon.go
 978@@ -11,11 +11,11 @@ import (
 979 	"time"
 980 
 981 	"github.com/charmbracelet/log"
 982-	"github.com/charmbracelet/soft-serve/server/access"
 983-	"github.com/charmbracelet/soft-serve/server/backend"
 984-	"github.com/charmbracelet/soft-serve/server/config"
 985-	"github.com/charmbracelet/soft-serve/server/git"
 986-	"github.com/charmbracelet/soft-serve/server/utils"
 987+	"github.com/charmbracelet/soft-serve/pkg/access"
 988+	"github.com/charmbracelet/soft-serve/pkg/backend"
 989+	"github.com/charmbracelet/soft-serve/pkg/config"
 990+	"github.com/charmbracelet/soft-serve/pkg/git"
 991+	"github.com/charmbracelet/soft-serve/pkg/utils"
 992 	"github.com/go-git/go-git/v5/plumbing/format/pktline"
 993 	"github.com/prometheus/client_golang/prometheus"
 994 	"github.com/prometheus/client_golang/prometheus/promauto"
 995diff --git a/server/daemon/daemon_test.go b/pkg/daemon/daemon_test.go
 996rename from server/daemon/daemon_test.go
 997rename to pkg/daemon/daemon_test.go
 998index 0592db2de732c03cb048e16b5c48640dd7c2ce8b..a8710513eedbe3db6a3f40fd41efce599ddbd2cf 100644
 999--- a/server/daemon/daemon_test.go
1000+++ b/pkg/daemon/daemon_test.go
1001@@ -12,14 +12,14 @@ import (
1002 	"strings"
1003 	"testing"
1004 
1005-	"github.com/charmbracelet/soft-serve/server/backend"
1006-	"github.com/charmbracelet/soft-serve/server/config"
1007-	"github.com/charmbracelet/soft-serve/server/db"
1008-	"github.com/charmbracelet/soft-serve/server/db/migrate"
1009-	"github.com/charmbracelet/soft-serve/server/git"
1010-	"github.com/charmbracelet/soft-serve/server/store"
1011-	"github.com/charmbracelet/soft-serve/server/store/database"
1012-	"github.com/charmbracelet/soft-serve/server/test"
1013+	"github.com/charmbracelet/soft-serve/pkg/backend"
1014+	"github.com/charmbracelet/soft-serve/pkg/config"
1015+	"github.com/charmbracelet/soft-serve/pkg/db"
1016+	"github.com/charmbracelet/soft-serve/pkg/db/migrate"
1017+	"github.com/charmbracelet/soft-serve/pkg/git"
1018+	"github.com/charmbracelet/soft-serve/pkg/store"
1019+	"github.com/charmbracelet/soft-serve/pkg/store/database"
1020+	"github.com/charmbracelet/soft-serve/pkg/test"
1021 	"github.com/go-git/go-git/v5/plumbing/format/pktline"
1022 	_ "modernc.org/sqlite" // sqlite driver
1023 )
1024diff --git a/server/db/context.go b/pkg/db/context.go
1025rename from server/db/context.go
1026rename to pkg/db/context.go
1027diff --git a/server/db/db.go b/pkg/db/db.go
1028rename from server/db/db.go
1029rename to pkg/db/db.go
1030index ae0bfcaae645591161dcf2bc7fc10bbf946bb6ba..968d0425afeb65cf7a62d6ebc6c406922178f692 100644
1031--- a/server/db/db.go
1032+++ b/pkg/db/db.go
1033@@ -7,7 +7,7 @@ import (
1034 	"fmt"
1035 
1036 	"github.com/charmbracelet/log"
1037-	"github.com/charmbracelet/soft-serve/server/config"
1038+	"github.com/charmbracelet/soft-serve/pkg/config"
1039 	"github.com/jmoiron/sqlx"
1040 	_ "github.com/lib/pq"  // postgres driver
1041 	_ "modernc.org/sqlite" // sqlite driver
1042diff --git a/server/db/errors.go b/pkg/db/errors.go
1043rename from server/db/errors.go
1044rename to pkg/db/errors.go
1045diff --git a/server/db/handler.go b/pkg/db/handler.go
1046rename from server/db/handler.go
1047rename to pkg/db/handler.go
1048diff --git a/server/db/logger.go b/pkg/db/logger.go
1049rename from server/db/logger.go
1050rename to pkg/db/logger.go
1051diff --git a/server/db/migrate/0001_create_tables.go b/pkg/db/migrate/0001_create_tables.go
1052rename from server/db/migrate/0001_create_tables.go
1053rename to pkg/db/migrate/0001_create_tables.go
1054index d1cadd4d4bf3e517e8912d76cb1997c7de2b4430..8491328c04c5e979f60321071445991a39c45916 100644
1055--- a/server/db/migrate/0001_create_tables.go
1056+++ b/pkg/db/migrate/0001_create_tables.go
1057@@ -6,10 +6,10 @@ import (
1058 	"fmt"
1059 	"strconv"
1060 
1061-	"github.com/charmbracelet/soft-serve/server/access"
1062-	"github.com/charmbracelet/soft-serve/server/config"
1063-	"github.com/charmbracelet/soft-serve/server/db"
1064-	"github.com/charmbracelet/soft-serve/server/sshutils"
1065+	"github.com/charmbracelet/soft-serve/pkg/access"
1066+	"github.com/charmbracelet/soft-serve/pkg/config"
1067+	"github.com/charmbracelet/soft-serve/pkg/db"
1068+	"github.com/charmbracelet/soft-serve/pkg/sshutils"
1069 )
1070 
1071 const (
1072diff --git a/server/db/migrate/0001_create_tables_postgres.down.sql b/pkg/db/migrate/0001_create_tables_postgres.down.sql
1073rename from server/db/migrate/0001_create_tables_postgres.down.sql
1074rename to pkg/db/migrate/0001_create_tables_postgres.down.sql
1075diff --git a/server/db/migrate/0001_create_tables_postgres.up.sql b/pkg/db/migrate/0001_create_tables_postgres.up.sql
1076rename from server/db/migrate/0001_create_tables_postgres.up.sql
1077rename to pkg/db/migrate/0001_create_tables_postgres.up.sql
1078diff --git a/server/db/migrate/0001_create_tables_sqlite.down.sql b/pkg/db/migrate/0001_create_tables_sqlite.down.sql
1079rename from server/db/migrate/0001_create_tables_sqlite.down.sql
1080rename to pkg/db/migrate/0001_create_tables_sqlite.down.sql
1081diff --git a/server/db/migrate/0001_create_tables_sqlite.up.sql b/pkg/db/migrate/0001_create_tables_sqlite.up.sql
1082rename from server/db/migrate/0001_create_tables_sqlite.up.sql
1083rename to pkg/db/migrate/0001_create_tables_sqlite.up.sql
1084diff --git a/server/db/migrate/0002_webhooks.go b/pkg/db/migrate/0002_webhooks.go
1085rename from server/db/migrate/0002_webhooks.go
1086rename to pkg/db/migrate/0002_webhooks.go
1087index 7ad37be61cc2d396a9ba1c57637c6ae461e1a93f..a525f6edc76add5b8402b362b9191ed70c851bd1 100644
1088--- a/server/db/migrate/0002_webhooks.go
1089+++ b/pkg/db/migrate/0002_webhooks.go
1090@@ -3,7 +3,7 @@ package migrate
1091 import (
1092 	"context"
1093 
1094-	"github.com/charmbracelet/soft-serve/server/db"
1095+	"github.com/charmbracelet/soft-serve/pkg/db"
1096 )
1097 
1098 const (
1099diff --git a/server/db/migrate/0002_webhooks_postgres.down.sql b/pkg/db/migrate/0002_webhooks_postgres.down.sql
1100rename from server/db/migrate/0002_webhooks_postgres.down.sql
1101rename to pkg/db/migrate/0002_webhooks_postgres.down.sql
1102diff --git a/server/db/migrate/0002_webhooks_postgres.up.sql b/pkg/db/migrate/0002_webhooks_postgres.up.sql
1103rename from server/db/migrate/0002_webhooks_postgres.up.sql
1104rename to pkg/db/migrate/0002_webhooks_postgres.up.sql
1105diff --git a/server/db/migrate/0002_webhooks_sqlite.down.sql b/pkg/db/migrate/0002_webhooks_sqlite.down.sql
1106rename from server/db/migrate/0002_webhooks_sqlite.down.sql
1107rename to pkg/db/migrate/0002_webhooks_sqlite.down.sql