From 5faadb6898a0b8248125aea1764ec9b33b356c8d Mon Sep 17 00:00:00 2001 From: Jinghao-coding Date: Sun, 26 Jul 2026 02:18:42 +0800 Subject: [PATCH] feat(cli): add atomic remote file download --- cli/cmd/file.go | 329 ++++++++++++++++ cli/cmd/file_test.go | 352 ++++++++++++++++++ cli/docs/COMMANDS.md | 30 ++ cli/internal/api/file.go | 134 +++++++ cli/internal/api/file_test.go | 207 ++++++++++ cli/internal/api/paths.go | 2 + cli/internal/i18n/catalog_file.go | 52 +++ cli/internal/i18n/i18n.go | 1 + cli/skills/crater-cli-file/SKILL.md | 58 +++ cli/test/snapshots/file/file_test.go | 72 ++++ .../snapshots/file/file_download.en.txtar | 120 ++++++ .../snapshots/file/file_download.zh-CN.txtar | 120 ++++++ output/playwright/issue-478-file-download.png | Bin 0 -> 136001 bytes 13 files changed, 1477 insertions(+) create mode 100644 cli/cmd/file.go create mode 100644 cli/cmd/file_test.go create mode 100644 cli/internal/api/file.go create mode 100644 cli/internal/api/file_test.go create mode 100644 cli/internal/i18n/catalog_file.go create mode 100644 cli/skills/crater-cli-file/SKILL.md create mode 100644 cli/test/snapshots/file/file_test.go create mode 100644 cli/testdata/snapshots/file/file_download.en.txtar create mode 100644 cli/testdata/snapshots/file/file_download.zh-CN.txtar create mode 100644 output/playwright/issue-478-file-download.png diff --git a/cli/cmd/file.go b/cli/cmd/file.go new file mode 100644 index 000000000..a00f9a9c4 --- /dev/null +++ b/cli/cmd/file.go @@ -0,0 +1,329 @@ +package cmd + +import ( + "context" + "errors" + "fmt" + "io" + "os" + pathpkg "path" + "path/filepath" + "strings" + "unicode" + + "github.com/raids-lab/crater/cli/internal/api" + "github.com/raids-lab/crater/cli/internal/clierror" + "github.com/raids-lab/crater/cli/internal/completion" + "github.com/raids-lab/crater/cli/internal/i18n" + "github.com/raids-lab/crater/cli/internal/output" + "github.com/raids-lab/crater/cli/pkg/errorcodes" + "github.com/spf13/cobra" +) + +var fileRemoteRoots = []string{"user", "public", "account"} + +var fileCmd = &cobra.Command{ + Use: "file", + Short: "Download remote files", + Long: "Download files from user, public, and account storage spaces.", + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + return errUnknownSubcommand(cmd, args[0]) + } + return cmd.Help() + }, +} + +var fileDownloadCmd = &cobra.Command{ + Use: "download [local-path]", + Short: "Download one remote file", + Args: fileDownloadArgs, + RunE: runFileDownload, +} + +type fileDownloadDeps struct { + client func() (api.FileDownloadClient, error) + stdout io.Writer + json bool +} + +type fileDownloadInput struct { + remotePath string + localPath string + overwrite bool +} + +type fileDownloadResult struct { + RemotePath string + LocalPath string + Bytes int64 + Overwrite bool +} + +func fileDownloadArgs(cmd *cobra.Command, args []string) error { + if len(args) > 2 { + return errTooManyArgs(cmd, len(args), 2) + } + if len(args) == 0 { + return errUsageFromIssues([]usageIssue{{ + Code: errorcodes.ErrMissingRequiredFlag, + Message: i18n.T("err_missing_required_arg", i18n.T("file_label_remote_file"), "remote-file"), + Field: "remote-file", + }}) + } + return nil +} + +func runFileDownload(cmd *cobra.Command, args []string) error { + return runFileDownloadWith(cmd, args, fileDownloadDeps{ + client: activeFileDownloadClient, + stdout: os.Stdout, + json: outputJSON, + }) +} + +func activeFileDownloadClient() (api.FileDownloadClient, error) { + return activeAPIClient() +} + +func runFileDownloadWith(cmd *cobra.Command, args []string, deps fileDownloadDeps) error { + remotePath, err := normalizeRemotePath(args[0], false) + if err != nil { + return err + } + if len(strings.Split(remotePath, "/")) < 2 { + return invalidFilePathIssue(i18n.T("err_file_path_not_file", args[0])) + } + + localPath, err := resolveLocalDownloadPath(remotePath, args) + if err != nil { + return err + } + overwrite, _ := cmd.Flags().GetBool("overwrite") + result, err := downloadToLocal(cmd.Context(), deps.client, fileDownloadInput{ + remotePath: remotePath, + localPath: localPath, + overwrite: overwrite, + }) + if err != nil { + return err + } + return writeFileDownloadResult(deps.stdout, deps.json, result) +} + +func resolveLocalDownloadPath(remotePath string, args []string) (string, error) { + if len(args) == 1 { + return pathpkg.Base(remotePath), nil + } + raw := args[1] + if raw == "" || strings.HasSuffix(raw, string(filepath.Separator)) { + return "", invalidLocalPathIssue(i18n.T("err_file_local_path_invalid", raw)) + } + cleaned := filepath.Clean(raw) + if cleaned == "." || cleaned == string(filepath.Separator) { + return "", invalidLocalPathIssue(i18n.T("err_file_local_path_invalid", raw)) + } + return cleaned, nil +} + +func downloadToLocal( + ctx context.Context, + clientFactory func() (api.FileDownloadClient, error), + input fileDownloadInput, +) (fileDownloadResult, error) { + existed, err := inspectDownloadTarget(input.localPath) + if err != nil { + return fileDownloadResult{}, err + } + if existed && !input.overwrite { + return fileDownloadResult{}, invalidLocalPathIssue(i18n.T("err_file_local_exists", input.localPath)) + } + + parent := filepath.Dir(input.localPath) + prefix := "." + filepath.Base(input.localPath) + ".crater-" + temporary, err := os.CreateTemp(parent, prefix) + if err != nil { + return fileDownloadResult{}, localFileError("err_file_local_temp", input.localPath, err) + } + temporaryPath := temporary.Name() + temporaryOpen := true + defer func() { + if temporaryOpen { + _ = temporary.Close() + } + _ = os.Remove(temporaryPath) + }() + + client, err := clientFactory() + if err != nil { + return fileDownloadResult{}, err + } + written, err := client.DownloadFile(ctx, input.remotePath, temporary) + if err != nil { + var destinationErr *api.DestinationWriteError + if errors.As(err, &destinationErr) { + return fileDownloadResult{}, localFileError("err_file_local_write", input.localPath, destinationErr.Cause) + } + return fileDownloadResult{}, cliErrFromAPI(err) + } + if err := temporary.Sync(); err != nil { + return fileDownloadResult{}, localFileError("err_file_local_sync", input.localPath, err) + } + if err := temporary.Close(); err != nil { + temporaryOpen = false + return fileDownloadResult{}, localFileError("err_file_local_close", input.localPath, err) + } + temporaryOpen = false + + if input.overwrite { + if err := os.Rename(temporaryPath, input.localPath); err != nil { + return fileDownloadResult{}, localFileError("err_file_local_publish", input.localPath, err) + } + } else if err := os.Link(temporaryPath, input.localPath); err != nil { + if os.IsExist(err) { + return fileDownloadResult{}, invalidLocalPathIssue(i18n.T("err_file_local_exists", input.localPath)) + } + return fileDownloadResult{}, localFileError("err_file_local_publish", input.localPath, err) + } + + return fileDownloadResult{ + RemotePath: input.remotePath, + LocalPath: input.localPath, + Bytes: written, + Overwrite: input.overwrite, + }, nil +} + +func inspectDownloadTarget(localPath string) (bool, error) { + info, err := os.Lstat(localPath) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, localFileError("err_file_local_stat", localPath, err) + } + if info.IsDir() { + return false, invalidLocalPathIssue(i18n.T("err_file_local_directory", localPath)) + } + return true, nil +} + +func writeFileDownloadResult(writer io.Writer, jsonOutput bool, result fileDownloadResult) error { + if jsonOutput { + return output.WriteSuccessJSON(writer, output.SuccessEnvelope(map[string]interface{}{ + "remote_path": result.RemotePath, + "local_path": result.LocalPath, + "bytes": result.Bytes, + "overwrite": result.Overwrite, + })) + } + _, err := fmt.Fprintln(writer, i18n.T("file_download_success", result.RemotePath, result.LocalPath, result.Bytes)) + if err != nil { + return &clierror.Error{ + Category: errorcodes.CategorySystem, + Code: errorcodes.ErrCommandExecution, + Message: i18n.T("err_file_output", err.Error()), + Context: map[string]interface{}{"msg": err.Error()}, + } + } + return nil +} + +func localFileError(key, localPath string, cause error) *clierror.Error { + return &clierror.Error{ + Category: errorcodes.CategorySystem, + Code: errorcodes.ErrCommandExecution, + Message: i18n.T(key, localPath, cause.Error()), + Context: map[string]interface{}{ + "path": localPath, + "msg": cause.Error(), + }, + } +} + +func normalizeRemotePath(remotePath string, allowEmpty bool) (string, error) { + if remotePath == "" { + if allowEmpty { + return "", nil + } + return "", invalidFilePathIssue(i18n.T("err_file_path_invalid", remotePath)) + } + if strings.ContainsRune(remotePath, '\\') { + return "", invalidFilePathIssue(i18n.T("err_file_path_invalid", remotePath)) + } + for _, character := range remotePath { + if unicode.IsControl(character) { + return "", invalidFilePathIssue(i18n.T("err_file_path_invalid", remotePath)) + } + } + + trimmed := strings.Trim(remotePath, "/") + rawSegments := strings.Split(trimmed, "/") + segments := make([]string, 0, len(rawSegments)) + for _, segment := range rawSegments { + if segment == ".." { + return "", invalidFilePathIssue(i18n.T("err_file_path_invalid", remotePath)) + } + if segment == "" || segment == "." { + continue + } + segments = append(segments, segment) + } + if len(segments) == 0 { + if allowEmpty { + return "", nil + } + return "", invalidFilePathIssue(i18n.T("err_file_path_invalid", remotePath)) + } + if !isFileRemoteRoot(segments[0]) { + return "", invalidFilePathIssue(i18n.T("err_file_path_root", remotePath)) + } + return strings.Join(segments, "/"), nil +} + +func invalidFilePathIssue(message string) error { + return errUsageFromIssues([]usageIssue{{ + Code: errorcodes.ErrInvalidFlagValue, + Message: message, + Field: "remote-file", + }}) +} + +func invalidLocalPathIssue(message string) error { + return errUsageFromIssues([]usageIssue{{ + Code: errorcodes.ErrInvalidFlagValue, + Message: message, + Field: "local-path", + }}) +} + +func isFileRemoteRoot(value string) bool { + for _, root := range fileRemoteRoots { + if value == root { + return true + } + } + return false +} + +func fileRemoteRootCompleter(ctx completion.Context) ([]completion.Candidate, error) { + prefix := strings.ToLower(completion.CurrentWordPrefix(ctx)) + candidates := make([]completion.Candidate, 0, len(fileRemoteRoots)) + for _, root := range fileRemoteRoots { + if prefix != "" && !strings.HasPrefix(root, prefix) { + continue + } + candidates = append(candidates, completion.Candidate{ + Value: root, + Description: i18n.T("file_root_" + root + "_desc"), + }) + } + return candidates, nil +} + +func init() { + fileDownloadCmd.Flags().Bool("overwrite", false, "Replace an existing local file") + fileCmd.AddCommand(fileDownloadCmd) + rootCmd.AddCommand(fileCmd) + completion.RegisterPositional([]string{"file", "download"}, 0, fileRemoteRootCompleter) +} diff --git a/cli/cmd/file_test.go b/cli/cmd/file_test.go new file mode 100644 index 000000000..691603d00 --- /dev/null +++ b/cli/cmd/file_test.go @@ -0,0 +1,352 @@ +package cmd + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "io" + "os" + "path/filepath" + "reflect" + "testing" + + "github.com/raids-lab/crater/cli/internal/api" + "github.com/raids-lab/crater/cli/internal/clierror" + "github.com/raids-lab/crater/cli/internal/completion" + "github.com/raids-lab/crater/cli/pkg/errorcodes" + "github.com/spf13/cobra" +) + +type fakeFileDownloadClient struct { + download func(context.Context, string, io.Writer) (int64, error) +} + +func (client fakeFileDownloadClient) DownloadFile(ctx context.Context, remotePath string, destination io.Writer) (int64, error) { + return client.download(ctx, remotePath, destination) +} + +func testFileDownloadCommand(t *testing.T, overwrite bool) *cobra.Command { + t.Helper() + command := &cobra.Command{Use: "download"} + command.Flags().Bool("overwrite", false, "") + if overwrite { + if err := command.Flags().Set("overwrite", "true"); err != nil { + t.Fatal(err) + } + } + return command +} + +func TestNormalizeRemoteDownloadPath(t *testing.T) { + tests := []struct { + name string + input string + want string + wantErr bool + }{ + {name: "nested file", input: "user/results/model.bin", want: "user/results/model.bin"}, + {name: "unicode and spaces", input: "/account/实验 data/结果.bin/", want: "account/实验 data/结果.bin"}, + {name: "normalizes safe segments", input: "public//runs/./out.bin", want: "public/runs/out.bin"}, + {name: "empty", wantErr: true}, + {name: "unknown root", input: "admin/secret.bin", wantErr: true}, + {name: "parent traversal", input: "user/../public/secret.bin", wantErr: true}, + {name: "backslash", input: `user\secret.bin`, wantErr: true}, + {name: "control character", input: "user/file\nname", wantErr: true}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got, err := normalizeRemotePath(test.input, false) + if (err != nil) != test.wantErr { + t.Fatalf("normalizeRemotePath(%q) error = %v, wantErr %v", test.input, err, test.wantErr) + } + if got != test.want { + t.Fatalf("normalizeRemotePath(%q) = %q, want %q", test.input, got, test.want) + } + }) + } +} + +func TestResolveLocalDownloadPath(t *testing.T) { + if got, err := resolveLocalDownloadPath("user/results/model.bin", []string{"user/results/model.bin"}); err != nil || got != "model.bin" { + t.Fatalf("default local path = %q, %v", got, err) + } + if got, err := resolveLocalDownloadPath("user/results/model.bin", []string{"user/results/model.bin", "downloads/result.bin"}); err != nil || got != filepath.Join("downloads", "result.bin") { + t.Fatalf("explicit local path = %q, %v", got, err) + } + if _, err := resolveLocalDownloadPath("user/results/model.bin", []string{"user/results/model.bin", ""}); err == nil { + t.Fatal("empty local path should fail") + } +} + +func TestRunFileDownloadRejectsInvalidRemoteBeforeClient(t *testing.T) { + factoryCalls := 0 + err := runFileDownloadWith( + testFileDownloadCommand(t, false), + []string{"user/../public/secret.bin"}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + factoryCalls++ + return nil, errors.New("must not be called") + }, + stdout: io.Discard, + }, + ) + if err == nil { + t.Fatal("invalid remote path should fail") + } + if factoryCalls != 0 { + t.Fatalf("factory calls = %d, want 0", factoryCalls) + } +} + +func TestRunFileDownloadRejectsLogicalRootAsFile(t *testing.T) { + factoryCalls := 0 + err := runFileDownloadWith( + testFileDownloadCommand(t, false), + []string{"user"}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + factoryCalls++ + return nil, errors.New("must not be called") + }, + stdout: io.Discard, + }, + ) + if err == nil { + t.Fatal("logical root should not be downloadable as a file") + } + if factoryCalls != 0 { + t.Fatalf("factory calls = %d, want 0", factoryCalls) + } +} + +func TestRunFileDownloadExistingTargetNeedsOverwriteBeforeClient(t *testing.T) { + directory := t.TempDir() + target := filepath.Join(directory, "result.bin") + if err := os.WriteFile(target, []byte("old"), 0o600); err != nil { + t.Fatal(err) + } + factoryCalls := 0 + err := runFileDownloadWith( + testFileDownloadCommand(t, false), + []string{"user/results/result.bin", target}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + factoryCalls++ + return nil, errors.New("must not be called") + }, + stdout: io.Discard, + }, + ) + if err == nil { + t.Fatal("existing target should fail without --overwrite") + } + if factoryCalls != 0 { + t.Fatalf("factory calls = %d, want 0", factoryCalls) + } + assertFileContent(t, target, []byte("old")) + assertNoDownloadTemps(t, target) +} + +func TestRunFileDownloadOverwriteIsAtomicAndJSONContainsOnlyMetadata(t *testing.T) { + directory := t.TempDir() + target := filepath.Join(directory, "result.bin") + if err := os.WriteFile(target, []byte("old"), 0o600); err != nil { + t.Fatal(err) + } + payload := []byte{0x00, 0xff, 'N', 'E', 'W'} + var stdout bytes.Buffer + err := runFileDownloadWith( + testFileDownloadCommand(t, true), + []string{"user/results/result.bin", target}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + return fakeFileDownloadClient{download: func(_ context.Context, remotePath string, destination io.Writer) (int64, error) { + if remotePath != "user/results/result.bin" { + t.Fatalf("remote path = %q", remotePath) + } + written, err := destination.Write(payload) + return int64(written), err + }}, nil + }, + stdout: &stdout, + json: true, + }, + ) + if err != nil { + t.Fatalf("runFileDownloadWith: %v", err) + } + assertFileContent(t, target, payload) + assertNoDownloadTemps(t, target) + if bytes.Contains(stdout.Bytes(), payload) { + t.Fatalf("stdout contains binary payload: %q", stdout.Bytes()) + } + var envelope struct { + Status string `json:"status"` + Data struct { + RemotePath string `json:"remote_path"` + LocalPath string `json:"local_path"` + Bytes int64 `json:"bytes"` + Overwrite bool `json:"overwrite"` + } `json:"data"` + } + if err := json.Unmarshal(stdout.Bytes(), &envelope); err != nil { + t.Fatalf("decode stdout: %v\n%s", err, stdout.String()) + } + if envelope.Status != "OK" || envelope.Data.RemotePath != "user/results/result.bin" || + envelope.Data.LocalPath != target || envelope.Data.Bytes != int64(len(payload)) || !envelope.Data.Overwrite { + t.Fatalf("envelope = %#v", envelope) + } +} + +func TestRunFileDownloadDefaultPublishesWithoutOverwrite(t *testing.T) { + directory := t.TempDir() + target := filepath.Join(directory, "result.bin") + payload := []byte("new download") + err := runFileDownloadWith( + testFileDownloadCommand(t, false), + []string{"user/results/result.bin", target}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + return fakeFileDownloadClient{download: func(_ context.Context, _ string, destination io.Writer) (int64, error) { + written, writeErr := destination.Write(payload) + return int64(written), writeErr + }}, nil + }, + stdout: io.Discard, + }, + ) + if err != nil { + t.Fatalf("runFileDownloadWith: %v", err) + } + assertFileContent(t, target, payload) + assertNoDownloadTemps(t, target) +} + +func TestRunFileDownloadFailureKeepsOldTargetAndCleansTemp(t *testing.T) { + directory := t.TempDir() + target := filepath.Join(directory, "result.bin") + if err := os.WriteFile(target, []byte("old"), 0o600); err != nil { + t.Fatal(err) + } + sentinel := errors.New("connection reset") + err := runFileDownloadWith( + testFileDownloadCommand(t, true), + []string{"user/results/result.bin", target}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + return fakeFileDownloadClient{download: func(_ context.Context, _ string, destination io.Writer) (int64, error) { + written, writeErr := destination.Write([]byte("partial")) + if writeErr != nil { + return int64(written), writeErr + } + return int64(written), &api.NetworkError{Cause: sentinel} + }}, nil + }, + stdout: io.Discard, + }, + ) + if err == nil { + t.Fatal("partial network failure should fail") + } + var cliErr *clierror.Error + if !errors.As(err, &cliErr) || cliErr.Category != errorcodes.CategoryAPI { + t.Fatalf("error = %T %v, want API cli error", err, err) + } + assertFileContent(t, target, []byte("old")) + assertNoDownloadTemps(t, target) +} + +func TestRunFileDownloadDestinationWriteErrorIsSystemError(t *testing.T) { + directory := t.TempDir() + target := filepath.Join(directory, "result.bin") + sentinel := errors.New("disk full") + err := runFileDownloadWith( + testFileDownloadCommand(t, false), + []string{"user/results/result.bin", target}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + return fakeFileDownloadClient{download: func(context.Context, string, io.Writer) (int64, error) { + return 0, &api.DestinationWriteError{Cause: sentinel} + }}, nil + }, + stdout: io.Discard, + }, + ) + var cliErr *clierror.Error + if !errors.As(err, &cliErr) || cliErr.Category != errorcodes.CategorySystem { + t.Fatalf("error = %T %v, want system cli error", err, err) + } + assertNoDownloadTemps(t, target) +} + +func TestRunFileDownloadNoOverwriteDetectsLateConflict(t *testing.T) { + directory := t.TempDir() + target := filepath.Join(directory, "result.bin") + err := runFileDownloadWith( + testFileDownloadCommand(t, false), + []string{"user/results/result.bin", target}, + fileDownloadDeps{ + client: func() (api.FileDownloadClient, error) { + return fakeFileDownloadClient{download: func(_ context.Context, _ string, destination io.Writer) (int64, error) { + written, writeErr := destination.Write([]byte("download")) + if writeErr != nil { + return int64(written), writeErr + } + if err := os.WriteFile(target, []byte("racer"), 0o600); err != nil { + t.Fatal(err) + } + return int64(written), nil + }}, nil + }, + stdout: io.Discard, + }, + ) + if err == nil { + t.Fatal("late target conflict should fail") + } + assertFileContent(t, target, []byte("racer")) + assertNoDownloadTemps(t, target) +} + +func TestFileRemoteRootCompleter(t *testing.T) { + candidates, err := fileRemoteRootCompleter(completion.Context{ + Words: []string{"crater", "file", "download", "a"}, + Current: 4, + }) + if err != nil { + t.Fatal(err) + } + got := make([]string, len(candidates)) + for index := range candidates { + got[index] = candidates[index].Value + } + if !reflect.DeepEqual(got, []string{"account"}) { + t.Fatalf("candidate values = %#v", got) + } +} + +func assertFileContent(t *testing.T, path string, want []byte) { + t.Helper() + got, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, want) { + t.Fatalf("%s content = %v, want %v", path, got, want) + } +} + +func assertNoDownloadTemps(t *testing.T, target string) { + t.Helper() + pattern := filepath.Join(filepath.Dir(target), "."+filepath.Base(target)+".crater-*") + matches, err := filepath.Glob(pattern) + if err != nil { + t.Fatal(err) + } + if len(matches) != 0 { + t.Fatalf("temporary files remain: %#v", matches) + } +} diff --git a/cli/docs/COMMANDS.md b/cli/docs/COMMANDS.md index 4b75a41c3..c83fee718 100644 --- a/cli/docs/COMMANDS.md +++ b/cli/docs/COMMANDS.md @@ -772,3 +772,33 @@ This section records the read-only API surface covered by the CLI after the broa - `crater admin cronjobs`: `/api/v1/admin/operations/cronjob`. - `crater admin whitelist`: `/api/v1/admin/operations/whitelist`. - These commands surface existing admin GET APIs only. They do not perform update/delete/reconcile actions. + +--- + +## 8. 远端文件模块 (file) + +本模块面向普通用户访问 storage service 暴露的逻辑文件空间。远端路径不是本机路径,只允许以 `user`、`public` 或 `account` 为首段;CLI 会规范化安全的 `.`、重复分隔符和首尾分隔符,逐段进行 URL 编码,保留合法的空格与非 ASCII 文件名,并在请求前拒绝任何 `..` 段、反斜杠和控制字符。 + +### `crater file download [local-path]` + +- **描述**:把一个远端普通文件流式下载到本机。 +- **位置参数**: + - ``(必填):逻辑远端文件路径,必须指向 `user`、`public` 或 `account` 下的具体条目,不能只给逻辑根。 + - `[local-path]`(可选):目标本地文件路径;不是目录。省略时使用远端路径的最后一段作为当前目录下的文件名。 +- **选项**: + - `--overwrite`(bool):允许原子替换已存在的本地文件;默认拒绝覆盖。 +- **处理逻辑**: + - 调用 `GET /api/ss/download/*path`,响应内容直接流式写入目标同目录的临时文件,不把完整文件读入内存。 + - 完整传输后依次同步、关闭临时文件。启用 `--overwrite` 时通过同目录重命名原子替换;默认模式通过原子 no-clobber 发布保证并发出现的目标也不会被覆盖。 + - 失败时清理临时文件;即使使用 `--overwrite`,也不会在下载完成前删除或截断原文件。 + - 未使用 `--overwrite` 时,请求前会检查目标是否已存在,最终发布本身也采用原子 no-clobber 语义,避免检查与发布之间的竞态覆盖。 + - 不支持目录递归下载、断点续传、并行分片或进度条。 +- **输出格式**: + - 默认模式:成功后展示远端路径、本地路径和写入字节数。 + - `--json`:仅在下载成功后向 stdout 输出结果元数据;文件内容永远不会写入 stdout。 +- **`--json` 的 `data`**: + - `remote_path`(字符串):规范化后的逻辑远端路径。 + - `local_path`(字符串):实际目标本地路径。 + - `bytes`(整数):写入字节数。 + - `overwrite`(布尔):本次是否启用了显式覆盖选项。 +- **状态**:[x] Completed diff --git a/cli/internal/api/file.go b/cli/internal/api/file.go new file mode 100644 index 000000000..2cd217bfa --- /dev/null +++ b/cli/internal/api/file.go @@ -0,0 +1,134 @@ +package api + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/url" + "strings" + + "github.com/imroc/req/v3" +) + +const maxFileErrorBody = 32 << 10 + +// FileDownloadClient exposes the streaming remote-file download API. +type FileDownloadClient interface { + DownloadFile(ctx context.Context, remotePath string, destination io.Writer) (int64, error) +} + +// NewFileDownloadClient creates a typed remote-file download client. +func NewFileDownloadClient(baseURL, token string) FileDownloadClient { + return NewClient(baseURL).SetToken(token) +} + +// DestinationWriteError identifies a failure writing the downloaded stream to +// the caller-owned destination. The command layer maps this to a local system +// error rather than an API error. +type DestinationWriteError struct { + Cause error +} + +func (e *DestinationWriteError) Error() string { + return "write download destination: " + e.Cause.Error() +} + +func (e *DestinationWriteError) Unwrap() error { + if e == nil { + return nil + } + return e.Cause +} + +// DownloadFile streams one remote file into destination without buffering the +// full response in memory. +func (c *Client) DownloadFile(ctx context.Context, remotePath string, destination io.Writer) (int64, error) { + requestPath := FileDownloadPath + "/" + escapeRemotePath(remotePath) + resp, err := c.httpClient.R(). + SetContext(ctx). + DisableAutoReadResponse(). + Get(requestPath) + if err != nil { + return 0, &NetworkError{Cause: err} + } + if !resp.IsSuccessState() { + if resp.Body == nil { + return 0, &RequestError{ + HTTPStatus: resp.GetStatusCode(), + Msg: http.StatusText(resp.GetStatusCode()), + } + } + defer resp.Body.Close() + return 0, rawFileRequestError(resp) + } + if resp.Body == nil { + return 0, &NetworkError{Cause: io.ErrUnexpectedEOF} + } + defer resp.Body.Close() + + tracked := &downloadDestinationWriter{destination: destination} + written, copyErr := io.Copy(tracked, resp.Body) + if copyErr != nil { + if tracked.writeErr != nil { + return written, &DestinationWriteError{Cause: tracked.writeErr} + } + return written, &NetworkError{Cause: copyErr} + } + return written, nil +} + +type downloadDestinationWriter struct { + destination io.Writer + writeErr error +} + +func (writer *downloadDestinationWriter) Write(data []byte) (int, error) { + written, err := writer.destination.Write(data) + if err != nil { + writer.writeErr = err + } else if written != len(data) { + writer.writeErr = io.ErrShortWrite + } + return written, err +} + +func rawFileRequestError(resp *req.Response) error { + body, readErr := io.ReadAll(io.LimitReader(resp.Body, maxFileErrorBody+1)) + if readErr != nil { + message := http.StatusText(resp.GetStatusCode()) + if message == "" { + message = "failed to read error response" + } + return &RequestError{ + HTTPStatus: resp.GetStatusCode(), + Msg: message + ": " + readErr.Error(), + } + } + if len(body) > maxFileErrorBody { + body = body[:maxFileErrorBody] + } + + var envelope Response[json.RawMessage] + _ = json.Unmarshal(body, &envelope) + message := strings.TrimSpace(envelope.Message) + if message == "" { + message = strings.TrimSpace(strings.ToValidUTF8(string(body), "\uFFFD")) + } + if message == "" { + message = http.StatusText(resp.GetStatusCode()) + } + return &RequestError{ + HTTPStatus: resp.GetStatusCode(), + CraterCode: envelope.Code, + Msg: message, + } +} + +func escapeRemotePath(remotePath string) string { + segments := strings.Split(remotePath, "/") + for index := range segments { + segments[index] = url.PathEscape(segments[index]) + } + return strings.Join(segments, "/") +} diff --git a/cli/internal/api/file_test.go b/cli/internal/api/file_test.go new file mode 100644 index 000000000..789a2e031 --- /dev/null +++ b/cli/internal/api/file_test.go @@ -0,0 +1,207 @@ +package api + +import ( + "bytes" + "context" + "errors" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/imroc/req/v3" +) + +type signalingWriter struct { + bytes.Buffer + firstWrite chan struct{} + signaled bool +} + +func (writer *signalingWriter) Write(data []byte) (int, error) { + written, err := writer.Buffer.Write(data) + if !writer.signaled { + writer.signaled = true + close(writer.firstWrite) + } + return written, err +} + +func TestDownloadFileStreamsAndEncodesPathSegments(t *testing.T) { + firstDestinationWrite := make(chan struct{}) + handlerDone := make(chan error, 1) + firstChunk := []byte{0x00, 0x01, 0xff, 'A'} + secondChunk := []byte("第二块") + + server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + if request.Method != http.MethodGet { + handlerDone <- errors.New("unexpected method: " + request.Method) + return + } + wantPath := "/api/ss/download/user/%E5%AE%9E%E9%AA%8C%20%231/100%25.bin" + if request.URL.EscapedPath() != wantPath { + handlerDone <- errors.New("unexpected escaped path: " + request.URL.EscapedPath()) + return + } + writer.Header().Set("Content-Type", "application/octet-stream") + writer.WriteHeader(http.StatusOK) + _, _ = writer.Write(firstChunk) + if flusher, ok := writer.(http.Flusher); ok { + flusher.Flush() + } + select { + case <-firstDestinationWrite: + case <-time.After(2 * time.Second): + handlerDone <- errors.New("client buffered the response before writing") + return + } + _, _ = writer.Write(secondChunk) + handlerDone <- nil + })) + defer server.Close() + + destination := &signalingWriter{firstWrite: firstDestinationWrite} + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + written, err := NewClient(server.URL).DownloadFile(ctx, "user/实验 #1/100%.bin", destination) + if err != nil { + t.Fatalf("DownloadFile: %v", err) + } + if handlerErr := <-handlerDone; handlerErr != nil { + t.Fatal(handlerErr) + } + want := append(append([]byte{}, firstChunk...), secondChunk...) + if !bytes.Equal(destination.Bytes(), want) { + t.Fatalf("downloaded bytes = %v, want %v", destination.Bytes(), want) + } + if written != int64(len(want)) { + t.Fatalf("written = %d, want %d", written, len(want)) + } +} + +func TestDownloadFileDecodesJSONAndPlainTextErrors(t *testing.T) { + tests := []struct { + name string + status int + body string + content string + wantCode int + wantMsg string + }{ + { + name: "Crater envelope", + status: http.StatusNotFound, + body: `{"code":40401,"data":null,"msg":"remote file not found"}`, + content: "application/json", + wantCode: 40401, + wantMsg: "remote file not found", + }, + { + name: "plain text", + status: http.StatusConflict, + body: "download conflict", + content: "text/plain", + wantMsg: "download conflict", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + writer.Header().Set("Content-Type", test.content) + writer.WriteHeader(test.status) + _, _ = io.WriteString(writer, test.body) + })) + defer server.Close() + + _, err := NewClient(server.URL).DownloadFile(context.Background(), "user/result.bin", io.Discard) + var requestErr *RequestError + if !errors.As(err, &requestErr) { + t.Fatalf("error = %T %v, want *RequestError", err, err) + } + if requestErr.HTTPStatus != test.status || requestErr.CraterCode != test.wantCode || requestErr.Msg != test.wantMsg { + t.Fatalf("request error = %#v", requestErr) + } + }) + } +} + +type failingWriter struct { + err error +} + +func (writer failingWriter) Write([]byte) (int, error) { + return 0, writer.err +} + +func TestDownloadFileIdentifiesDestinationWriteFailure(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + writer.WriteHeader(http.StatusOK) + _, _ = writer.Write([]byte("binary")) + })) + defer server.Close() + + sentinel := errors.New("disk full") + _, err := NewClient(server.URL).DownloadFile(context.Background(), "user/result.bin", failingWriter{err: sentinel}) + var writeErr *DestinationWriteError + if !errors.As(err, &writeErr) { + t.Fatalf("error = %T %v, want *DestinationWriteError", err, err) + } + if !errors.Is(writeErr, sentinel) { + t.Fatalf("error = %v, want sentinel", writeErr) + } +} + +func TestRawFileRequestErrorUsesStatusTextForEmptyBody(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + writer.WriteHeader(http.StatusBadGateway) + })) + defer server.Close() + + _, err := NewClient(server.URL).DownloadFile(context.Background(), "user/result.bin", io.Discard) + var requestErr *RequestError + if !errors.As(err, &requestErr) { + t.Fatalf("error = %T %v, want *RequestError", err, err) + } + if requestErr.Msg != http.StatusText(http.StatusBadGateway) { + t.Fatalf("message = %q", requestErr.Msg) + } +} + +type failingReadCloser struct { + err error +} + +func (reader failingReadCloser) Read([]byte) (int, error) { + return 0, reader.err +} + +func (failingReadCloser) Close() error { + return nil +} + +func TestDownloadFileKeepsHTTPStatusWhenErrorBodyReadFails(t *testing.T) { + sentinel := errors.New("broken error body") + client := NewClient("https://example.invalid") + client.httpClient.GetTransport().WrapRoundTripFunc(func(_ http.RoundTripper) req.HttpRoundTripFunc { + return func(request *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusNotFound, + Status: "404 Not Found", + Header: make(http.Header), + Body: failingReadCloser{err: sentinel}, + Request: request, + }, nil + } + }) + + _, err := client.DownloadFile(context.Background(), "user/missing.bin", io.Discard) + var requestErr *RequestError + if !errors.As(err, &requestErr) { + t.Fatalf("error = %T %v, want *RequestError", err, err) + } + if requestErr.HTTPStatus != http.StatusNotFound || requestErr.Msg != "Not Found: broken error body" { + t.Fatalf("request error = %#v", requestErr) + } +} diff --git a/cli/internal/api/paths.go b/cli/internal/api/paths.go index 6ccc6fce4..fb627cac1 100644 --- a/cli/internal/api/paths.go +++ b/cli/internal/api/paths.go @@ -27,6 +27,7 @@ const ( AdminQueueQuotasPfx = "/api/v1/admin/queue-quotas" AdminGPUAnalysisPfx = "/api/v1/admin/gpu-analysis" SystemConfigPrefix = "/api/v1/system-config" + StoragePrefix = "/api/ss" AdminSysConfigPfx = "/api/v1/admin/system-config" UsersPrefix = "/api/v1/users" AdminUsersPrefix = "/api/v1/admin/users" @@ -54,4 +55,5 @@ const ( VCJobListPath = VCJobsPrefix VCJobBillingPath = VCJobsPrefix + "/billing" AdminVCJobBillingPath = AdminVCJobsPrefix + "/billing" + FileDownloadPath = StoragePrefix + "/download" ) diff --git a/cli/internal/i18n/catalog_file.go b/cli/internal/i18n/catalog_file.go new file mode 100644 index 000000000..fd3e05d64 --- /dev/null +++ b/cli/internal/i18n/catalog_file.go @@ -0,0 +1,52 @@ +package i18n + +var catalogFile = map[Language]map[string]string{ + En: { + "file_short": "Download remote files", + "file_long": "Download files from user, public, and account storage spaces.", + "file_download_short": "Download one remote file", + "file_download_flag_overwrite": "Replace an existing local file", + "file_label_remote_file": "remote file", + "err_file_path_invalid": "invalid remote path %q", + "err_file_path_root": "remote path must start with user, public, or account: %q", + "err_file_path_not_file": "remote file must name an entry below user, public, or account: %q", + "err_file_local_path_invalid": "invalid local path %q", + "err_file_local_exists": "local path already exists; use --overwrite to replace it: %q", + "err_file_local_directory": "local path is a directory, not a file: %q", + "err_file_local_stat": "failed to inspect local path %q: %s", + "err_file_local_temp": "failed to create a temporary file for %q: %s", + "err_file_local_write": "failed to write local file %q: %s", + "err_file_local_sync": "failed to sync local file %q: %s", + "err_file_local_close": "failed to close local file %q: %s", + "err_file_local_publish": "failed to atomically publish local file %q: %s", + "err_file_output": "failed to write command output: %s", + "file_download_success": "Downloaded %s to %s (%d bytes)", + "file_root_user_desc": "Your private user storage.", + "file_root_public_desc": "Shared public storage.", + "file_root_account_desc": "Storage for the current account.", + }, + ZhCN: { + "file_short": "下载远端文件", + "file_long": "从用户、公共及当前账户存储空间下载文件。", + "file_download_short": "下载单个远端文件", + "file_download_flag_overwrite": "替换已存在的本地文件", + "file_label_remote_file": "远端文件", + "err_file_path_invalid": "无效的远端路径 %q", + "err_file_path_root": "远端路径必须以 user、public 或 account 开头:%q", + "err_file_path_not_file": "远端文件必须指向 user、public 或 account 下的具体条目:%q", + "err_file_local_path_invalid": "无效的本地路径 %q", + "err_file_local_exists": "本地路径已存在;如需替换请使用 --overwrite:%q", + "err_file_local_directory": "本地路径是目录而不是文件:%q", + "err_file_local_stat": "检查本地路径 %q 失败:%s", + "err_file_local_temp": "为 %q 创建临时文件失败:%s", + "err_file_local_write": "写入本地文件 %q 失败:%s", + "err_file_local_sync": "同步本地文件 %q 失败:%s", + "err_file_local_close": "关闭本地文件 %q 失败:%s", + "err_file_local_publish": "原子发布本地文件 %q 失败:%s", + "err_file_output": "写入命令输出失败:%s", + "file_download_success": "已将 %s 下载到 %s(%d 字节)", + "file_root_user_desc": "当前用户的私有存储空间", + "file_root_public_desc": "共享公共存储空间", + "file_root_account_desc": "当前账户的存储空间", + }, +} diff --git a/cli/internal/i18n/i18n.go b/cli/internal/i18n/i18n.go index c2a68e3a2..003729a13 100644 --- a/cli/internal/i18n/i18n.go +++ b/cli/internal/i18n/i18n.go @@ -24,6 +24,7 @@ var translations = mergeCatalogs( catalogCompletion, catalogCompatibility, catalogDownload, + catalogFile, catalogRead, catalogImage, catalogOrder, diff --git a/cli/skills/crater-cli-file/SKILL.md b/cli/skills/crater-cli-file/SKILL.md new file mode 100644 index 000000000..2ad804d1f --- /dev/null +++ b/cli/skills/crater-cli-file/SKILL.md @@ -0,0 +1,58 @@ +--- +name: crater-cli-file +version: 0.1.0 +description: "Use Crater CLI to download one ordinary-user remote file safely and atomically." +metadata: + requires: + bins: ["crater"] + cliHelp: "crater file --help" +--- + +# Crater CLI File Download + +**CRITICAL — Before doing anything else, MUST read `crater-cli-shared` (possible path: [`../crater-cli-shared/SKILL.md`](../crater-cli-shared/SKILL.md)) for global options, non-interactive use, errors, and sensitive information handling.** + +Use `crater file download` when a user wants to copy one remote file from Crater storage to the local machine. + +## Supported workflow + +- Download to the current directory using the remote basename: + + ```bash + crater file download user/results/model.bin + ``` + +- Choose an exact local file path: + + ```bash + crater file download "account/共享数据/result.bin" ./downloads/result.bin + ``` + +- Replace an existing local file only after the user explicitly asks for it: + + ```bash + crater file download user/results/model.bin ./model.bin --overwrite + ``` + +- Return structured metadata: + + ```bash + crater file download user/results/model.bin ./model.bin --json --no-interactive + ``` + +## Safety + +- Remote paths must start with `user`, `public`, or `account` and must name an entry below that root. +- Never add `--overwrite` unless replacing the exact local target is part of the user's request. +- The optional local path is a file path, not a directory. +- The command downloads one file only; it does not recursively download directories. +- Binary content is written only to the target file. JSON stdout contains metadata, not file bytes. +- Do not ask the user to provide a token or Keyring content. + +## Troubleshooting + +1. Run `crater auth ls --json` and confirm an active context exists. +2. Use `crater file download --help` to verify the local binary supports the command. +3. If the target exists, choose another path or obtain explicit permission to use `--overwrite`. +4. If a transfer fails, the final target is not published and the temporary file is cleaned up. +5. For API errors, inspect `category`, `code`, and `context.http_status` from JSON stderr without exposing credentials. diff --git a/cli/test/snapshots/file/file_test.go b/cli/test/snapshots/file/file_test.go new file mode 100644 index 000000000..abe1e0836 --- /dev/null +++ b/cli/test/snapshots/file/file_test.go @@ -0,0 +1,72 @@ +package file_test + +import ( + "os" + "path/filepath" + "testing" + + "github.com/raids-lab/crater/cli/internal/snaptest" +) + +const goldenStemFile = "file_download" + +func TestFileDownloadSnapshotsEN(t *testing.T) { + runFileDownloadSnapshots(t, "en") +} + +func TestFileDownloadSnapshotsZhCN(t *testing.T) { + runFileDownloadSnapshots(t, "zh-CN") +} + +func runFileDownloadSnapshots(t *testing.T, language string) { + t.Helper() + path := snaptest.GoldenFileT(t, "file", goldenStemFile, language) + home := t.TempDir() + baseEnv := snaptest.EnvMinimal(home, language) + binary := snaptest.CraterExecutable(t) + localTarget := "snapshot-download-" + language + ".bin" + cases := []snaptest.Case{ + {ID: "01-file-typo-json", Args: []string{"file", "get", "--json", "--no-interactive"}}, + {ID: "01b-file-typo-text", Args: []string{"file", "get", "--no-interactive"}}, + {ID: "02-file-download-missing-json", Args: []string{"file", "download", "--json", "--no-interactive"}}, + {ID: "03-file-download-extra-arg-json", Args: []string{"file", "download", "user/a.bin", "local.bin", "extra", "--json", "--no-interactive"}}, + {ID: "04-file-download-traversal-json", Args: []string{"file", "download", "user/../public/a.bin", "--json", "--no-interactive"}}, + {ID: "05-file-download-root-json", Args: []string{"file", "download", "user", "--json", "--no-interactive"}}, + {ID: "06-file-download-404-json", Args: []string{"file", "download", "user/实验 data/result.bin", localTarget, "--overwrite", "--json", "--no-interactive"}}, + {ID: "07-file-help", Args: []string{"file", "--help"}}, + {ID: "08-file-download-help", Args: []string{"file", "download", "--help"}}, + } + + results := make([]*snaptest.Result, len(cases)) + for index := range cases { + environment := baseEnv + if cases[index].ID == "06-file-download-404-json" { + environment = append(baseEnv, "CRATER_TEST_SANDBOX_HTTP=error404") + } + result, err := snaptest.Run(binary, environment, cases[index].Args) + if err != nil { + t.Fatalf("case %s: %v", cases[index].ID, err) + } + results[index] = result + } + assertNoSnapshotDownloadArtifacts(t, localTarget) + + update := os.Getenv("UPDATE_SNAPSHOTS") == "1" || os.Getenv("UPDATE_SNAPSHOTS") == "true" + if err := snaptest.MatchOrUpdateGolden(path, language, cases, results, update); err != nil { + t.Fatal(err) + } +} + +func assertNoSnapshotDownloadArtifacts(t *testing.T, target string) { + t.Helper() + if _, err := os.Lstat(target); !os.IsNotExist(err) { + t.Fatalf("snapshot target was not cleaned up: %s (err=%v)", target, err) + } + matches, err := filepath.Glob("." + filepath.Base(target) + ".crater-*") + if err != nil { + t.Fatal(err) + } + if len(matches) != 0 { + t.Fatalf("snapshot temporary files remain: %#v", matches) + } +} diff --git a/cli/testdata/snapshots/file/file_download.en.txtar b/cli/testdata/snapshots/file/file_download.en.txtar new file mode 100644 index 000000000..41dee6eed --- /dev/null +++ b/cli/testdata/snapshots/file/file_download.en.txtar @@ -0,0 +1,120 @@ +# Crater CLI snapshot bundle (txtar). Regenerate: make snapshot-update (or UPDATE_SNAPSHOTS=1 go test ./test/snapshots/...) +-- en/01-file-typo-json/argv -- +crater file get --json --no-interactive +-- en/01-file-typo-json/exit -- +2 +-- en/01-file-typo-json/stdout -- +-- en/01-file-typo-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_UNKNOWN_COMMAND", + "message": "unknown command \"get\" for \"crater file\"\nRun \"crater file --help\" for usage." +} +-- en/01b-file-typo-text/argv -- +crater file get --no-interactive +-- en/01b-file-typo-text/exit -- +2 +-- en/01b-file-typo-text/stdout -- +-- en/01b-file-typo-text/stderr -- +Error: + unknown command "get" for "crater file" + Run "crater file --help" for usage. +-- en/02-file-download-missing-json/argv -- +crater file download --json --no-interactive +-- en/02-file-download-missing-json/exit -- +2 +-- en/02-file-download-missing-json/stdout -- +-- en/02-file-download-missing-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_MISSING_REQUIRED_FLAG", + "message": "remote file is required (\u003cremote-file\u003e)" +} +-- en/03-file-download-extra-arg-json/argv -- +crater file download user/a.bin local.bin extra --json --no-interactive +-- en/03-file-download-extra-arg-json/exit -- +2 +-- en/03-file-download-extra-arg-json/stdout -- +-- en/03-file-download-extra-arg-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_INVALID_FLAG_VALUE", + "message": "too many arguments for crater file download: got 3, want at most 2" +} +-- en/04-file-download-traversal-json/argv -- +crater file download user/../public/a.bin --json --no-interactive +-- en/04-file-download-traversal-json/exit -- +2 +-- en/04-file-download-traversal-json/stdout -- +-- en/04-file-download-traversal-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_INVALID_FLAG_VALUE", + "message": "invalid remote path \"user/../public/a.bin\"" +} +-- en/05-file-download-root-json/argv -- +crater file download user --json --no-interactive +-- en/05-file-download-root-json/exit -- +2 +-- en/05-file-download-root-json/stdout -- +-- en/05-file-download-root-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_INVALID_FLAG_VALUE", + "message": "remote file must name an entry below user, public, or account: \"user\"" +} +-- en/06-file-download-404-json/argv -- +crater file download user/实验 data/result.bin snapshot-download-en.bin --overwrite --json --no-interactive +-- en/06-file-download-404-json/exit -- +4 +-- en/06-file-download-404-json/stdout -- +-- en/06-file-download-404-json/stderr -- +{ + "category": "api_error", + "code": "ERR_NOT_FOUND_404", + "message": "HTTP 404: simulated", + "context": { + "crater_code": 404, + "http_status": 404, + "msg": "simulated" + } +} +-- en/07-file-help/argv -- +crater file --help +-- en/07-file-help/exit -- +0 +-- en/07-file-help/stdout -- +Download files from user, public, and account storage spaces. + +Usage: + crater file [flags] + crater file [command] + +Available Commands: + download Download one remote file + +Global Flags: + -h, --help Help for crater + --json Output in raw JSON format + --no-interactive Disable interactive prompts + +Use "crater file [command] --help" for more information about a command. +-- en/07-file-help/stderr -- +-- en/08-file-download-help/argv -- +crater file download --help +-- en/08-file-download-help/exit -- +0 +-- en/08-file-download-help/stdout -- +Download one remote file + +Usage: + crater file download [local-path] [flags] + +Flags: + --overwrite Replace an existing local file + +Global Flags: + -h, --help Help for crater + --json Output in raw JSON format + --no-interactive Disable interactive prompts +-- en/08-file-download-help/stderr -- diff --git a/cli/testdata/snapshots/file/file_download.zh-CN.txtar b/cli/testdata/snapshots/file/file_download.zh-CN.txtar new file mode 100644 index 000000000..47d1678f0 --- /dev/null +++ b/cli/testdata/snapshots/file/file_download.zh-CN.txtar @@ -0,0 +1,120 @@ +# Crater CLI snapshot bundle (txtar). Regenerate: make snapshot-update (or UPDATE_SNAPSHOTS=1 go test ./test/snapshots/...) +-- zh-CN/01-file-typo-json/argv -- +crater file get --json --no-interactive +-- zh-CN/01-file-typo-json/exit -- +2 +-- zh-CN/01-file-typo-json/stdout -- +-- zh-CN/01-file-typo-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_UNKNOWN_COMMAND", + "message": "unknown command \"get\" for \"crater file\"\nRun \"crater file --help\" for usage." +} +-- zh-CN/01b-file-typo-text/argv -- +crater file get --no-interactive +-- zh-CN/01b-file-typo-text/exit -- +2 +-- zh-CN/01b-file-typo-text/stdout -- +-- zh-CN/01b-file-typo-text/stderr -- +Error: + unknown command "get" for "crater file" + Run "crater file --help" for usage. +-- zh-CN/02-file-download-missing-json/argv -- +crater file download --json --no-interactive +-- zh-CN/02-file-download-missing-json/exit -- +2 +-- zh-CN/02-file-download-missing-json/stdout -- +-- zh-CN/02-file-download-missing-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_MISSING_REQUIRED_FLAG", + "message": "缺少必要参数:远端文件 (\u003cremote-file\u003e)" +} +-- zh-CN/03-file-download-extra-arg-json/argv -- +crater file download user/a.bin local.bin extra --json --no-interactive +-- zh-CN/03-file-download-extra-arg-json/exit -- +2 +-- zh-CN/03-file-download-extra-arg-json/stdout -- +-- zh-CN/03-file-download-extra-arg-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_INVALID_FLAG_VALUE", + "message": "crater file download 的参数过多:收到 3 个,最多允许 2 个" +} +-- zh-CN/04-file-download-traversal-json/argv -- +crater file download user/../public/a.bin --json --no-interactive +-- zh-CN/04-file-download-traversal-json/exit -- +2 +-- zh-CN/04-file-download-traversal-json/stdout -- +-- zh-CN/04-file-download-traversal-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_INVALID_FLAG_VALUE", + "message": "无效的远端路径 \"user/../public/a.bin\"" +} +-- zh-CN/05-file-download-root-json/argv -- +crater file download user --json --no-interactive +-- zh-CN/05-file-download-root-json/exit -- +2 +-- zh-CN/05-file-download-root-json/stdout -- +-- zh-CN/05-file-download-root-json/stderr -- +{ + "category": "usage_error", + "code": "ERR_INVALID_FLAG_VALUE", + "message": "远端文件必须指向 user、public 或 account 下的具体条目:\"user\"" +} +-- zh-CN/06-file-download-404-json/argv -- +crater file download user/实验 data/result.bin snapshot-download-zh-CN.bin --overwrite --json --no-interactive +-- zh-CN/06-file-download-404-json/exit -- +4 +-- zh-CN/06-file-download-404-json/stdout -- +-- zh-CN/06-file-download-404-json/stderr -- +{ + "category": "api_error", + "code": "ERR_NOT_FOUND_404", + "message": "请求失败(HTTP 404):simulated", + "context": { + "crater_code": 404, + "http_status": 404, + "msg": "simulated" + } +} +-- zh-CN/07-file-help/argv -- +crater file --help +-- zh-CN/07-file-help/exit -- +0 +-- zh-CN/07-file-help/stdout -- +从用户、公共及当前账户存储空间下载文件。 + +Usage: + crater file [flags] + crater file [command] + +Available Commands: + download 下载单个远端文件 + +Global Flags: + -h, --help 显示帮助信息 + --json 以原始 JSON 格式输出 + --no-interactive 禁用交互式提示 + +Use "crater file [command] --help" for more information about a command. +-- zh-CN/07-file-help/stderr -- +-- zh-CN/08-file-download-help/argv -- +crater file download --help +-- zh-CN/08-file-download-help/exit -- +0 +-- zh-CN/08-file-download-help/stdout -- +下载单个远端文件 + +Usage: + crater file download [local-path] [flags] + +Flags: + --overwrite 替换已存在的本地文件 + +Global Flags: + -h, --help 显示帮助信息 + --json 以原始 JSON 格式输出 + --no-interactive 禁用交互式提示 +-- zh-CN/08-file-download-help/stderr -- diff --git a/output/playwright/issue-478-file-download.png b/output/playwright/issue-478-file-download.png new file mode 100644 index 0000000000000000000000000000000000000000..aca5215942a20af651635d1eac23509a747049a3 GIT binary patch literal 136001 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

ZF~Rk~9*4czs=BLXfyQ!0O% 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 H?M(O`0ykN` literal 0 HcmV?d00001