Skip to content

Commit 8afdceb

Browse files
authored
Releases/v2.16.0 (#417)
1 parent 476bb76 commit 8afdceb

31 files changed

+1058
-98
lines changed

CHANGELOG.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
# 2.16.0
2+
## 新增
3+
1. create-share / share-ls / share-cp 命令支持创建对文件夹的共享,列举和下载
4+
2. 上传命令支持额外的 --accelerate 选项
5+
3. fop 命令支持 --workflow-template-id 和 --type 选项
6+
7+
## 更新
8+
1. listbucket2 现在即使使用了 --limit 参数得到的 marker 也是精确的
9+
110
# 2.15.0
211
## 新增
312
1. buckets 命令列举全量 bucket
@@ -56,7 +65,7 @@
5665
# 2.9.0
5766
1. 新增 batchforbidden 命令,支持批量修改文件启用/禁用状态,具体参考命令使用说明
5867
2. qdownload 命令新增支持自定义文件本地存储路径, 具体参考命令使用说明
59-
4. stat 命令补充部分文件元数据信息,比如过期删除时间等
68+
4. stat 命令补充部分文件元数据信息,比如过期删除时间等
6069
5. bucket 命令补充部分空间信息,比如可查看空间配置的 Refer 等
6170
6. 优化 qupload 关于上传流程中检测文件是否存在机制
6271
7. 优化 qdownload 关于下载流程中检测文件是否存在机制

Makefile

+21-21
Original file line numberDiff line numberDiff line change
@@ -32,52 +32,52 @@ linux: $(LINUX86).zip $(LINUX64).zip $(LINUXARM).zip $(LINUXARM64).zip $(LINUXMI
3232
windows: $(WIN86).zip $(WIN64).zip $(WINARM).zip $(WINARM64).zip
3333

3434
qshell-$(VERSION)-darwin-%.zip: qshell-$(VERSION)-darwin-%
35-
@zip $@ $<
35+
zip $@ $<
3636
qshell-$(VERSION)-linux-%.zip: qshell-$(VERSION)-linux-%
37-
@zip $@ $<
37+
zip $@ $<
3838
qshell-$(VERSION)-windows-%.zip: qshell-$(VERSION)-windows-%.exe
39-
@zip $@ $<
39+
zip $@ $<
4040

4141
$(DARWIN):
42-
@GOOS=darwin GOARCH=amd64 $(GO) build -ldflags $(LDFLAGS) -o $(DARWIN) .
42+
GOOS=darwin GOARCH=amd64 $(GO) build -ldflags $(LDFLAGS) -o $(DARWIN) ./main/
4343
$(DARWINARM64):
44-
@GOOS=darwin GOARCH=arm64 $(GO) build -ldflags $(LDFLAGS) -o $(DARWINARM64) .
44+
GOOS=darwin GOARCH=arm64 $(GO) build -ldflags $(LDFLAGS) -o $(DARWINARM64) ./main/
4545
$(LINUX86):
46-
@CGO_ENABLED=0 GOOS=linux GOARCH=386 $(GO) build -ldflags $(LDFLAGS) -o $(LINUX86) .
46+
CGO_ENABLED=0 GOOS=linux GOARCH=386 $(GO) build -ldflags $(LDFLAGS) -o $(LINUX86) ./main/
4747
$(LINUX64):
48-
@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUX64) .
48+
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUX64) ./main/
4949
$(LINUXARM):
50-
@CGO_ENABLED=0 GOOS=linux GOARCH=arm $(GO) build -ldflags $(LDFLAGS) -o $(LINUXARM) .
50+
CGO_ENABLED=0 GOOS=linux GOARCH=arm $(GO) build -ldflags $(LDFLAGS) -o $(LINUXARM) ./main/
5151
$(LINUXARM64):
52-
@CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXARM64) .
52+
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXARM64) ./main/
5353
$(LINUXMIPS):
54-
@CGO_ENABLED=0 GOOS=linux GOARCH=mips $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPS) .
54+
CGO_ENABLED=0 GOOS=linux GOARCH=mips $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPS) ./main/
5555
$(LINUXMIPSLE):
56-
@CGO_ENABLED=0 GOOS=linux GOARCH=mipsle $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPSLE) .
56+
CGO_ENABLED=0 GOOS=linux GOARCH=mipsle $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPSLE) ./main/
5757
$(LINUXMIPS64):
58-
@CGO_ENABLED=0 GOOS=linux GOARCH=mips64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPS64) .
58+
CGO_ENABLED=0 GOOS=linux GOARCH=mips64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPS64) ./main/
5959
$(LINUXMIPS64LE):
60-
@CGO_ENABLED=0 GOOS=linux GOARCH=mips64le $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPS64LE) .
60+
CGO_ENABLED=0 GOOS=linux GOARCH=mips64le $(GO) build -ldflags $(LDFLAGS) -o $(LINUXMIPS64LE) ./main/
6161
$(LINUXLOONG64):
62-
@CGO_ENABLED=0 GOOS=linux GOARCH=loong64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXLOONG64) .
62+
CGO_ENABLED=0 GOOS=linux GOARCH=loong64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXLOONG64) ./main/
6363
$(LINUXRISCV64):
64-
@CGO_ENABLED=0 GOOS=linux GOARCH=riscv64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXRISCV64) .
64+
CGO_ENABLED=0 GOOS=linux GOARCH=riscv64 $(GO) build -ldflags $(LDFLAGS) -o $(LINUXRISCV64) ./main/
6565
$(WIN86).exe:
66-
@CGO_ENABLED=0 GOOS=windows GOARCH=386 $(GO) build -ldflags $(LDFLAGS) -o $(WIN86).exe .
66+
CGO_ENABLED=0 GOOS=windows GOARCH=386 $(GO) build -ldflags $(LDFLAGS) -o $(WIN86).exe ./main/
6767
$(WIN64).exe:
68-
@CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GO) build -ldflags $(LDFLAGS) -o $(WIN64).exe .
68+
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GO) build -ldflags $(LDFLAGS) -o $(WIN64).exe ./main/
6969
$(WINARM).exe:
70-
@CGO_ENABLED=0 GOOS=windows GOARCH=arm $(GO) build -ldflags $(LDFLAGS) -o $(WINARM).exe .
70+
CGO_ENABLED=0 GOOS=windows GOARCH=arm $(GO) build -ldflags $(LDFLAGS) -o $(WINARM).exe ./main/
7171
$(WINARM64).exe:
72-
@CGO_ENABLED=0 GOOS=windows GOARCH=arm64 $(GO) build -ldflags $(LDFLAGS) -o $(WINARM64).exe .
72+
CGO_ENABLED=0 GOOS=windows GOARCH=arm64 $(GO) build -ldflags $(LDFLAGS) -o $(WINARM64).exe ./main/
7373

