From 2bc4fc4ea05084bd72523e50512a7b87daef242f Mon Sep 17 00:00:00 2001 From: Suyunmeng Date: Wed, 22 Jul 2026 03:36:07 +0800 Subject: [PATCH 1/4] fix(115_open): recover incomplete path metadata Fall back to the parent directory listing when path metadata is temporarily missing or incomplete so filesystem operations receive usable objects. Co-authored-by: Claude --- drivers/115_open/driver.go | 43 +++++++++++++++++++++++++++++++++----- drivers/115_open/util.go | 21 ++++++++++++++++++- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/drivers/115_open/driver.go b/drivers/115_open/driver.go index 62d406614..14275246f 100644 --- a/drivers/115_open/driver.go +++ b/drivers/115_open/driver.go @@ -2,7 +2,6 @@ package _115_open import ( "context" - "errors" "fmt" "net/http" stdpath "path" @@ -171,19 +170,53 @@ func (d *Open115) Get(ctx context.Context, path string) (model.Obj, error) { path = stdpath.Join(d.parentPath, path) resp, err := d.client.GetFolderInfoByPath(ctx, path) if err != nil { - if errors.Is(err, sdk.ErrObjectNotFound) { - return nil, errs.ObjectNotFound + if isObjectNotFound(err) { + return d.getFromParent(ctx, path, "") } return nil, err } - return &Obj{ + obj := &Obj{ Fid: resp.FileID, Fn: resp.FileName, Fc: resp.FileCategory, Sha1: resp.Sha1, Pc: resp.PickCode, FS: resp.SizeByte, - }, nil + Upt: parseTime(resp.UTime), + UpPt: parseTime(resp.PTime), + } + if !obj.IsDir() && (obj.GetSize() <= 0 || obj.ModTime().Unix() <= 0) { + return d.getFromParent(ctx, path, obj.GetID()) + } + return obj, nil +} + +func (d *Open115) getFromParent(ctx context.Context, path, id string) (model.Obj, error) { + parent, name := stdpath.Split(path) + parentID := d.GetRootId() + if stdpath.Clean(parent) != stdpath.Clean(d.parentPath) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } + parentInfo, err := d.client.GetFolderInfoByPath(ctx, parent) + if err != nil { + if isObjectNotFound(err) { + return nil, errs.ObjectNotFound + } + return nil, err + } + parentID = parentInfo.FileID + } + files, err := d.List(ctx, &Obj{Fid: parentID, Fc: "0"}, model.ListArgs{}) + if err != nil { + return nil, err + } + for _, file := range files { + if (id != "" && file.GetID() == id) || (id == "" && file.GetName() == name) { + return file, nil + } + } + return nil, errs.ObjectNotFound } func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) { diff --git a/drivers/115_open/util.go b/drivers/115_open/util.go index a7a333c91..7a0eaa718 100644 --- a/drivers/115_open/util.go +++ b/drivers/115_open/util.go @@ -1,6 +1,12 @@ package _115_open -import "encoding/json" +import ( + "encoding/json" + "errors" + "strconv" + + sdk "github.com/OpenListTeam/115-sdk-go" +) func ParseInt64(v json.Number) (int64, error) { i, err := v.Int64() @@ -13,3 +19,16 @@ func ParseInt64(v json.Number) (int64, error) { } return int64(0), err } + +func parseTime(value string) int64 { + timestamp, _ := strconv.ParseInt(value, 10, 64) + return timestamp +} + +func isObjectNotFound(err error) bool { + if errors.Is(err, sdk.ErrObjectNotFound) { + return true + } + var sdkErr *sdk.Error + return errors.As(err, &sdkErr) && sdkErr.Code == 430004 +} From 59a40c38a389f9e2e25087e944384a6a300139e5 Mon Sep 17 00:00:00 2001 From: Suyunmeng Date: Wed, 22 Jul 2026 03:36:07 +0800 Subject: [PATCH 2/4] fix(115_open): resolve transient parent paths Continue resolving parent directories through ancestor listings when the path metadata endpoint briefly reports them missing. Co-authored-by: Claude --- drivers/115_open/driver.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/115_open/driver.go b/drivers/115_open/driver.go index 14275246f..a6f51c7cf 100644 --- a/drivers/115_open/driver.go +++ b/drivers/115_open/driver.go @@ -200,12 +200,17 @@ func (d *Open115) getFromParent(ctx context.Context, path, id string) (model.Obj } parentInfo, err := d.client.GetFolderInfoByPath(ctx, parent) if err != nil { - if isObjectNotFound(err) { - return nil, errs.ObjectNotFound + if !isObjectNotFound(err) { + return nil, err } - return nil, err + parentObj, err := d.getFromParent(ctx, parent, "") + if err != nil { + return nil, err + } + parentID = parentObj.GetID() + } else { + parentID = parentInfo.FileID } - parentID = parentInfo.FileID } files, err := d.List(ctx, &Obj{Fid: parentID, Fc: "0"}, model.ListArgs{}) if err != nil { From 545d60b291fbe247dca99cf581462eb463050a44 Mon Sep 17 00:00:00 2001 From: Suyunmeng Date: Wed, 22 Jul 2026 12:25:07 +0800 Subject: [PATCH 3/4] fix(115_open): consume SDK not-found errors Use the merged SDK error semantics for code 430004 and pin the integration to its immutable merged pseudo-version until the next SDK release is published. --- drivers/115_open/driver.go | 5 +++-- drivers/115_open/util.go | 11 ----------- go.mod | 2 +- go.sum | 2 ++ 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/drivers/115_open/driver.go b/drivers/115_open/driver.go index a6f51c7cf..a76772e54 100644 --- a/drivers/115_open/driver.go +++ b/drivers/115_open/driver.go @@ -2,6 +2,7 @@ package _115_open import ( "context" + "errors" "fmt" "net/http" stdpath "path" @@ -170,7 +171,7 @@ func (d *Open115) Get(ctx context.Context, path string) (model.Obj, error) { path = stdpath.Join(d.parentPath, path) resp, err := d.client.GetFolderInfoByPath(ctx, path) if err != nil { - if isObjectNotFound(err) { + if errors.Is(err, sdk.ErrObjectNotFound) { return d.getFromParent(ctx, path, "") } return nil, err @@ -200,7 +201,7 @@ func (d *Open115) getFromParent(ctx context.Context, path, id string) (model.Obj } parentInfo, err := d.client.GetFolderInfoByPath(ctx, parent) if err != nil { - if !isObjectNotFound(err) { + if !errors.Is(err, sdk.ErrObjectNotFound) { return nil, err } parentObj, err := d.getFromParent(ctx, parent, "") diff --git a/drivers/115_open/util.go b/drivers/115_open/util.go index 7a0eaa718..a12ed8b1b 100644 --- a/drivers/115_open/util.go +++ b/drivers/115_open/util.go @@ -2,10 +2,7 @@ package _115_open import ( "encoding/json" - "errors" "strconv" - - sdk "github.com/OpenListTeam/115-sdk-go" ) func ParseInt64(v json.Number) (int64, error) { @@ -24,11 +21,3 @@ func parseTime(value string) int64 { timestamp, _ := strconv.ParseInt(value, 10, 64) return timestamp } - -func isObjectNotFound(err error) bool { - if errors.Is(err, sdk.ErrObjectNotFound) { - return true - } - var sdkErr *sdk.Error - return errors.As(err, &sdkErr) && sdkErr.Code == 430004 -} diff --git a/go.mod b/go.mod index d0fd7fd7d..a43ce1c41 100644 --- a/go.mod +++ b/go.mod @@ -149,7 +149,7 @@ require ( ) require ( - github.com/OpenListTeam/115-sdk-go v0.2.5 + github.com/OpenListTeam/115-sdk-go v0.2.6-0.20260722041919-7799bb98e739 github.com/STARRY-S/zip v0.2.3 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/blevesearch/go-faiss v1.0.25 // indirect diff --git a/go.sum b/go.sum index 924bf79ca..a35c943d9 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ github.com/OpenListTeam/115-sdk-go v0.2.4 h1:dVoEz3Pm996n/ZCuRckQvz36w938uNHjPrS github.com/OpenListTeam/115-sdk-go v0.2.4/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= github.com/OpenListTeam/115-sdk-go v0.2.5 h1:E4O7GZmEXlGnouZ/e9//xU7NepT9JJkWtnF3O/VSb08= github.com/OpenListTeam/115-sdk-go v0.2.5/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= +github.com/OpenListTeam/115-sdk-go v0.2.6-0.20260722041919-7799bb98e739 h1:LD8k4PvtmA0QDMAX5DSYh+bTwSaMbfXOZd8XWzKV530= +github.com/OpenListTeam/115-sdk-go v0.2.6-0.20260722041919-7799bb98e739/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= github.com/OpenListTeam/go-cache v0.1.0 h1:eV2+FCP+rt+E4OCJqLUW7wGccWZNJMV0NNkh+uChbAI= github.com/OpenListTeam/go-cache v0.1.0/go.mod h1:AHWjKhNK3LE4rorVdKyEALDHoeMnP8SjiNyfVlB+Pz4= github.com/OpenListTeam/gsync v0.1.0 h1:ywzGybOvA3lW8K1BUjKZ2IUlT2FSlzPO4DOazfYXjcs= From f8b87bb06b3ce9adebc27139cdba8f2479d65749 Mon Sep 17 00:00:00 2001 From: Suyunmeng Date: Wed, 22 Jul 2026 12:44:16 +0800 Subject: [PATCH 4/4] fix(115_open): resolve incomplete ancestor paths Use the released SDK error semantics and normalize parent paths so transient metadata gaps recover from ancestor directory listings. Co-authored-by: Claude --- drivers/115_open/driver.go | 3 ++- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/115_open/driver.go b/drivers/115_open/driver.go index a76772e54..cd43d1759 100644 --- a/drivers/115_open/driver.go +++ b/drivers/115_open/driver.go @@ -186,13 +186,14 @@ func (d *Open115) Get(ctx context.Context, path string) (model.Obj, error) { Upt: parseTime(resp.UTime), UpPt: parseTime(resp.PTime), } - if !obj.IsDir() && (obj.GetSize() <= 0 || obj.ModTime().Unix() <= 0) { + if !obj.IsDir() && obj.ModTime().Unix() <= 0 { return d.getFromParent(ctx, path, obj.GetID()) } return obj, nil } func (d *Open115) getFromParent(ctx context.Context, path, id string) (model.Obj, error) { + path = stdpath.Clean(path) parent, name := stdpath.Split(path) parentID := d.GetRootId() if stdpath.Clean(parent) != stdpath.Clean(d.parentPath) { diff --git a/go.mod b/go.mod index a43ce1c41..98f6c28aa 100644 --- a/go.mod +++ b/go.mod @@ -149,7 +149,7 @@ require ( ) require ( - github.com/OpenListTeam/115-sdk-go v0.2.6-0.20260722041919-7799bb98e739 + github.com/OpenListTeam/115-sdk-go v0.2.6 github.com/STARRY-S/zip v0.2.3 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/blevesearch/go-faiss v1.0.25 // indirect diff --git a/go.sum b/go.sum index a35c943d9..490b46eb8 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ github.com/OpenListTeam/115-sdk-go v0.2.4 h1:dVoEz3Pm996n/ZCuRckQvz36w938uNHjPrS github.com/OpenListTeam/115-sdk-go v0.2.4/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= github.com/OpenListTeam/115-sdk-go v0.2.5 h1:E4O7GZmEXlGnouZ/e9//xU7NepT9JJkWtnF3O/VSb08= github.com/OpenListTeam/115-sdk-go v0.2.5/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= -github.com/OpenListTeam/115-sdk-go v0.2.6-0.20260722041919-7799bb98e739 h1:LD8k4PvtmA0QDMAX5DSYh+bTwSaMbfXOZd8XWzKV530= -github.com/OpenListTeam/115-sdk-go v0.2.6-0.20260722041919-7799bb98e739/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= +github.com/OpenListTeam/115-sdk-go v0.2.6 h1:ehXyStvncvn4qRBuknor3kyGZtUmHc0+stjF2ByVdFo= +github.com/OpenListTeam/115-sdk-go v0.2.6/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= github.com/OpenListTeam/go-cache v0.1.0 h1:eV2+FCP+rt+E4OCJqLUW7wGccWZNJMV0NNkh+uChbAI= github.com/OpenListTeam/go-cache v0.1.0/go.mod h1:AHWjKhNK3LE4rorVdKyEALDHoeMnP8SjiNyfVlB+Pz4= github.com/OpenListTeam/gsync v0.1.0 h1:ywzGybOvA3lW8K1BUjKZ2IUlT2FSlzPO4DOazfYXjcs=