mirror of
https://github.com/saltbo/zpan.git
synced 2026-08-29 00:01:42 +08:00
refactor(cli): move zpan command module to cmd
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
@@ -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,4 +1,4 @@
|
||||
module github.com/saltbo/zpan/downloader
|
||||
module github.com/saltbo/zpan/cmd
|
||||
|
||||
go 1.25.0
|
||||
|
||||
@@ -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 {
|
||||
+1
-1
@@ -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
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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.',
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user