7474
.PHONY: cleanzip cleanbin clean upload
7575

7676
cleanzip:
77-
@rm -f qshell-$(VERSION)-*.zip
77+
rm -f qshell-$(VERSION)-*.zip
7878

7979
cleanbin:
80-
@rm -f qshell-$(VERSION)-*
80+
rm -f qshell-$(VERSION)-*
8181

8282
clean: cleanzip cleanbin
8383

cmd/fop.go

+9-6
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ var preFopStatusCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
2626
return cmd
2727
}
2828

29-
var preFopCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
30-
var info = operations.PreFopInfo{}
29+
var pfopCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
30+
var info = operations.PfopInfo{}
3131
var cmd = &cobra.Command{
3232
Use: "pfop <Bucket> <Key> <fopCommand>",
3333
Short: "Issue a request to process file in bucket",
@@ -42,14 +42,17 @@ var preFopCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
4242
if len(args) > 2 {
4343
info.Fops = args[2]
4444
}
45-
operations.PreFop(cfg, info)
45+
operations.Pfop(cfg, info)
4646
},
4747
}
4848
cmd.Flags().StringVarP(&info.Pipeline, "pipeline", "p", "", "task pipeline")
4949
cmd.Flags().StringVarP(&info.NotifyURL, "notify-url", "u", "", "notfiy url")
50+
cmd.Flags().StringVarP(&info.WorkflowTemplateID, "workflow-template-id", "", "", "Workflow template ID")
5051

