refactor(cli): move zpan command module to cmd

This commit is contained in:
saltbo
2026-06-06 01:49:41 -04:00
parent 9486360389
commit f31278b434
33 changed files with 55 additions and 45 deletions
+5 -5
View File
@@ -17,13 +17,13 @@ jobs:
if: github.repository == 'saltbo/zpan'
defaults:
run:
working-directory: downloader
working-directory: cmd
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version-file: downloader/go.mod
cache-dependency-path: downloader/go.sum
go-version-file: cmd/go.mod
cache-dependency-path: cmd/go.sum
- name: Check formatting
run: |
files="$(gofmt -l .)"
@@ -51,8 +51,8 @@ jobs:
cache: pnpm
- uses: actions/setup-go@v6
with:
go-version-file: downloader/go.mod
cache-dependency-path: downloader/go.sum
go-version-file: cmd/go.mod
cache-dependency-path: cmd/go.sum
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm typecheck
+2 -2
View File
@@ -20,8 +20,8 @@ jobs:
cache: pnpm
- uses: actions/setup-go@v6
with:
go-version-file: downloader/go.mod
cache-dependency-path: downloader/go.sum
go-version-file: cmd/go.mod
cache-dependency-path: cmd/go.sum
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm typecheck
+7 -7
View File
@@ -15,12 +15,12 @@ COPY . .
RUN pnpm build:node \
&& pnpm prune --prod
FROM golang:1.25 AS downloader-builder
WORKDIR /app/downloader
COPY downloader/go.mod downloader/go.sum ./
FROM golang:1.25 AS cli-builder
WORKDIR /app/cmd
COPY cmd/go.mod cmd/go.sum ./
RUN go mod download
COPY downloader ./
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/zpan ./cmd/zpan
COPY cmd ./
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/zpan ./zpan
FROM debian:bookworm-slim AS cli
RUN apt-get update \
@@ -28,7 +28,7 @@ RUN apt-get update \
&& rm -rf /var/lib/apt/lists/* \
&& addgroup --system zpan \
&& adduser --system --ingroup zpan --home /home/zpan zpan
COPY --from=downloader-builder /out/zpan /usr/local/bin/zpan
COPY --from=cli-builder /out/zpan /usr/local/bin/zpan
RUN mkdir -p /home/zpan/.config/zpan /home/zpan/.local/state/zpan/downloader /downloads \
&& chown -R zpan:zpan /home/zpan /downloads
USER zpan
@@ -52,7 +52,7 @@ COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/migrations ./migrations
COPY --from=builder /app/scripts/docker-entrypoint.sh /app/scripts/docker-entrypoint.sh
COPY --from=downloader-builder /out/zpan /usr/local/bin/zpan
COPY --from=cli-builder /out/zpan /usr/local/bin/zpan
RUN mkdir -p /data /home/zpan/.config/zpan /home/zpan/.local/state/zpan/downloader \
&& chown -R zpan:zpan /data /home/zpan
+1 -1
View File
@@ -1,4 +1,4 @@
module github.com/saltbo/zpan/downloader
module github.com/saltbo/zpan/cmd
go 1.25.0
View File
@@ -9,7 +9,7 @@ import (
"strings"
"time"
"github.com/saltbo/zpan/downloader/internal/openapi"
"github.com/saltbo/zpan/cmd/internal/openapi"
)
type Client struct {
@@ -18,7 +18,7 @@ import (
"github.com/Braurbeki/arigo"
"github.com/cenkalti/rpc2"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
type Aria2 struct {
@@ -8,7 +8,7 @@ import (
"strings"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
type Result struct {
@@ -14,7 +14,7 @@ import (
"github.com/Braurbeki/arigo"
qbittorrent "github.com/autobrr/go-qbittorrent"
"github.com/cenkalti/rpc2"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
func downloadTask(id, sourceType, sourceURI string) client.DownloadTask {
@@ -12,7 +12,7 @@ import (
"strconv"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
type HTTP struct {
@@ -18,7 +18,7 @@ import (
"testing"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
func liveTask(id, sourceType, sourceURI, name string) client.DownloadTask {
@@ -13,7 +13,7 @@ import (
"time"
qbittorrent "github.com/autobrr/go-qbittorrent"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
type QBittorrent struct {
@@ -5,7 +5,7 @@ import (
"fmt"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/cmd/internal/client"
)
const apiRetryAttempts = 3
@@ -5,7 +5,7 @@ import (
"errors"
"testing"
"github.com/saltbo/zpan/downloader/internal/config"
"github.com/saltbo/zpan/cmd/internal/config"
)
func TestCallAPIRetriesTransientErrors(t *testing.T) {
@@ -6,8 +6,8 @@ import (
"strings"
"time"
"github.com/saltbo/zpan/downloader/internal/config"
"github.com/saltbo/zpan/downloader/internal/engine"
"github.com/saltbo/zpan/cmd/internal/config"
"github.com/saltbo/zpan/cmd/internal/engine"
)
func (w *Worker) resolveEngine(ctx context.Context) error {
@@ -8,8 +8,8 @@ import (
"strings"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/downloader/internal/engine"
"github.com/saltbo/zpan/cmd/internal/client"
"github.com/saltbo/zpan/cmd/internal/engine"
)
const retainedSeedReportInterval = 5 * time.Second
@@ -11,8 +11,8 @@ import (
"strings"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/downloader/internal/engine"
"github.com/saltbo/zpan/cmd/internal/client"
"github.com/saltbo/zpan/cmd/internal/engine"
)
const maxSingleUploadSize = 5 * 1024 * 1024 * 1024
@@ -15,9 +15,9 @@ import (
"sync"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/downloader/internal/config"
"github.com/saltbo/zpan/downloader/internal/engine"
"github.com/saltbo/zpan/cmd/internal/client"
"github.com/saltbo/zpan/cmd/internal/config"
"github.com/saltbo/zpan/cmd/internal/engine"
)
const Version = "0.1.0"
@@ -14,9 +14,9 @@ import (
"testing"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/downloader/internal/config"
"github.com/saltbo/zpan/downloader/internal/engine"
"github.com/saltbo/zpan/cmd/internal/client"
"github.com/saltbo/zpan/cmd/internal/config"
"github.com/saltbo/zpan/cmd/internal/engine"
)
func TestResolveEngineRejectsUnknownConfiguredEngine(t *testing.T) {
@@ -12,9 +12,9 @@ import (
"syscall"
"time"
"github.com/saltbo/zpan/downloader/internal/client"
"github.com/saltbo/zpan/downloader/internal/config"
"github.com/saltbo/zpan/downloader/internal/worker"
"github.com/saltbo/zpan/cmd/internal/client"
"github.com/saltbo/zpan/cmd/internal/config"
"github.com/saltbo/zpan/cmd/internal/worker"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
@@ -43,6 +43,7 @@ func rootCommand() *cobra.Command {
v.SetConfigFile(cfgFile)
}
root.AddCommand(configCommand(v, &cfgFile))
root.AddCommand(downloaderCommand(v, &cfgFile))
return root
}
@@ -53,7 +54,6 @@ func downloaderCommand(v *viper.Viper, cfgFile *string) *cobra.Command {
Short: "Manage the ZPan remote downloader",
}
cmd.AddCommand(upCommand(v, cfgFile))
cmd.AddCommand(downloaderConfigCommand(v, cfgFile))
return cmd
}
@@ -116,10 +116,10 @@ func upCommand(v *viper.Viper, cfgFile *string) *cobra.Command {
}
}
func downloaderConfigCommand(v *viper.Viper, cfgFile *string) *cobra.Command {
func configCommand(v *viper.Viper, cfgFile *string) *cobra.Command {
cmd := &cobra.Command{
Use: "config",
Short: "Manage downloader configuration",
Short: "Manage CLI configuration",
}
cmd.AddCommand(&cobra.Command{
Use: "init",
@@ -3,7 +3,7 @@ package main
import (
"testing"
"github.com/saltbo/zpan/downloader/internal/config"
"github.com/saltbo/zpan/cmd/internal/config"
)
func TestRegistrationHeartbeatNormalizesAutoEngine(t *testing.T) {
@@ -49,4 +49,14 @@ func TestRootCommandExposesDownloaderSubcommands(t *testing.T) {
if downloader.Name() != "up" {
t.Fatalf("expected downloader up command, got %q", downloader.Name())
}
config, _, err := root.Find([]string{"config", "init"})
if err != nil {
t.Fatal(err)
}
if config.Name() != "init" {
t.Fatalf("expected root config init command, got %q", config.Name())
}
if command, _, err := root.Find([]string{"downloader", "config"}); err == nil && command.Name() == "config" {
t.Fatal("downloader config command should not be exposed")
}
}
+1 -1
View File
@@ -37,7 +37,7 @@
"e2e:archive": "node scripts/run-cloud-e2e.mjs --local --with-s3-mock --spec archive.spec.ts",
"e2e:archive:cf": "node scripts/run-cloud-e2e.mjs --runtime cf --local --with-s3-mock --spec archive.spec.ts",
"openapi:downloader": "tsx scripts/generate-downloader-openapi.ts",
"openapi:downloader:go": "pnpm openapi:downloader && cd downloader && go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.7.0 -config oapi-codegen.yaml ../docs/openapi/downloader.json",
"openapi:downloader:go": "pnpm openapi:downloader && cd cmd && go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.7.0 -config oapi-codegen.yaml ../docs/openapi/downloader.json",
"openapi:downloader:check": "tsx scripts/check-downloader-openapi.ts",
"openapi:downloader:all": "pnpm openapi:downloader:go"
},
+1 -1
View File
@@ -52,7 +52,7 @@ async function main() {
'Downloader OpenAPI document is stale.',
)
await assertSame(
'downloader/internal/openapi/client.gen.go',
'cmd/internal/openapi/client.gen.go',
generatedClientPath,
'Downloader Go OpenAPI client is stale.',
)