diff --git a/drivers/alias/driver.go b/drivers/alias/driver.go index 271096b3..d9b290ed 100644 --- a/drivers/alias/driver.go +++ b/drivers/alias/driver.go @@ -7,6 +7,7 @@ import ( "github.com/alist-org/alist/v3/internal/driver" "github.com/alist-org/alist/v3/internal/errs" + "github.com/alist-org/alist/v3/internal/fs" "github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/pkg/utils" ) @@ -45,6 +46,9 @@ func (d *Alias) Init(ctx context.Context) error { d.oneKey = k } d.autoFlatten = true + } else { + d.oneKey = "" + d.autoFlatten = false } return nil } @@ -111,4 +115,26 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) ( return nil, errs.ObjectNotFound } +func (d *Alias) Rename(ctx context.Context, srcObj model.Obj, newName string) error { + reqPath, err := d.getReqPath(ctx, srcObj) + if err == nil { + return fs.Rename(ctx, *reqPath, newName) + } + if errs.IsNotImplement(err) { + return errors.New("same-name files cannot be Rename") + } + return err +} + +func (d *Alias) Remove(ctx context.Context, obj model.Obj) error { + reqPath, err := d.getReqPath(ctx, obj) + if err == nil { + return fs.Remove(ctx, *reqPath) + } + if errs.IsNotImplement(err) { + return errors.New("same-name files cannot be Delete") + } + return err +} + var _ driver.Driver = (*Alias)(nil) diff --git a/drivers/alias/meta.go b/drivers/alias/meta.go index 6611e1dc..2bebe7b0 100644 --- a/drivers/alias/meta.go +++ b/drivers/alias/meta.go @@ -9,7 +9,8 @@ type Addition struct { // Usually one of two // driver.RootPath // define other - Paths string `json:"paths" required:"true" type:"text"` + Paths string `json:"paths" required:"true" type:"text"` + ProtectSameName bool `json:"protect_same_name" default:"true" required:"false" help:"Protects same-name files from Delete or Rename"` } var config = driver.Config{ @@ -22,6 +23,10 @@ var config = driver.Config{ func init() { op.RegisterDriver(func() driver.Driver { - return &Alias{} + return &Alias{ + Addition: Addition{ + ProtectSameName: true, + }, + } }) } diff --git a/drivers/alias/util.go b/drivers/alias/util.go index 4e3d6bf0..803bd073 100644 --- a/drivers/alias/util.go +++ b/drivers/alias/util.go @@ -6,6 +6,7 @@ import ( stdpath "path" "strings" + "github.com/alist-org/alist/v3/internal/errs" "github.com/alist-org/alist/v3/internal/fs" "github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/internal/sign" @@ -112,3 +113,35 @@ func (d *Alias) link(ctx context.Context, dst, sub string, args model.LinkArgs) link, _, err := fs.Link(ctx, reqPath, args) return link, err } + +func (d *Alias) getReqPath(ctx context.Context, obj model.Obj) (*string, error) { + root, sub := d.getRootAndPath(obj.GetPath()) + if sub == "" || sub == "/" { + return nil, errs.NotSupport + } + dsts, ok := d.pathMap[root] + if !ok { + return nil, errs.ObjectNotFound + } + var reqPath string + var err error + for _, dst := range dsts { + reqPath = stdpath.Join(dst, sub) + _, err = fs.Get(ctx, reqPath, &fs.GetArgs{NoLog: true}) + if err == nil { + if d.ProtectSameName { + if ok { + ok = false + } else { + return nil, errs.NotImplement + } + } else { + break + } + } + } + if err != nil { + return nil, errs.ObjectNotFound + } + return &reqPath, nil +} diff --git a/internal/errs/errors.go b/internal/errs/errors.go index cd681e60..ecfe43e3 100644 --- a/internal/errs/errors.go +++ b/internal/errs/errors.go @@ -3,6 +3,7 @@ package errs import ( "errors" "fmt" + pkgerr "github.com/pkg/errors" ) @@ -33,3 +34,6 @@ func IsNotFoundError(err error) bool { func IsNotSupportError(err error) bool { return errors.Is(pkgerr.Cause(err), NotSupport) } +func IsNotImplement(err error) bool { + return errors.Is(pkgerr.Cause(err), NotImplement) +}