{"record":{"id":"0274633a9a2bb44c","repo":"a-b-street/abstreet","slug":"not-in-data-manifest-txt","errorCode":null,"errorMessage":"{} not in data/MANIFEST.txt","messagePattern":"(.+?) not in data/MANIFEST\\.txt","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"updater/src/main.rs","lineNumber":84,"sourceCode":"\n    abstutil::logger::setup();\n    match Task::from_args() {\n        Task::Upload => {\n            upload(\"dev\");\n        }\n        Task::IncrementalUpload { version } => {\n            // We DON'T want to override the main data immediately from the batch Docker jobs. If\n            // running locally, can temporarily disable this assertion.\n            assert_ne!(version, \"dev\");\n            incremental_upload(version);\n        }\n        Task::DryRun { single_file } => {\n            if let Some(path) = single_file {\n                let local = md5sum(&path);\n                let truth = Manifest::load()\n                    .entries\n                    .remove(&path)\n                    .unwrap_or_else(|| panic!(\"{} not in data/MANIFEST.txt\", path))\n                    .checksum;\n                if local != truth {\n                    println!(\"{} has changed\", path);\n                }\n            } else {\n                just_compare();\n            }\n        }\n        Task::OptIntoAll => {\n            println!(\"{}\", abstutil::to_json(&DataPacks::all_data_packs()));\n        }\n        Task::Download {\n            minimal,\n            dont_delete,\n            dl_from_local,\n            version,\n        } => {\n            download_updates(version, minimal, !dont_delete, dl_from_local).await;","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/a-b-street/abstreet/blob/0964f29315820c91b171b585eb51e300164e9197/updater/src/main.rs#L66-L102","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Pass the exact path relative to the repo root as recorded in data/MANIFEST.txt","Regenerate the manifest so the new file gets an entry, then rerun","Check manifest entries (grep the path in data/MANIFEST.txt) to confirm the exact key"],"exampleFix":"// before\n./target/release/updater dry-run --single-file=data/input/myfile.bin\n// after (regenerate manifest first, or use the exact manifest key)\ngrep 'data/input/myfile.bin' data/MANIFEST.txt\ncargo run --bin updater -- dry-run --single-file=data/input/myfile.bin","handlingStrategy":"validation","validationCode":"let manifest = Manifest::load();\nassert!(manifest.entries.contains_key(path), \"{} not in manifest; regenerate it\", path);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Regenerate MANIFEST.txt after adding data files","Pass exact manifest-relative paths to --single-file","Grep the manifest to confirm the key before dry-run"],"tags":["rust","panic","manifest","checksum"],"backgroundTag":"record-not-found","analyzedSha":"0964f29315820c91b171b585eb51e300164e9197","analyzedAt":"2026-09-13T18:02:03.421Z","contentChangedAt":"2026-09-13T18:02:03.421Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}