51-
cmd.Flags().BoolVarP(&info.NotifyForce, "force", "y", false, "force execute")
52-
cmd.Flags().BoolVarP(&info.NotifyForce, "force-old", "f", false, "force execute, deprecated")
52+
cmd.Flags().BoolVarP(&info.Force, "force", "y", false, "force execute")
53+
cmd.Flags().BoolVarP(&info.Force, "force-old", "f", false, "force execute, deprecated")
54+
55+
cmd.Flags().Int64VarP(&info.Type, "type", "", 0, "task type")
5356
_ = cmd.Flags().MarkDeprecated("force-old", "use --force instead")
5457

5558
return cmd
@@ -61,7 +64,7 @@ func init() {
6164

6265
func fopCmdLoader(superCmd *cobra.Command, cfg *iqshell.Config) {
6366
superCmd.AddCommand(
64-
preFopCmdBuilder(cfg),
67+
pfopCmdBuilder(cfg),
6568
preFopStatusCmdBuilder(cfg),
6669
)
6770
}

cmd/share.go

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package cmd
2+
3+
import (
4+
"strings"
5+
6+
"github.com/qiniu/qshell/v2/docs"
7+
"github.com/qiniu/qshell/v2/iqshell"
8+
"github.com/qiniu/qshell/v2/iqshell/storage/object/operations"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var createShareCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
13+
var info = operations.CreateShareInfo{}
14+
var cmd = &cobra.Command{
15+
Use: "create-share [kodo://]<Bucket>/<Prefix>",
16+
Short: "Share the specified directory",
17+
Run: func(cmd *cobra.Command, args []string) {
18+
cfg.CmdCfg.CmdId = docs.CreateShareType
19+
if len(args) > 0 {
20+
url := args[0]
21+
url = strings.TrimPrefix(url, "kodo://")
22+
parts := strings.SplitN(url, "/", 2)
23+
if len(parts) > 0 {
24+
info.Bucket = parts[0]
25+
}
26+
if len(parts) > 1 {
27+
info.Prefix = parts[1]
28+
}
29+
info.Permission = "READONLY"
30+
}
31+
operations.CreateShare(cfg, info)
32+
},
33+
}
34+
cmd.Flags().StringVarP(&info.ExtractCode, "extract-code", "", "", "Specify extract code for the share, must consist of 6 alphabets and numbers")
35+
cmd.Flags().Int64VarP(&info.DurationSeconds, "validity-period", "", 900, "Specify validity period in seconds, must be longer than 1 mintutes and shorter than 2 hours")
36+
cmd.Flags().StringVarP(&info.OutputPath, "output", "", "", "Specify path to save output")
37+
return cmd
38+
}
39+
40+
var listShareCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
41+
var info = operations.ListShareInfo{}
42+
var cmd = &cobra.Command{
43+
Use: "share-ls <Link>",
44+
Short: "List shared files",
45+
Run: func(cmd *cobra.Command, args []string) {
46+
cfg.CmdCfg.CmdId = docs.ShareLsType
47+
if len(args) > 0 {
48+
info.LinkURL = args[0]
49+
}
50+
operations.ListShare(cfg, info)
51+
},
52+
}
53+
cmd.Flags().StringVarP(&info.ExtractCode, "extract-code", "", "", "Specify extract code for the share, must consist of 6 alphabets and numbers")
54+
cmd.Flags().StringVarP(&info.Prefix, "prefix", "p", "", "list the shared directory with this prefix if set")
55+
cmd.Flags().Int64VarP(&info.Limit, "limit", "n", 0, "max count of items to output")
56+
cmd.Flags().StringVarP(&info.Marker, "marker", "m", "", "list marker")
57+
return cmd
58+
}
59+
60+
var copyShareCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
61+
var info = operations.CopyShareInfo{}
62+
var cmd = &cobra.Command{
63+
Use: "share-cp <Link> --to=<ToPath>",
64+
Short: "Copy shared files",
65+
Run: func(cmd *cobra.Command, args []string) {
66+
cfg.CmdCfg.CmdId = docs.ShareCpType
67+
if len(args) > 0 {
68+
info.LinkURL = args[0]
69+
}
70+
operations.CopyShare(cfg, info)
71+
},
72+
}
73+
cmd.Flags().StringVarP(&info.ExtractCode, "extract-code", "", "", "Specify extract code for the share, must consist of 6 alphabets and numbers")
74+
cmd.Flags().StringVarP(&info.FromPath, "from", "", "", "copy from path")
75+
cmd.Flags().StringVarP(&info.ToPath, "to", "", "", "copy to path")
76+
cmd.Flags().BoolVarP(&info.Recursive, "recursive", "r", false, "copy directories recursively")
77+
return cmd
78+
}
79+
80+
func init() {
81+
registerLoader(shareCmdLoader)
82+
}
83+
84+
func shareCmdLoader(superCmd *cobra.Command, cfg *iqshell.Config) {
85+
superCmd.AddCommand(
86+
createShareCmdBuilder(cfg),
87+
listShareCmdBuilder(cfg),
88+
copyShareCmdBuilder(cfg),
89+
)
90+
}

