{"record":{"id":"5dbb827798e918a6","repo":"AlistGo/alist","slug":"merge-subfolder-s-w","errorCode":null,"errorMessage":"merge subfolder %s: %w","messagePattern":"merge subfolder (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/sjtu_netdisk/driver.go","lineNumber":304,"sourceCode":"\t\t\ttargetDstPath := targetPath\n\n\t\t\t// subfolder: recursive Move\n\t\t\tif child.IsDir() {\n\t\t\t\tchildErr := d.moveItem(ctx, childSrcPath, targetDstPath, child.GetName(), true, \"ask\")\n\t\t\t\tif childErr != nil && errors.Is(childErr, errs.ObjectNotFound) {\n\t\t\t\t\tchildObj := &model.Object{\n\t\t\t\t\t\tName:     child.GetName(),\n\t\t\t\t\t\tPath:     childSrcPath,\n\t\t\t\t\t\tSize:     child.GetSize(),\n\t\t\t\t\t\tIsFolder: true,\n\t\t\t\t\t}\n\t\t\t\t\t_, mergeErr := d.Move(ctx, childObj, &model.Object{\n\t\t\t\t\t\tPath:     targetPath,\n\t\t\t\t\t\tName:     srcObj.GetName(),\n\t\t\t\t\t\tIsFolder: true,\n\t\t\t\t\t})\n\t\t\t\t\tif mergeErr != nil {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"merge subfolder %s: %w\", child.GetName(), mergeErr)\n\t\t\t\t\t}\n\t\t\t\t} else if childErr != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"merge subfolder %s: %w\", child.GetName(), childErr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// child item is file\n\t\t\t\tfileErr := d.moveItem(ctx, childSrcPath, targetDstPath, child.GetName(), false, \"overwrite\")\n\t\t\t\tif fileErr != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"merge file %s: %w\", child.GetName(), fileErr)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// delete empty srcObj folder\n\t\t_ = d.Remove(ctx, srcObj)\n\n\t\treturn &model.Object{\n\t\t\tName:     srcObj.GetName(),","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/sjtu_netdisk/driver.go#L286-L322","documentation":"During a merge-move in the SJTU driver, a child subfolder's recursive d.Move() returned an error (e.g. auth failure, API 5xx, or nested merge failure). The message names the failing subfolder so the merge can be resumed from it. This is the error path for recursive Move failures, distinct from 1026 which covers the moveItem call itself.","triggerScenarios":"Move folder over an existing folder with the same name; one nested subfolder fails its recursive Move due to expired token, server error, or a nested name conflict that itself errors.","commonSituations":"Deep directory trees where any single nested failure aborts the whole merge; token expiring mid-operation on large trees; partial server-side state left from a previous failed merge.","solutions":["Note the subfolder name in the message — retry the move of just that subfolder","Check the underlying error for auth or 404 causes and fix those first","For very large trees, move subfolders individually so one failure does not abort everything","Verify the destination state after a failure (some children may already be moved) before retrying"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"merge subfolder\") {\n    sub := extractSubfolderName(err) // from the %s in the message\n    return moveSingleSubfolder(ctx, sub) // resume from the failed branch\n}","preventionTips":["Retry from the named subfolder rather than the whole tree — earlier children already moved","Fix auth/permission errors before retrying large merges","Avoid concurrent operations on the same directory tree"],"tags":["sjtu-netdisk","move","merge","recursion"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}