Skip to content
zit Artifact [1f21f96558]
Login

Artifact [1f21f96558]

Artifact 1f21f96558d6006322bf094b01c27f2b6306d3ef57bab9ac8634189c688b567e:

Manifest of check-in [1f21f96558] - fast-export: accept an author with an empty email

parseIdentity refused an identity carrying an empty address twice over, once as `open + 1 == close` and again as `email.len == 0`. That is not malformed input. Setting `user.email` to the empty string is ordinary git configuration; `git fast-export` writes the identity with an empty angle-bracket pair, and `git fast-import` reads that same stream back to the same commit. The construct is valid by git's own definition on both sides of its own tooling, and we rejected it.

The cost was not cosmetic. Two such commits, reachable only through a merge's second parent, aborted the import of an entire 437 commit repository with `import-git: import failed: Malformed`, naming neither the line nor the rule.

Only the email clauses are relaxed. The name clauses stay: git's own porcelain refuses an empty ident name, and the importer maps the identity's name onto the U card login, so a nameless identity would produce a nameless check-in. The two questions were conflated in a single condition, which is a large part of why this went unnoticed, so the guard now separates them and says why.

This is the third defect on this branch of the same shape: a property of our own fixtures promoted into a rule about the world. The first two were bounds tuned to the width of our benchmark corpus. This one is sharper, a refusal of input the tool we integrate with emits by default. Every identity fixture in the parser tests carried a non-empty email, so a uniform corpus could not falsify a rule that keys on emptiness.

Both tests are witnesses rather than decoration: each fails with Malformed against the previous parser and passes against this one. The unit test pins the construct and the empty-name refusal beside it; the differential test has git itself produce the commit and then asserts the imported check-in carries the login mohye77 rather than an empty user. by dmestas on 2026-07-31 03:13:01.


