AlistGo/alist · error

rename merge file %s: %w

Error message

rename merge file %s: %w

What it means

During a rename-merge in the SJTU driver, moving one child FILE into the renamed folder failed (moveItem with "overwrite" strategy). The message names the file; the wrapped error carries the API failure. Files are force-overwritten, so this is a transport/API error, not a conflict.

Source

Thrown at drivers/sjtu_netdisk/driver.go:420

			}

			targetDirObj := &model.Object{Path: dstPath, Name: newName, IsFolder: true}

			for _, child := range children {
				childSrcPath := path.Join(srcObj.GetPath(), child.GetName())

				if child.IsDir() {
					childObj := &model.Object{
						Name: child.GetName(), Path: childSrcPath,
						Size: child.GetSize(), IsFolder: true,
					}
					if _, mergeErr := d.Move(ctx, childObj, targetDirObj); mergeErr != nil {
						return nil, fmt.Errorf("rename merge subfolder %s: %w", child.GetName(), mergeErr)
					}
				} else {
					fileErr := d.moveItem(ctx, childSrcPath, dstPath, child.GetName(), false, "overwrite")
					if fileErr != nil {
						return nil, fmt.Errorf("rename merge file %s: %w", child.GetName(), fileErr)
					}
				}
			}

			_ = d.Remove(ctx, srcObj)

			return &model.Object{
				Name:     newName,
				Size:     srcObj.GetSize(),
				IsFolder: true,
				Modified: srcObj.ModTime(),
				Ctime:    srcObj.CreateTime(),
				Path:     dstPath,
			}, nil
		}

		return nil, fmt.Errorf("unexpected rename folder response: status=%d", resp.StatusCode())
	}

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Retry the rename after addressing the wrapped error
  2. Move/rename the named file manually to confirm it succeeds alone
  3. Close clients holding the file open, then retry
  4. Split large renames into smaller batches
Defensive patterns

Strategy: retry

Try / catch

if err != nil && strings.Contains(err.Error(), "rename merge file") {
    f := extractFileName(err)
    return moveSingleFile(ctx, f)
}

Prevention

When it happens

Trigger: Rename folder onto an existing name triggers the merge loop; the per-file move PUT fails for one file (expired token, 5xx, server lock).

Common situations: Bulk merges with one bad file aborting everything; file held open elsewhere; transient API errors under load.

Related errors


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/2968b3bb3d1d7b04. Report an issue: GitHub.