Skip to content

Commit a88ccfa

Browse files
authored
Merge pull request #37 from beclab/fix/external_delete
fix: external delete
2 parents 24ec5c4 + 1d1866d commit a88ccfa

File tree

8 files changed

+59
-42
lines changed

8 files changed

+59
-42
lines changed

pkg/drivers/posix/helper.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,40 @@
11
package posix
22

33
import (
4+
"errors"
45
"files/pkg/files"
6+
"os"
57

68
"github.com/spf13/afero"
79
)
810

911
func getRawFile(file *files.FileInfo) (afero.File, error) {
1012
return file.Fs.Open(file.Path)
1113
}
14+
15+
func extractErrMsg(err error) string {
16+
var pe *os.PathError
17+
if errors.As(err, &pe) {
18+
return pe.Err.Error()
19+
}
20+
21+
var le *os.LinkError
22+
if errors.As(err, &le) {
23+
return le.Err.Error()
24+
}
25+
26+
var se *os.SyscallError
27+
if errors.As(err, &se) {
28+
return se.Err.Error()
29+
}
30+
31+
return err.Error()
32+
33+
// for {
34+
// next := errors.Unwrap(err)
35+
// if next == nil {
36+
// return err.Error()
37+
// }
38+
// err = next
39+
// }
40+
}

