jdx/mise · error

checkpoint has no content snapshot

Error message

checkpoint {} has no content snapshot

What it means

`mise dotfiles history show --files` lists the file tree captured in the checkpoint. Some checkpoints only record journal/metadata without a content snapshot (snapshot is None); asking for --files on such a checkpoint bails with the checkpoint id.

Solutions

  1. Omit --files and use the journal output instead for that checkpoint
  2. Pick a newer checkpoint that includes a content snapshot (check `mise dotfiles history ls`)
  3. Recreate a checkpoint by touching/saving the file so a fresh snapshot is taken

Example fix

// before
mise dotfiles history show ckpt123 --files   // no snapshot
// after
mise dotfiles history show ckpt123           # journal only
# or pick a snapshot-bearing checkpoint
mise dotfiles history ls
Defensive patterns

Strategy: fallback

Validate before calling

mise dotfiles history ls | grep "$ckpt"   # confirm checkpoint age/features

Try / catch

match Err(msg) if msg.contains("has no content snapshot") => retry without --files and use journal output

Prevention

When it happens

Trigger: `mise dotfiles history show <id> --files` where c.tree.snapshot is None for that checkpoint — e.g. checkpoints created before snapshot capture was enabled or for operations that did not snapshot content.

Common situations: Old checkpoints from before the snapshot feature; large files configured to skip snapshots; corrupted store where the snapshot tree reference was lost.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/2954f56c22da0c01. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/dotfiles/history/show.rs:145

        }
        for omitted in &coverage.omitted {
            miseprintln!("  omitted: {} ({})", omitted.path, omitted.reason);
        }
        for incomplete in &coverage.incomplete {
            miseprintln!("  incomplete: {} ({})", incomplete.path, incomplete.reason);
        }
        if let Some(operation) = &c.operation
            && !operation.journal.is_empty()
        {
            miseprintln!("");
            miseprintln!("Journal:");
            for line in journal::render(&operation.journal) {
                miseprintln!("  - {line}");
            }
        }
        if self.files {
            let Some(tree) = &c.tree.snapshot else {
                bail!("checkpoint {} has no content snapshot", entry.id);
            };
            let Some(repo) = store.repo() else {
                bail!("listing snapshot files requires git");
            };
            miseprintln!("");
            miseprintln!("Files:");
            for file in repo.ls_tree(tree)? {
                let size = file.size.map(|size| size.to_string()).unwrap_or_default();
                miseprintln!(
                    "  {} {:>8} {}",
                    file.mode,
                    size,
                    crate::system::history::tracked::tree_path_to_display(&file.path)
                );
            }
        }
        Ok(())
    }

View on GitHub (pinned to 533346cc37)