drive: metadata: fix error when setting copy-requires-writer-permission on a folder

This appears not to be allowed, so this fixes the problem by ignoring
that metadata for a folder.

Fixes #8517
This commit is contained in:
Nick Craig-Wood 2025-04-24 13:45:04 +01:00
parent b94f80b9d7
commit 1f8373fae8
2 changed files with 7 additions and 5 deletions

View File

@ -1745,7 +1745,7 @@ func (f *Fs) createDir(ctx context.Context, pathID, leaf string, metadata fs.Met
} }
var updateMetadata updateMetadataFn var updateMetadata updateMetadataFn
if len(metadata) > 0 { if len(metadata) > 0 {
updateMetadata, err = f.updateMetadata(ctx, createInfo, metadata, true) updateMetadata, err = f.updateMetadata(ctx, createInfo, metadata, true, true)
if err != nil { if err != nil {
return nil, fmt.Errorf("create dir: failed to update metadata: %w", err) return nil, fmt.Errorf("create dir: failed to update metadata: %w", err)
} }
@ -1776,7 +1776,7 @@ func (f *Fs) updateDir(ctx context.Context, dirID string, metadata fs.Metadata)
} }
dirID = actualID(dirID) dirID = actualID(dirID)
updateInfo := &drive.File{} updateInfo := &drive.File{}
updateMetadata, err := f.updateMetadata(ctx, updateInfo, metadata, true) updateMetadata, err := f.updateMetadata(ctx, updateInfo, metadata, true, true)
if err != nil { if err != nil {
return nil, fmt.Errorf("update dir: failed to update metadata from source object: %w", err) return nil, fmt.Errorf("update dir: failed to update metadata from source object: %w", err)
} }

View File

@ -507,7 +507,7 @@ type updateMetadataFn func(context.Context, *drive.File) error
// //
// It returns a callback which should be called to finish the updates // It returns a callback which should be called to finish the updates
// after the data is uploaded. // after the data is uploaded.
func (f *Fs) updateMetadata(ctx context.Context, updateInfo *drive.File, meta fs.Metadata, update bool) (callback updateMetadataFn, err error) { func (f *Fs) updateMetadata(ctx context.Context, updateInfo *drive.File, meta fs.Metadata, update, isFolder bool) (callback updateMetadataFn, err error) {
callbackFns := []updateMetadataFn{} callbackFns := []updateMetadataFn{}
callback = func(ctx context.Context, info *drive.File) error { callback = func(ctx context.Context, info *drive.File) error {
for _, fn := range callbackFns { for _, fn := range callbackFns {
@ -532,7 +532,9 @@ func (f *Fs) updateMetadata(ctx context.Context, updateInfo *drive.File, meta fs
} }
switch k { switch k {
case "copy-requires-writer-permission": case "copy-requires-writer-permission":
if err := parseBool(&updateInfo.CopyRequiresWriterPermission); err != nil { if isFolder {
fs.Debugf(f, "Ignoring %s=%s as can't set on folders", k, v)
} else if err := parseBool(&updateInfo.CopyRequiresWriterPermission); err != nil {
return nil, err return nil, err
} }
case "writers-can-share": case "writers-can-share":
@ -629,7 +631,7 @@ func (f *Fs) fetchAndUpdateMetadata(ctx context.Context, src fs.ObjectInfo, opti
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to read metadata from source object: %w", err) return nil, fmt.Errorf("failed to read metadata from source object: %w", err)
} }
callback, err = f.updateMetadata(ctx, updateInfo, meta, update) callback, err = f.updateMetadata(ctx, updateInfo, meta, update, false)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to update metadata from source object: %w", err) return nil, fmt.Errorf("failed to update metadata from source object: %w", err)
} }