cmd/upload.go

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ var upload2CmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
9090
cmd.Flags().StringVar(&info.SkipFixedStrings, "skip-fixed-strings", "", "skip files with the fixed string in the name")
9191
cmd.Flags().StringVar(&info.SkipSuffixes, "skip-suffixes", "", "skip files with these suffixes")
9292
cmd.Flags().StringVar(&info.UpHost, "up-host", "", "upload host")
93+
cmd.Flags().BoolVarP(&info.Accelerate, "accelerate", "", false, "enable uploading acceleration")
9394
cmd.Flags().StringVar(&info.RecordRoot, "record-root", "", "record root dir, and will save record info to the dir(db and log), default <UserRoot>/.qshell")
9495
cmd.Flags().StringVar(&LogFile, "log-file", "", "log file")
9596
cmd.Flags().StringVar(&LogLevel, "log-level", "debug", "log level")
@@ -146,6 +147,7 @@ var syncCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
146147
cmd.Flags().BoolVarP(&info.UseResumeV2, "resumable-api-v2", "", false, "use resumable upload v2 APIs to upload")
147148
cmd.Flags().Int64VarP(&info.ChunkSize, "resumable-api-v2-part-size", "", data.BLOCK_SIZE, "the part size when use resumable upload v2 APIs to upload, default 4M")
148149
cmd.Flags().StringVarP(&info.UpHost, "up-host", "u", "", "upload host")
150+
cmd.Flags().BoolVarP(&info.Accelerate, "accelerate", "", false, "enable uploading acceleration")
149151

150152
cmd.Flags().IntVarP(&info.FileType, "file-type", "", 0, "set storage type of file, 0:STANDARD storage, 1:IA storage, 2:ARCHIVE storage, 3:DEEP_ARCHIVE storage, 4:ARCHIVE_IR storage")
151153
cmd.Flags().IntVarP(&info.FileType, "storage", "s", 0, "set storage type of file, same to --file-type")
@@ -203,6 +205,7 @@ var formUploadCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
203205
_ = cmd.Flags().MarkDeprecated("storage", "use --file-type instead") // 废弃 storage
204206

205207
cmd.Flags().StringVarP(&info.UpHost, "up-host", "u", "", "uphost")
208+
cmd.Flags().BoolVarP(&info.Accelerate, "accelerate", "", false, "enable uploading acceleration")
206209

