a-b-street/abstreet · error

not in data/MANIFEST.txt

Error message

{} not in data/MANIFEST.txt

What it means

During a dry-run comparison for a single file, the updater expects every local path to have an entry in data/MANIFEST.txt. If the path isn't listed in the manifest, it panics, since there is no known checksum to compare against.

Solutions

  1. Pass the exact path relative to the repo root as recorded in data/MANIFEST.txt
  2. Regenerate the manifest so the new file gets an entry, then rerun
  3. Check manifest entries (grep the path in data/MANIFEST.txt) to confirm the exact key

Example fix

// before
./target/release/updater dry-run --single-file=data/input/myfile.bin
// after (regenerate manifest first, or use the exact manifest key)
grep 'data/input/myfile.bin' data/MANIFEST.txt
cargo run --bin updater -- dry-run --single-file=data/input/myfile.bin
Defensive patterns

Strategy: validation

Validate before calling

let manifest = Manifest::load();
assert!(manifest.entries.contains_key(path), "{} not in manifest; regenerate it", path);

Prevention

When it happens

Trigger: Running the updater's DryRun task with single_file set to a path that has no entry in data/MANIFEST.txt (path string must match the manifest keys exactly).

Common situations: Typos or wrong relative path passed to --single-file; a newly added data file whose manifest was never regenerated; manifest out of date after manual edits.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of a-b-street/abstreet@0964f29315 (2026-09-13). Data as JSON: /api/errors/0274633a9a2bb44c. Report an issue: GitHub.

Appendix: source

Thrown at updater/src/main.rs:84

    abstutil::logger::setup();
    match Task::from_args() {
        Task::Upload => {
            upload("dev");
        }
        Task::IncrementalUpload { version } => {
            // We DON'T want to override the main data immediately from the batch Docker jobs. If
            // running locally, can temporarily disable this assertion.
            assert_ne!(version, "dev");
            incremental_upload(version);
        }
        Task::DryRun { single_file } => {
            if let Some(path) = single_file {
                let local = md5sum(&path);
                let truth = Manifest::load()
                    .entries
                    .remove(&path)
                    .unwrap_or_else(|| panic!("{} not in data/MANIFEST.txt", path))
                    .checksum;
                if local != truth {
                    println!("{} has changed", path);
                }
            } else {
                just_compare();
            }
        }
        Task::OptIntoAll => {
            println!("{}", abstutil::to_json(&DataPacks::all_data_packs()));
        }
        Task::Download {
            minimal,
            dont_delete,
            dl_from_local,
            version,
        } => {
            download_updates(version, minimal, !dont_delete, dl_from_local).await;

View on GitHub (pinned to 0964f29315)