AlistGo/alist · error

rename merge subfolder %s: %w

Error message

rename merge subfolder %s: %w

What it means

During a rename-merge in the SJTU driver, recursively moving one child subfolder into the renamed target folder failed. The message names the failing subfolder. The wrapped error is the recursive Move failure (auth, 5xx, or a deeper nested conflict).

Source

Thrown at drivers/sjtu_netdisk/driver.go:415

		// 409 means conflict name
		if resp.StatusCode() == http.StatusConflict {
			children, listErr := d.List(ctx, srcObj, model.ListArgs{})
			if listErr != nil {
				return nil, fmt.Errorf("rename merge: list source folder failed: %w", listErr)
			}

			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,

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Retry the rename — already-moved children make the retry effectively resumable
  2. Check the wrapped error for auth/permission causes and remediate
  3. Rename subfolders individually to isolate the failing branch
  4. Verify destination state before retrying to avoid duplicates
Defensive patterns

Strategy: retry

Try / catch

if err != nil && strings.Contains(err.Error(), "rename merge subfolder") {
    sub := extractSubfolderName(err)
    return moveSingleSubfolder(ctx, sub)
}

Prevention

When it happens

Trigger: Folder rename onto an existing name; during the child loop, d.Move(childObj, targetDirObj) errors for one subfolder.

Common situations: Deep trees with a single failing branch aborting the whole rename; token expiry during long merges; partial state from an earlier interrupted merge.

Related errors


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