207210
cmd.Flags().StringVarP(&info.Policy.EndUser, "end-user", "", "", "Owner identification")
208211
cmd.Flags().StringVarP(&info.Policy.CallbackURL, "callback-urls", "l", "", "upload callback urls, separated by comma")
@@ -262,6 +265,7 @@ var resumeUploadCmdBuilder = func(cfg *iqshell.Config) *cobra.Command {
262265

263266
cmd.Flags().IntVarP(&info.ResumeWorkerCount, "worker", "c", 3, "worker count")
264267
cmd.Flags().StringVarP(&info.UpHost, "up-host", "u", "", "uphost")
268+
cmd.Flags().BoolVarP(&info.Accelerate, "accelerate", "", false, "enable uploading acceleration")
265269

266270
cmd.Flags().StringVarP(&info.Policy.EndUser, "end-user", "", "", "Owner identification")
267271
cmd.Flags().StringVarP(&info.Policy.CallbackURL, "callback-urls", "l", "", "upload callback urls, separated by comma")

docs/create-share.go

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package docs
2+
3+
import _ "embed"
4+
5+
//go:embed create-share.md
6+
var createShareDocument string
7+
8+
const CreateShareType = "create-share"
9+
10+
func init() {
11+
addCmdDocumentInfo(CreateShareType, createShareDocument)
12+
}

docs/create-share.md

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# 简介
2+
`create-share` 命令为需要分享的目录创建授权链接。
3+
4+
# 格式
5+
```
6+
qshell create-share [kodo://]<Bucket>/<Prefix>
7+
```
8+
9+
# 帮助文档
10+
可以在命令行输入如下命令获取帮助文档:
11+
```
12+
// 简单描述
13+
$ qshell create-share -h
14+
15+
// 详细文档(此文档)
16+
$ qshell create-share --doc
17+
```
18+
19+
# 鉴权
20+
需要使用 `qshell account` 或者 `qshell user add` 命令设置鉴权信息 `AccessKey`, `SecretKey``Name`
21+
22+
# 参数
23+
- Bucket: 空间名称【必选】
24+
- Prefix: 前缀【必选】
25+
26+
# 选项
27+
- --extract-code: 提取码,只能包含六位大小写字母或者数字,如果不填写,将会自动生成。【可选】
28+
- --validity-period: 有效时间,如果不填写,默认为 15 分钟。【可选】
29+
- --output: 保存路径,以 JSON 格式保存输出内容,如果不填写,则直接以文本形式输出。【可选】
30+
31+
# 示例
32+
```
33+
$ qshell create-share kodo://bucketname/prefix
34+
Link:
35+
http://portal.qiniu.com/kodo-shares/verify?id=AGQEKDRxBBjbGmsKduQS9oFx59rz&token=qhtbC5YmDCO-WiPriuoCG_t4hZ1LboSOtRYSJXo_%3A9uJY8FiNrKjNrt4MpBx547jlgwr8aes15z5i8VY6l5SU6ga2IKWDBSGTv1jo-rOocklE7QqApzG6okJktZ36umLoqv9x1kuo5fNmgasLXowyTuHIM3kXsaV_DoXmvQsGr5ol6j4RtrmLcKdtXhpkGH8MfSjEgRV91Bx_Q_mSwpJ1028p8yZCSad_QOu_kSPxzeLZmWlUpAtO2oEXdbMTBxhTCH_3awCgqkgoogi0FQGP4zHxeFr0n3vj69DpmWqe6DiYbYLivCuU0kOF5Khv4I6-w6vjjdY
36+
Extract Code:
37+
wp7gqc
38+
Expire:
39+
2024-10-09 10:44:41 +0000
40+
41+
$ qshell create-share --output=share.json kodo://bucketname/prefix
42+
```

docs/fput.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ qshell fput [--overwrite] [--callback-urls <CallbackUrls>] [--callback-host <Cal
1414
可以在命令行输入如下命令获取帮助文档:
1515
```
1616
// 简单描述
17-
$ qshell fput -h
17+
$ qshell fput -h
1818
1919
// 详细文档(此文档)
2020
$ qshell fput --doc
@@ -27,8 +27,9 @@ $ qshell fput --doc
2727
- Bucket:空间名,可以为公开空间或私有空间【必选】
2828
- Key:文件保存在七牛空间的名称 【必选】
2929
- LocalFile:本地文件的路径【必选】
30-
30+
3131
# 选项
32+
- --accelerate:启用上传加速。【可选】
3233
- --overwrite:是否覆盖空间已有文件,默认为 `false`。 【可选】
3334
- -t/--mimetype:指定文件的 MimeType。 【可选】
3435
- --file-type:文件存储类型,默认为 `0`(标准存储),`1` 为低频存储,`2` 为归档存储,`3` 为深度归档存储,`4` 为归档直读存储。 【可选】
@@ -52,7 +53,7 @@ $ qshell fput --doc
5253
2) 检查 Key 扩展名;
5354
3) 侦测内容。
5455
3. 设为 -1 值,无论上传端指定了何值直接使用该值。
55-
```
56+
```
5657
- --traffic-limit:上传请求单链接速度限制,控制客户端带宽占用。限速值取值范围为 819200 ~ 838860800,单位为 bit/s。【可选】
5758

5859

0 commit comments

Comments
 (0)