alibaba/open-code-review · error

create session dir: %w

Error message

create session dir: %w

What it means

Thrown when os.MkdirAll fails to create the session directory ~/.opencodereview/<sessions>/<encoded-repo-path> with mode 0700. The writer needs this directory to exist before it can create the JSONL session file. The wrapped error carries the underlying os.PathError.

Source

Thrown at internal/session/persist.go:111

	vol = strings.ReplaceAll(vol, ":", "_")

	// Handle edge case where path was only separators or volume name
	result := vol + p
	if result == "" {
		return "empty"
	}
	return result
}

func (jw *jsonlWriter) open() error {
	home, err := os.UserHomeDir()
	if err != nil {
		return fmt.Errorf("resolve home dir: %w", err)
	}

	sessionDir := filepath.Join(home, ".opencodereview", sessionSubDir, encodeRepoPath(jw.repoDir))
	if err := os.MkdirAll(sessionDir, 0700); err != nil {
		return fmt.Errorf("create session dir: %w", err)
	}

	filename := filepath.Join(sessionDir, jw.sessionID+".jsonl")
	f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
	if err != nil {
		return fmt.Errorf("open session file: %w", err)
	}

	jw.file = f
	jw.writer = bufio.NewWriter(f)
	return nil
}

func (jw *jsonlWriter) writeRecordLocked(rec map[string]any) {
	data, err := json.Marshal(rec)
	if err != nil {
		fmt.Printf("[ocr session] failed to marshal record: %v\n", err)
		return

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Check whether ~/.opencodereview exists as a file and remove/rename it so it can be a directory (mkdir -p ~/.opencodereview)
  2. Ensure $HOME is writable by the current user (chmod u+w $HOME, or pick a different HOME)
  3. Check disk space/quota (df -h ~) and free space if the filesystem is full
  4. Inspect the wrapped PathError for the exact failing path and fix permissions (chown/chmod) or mounts

Example fix

// shell
# before
ls -la ~/.opencodereview   # regular file -> blocks MkdirAll
// after
rm ~/.opencodereview && mkdir -p ~/.opencodereview
Defensive patterns

Strategy: validation

Validate before calling

home, err := os.UserHomeDir()
if err == nil {
    dir := filepath.Join(home, ".opencodereview")
    if fi, err := os.Stat(dir); err == nil && !fi.IsDir() {
        return fmt.Errorf("%s exists as a file; remove it", dir)
    }
    if err := os.MkdirAll(dir, 0700); err != nil {
        return err
    }
}

Try / catch

if err := runOCR(); err != nil {
    if strings.Contains(err.Error(), "create session dir") {
        log.Fatalf("Check that $HOME is writable and ~/.opencodereview is not a file: %v", err)
    }
}

Prevention

When it happens

Trigger: newJSONLWriter -> open() calls os.MkdirAll on the session dir and it fails: a parent path component is a regular file, or the process lacks write permission on $HOME, or the filesystem is read-only.

Common situations: $HOME is read-only or full (disk quota exceeded); ~/.opencodereview exists as a file instead of a directory (created accidentally); NFS/containers with read-only mounts; SELinux/AppArmor denials on $HOME.

Understand the failure class

Background: mkdir permission denied (EACCES): failed to create directory errors explained — this error's family across 32 libraries.

Related errors


AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02). Data as JSON: /api/errors/8ea5ca3c4f350d12. Report an issue: GitHub.