{"record":{"id":"5211748889124c76","repo":"AlistGo/alist","slug":"rename-merge-subfolder-s-w","errorCode":null,"errorMessage":"rename merge subfolder %s: %w","messagePattern":"rename merge subfolder (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/sjtu_netdisk/driver.go","lineNumber":415,"sourceCode":"\t\t// 409 means conflict name\n\t\tif resp.StatusCode() == http.StatusConflict {\n\t\t\tchildren, listErr := d.List(ctx, srcObj, model.ListArgs{})\n\t\t\tif listErr != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"rename merge: list source folder failed: %w\", listErr)\n\t\t\t}\n\n\t\t\ttargetDirObj := &model.Object{Path: dstPath, Name: newName, IsFolder: true}\n\n\t\t\tfor _, child := range children {\n\t\t\t\tchildSrcPath := path.Join(srcObj.GetPath(), child.GetName())\n\n\t\t\t\tif child.IsDir() {\n\t\t\t\t\tchildObj := &model.Object{\n\t\t\t\t\t\tName: child.GetName(), Path: childSrcPath,\n\t\t\t\t\t\tSize: child.GetSize(), IsFolder: true,\n\t\t\t\t\t}\n\t\t\t\t\tif _, mergeErr := d.Move(ctx, childObj, targetDirObj); mergeErr != nil {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"rename merge subfolder %s: %w\", child.GetName(), mergeErr)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfileErr := d.moveItem(ctx, childSrcPath, dstPath, child.GetName(), false, \"overwrite\")\n\t\t\t\t\tif fileErr != nil {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"rename merge file %s: %w\", child.GetName(), fileErr)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_ = d.Remove(ctx, srcObj)\n\n\t\t\treturn &model.Object{\n\t\t\t\tName:     newName,\n\t\t\t\tSize:     srcObj.GetSize(),\n\t\t\t\tIsFolder: true,\n\t\t\t\tModified: srcObj.ModTime(),\n\t\t\t\tCtime:    srcObj.CreateTime(),\n\t\t\t\tPath:     dstPath,","sourceCodeStart":397,"sourceCodeEnd":433,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/sjtu_netdisk/driver.go#L397-L433","documentation":"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).","triggerScenarios":"Folder rename onto an existing name; during the child loop, d.Move(childObj, targetDirObj) errors for one subfolder.","commonSituations":"Deep trees with a single failing branch aborting the whole rename; token expiry during long merges; partial state from an earlier interrupted merge.","solutions":["Retry the rename — already-moved children make the retry effectively resumable","Check the wrapped error for auth/permission causes and remediate","Rename subfolders individually to isolate the failing branch","Verify destination state before retrying to avoid duplicates"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"rename merge subfolder\") {\n    sub := extractSubfolderName(err)\n    return moveSingleSubfolder(ctx, sub)\n}","preventionTips":["Retry from the named subfolder; earlier children already moved","Fix underlying auth errors before retrying","Avoid rename-merges on very deep trees; restructure instead"],"tags":["sjtu-netdisk","rename","merge","recursion"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}