@@ -57,10 +57,12 @@ func FsMkdir(c *gin.Context) {
5757}
5858
5959type MoveCopyReq struct {
60- SrcDir string `json:"src_dir"`
61- DstDir string `json:"dst_dir"`
62- Names []string `json:"names"`
63- Overwrite bool `json:"overwrite"`
60+ SrcDir string `json:"src_dir"`
61+ DstDir string `json:"dst_dir"`
62+ Names []string `json:"names"`
63+ Overwrite bool `json:"overwrite"`
64+ SkipExisting bool `json:"skip_existing"`
65+ Merge bool `json:"merge"`
6466}
6567
6668func FsMove (c * gin.Context ) {
@@ -89,20 +91,25 @@ func FsMove(c *gin.Context) {
8991 return
9092 }
9193
94+ var validNames []string
9295 if ! req .Overwrite {
9396 for _ , name := range req .Names {
94- if res , _ := fs .Get (c .Request .Context (), stdpath .Join (dstDir , name ), & fs.GetArgs {NoLog : true }); res != nil {
97+ if res , _ := fs .Get (c .Request .Context (), stdpath .Join (dstDir , name ), & fs.GetArgs {NoLog : true }); res != nil && ! req . SkipExisting {
9598 common .ErrorStrResp (c , fmt .Sprintf ("file [%s] exists" , name ), 403 )
9699 return
100+ } else if res == nil {
101+ validNames = append (validNames , name )
97102 }
98103 }
104+ } else {
105+ validNames = req .Names
99106 }
100107
101108 // Create all tasks immediately without any synchronous validation
102109 // All validation will be done asynchronously in the background
103110 var addedTasks []task.TaskExtensionInfo
104- for i , name := range req . Names {
105- t , err := fs .Move (c .Request .Context (), stdpath .Join (srcDir , name ), dstDir , len (req . Names ) > i + 1 )
111+ for i , name := range validNames {
112+ t , err := fs .Move (c .Request .Context (), stdpath .Join (srcDir , name ), dstDir , len (validNames ) > i + 1 )
106113 if t != nil {
107114 addedTasks = append (addedTasks , t )
108115 }
@@ -151,20 +158,34 @@ func FsCopy(c *gin.Context) {
151158 return
152159 }
153160
161+ var validNames []string
154162 if ! req .Overwrite {
155163 for _ , name := range req .Names {
156164 if res , _ := fs .Get (c .Request .Context (), stdpath .Join (dstDir , name ), & fs.GetArgs {NoLog : true }); res != nil {
157- common .ErrorStrResp (c , fmt .Sprintf ("file [%s] exists" , name ), 403 )
158- return
165+ if ! req .SkipExisting && ! req .Merge {
166+ common .ErrorStrResp (c , fmt .Sprintf ("file [%s] exists" , name ), 403 )
167+ return
168+ } else if req .Merge && res .IsDir () {
169+ validNames = append (validNames , name )
170+ }
171+ } else {
172+ validNames = append (validNames , name )
159173 }
160174 }
175+ } else {
176+ validNames = req .Names
161177 }
162178
163179 // Create all tasks immediately without any synchronous validation
164180 // All validation will be done asynchronously in the background
165181 var addedTasks []task.TaskExtensionInfo
166- for i , name := range req .Names {
167- t , err := fs .Copy (c .Request .Context (), stdpath .Join (srcDir , name ), dstDir , len (req .Names ) > i + 1 )
182+ for i , name := range validNames {
183+ var t task.TaskExtensionInfo
184+ if req .Merge {
185+ t , err = fs .Merge (c .Request .Context (), stdpath .Join (srcDir , name ), dstDir , len (validNames ) > i + 1 )
186+ } else {
187+ t , err = fs .Copy (c .Request .Context (), stdpath .Join (srcDir , name ), dstDir , len (validNames ) > i + 1 )
188+ }
168189 if t != nil {
169190 addedTasks = append (addedTasks , t )
170191 }
0 commit comments