C fast-export:\saccept\san\sauthor\swith\san\sempty\semail\n\nparseIdentity\srefused\san\sidentity\scarrying\san\sempty\saddress\stwice\sover,\nonce\sas\s`open\s+\s1\s==\sclose`\sand\sagain\sas\s`email.len\s==\s0`.\sThat\sis\snot\nmalformed\sinput.\sSetting\s`user.email`\sto\sthe\sempty\sstring\sis\sordinary\ngit\sconfiguration;\s`git\sfast-export`\swrites\sthe\sidentity\swith\san\sempty\nangle-bracket\spair,\sand\s`git\sfast-import`\sreads\sthat\ssame\sstream\sback\sto\nthe\ssame\scommit.\sThe\sconstruct\sis\svalid\sby\sgit's\sown\sdefinition\son\sboth\nsides\sof\sits\sown\stooling,\sand\swe\srejected\sit.\n\nThe\scost\swas\snot\scosmetic.\sTwo\ssuch\scommits,\sreachable\sonly\sthrough\sa\nmerge's\ssecond\sparent,\saborted\sthe\simport\sof\san\sentire\s437\scommit\nrepository\swith\s`import-git:\simport\sfailed:\sMalformed`,\snaming\sneither\nthe\sline\snor\sthe\srule.\n\nOnly\sthe\semail\sclauses\sare\srelaxed.\sThe\sname\sclauses\sstay:\sgit's\sown\nporcelain\srefuses\san\sempty\sident\sname,\sand\sthe\simporter\smaps\sthe\nidentity's\sname\sonto\sthe\sU\scard\slogin,\sso\sa\snameless\sidentity\swould\nproduce\sa\snameless\scheck-in.\sThe\stwo\squestions\swere\sconflated\sin\sa\nsingle\scondition,\swhich\sis\sa\slarge\spart\sof\swhy\sthis\swent\sunnoticed,\sso\nthe\sguard\snow\sseparates\sthem\sand\ssays\swhy.\n\nThis\sis\sthe\sthird\sdefect\son\sthis\sbranch\sof\sthe\ssame\sshape:\sa\sproperty\sof\nour\sown\sfixtures\spromoted\sinto\sa\srule\sabout\sthe\sworld.\sThe\sfirst\stwo\nwere\sbounds\stuned\sto\sthe\swidth\sof\sour\sbenchmark\scorpus.\sThis\sone\sis\nsharper,\sa\srefusal\sof\sinput\sthe\stool\swe\sintegrate\swith\semits\sby\sdefault.\nEvery\sidentity\sfixture\sin\sthe\sparser\stests\scarried\sa\snon-empty\semail,\sso\na\suniform\scorpus\scould\snot\sfalsify\sa\srule\sthat\skeys\son\semptiness.\n\nBoth\stests\sare\switnesses\srather\sthan\sdecoration:\seach\sfails\swith\nMalformed\sagainst\sthe\sprevious\sparser\sand\spasses\sagainst\sthis\sone.\sThe\nunit\stest\spins\sthe\sconstruct\sand\sthe\sempty-name\srefusal\sbeside\sit;\sthe\ndifferential\stest\shas\sgit\sitself\sproduce\sthe\scommit\sand\sthen\sasserts\sthe\nimported\scheck-in\scarries\sthe\slogin\smohye77\srather\sthan\san\sempty\suser.
D 2026-07-31T03:13:01.753
F .fossil-settings/ignore-glob 76b01a09a221949a7a8acff90b391d1ba8a541ef6696924287ad5ca73908a582
F .github/workflows/ci.yml 757f4e7c6d29e6358dd98a638ab7804ff3460012c02b95f2d3038e2f234b33ee
F LICENSE 702ae7ff835a2a971dae11c5cae039803bf394b77a6d8ec9f18693e449eaaf26
F README.md 67bb1afa5bff033e7ce51ff92e782a8a22a5e64541c219b338147da4b1ad8f47
F build.zig 5bb4db1341c980e4b68851302c2de657dc553f7e60f91a35538666c7df8c298b
F build.zig.zon dd3992bfc8da12e09a018c4697e38ddf79d07e225405af448ecca1ebefc3ea0c
F docs/RELEASE-NOTES-0.1.0.md 5ed8b4d35ee23b7990261f8af34f5fa3cc629baf63b0059d9f7bb2d2c48dc802
F docs/RELEASE-NOTES-0.1.1.md 59eea8c487dc1e9190c44c371656e430cd5621031a71c502ecbae96802712857
F docs/RELEASE-NOTES-0.1.2.md 7c968ab247ad1194f9163e625a37452ae72bdc23f3e66e8ea26b39f6e0a52914
F docs/RELEASE-NOTES-0.1.3.md c8f703b8717040f96a9b77ad132bbe309ba4368ead5362739e4d5ef23f2d3286
F docs/rfcs/draft-fossil-artifact-format-00.txt a6d542a5effeb41d0ea1e916058ccdc0a5819787f167ef1ebad7814f5680e7ad
F docs/rfcs/draft-fossil-delta-format-00.txt d8025d6d75322e33887c3334a4b9cc729960028b3c994ed01e5a474e4b388fd2
F docs/rfcs/draft-fossil-repo-state-00.txt b35480166caaf5d2c220086140a1d47034e9b4967689be8f4cd8779bbdbbc3da
F docs/rfcs/draft-fossil-submanifests-00.txt eaef2e2e36f4fab96ec4ba9654a8e7c02317086918f6e32e45fd62897dfd48e9
F docs/rfcs/draft-fossil-sync-protocol-00.txt 153d31ec11ff6636793514df711389883d5dd3111b97d3da295a30308fb400b4
F scripts/mirror-export.sh cc1130129e3c320cb9c1c5a05f505e45ece23d6bb3e0228da8e7ffe97bd5612b x
F scripts/soak.README 3a2f028e4f87a395b2b779ac63260fcb68a7a9c7ffc9fea5b065d5bc065c4719
F scripts/soak.sh e184de2f7396ae88c1266d565092282dc9aff151fab8f971840d867562f7d1be x
F src/annotate.zig 0a6b6728099e63c84681d1e5228ebb45fafb55d65df1720358247fd6e6532c63
F src/artifact.zig 81425cecf990ac1eb2b87cd48522aa535ac67c9e3ac16f2169aa1418f5d4d875
F src/artifact_fuzz.zig 98000540f71b1f8fa8a33d2f1da885a6c9c2507108fb1bc95630c3b6b4fab0dc
F src/artifact_test.zig 13e3b0371b8d832030a183a5e6409d2d26d33db3ec7a0d940fd949b65b0856d2
F src/bisect.zig 70a0b3561380f216a0cea9ee9419bb1cd1b77d9b6a73786f41992dfd70ceb04a
F src/checkout.zig 31f20dc1fe5285575b7bfca7fedbca1dae07e2cb77c9fde6f0f27e72a7e4f80f
F src/ci_test.zig 642a5de2bc6df0c3b028ab5c6baaeaa3ce29c420b6b47760e996b204591d8fd4
F src/cli.zig f26c62710b07cc2b025f040650cd3fcbafb96bd6cecb2f6060a941e8f8a48a08
F src/cmd/checkout.zig 0f079b56222a8277d1e4fcc44a6c8ddfd996ab09430267dc7c9ee0d549abf95d
F src/cmd/history.zig fd3adc3448c7a8486a8610ff7a47f2ca89620e897590155f0bc1b83bfd64b2a1
F src/cmd/sync.zig b2f11cb373cc455e77600115ec3de0b92d5e946654a14afbc5a5926f9f24f160
F src/cmd/tracking.zig 46b079b974838f92b9508a647c0a89e3747fec09dab072a0bae2c0d0639c4831
F src/container.zig cef1028531f2763f94248b761c8779a1884e44bb854b8c45617494e3ead40e61
F src/container_test.zig a013652b1ed181161d3ad8fc9d8f052f7c27b61e129662632ceaf8cf189445ec
F src/control_paths.zig bc1a94f35675065cee6bf29e9236b443e2a1879ec2f9b65ef0141b1042a77219
F src/crc32.zig 57429c29f4a67a9bfaebad8d5826471f9ff26cfd085c5424bf8e0fccba376bb4
F src/crc32_fuzz.zig 2e6c3425989051ec826b0f1208fa9716808011e71c98ff0a5ae2e38de524caea
F src/delta.zig e8f3a6297d47549aea146222732ccf514c39688414f0a74ba396ac91066686f3
F src/delta_fuzz.zig 5e5c715722760d6f45c4eaaf9b5d495bf83c59e5869a0e0dd76bb57b007e3b53
F src/delta_test.zig b18d97e117dce8fbcc05bff6f6954effdb946bab6d36337efbe5ef64d10646a0
F src/dst.zig 077f19221915ff99026216b96de927fedb499ab265bfe51d5f7f5364e8de32e3
F src/e2e.zig 0a93a1d2133a2dba20468b727afb88e556e5faad818a098a7a6098f4dddcdecc
F src/extras.zig a105769691ce5fd17f67f037c3d773b6ac546798aa6d49ff1acc064d90b8b177
F src/fuzz_tests.zig 60f1db664e0540a05944c3ddb230125ecfaa971e30aaa18c1001c349e861a083
F src/git_fast_export.zig 36ff5739435d2e52740014653ada0e1d8e99f866fd8a495e37710e5edc515162
F src/git_fast_export_test.zig ae055fc388c690114200838fcd0e73f4992740244c686c5deedc4b87010289ef
F src/git_import.zig 9d644eebcef2688ad3ae97f1b1c914b12b13fa2948d31c67e1b3e74f7fec3dab
F src/git_import_benchmark.zig 1ae4a9867c91a78459a4b6cdc8a10427fa85807727e5327bdee6dcc57703e254
F src/git_import_benchmark_support.zig 1e9bc27aed47e63f315cb5c8a4fea2f43a4ccd410e4aeb35c4a8a81391588f68
F src/git_import_cli.zig e914a3cffb8205169823dd4c3804ea6eb5c79ff2a06da22c04b88c10c3d2995a
F src/git_import_cli_pipe_helper.zig 0cbb3eba0d56a9d4fb26b74f20565532372c4fbace16742d6943d04b13bdcdec
F src/git_import_cli_test.zig 44248444b07145496b44fc1ba0c39637b64c486f79ef195f3db42e717a2cc60e
F src/git_import_e2e.zig 8e40de2d5396532b9c0692f700223e8e0214b4f06b450c29f1849b18cda2cb14
F src/git_import_impl.zig 06f955d2d712c6cd5be53c9c660e0e570dae5938898afaa9791765683575f5ad
F src/git_import_refs_test.zig f507bba80b5a276bdb6e5fad8a234247cb5d01433c56ec7725d4b2701115c31c
F src/git_import_test.zig 2717ab140648f77e80fc955ba2f261ec6b6b23455a894cf54d79a9077b22959c
F src/logstore.zig af0b29cbab14bd69596faa3fbae363056c72ac22eb7a76f68b4e47df4558610d
F src/logstore_benchmark.zig 23ec4f894bdf845e21353e343a963045d2c45d960befa2c97c248460c043aaf7
F src/logstore_fuzz.zig fcdbb70b468fcabff6edbfd8a526832acc5ba12a39cca83b5fdffd5716817e8d
F src/logstore_test.zig c97492855395653fd0483a1c4ca003512ad0107c0b3ef6e061ed12f6db8c5675
F src/main.zig 3b9715575371359585955cb82cf69daa356c9adc75791e9a179ac6bc21699b69
F src/managed.zig 81ccc2d6321fe3dff91f653305ae4e73bea0b3fae7db2ab2f0cf168d9518d601
F src/merge3.zig 7fc52445688751bb8af30462549650660bcdbadabef54d892b6505d628248d0b
F src/merge3_fuzz.zig 83dcd4d9f2f9c208baa15e79ceeea80a0ebf47456a9b045f6d1c1efe3a927582
F src/pack.zig 0ea96cb540b3f43f6ff8ce95a3044ce939879bc6f9bf0eb82b26aab4089009c7
F src/packaging_test.zig 95627a5646a06c36a87f2bed1ec925898b8a69248809f6cad0bbdcea9a059cf3
F src/repocache.zig 32af5b54b011fef358a134273b5e6f43da4282122c05a85ad503a8f7796c6c66
F src/repoimage.zig 7d2dc2f3c145e10e2d9ba6997705fd61a0cc0aedde8e171c253163d1279ccdd5
F src/repository.zig 5e35dae88418bb328bcfc209b13badbb2fe5cc832fb83b60cd0ee7be07a5169a
F src/repository_test.zig ffcb406f6a80facde45696b7af8ac321b3972babf636eb26b903c63b6c9f6b56
F src/repostate.zig 78fa336fdbd491ac4a0a161e87e6c6edacaee8051c276b10eb9f6c61a0a2c6fa
F src/repostate_test.zig 0f5c4ae8b3782e6910beb30b4d1960fdd16ec3e7c37b3727633d47ab52b0b8db
F src/repoview.zig b6e0b35b133b6acfae8dde8fb4ab45a886e50e43ebb668030ce941dc205dd2c5
F src/rfc_vectors/artifact_a1_1_sha1_manifest.txt 82d8fc78b3fbf85efe80cb05e79db40c910bf0551e55b728c6f9c2ca7a42ddb6
F src/rfc_vectors/artifact_a1_2_sha3_technote.txt 832e850f83aab2e2a754aa97591109f7f05fb41e4126c7e71c88a59d6d17e55d
F src/rfc_vectors/artifact_a3_rcard_manifest.txt 47e412ef211f095e93275fadf527909e581eef42357d8437fc7e299bfc3e62a7
F src/rfc_vectors/submanifest_a2_1_leaf.txt aa9d404c14fe4dadd2ab398961fb0dfe650a877c061f650d8233a5888e920acf
F src/rfc_vectors/submanifest_a2_2_leaf.txt a50a722b465ed67b42ee0fbe61e4a19d6b1d22940ba5740e99e450921e3f52ea
F src/rfc_vectors/submanifest_a3_tree_manifest.txt 95fba39cbaba76fccb15571516659cea6a0e8a60123c3e7bda1397649d87c509
F src/rfc_vectors/submanifest_a4_1_leaf.txt b8e53d0c46cb57b616cc0ed6de5ce2453715be6157b73d247bcd5de8a6510aaa
F src/rfc_vectors/submanifest_a4_2_leaf.txt cff23e5ba71569397c1d816afa2dd0bfffc42339e402df36b63623846bd5fcbe
F src/rfc_vectors/submanifest_a4_3_leaf.txt 9604c3f9774f7472d7bff44d5965f30250358a3e7a18046eeaf5f9d83bd5cdc6
F src/rfc_vectors/submanifest_a4_tree_manifest.txt 02dad8d4451ecf930c0c8637cf66351579aa746aebf0cf10f249b2a6dea37caa
F src/rfc_vectors/submanifest_a5_delta_manifest.txt c74e37f650677523f7b6c2b4f094f766c4427a8ea180768ad75fa2de6bd14902
F src/rfc_vectors/submanifest_a5_encoding_leaf_1.txt e2899273b6a258ee18e053a79903d02469a275e2c80279c3657c7b803e2af6c0
F src/rfc_vectors/submanifest_a5_encoding_leaf_2.txt d7edb65681faaa4fd4f3541f04370421b057bf299098b781c7ec50d609869082
F src/rfc_vectors/submanifest_a5_encoding_leaf_3.txt c634332663f1cc0298aae6b61c799214a522877102cd6acdfe633f29fd79eeaf
F src/rfc_vectors/submanifest_a5_encoding_manifest.txt deb0cb8b56fddfc4eebbab0f928cbdb19e64a6ba568064d5b43663dc1ef7263f
F src/rfc_vectors/submanifest_a5_merge_leaf_1.txt 4bf4476e3aa41a1e3d26c85173c18fcd19f61871d4fc31215e523d7502078cc8
F src/rfc_vectors/submanifest_a5_merge_leaf_2.txt 6f3c993caa208b6fd44332d241676f9aa6a8c29dc7e28f287d5cdc088005a842
F src/rfc_vectors/submanifest_a5_merge_manifest.txt cef55b9b325fbc8abd59a044acafa57603c1b11a605e7fbba02d511a6da7a806
F src/rfc_vectors/submanifest_a5_three_level_interior_1.txt d42946de7b59647235f2166d964e9e5878bb1b3aba796b5e9c5e9dc719784e23
F src/rfc_vectors/submanifest_a5_three_level_interior_2.txt c1cc48fa9a3fbc34da7614632137890b4b09b33e750abc75514836c533e5f42e
F src/rfc_vectors/submanifest_a5_three_level_manifest.txt c136ef62f5f13c18d06564649da6022d9fe25cde5be15dd1ad10b04015096424
F src/rfc_vectors/sync_a1_round1_reply.txt 638813029b10f81303b88859279afb17095d7c779c993f4267870909acabbeb9
F src/rfc_vectors/sync_a1_round2_file_cards.txt 4fa397741f7521cc4181d5d6b04dc143187f57602384eaa688552115ecda27c2
F src/rfc_vectors/sync_a1_round2_reply.txt af956808190c79b37a384041690c36b78845b471d6c6c01d1cced6e3ee92e6b1
F src/rfc_vectors/sync_a2_reply.txt aa130a127cde210f793c7842960083c765e0ffc7b673374fabc8f0edfe03d763
F src/root.zig d76470b4034f7c3581aee60c50437405aa1b6ac06442b8fa45812443b8df0c47
F src/serve.zig 5a934102c75a29b2f57d4c3e69bed69e1319ecdb56b12a8da5407297661cff3b
F src/serve_benchmark.zig ff55c6148e961c9374ad60a756d9d997fadbc854d2a79d625235b580aefb8656
F src/serve_fuzz.zig 3c39ea768ffa37599e2cc00c588f053870766ab91500aceb0d844a4322174687
F src/sim/assembly_sweep.zig 65016d6ae15579b7e4c7db91ea4659b21dc67533b3807ad30619a3b517ef4ed1
F src/sim/checkout_sweep.zig 80bb6fef67c88a29a2b6bdc372996c9f2c4ad65db289cddebc7a427b42ee5d39
F src/sim/faulty_dir.zig 29f0efc3338c14eb87085cd87591d01d78ae1feac8b3f6ab7f5a2533ac01a7db
F src/sim/faulty_file.zig 720be41b7f9bd64b9fd2586201e2f62d79c6d60452196eedeb9708b170093424
F src/sim/gen.zig a05fa9fa17e4b585c662c6e1d3855e5e46327db9c7490bc834382b64e742c557
F src/sim/net.zig 8fb057012ce0a33f67c928cd696bc2761fea8ba4012b2daa33871b2ba5dfe772
F src/sim/oracle.zig bc9e272bb3332b7b715fbcc254b63583aa294b769d423f4be48593152717dfb2
F src/sim/storage_sweep.zig 78e8a877e22afe537d29d289273d739a18f220497584b925492ed57331af27d9
F src/sim/sync_gen.zig 238d46942915b5c0e989dfc738b5927b5228468ea123e6f17b6fb593aa5cbf6e
F src/sim/sync_sweep.zig feeab7fa3123f8a9a1e6a43b6feee0e4d68479a6a19eb9374d57edbe9c600d4b
F src/smoke.zig 71968cdaeed39abca39b4795c95f590f9afea80a32e95a07d4209495aeb70ea6
F src/storage.zig 512205eb629d5af8d50ad336f1ef49f53b455abd52ee2f9b56d20893cafad39f
F src/storage_benchmark.zig 123ee72db0b7ba660a11594b54b4e11410b3cb1df4ca4e8c3e29cfcb7ceb48b3
F src/storestat.zig 30bd29d3638c4dcda9766f94a1a202cc1df181add943d9afb9ef225ccc64b4f9
F src/submanifest_benchmark.zig 8668fb10ea60736302c97f8c19c6cec5cbbdbe99b2013494b889df5d699ac2e1
F src/submanifest_editor.zig 3054898bbe9377edfcddad47fe25ec05666a011248f90e18add776f5cf19bcb5
F src/submanifest_editor_test.zig 5ea55e5c37df2ca7e9b51798890aab0848cb9ce4c02269bf876bf48fe4386db1
F src/submanifest_partition.zig 1d06059185986c977d20433ea8318f0e48e7f58a59a7432fb5e93de75a64c932
F src/sync.zig fe129cf3168cc8613264448ffea8794e2d18be283c74f15d02d3e82c74678664
F src/sync_benchmark.zig f0d99a1f8273a1675a2f482a4977bbb12fc07a432447905c991bd359db73acdf
F src/sync_driver.zig 722ed498ea6b76900661a085d4257e51f6416d43ac1185e8ac15140de265f67e
F src/sync_driver_test.zig 20eb1827932874422a75d06cfe503680cf17d99152dff1f852989dc22ae923c5
F src/sync_fuzz.zig 0ab9b7195535468db561cdcb405b7bf17536e2c6cb77a115ab1fe2badb001194
F src/sync_test.zig c2a24e84db7afca3e688854ff9079046c3633877d38cf834901f3c5734a2a8fd
F src/tidy.zig 59fba497b6a9a39314fc24a08334321ecaad1c026cc0a7d35c67a1e2066458a8
F src/transport.zig 36c4cbabaf10b30dbc20c6b8a30df94394a7e0a65b27613f0ace2f49ec1eaa79
F src/transport_fuzz.zig 43c310c51a6502fb2e049e6f43dfa151b1a632e6c885554ec6edce4ec62a8a48
F src/undo.zig c3ef95e4c6affeb893e60922506b760f483a6640fe3fd5c63bf86c6d20cf2675
F src/update.zig 050c0b96ae847a2a3d4e544e2e031715a4259f44d6bcdea1677fc094c89b8fab
F src/update_test.zig 5185a994e37dc3d3d73e37facdc5d85548f14a54e8ca8e32a26216d2a8437818
F src/warmread_benchmark.zig 290887ab34f7777effcd4062c000456b1fcf8a59f84617a96a740d15a0245776
P dc0aa2f8584bd261f2cbc42cf785a4252b6fddb0e4af1554a29c15b773e64f76
R 0eea3b7e81acab7b5b23eccca099e3f3
U dmestas
Z ead95eb444307d18f78cb0d5c233e82a