siyuan-note/siyuan · error
errors.New(msg) with Conf.Language(5) template: move failure
Error message
errors.New(msg) with Conf.Language(5) template: move failure message shown to user
What it means
Box.Move renames a path inside a notebook via filelock.Rename (called from moveDoc). On failure it formats the localized template Conf.Language(5) with box name, source path and OS error, and returns errors.New(msg).
Source
Thrown at kernel/model/box.go:520
IncSync()
return nil
}
func (box *Box) Move(oldPath, newPath string) error {
if _, err := box.validateBoxPath(oldPath); err != nil {
return err
}
if _, err := box.validateBoxPath(newPath); err != nil {
return err
}
boxLocalPath := filepath.Join(util.DataDir, box.ID)
fromPath := filepath.Join(boxLocalPath, oldPath)
toPath := filepath.Join(boxLocalPath, newPath)
if err := filelock.Rename(fromPath, toPath); err != nil {
msg := fmt.Sprintf(Conf.Language(5), box.Name, fromPath, err)
logging.LogErrorf("move [path=%s] in box [%s] failed: %s", fromPath, box.Name, err)
return errors.New(msg)
}
if oldDir := path.Dir(oldPath); ast.IsNodeIDPattern(path.Base(oldDir)) {
fromDir := filepath.Join(boxLocalPath, oldDir)
if util.IsEmptyDir(fromDir) {
filelock.Remove(fromDir)
}
}
IncSync()
return nil
}
func (box *Box) Remove(path string) error {
if _, err := box.validateBoxPath(path); err != nil {
return err
}
boxLocalPath := filepath.Join(util.DataDir, box.ID)
filePath := filepath.Join(boxLocalPath, path)View on GitHub (pinned to 8641553a1f)
Solutions
- Read the OS error inside the message (e.g. 'no such file', 'file exists')
- Pick a destination name/path that does not already exist
- Retry after concurrent edits/syncs settle; ensure the source document still exists
- Avoid moving across mount points; keep the whole workspace on one filesystem
Defensive patterns
Strategy: validation
Validate before calling
if _, err := os.Stat(fromPath); err != nil { return errors.New("source document missing") }; if _, err := os.Stat(toPath); err == nil { return errors.New("destination already exists") } Try / catch
if err := box.Move(oldPath, newPath); err != nil { showErrorToUser(err.Error()) } Prevention
- Check destination uniqueness before moving
- Retry after concurrent moves from other clients settle
- Keep the workspace on a single filesystem
When it happens
Trigger: Renaming/moving a document when the source is missing, the destination already exists, or the filesystem cannot perform the rename (cross-device link, permission denied, path traversal already excluded by validation).
Common situations: Two clients moving the same doc concurrently; destination name already taken (duplicate title); data dir on a network mount where rename semantics differ; doc deleted externally before the move.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- install marketplace package failed: %w; rollback failed: %s
- errors.New(msg) with Conf.Language(6) template: mkdir all fa
- msg = fmt.Sprintf(Conf.Language(5), fromBox.Name, fromPath,
- rename path failed
- rollback [%s] to [%s] failed: %w
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/b8965ed1bbecac52.
Report an issue: GitHub.