pkg/drivers/posix/posix.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ func (s *PosixStorage) Delete(fileDeleteArg *models.FileDeleteArgs) ([]byte, err
182182

183183
var invalidPaths []string
184184

185+
var errmsg = make(map[string]string)
186+
185187
for _, dirent := range dirents {
186188
dirent = strings.TrimSpace(dirent)
187189
if dirent == "" || dirent == "/" || !strings.HasPrefix(dirent, "/") {
@@ -196,15 +198,21 @@ func (s *PosixStorage) Delete(fileDeleteArg *models.FileDeleteArgs) ([]byte, err
196198

197199
for _, dirent := range dirents {
198200
dirent = strings.TrimSpace(dirent)
199-
direntPath := fileData.Path + dirent
201+
direntPath := fileData.Path + strings.TrimLeft(dirent, "/")
202+
klog.Infof("Posix delete, remove dirent path: %s", direntPath)
200203
if err = fileData.Fs.RemoveAll(direntPath); err != nil {
201204
klog.Errorf("Posix delete, remove path error: %v, user: %s, path: %s", err, user, direntPath)
202-
deleteFailedPaths = append(deleteFailedPaths, dirent)
205+
e := extractErrMsg(err)
206+
_, ok := errmsg[e]
207+
if !ok {
208+
errmsg[e] = e
209+
deleteFailedPaths = append(deleteFailedPaths, e)
210+
}
203211
}
204212
}
205213

206214
if len(deleteFailedPaths) > 0 {
207-
return utils.ToBytes(deleteFailedPaths), fmt.Errorf("delete failed paths")
215+
return nil, fmt.Errorf("%s", strings.Join(deleteFailedPaths, ";"))
208216
}
209217

210218
return nil, nil
@@ -280,7 +288,7 @@ func (s *PosixStorage) getFiles(fileParam *models.FileParam, expand, content boo
280288
if s.isExternal(fileParam.FileType, fileParam.Extend) {
281289
klog.Infof("getFiles fileType: %s, extend: %s", fileParam.FileType, fileParam.Extend)
282290
file.ExternalType = global.GlobalMounted.CheckExternalType(file.Path, file.IsDir)
283-
if file.IsDir {
291+
if file.IsDir && file.Listing != nil {
284292
for _, f := range file.Items {
285293
f.ExternalType = global.GlobalMounted.CheckExternalType(f.Path, f.IsDir)
286294
}

pkg/drivers/sync/sync.go

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -194,27 +194,17 @@ func (s *SyncStorage) Create(contextArgs *models.HttpContextArgs) ([]byte, error
194194

195195
klog.Infof("Sync create, owner: %s, args: %s", owner, utils.ToJson(contextArgs))
196196

197-
dirDetail, _ := s.getDirDetail(fileParam)
198-
if dirDetail != nil {
199-
return nil, errors.New("the path already exists")
200-
}
201-
202197
p := strings.Trim(fileParam.Path, "/")
203198
parts := strings.Split(p, "/")
204199
subFolder := "/"
200+
205201
for _, part := range parts {
206202
subFolder = filepath.Join(subFolder, part)
207203
if !strings.HasPrefix(subFolder, "/") {
208204
subFolder = "/" + subFolder
209205
}
210206

211-
var url = "http://127.0.0.1:80/seahub/api/v2.1/repos/" + fileParam.Extend + "/dir/?p=" + common.EscapeURLWithSpace(subFolder) + "&with_thumbnail=true"
212-
_, err := s.service.Get(url, http.MethodGet, nil)
213-
if err == nil {
214-
continue
215-
}
216-
217-
url = "http://127.0.0.1:80/seahub/api/v2.1/repos/" + fileParam.Extend + "/dir/?p=" + common.EscapeURLWithSpace(subFolder)
207+
var url = "http://127.0.0.1:80/seahub/api/v2.1/repos/" + fileParam.Extend + "/dir/?p=" + common.EscapeURLWithSpace(subFolder)
218208
data := make(map[string]string)
219209
data["operation"] = "mkdir"
220210
res, err := s.service.Get(url, http.MethodPost, []byte(utils.ToJson(data)))
@@ -337,22 +327,3 @@ func (s *SyncStorage) getFiles(fileParam *models.FileParam) (*Files, error) {
337327

338328
return data, nil
339329
}
340-
341-
func (s *SyncStorage) getDirDetail(fileParam *models.FileParam) (*models.SyncPathDetail, error) {
342-
var user = fileParam.Owner
343-
getUrl := "http://127.0.0.1:80/seahub/api/v2.1/repos/" + fileParam.Extend + "/dir/detail/?path=" + common.EscapeURLWithSpace(fileParam.Path)
344-
345-
klog.Infof("Sync get dir detail, user: %s, get url: %s", user, getUrl)
346-
347-
detail, err := s.service.Get(getUrl, http.MethodGet, nil)
348-
if err != nil {
349-
return nil, err
350-
}
351-
352-
var d *models.SyncPathDetail
353-
if err := json.Unmarshal(detail, &d); err != nil {
354-
return nil, err
355-
}
356-
357-
return d, nil
358-
}

pkg/drives/sync.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ func (rs *SyncResourceService) PasteDirFrom(task *pool.Task, fs afero.Fs, srcFil
343343
Extend: srcFileParam.Extend,
344344
Path: strings.TrimPrefix(fsrc, strings.TrimPrefix(srcUri, "/data")),
345345
}
346+
klog.Infof("~~~Debug log: dstUri=%s, fdst=%s", dstUri, fdst)
346347
fdstFileParam := &models.FileParam{
347348
Owner: dstFileParam.Owner,
348349
FileType: dstFileParam.FileType,
@@ -932,6 +933,7 @@ func walkSyncDirentsGenerator(body []byte, header *http.Header, r *http.Request,
932933
}
933934

934935
func SyncMkdirAllFileParam(fileParam *models.FileParam, mode os.FileMode, isDir bool, r *http.Request) error {
936+
klog.Errorf("~~~Debug log: dstFileParam=%v", fileParam)
935937
repoID := fileParam.Extend
936938
var prefix string
937939
if isDir {
@@ -943,9 +945,10 @@ func SyncMkdirAllFileParam(fileParam *models.FileParam, mode os.FileMode, isDir
943945
client := &http.Client{}
944946

945947
// Split the prefix by '/' and generate the URLs
946-
prefixParts := strings.Split(prefix, "/")
948+
prefixParts := strings.Split(strings.Trim(prefix, "/"), "/")
947949
for i := 0; i < len(prefixParts); i++ {
948950
curPrefix := strings.Join(prefixParts[:i+1], "/")
951+
klog.Infof("~~~Debug log: curPrefix=%s", curPrefix)
949952
curInfoURL := "http://127.0.0.1:80/seahub/api/v2.1/repos/" + repoID + "/dir/?p=" + common.EscapeURLWithSpace("/"+curPrefix) + "&with_thumbnail=true"
950953
getRequest, err := http.NewRequest("GET", curInfoURL, nil)
951954
if err != nil {
@@ -963,7 +966,7 @@ func SyncMkdirAllFileParam(fileParam *models.FileParam, mode os.FileMode, isDir
963966
if getResponse.StatusCode == 200 {
964967
continue
965968
} else {
966-
klog.Infoln(getResponse.Status)
969+
klog.Infoln("~~~Debug log:", getResponse.Status)
967970
}
968971

969972
type CreateDirRequest struct {
@@ -972,6 +975,7 @@ func SyncMkdirAllFileParam(fileParam *models.FileParam, mode os.FileMode, isDir
972975

973976
curCreateURL := "http://127.0.0.1:80/seahub/api/v2.1/repos/" + repoID + "/dir/?p=" + common.EscapeURLWithSpace("/"+curPrefix)
974977

978+
klog.Infof("~~~Debug log: curCreateURL=%s", curCreateURL)
975979
createDirReq := CreateDirRequest{
976980
Operation: "mkdir",
977981
}
@@ -1261,6 +1265,7 @@ func SyncBufferToFile(task *pool.Task, bufferFilePath, dst string, dstFileParam
12611265

12621266
repoID := dstFileParam.Extend
12631267
prefix, filename := filepath.Split(dstFileParam.Path)
1268+
prefix = strings.TrimPrefix(prefix, "/")
12641269

12651270
extension := path.Ext(filename)
12661271
mimeType := "application/octet-stream"
@@ -1737,9 +1742,9 @@ func PasteSyncPatch(task *pool.Task, action string, srcFileParam, dstFileParam *
17371742
}
17381743

17391744
// It seems that we can't mkdir althrough when using sync-bacth-copy/move-item, so we must use false for isDir here.
1740-
if err := SyncMkdirAllFileParam(dstFileParam, 0, false, r); err != nil {
1741-
return err
1742-
}
1745+
//if err := SyncMkdirAllFileParam(dstFileParam, 0, false, r); err != nil {
1746+
// return err
1747+
//}
17431748

17441749
//src = strings.Trim(src, "/")
17451750
//if !strings.Contains(src, "/") {

pkg/http/list.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ func fileHandle(fn fileHandlerFunc, prefix string) http.Handler {
5757

5858
res, err := fn(handler, contextArg)
5959
if err != nil {
60+
w.WriteHeader(http.StatusInternalServerError)
6061
json.NewEncoder(w).Encode(map[string]interface{}{
6162
"code": 1,
6263
"message": err.Error(),
@@ -115,6 +116,7 @@ func fileDeleteHandle(fn fileDeleteHandlerFunc, prefix string) http.Handler {
115116
if res != nil {
116117
json.Unmarshal(res, &deleteFailedPaths)
117118
}
119+
w.WriteHeader(http.StatusInternalServerError)
118120
json.NewEncoder(w).Encode(map[string]interface{}{
119121
"code": 1,
120122
"data": deleteFailedPaths,

pkg/http/raw.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func rawHandle(fn rawHandlerFunc, prefix string) http.Handler {
5555
file, err := fn(handler, contextArg)
5656
if err != nil {
5757
klog.Errorf("raw error: %v, user: %s, url: %s", err, contextArg.FileParam.Owner, r.URL.Path)
58+
w.WriteHeader(http.StatusInternalServerError)
5859
json.NewEncoder(w).Encode(map[string]interface{}{
5960
"code": 1,
6061
"message": err.Error(),

pkg/http/tree.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func treeHandle(fn treeHandlerFunc, prefix string) http.Handler {
6464
err = fn(handler, fileParam, stopChan, dataChan)
6565
if err != nil {
6666
klog.Errorf("tree error: %v, user: %s, url: %s", err, owner, r.URL.Path)
67+
w.WriteHeader(http.StatusInternalServerError)
6768
json.NewEncoder(w).Encode(map[string]interface{}{
6869
"code": 1,
6970
"message": err.Error(),

pkg/models/file_param.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ func (r *FileParam) GetResourceUri() (string, error) {
133133
} else if r.FileType == "internal" || r.FileType == "smb" || r.FileType == "usb" || r.FileType == "hdd" {
134134
return filepath.Join(constant.EXTERNAL_PREFIX), nil
135135
} else if r.FileType == "sync" {
136-
return filepath.Join(r.FileType, r.Extend), nil
136+
return filepath.Join("/", r.FileType, r.Extend), nil
137137
} else if r.FileType == "google" || r.FileType == "dropbox" || r.FileType == "awss3" {
138-
return filepath.Join("drive", r.FileType, r.Extend), nil
138+
return filepath.Join("/", "drive", r.FileType, r.Extend), nil
139139
}
140140

141141
return "", fmt.Errorf("invalid file type: %s", r.FileType)

0 commit comments

Comments
 (0)