)]}'
{"id":"depot~6720","triplet_id":"depot~canon~I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f","project":"depot","branch":"canon","attention_set":{},"removed_from_attention_set":{"1000034":{"account":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"last_update":"2022-09-21 14:23:46.000000000","reason":"Change was submitted"},"1000001":{"account":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"last_update":"2022-09-21 14:11:38.000000000","reason":"removed on reply"},"1000010":{"account":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"last_update":"2022-09-21 14:23:46.000000000","reason":"Change was submitted"}},"hashtags":[],"change_id":"I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f","subject":"fix(tvix/eval): compare versions with an extra empty component","status":"MERGED","created":"2022-09-21 11:58:33.000000000","updated":"2022-09-21 14:23:46.000000000","submitted":"2022-09-21 14:23:46.000000000","submitter":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"total_comment_count":0,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"6722","meta_rev_id":"be0bc5ba297714c0a34e74073d3823c5f74b247f","_number":6720,"virtual_id_number":6720,"owner":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"actions":{},"labels":{"Code-Review":{"approved":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"all":[{"value":0,"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},{"tag":"autogenerated:gerrit:merged","value":2,"date":"2022-09-21 14:23:46.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}],"values":{"-2":"This shall not be merged","-1":"I would prefer this is not merged as is"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me, approved"},"description":"","default_value":0},"Verified":{"approved":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"all":[{"value":0,"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},{"value":0,"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"tag":"autogenerated:gerrit:merged","value":1,"date":"2022-09-21 14:23:46.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}],"values":{"-1":"Fails"," 0":"No score","+1":"Verified"},"description":"","default_value":0},"Autosubmit":{"all":[{"value":0,"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},{"value":0,"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}],"values":{" 0":"Submit manually","+1":"Submit automatically"},"description":"","default_value":0,"optional":true},"All-Comments-Resolved":{"approved":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"all":[{"value":0,"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},{"value":0,"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}]},"Conformant-Commit-Message":{"approved":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"all":[{"value":0,"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},{"value":0,"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"value":0,"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}]}},"removable_reviewers":[{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"}],"reviewers":{"CC":[{"_account_id":1000065,"name":"Thomas Frank","email":"thomas@franks-im-web.de","username":"thofrank"}],"REVIEWER":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2022-09-21 11:58:38.000000000","updated_by":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"reviewer":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"state":"CC"},{"updated":"2022-09-21 11:59:11.000000000","updated_by":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"reviewer":{"_account_id":1000065,"name":"Thomas Frank","email":"thomas@franks-im-web.de","username":"thofrank"},"state":"CC"},{"updated":"2022-09-21 11:59:11.000000000","updated_by":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"reviewer":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"state":"REVIEWER"},{"updated":"2022-09-21 11:59:11.000000000","updated_by":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"reviewer":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"state":"REVIEWER"},{"updated":"2022-09-21 12:00:58.000000000","updated_by":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"reviewer":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"state":"REVIEWER"}],"messages":[{"id":"8dc6b72fbb6445ab8357eccd195d49a7393e3158","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"date":"2022-09-21 11:58:33.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"f78f7bed78a4c24107568f94b2c548f06b8281bf","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-21 11:58:38.000000000","message":"Patch Set 1:\n\nStarted build for patchset #1 on: https://buildkite.com/tvl/depot/builds/16653","accounts_in_message":[],"_revision_number":1},{"id":"0b3dfd7d9121fe316fca0eba280dee1fbaa50ab4","tag":"autogenerated:gerrit:code-owners:addReviewer","author":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"date":"2022-09-21 11:59:11.000000000","message":"\u003cGERRIT_ACCOUNT_1000001\u003e, who was added as reviewer owns the following files:\n* tvix/eval/src/builtins/mod.rs\n* tvix/eval/src/builtins/versions.rs\n\n\u003cGERRIT_ACCOUNT_1000010\u003e, who was added as reviewer owns the following files:\n* tvix/eval/src/builtins/mod.rs\n* tvix/eval/src/builtins/versions.rs\n","accounts_in_message":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"}],"_revision_number":1},{"id":"acbab4cf578cea05432eda19ae99b9d77d047f31","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-21 12:00:58.000000000","message":"Patch Set 1: Verified+1\n\nBuild of patchset 1 passed: https://buildkite.com/tvl/depot/builds/16653","accounts_in_message":[],"_revision_number":1},{"id":"79ddbea26773f50418d875587c29892464783be7","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"date":"2022-09-21 12:04:48.000000000","message":"Uploaded patch set 2.","accounts_in_message":[],"_revision_number":2},{"id":"5f482ba1fb64afb76b2d40be068af72d63212913","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-21 12:04:50.000000000","message":"Patch Set 2:\n\nStarted build for patchset #2 on: https://buildkite.com/tvl/depot/builds/16656","accounts_in_message":[],"_revision_number":2},{"id":"829e35d8708c7973303bda75069f7df1a0e91659","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-21 12:06:10.000000000","message":"Patch Set 2: Verified+1\n\nBuild of patchset 2 passed: https://buildkite.com/tvl/depot/builds/16656","accounts_in_message":[],"_revision_number":2},{"id":"fd7979c592d23e3272cb13e4cecdc640fca05ed5","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"date":"2022-09-21 12:13:37.000000000","message":"Uploaded patch set 3.","accounts_in_message":[],"_revision_number":3},{"id":"54b0895205e37f1f531d10608501670e0daa711c","tag":"autogenerated:buildkite~trigger","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-21 12:13:39.000000000","message":"Patch Set 3:\n\nStarted build for patchset #3 on: https://buildkite.com/tvl/depot/builds/16658","accounts_in_message":[],"_revision_number":3},{"id":"ef56cee49c5873b3c6b073553d1993dbe0bf3172","tag":"autogenerated:buildkite~result","author":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]},"date":"2022-09-21 12:15:00.000000000","message":"Patch Set 3: Verified+1\n\nBuild of patchset 3 passed: https://buildkite.com/tvl/depot/builds/16658","accounts_in_message":[],"_revision_number":3},{"id":"4f2bead5eb0aa44ab031671e28f2aea37881270d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"date":"2022-09-21 13:08:29.000000000","message":"Uploaded patch set 4: New patch set was added with same tree, parent tree, and commit message as Patch Set 3.","accounts_in_message":[],"_revision_number":4},{"id":"93f45ba8c4b5c2dd26c98aea0a7721c5a6733437","author":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"date":"2022-09-21 14:11:38.000000000","message":"Patch Set 4: Code-Review+2\n\nBy voting Code-Review+2 the following files are now code-owner approved by \u003cGERRIT_ACCOUNT_1000001\u003e:\n* tvix/eval/src/builtins/mod.rs\n* tvix/eval/src/builtins/versions.rs\n","accounts_in_message":[{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"}],"_revision_number":4},{"id":"be0bc5ba297714c0a34e74073d3823c5f74b247f","tag":"autogenerated:gerrit:merged","author":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"date":"2022-09-21 14:23:46.000000000","message":"Change has been successfully rebased and submitted as 083fc1dbe59e28bb25cc1dc7405ee45d9d9244b7","accounts_in_message":[],"_revision_number":5}],"current_revision_number":5,"current_revision":"083fc1dbe59e28bb25cc1dc7405ee45d9d9244b7","revisions":{"8245f4752146320dce284f26abe10a8ad94f7392":{"kind":"REWORK","_number":1,"created":"2022-09-21 11:58:33.000000000","uploader":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"ref":"refs/changes/20/6720/1","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/20/6720/1","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/20/6720/1"}}},"commit":{"parents":[{"commit":"b1754c3a4e5c4c34bd007b7eb9993fc9a5171da1","subject":"fix(tvix/eval): implement C++ Nix version part comparison algorithm","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003db1754c3a4e5c4c34bd007b7eb9993fc9a5171da1"}]}],"author":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 11:47:23.000000000","tz":120},"committer":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 11:58:30.000000000","tz":120},"subject":"fix(tvix/eval): compare versions with an extra empty component","message":"fix(tvix/eval): compare versions with an extra empty component\n\nThis is necessary because builtins.compareVersions compares versions in\na subtly not-quite-but-still-lexicographical way: `pre` for example can\nhave an effect if it is post-fixed: `2.3 \u003c 2.3pre`. This is a violation\nof the rule that in a lexicographical ordering, the longer string is\nconsidered greater if they are otherwise equal. builtins.compareVersion\nis comparing lexicographically though, if you do the following\ntransformation beforehand:\n\n  2.3 --split--\u003e [ \"2\" \"3\" ] --append--\u003e [ \"2\" \"3\" \"\" ]\n  2.3pre --split--\u003e [ \"2\" \"3\" \"pre\" ] --append--\u003e [ \"2\" \"3\" \"pre\" \"\" ]\n\nComparing the transformed version is then done lexicographically:\n\n  2.3 \u003c 2.3.0pre since [ \"2\" \"3\" \"\" ] \u003c [ \"2\" \"3\" \"0\" \"pre\" ]\n\nHere, the `pre` rule never comes into effect because no comparison on it\nhappens, instead we use the longer string rule of a lexicographical\ncomparison.\n\nIn the C++ codebase, the reason for this behavior is that the\niterator-esque construct they use always yields the empty string before\nit exposes it has been fully consumed. This is probably intentional to\nsupport the postfixed `pre` which is, for example, used by NixOS\nversions (e.g. unstable post 22.05 is 22.11-pre). We replicate this\nbehavior using the `Chain` iterator in `VersionPartsIter::new_for_cmp`.\n\nChange-Id: I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8245f4752146320dce284f26abe10a8ad94f7392"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d8245f4752146320dce284f26abe10a8ad94f7392"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"b1754c3a4e5c4c34bd007b7eb9993fc9a5171da1","is_merged_in_target_branch":false,"change_id":"I46642e6da5eac7c0883cdce860622cdba04cd12b","change_number":6719,"patch_set_number":1,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"90d5fa0ab8e6d1fa5faea0c0f41e1585816ecf7f":{"kind":"REWORK","_number":2,"created":"2022-09-21 12:04:48.000000000","uploader":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"ref":"refs/changes/20/6720/2","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/20/6720/2","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/20/6720/2"}}},"commit":{"parents":[{"commit":"dff2a6f019a03ccdacaa565933b1eacc97dc6295","subject":"fix(tvix/eval): implement C++ Nix version part comparison algorithm","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003ddff2a6f019a03ccdacaa565933b1eacc97dc6295"}]}],"author":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 11:47:23.000000000","tz":120},"committer":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 12:04:35.000000000","tz":120},"subject":"fix(tvix/eval): compare versions with an extra empty component","message":"fix(tvix/eval): compare versions with an extra empty component\n\nThis is necessary because builtins.compareVersions compares versions in\na subtly not-quite-but-still-lexicographical way: `pre` for example can\nhave an effect if it is post-fixed: `2.3 \u003c 2.3pre`. This is a violation\nof the rule that in a lexicographical ordering, the longer string is\nconsidered greater if they are otherwise equal. builtins.compareVersion\nis comparing lexicographically though, if you do the following\ntransformation beforehand:\n\n  2.3 --split--\u003e [ \"2\" \"3\" ] --append--\u003e [ \"2\" \"3\" \"\" ]\n  2.3pre --split--\u003e [ \"2\" \"3\" \"pre\" ] --append--\u003e [ \"2\" \"3\" \"pre\" \"\" ]\n\nComparing the transformed version is then done lexicographically:\n\n  2.3 \u003c 2.3.0pre since [ \"2\" \"3\" \"\" ] \u003c [ \"2\" \"3\" \"0\" \"pre\" ]\n\nHere, the `pre` rule never comes into effect because no comparison on it\nhappens, instead we use the longer string rule of a lexicographical\ncomparison.\n\nIn the C++ codebase, the reason for this behavior is that the\niterator-esque construct they use always yields the empty string before\nit exposes it has been fully consumed. This is probably intentional to\nsupport the postfixed `pre` which is, for example, used by NixOS\nversions (e.g. unstable post 22.05 is 22.11-pre). We replicate this\nbehavior using the `Chain` iterator in `VersionPartsIter::new_for_cmp`.\n\nChange-Id: I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d90d5fa0ab8e6d1fa5faea0c0f41e1585816ecf7f"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d90d5fa0ab8e6d1fa5faea0c0f41e1585816ecf7f"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"dff2a6f019a03ccdacaa565933b1eacc97dc6295","is_merged_in_target_branch":false,"change_id":"I46642e6da5eac7c0883cdce860622cdba04cd12b","change_number":6719,"patch_set_number":2,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"ccc2de4dd04a51016401868da4a2a714e8f164e0":{"kind":"REWORK","_number":3,"created":"2022-09-21 12:13:37.000000000","uploader":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"ref":"refs/changes/20/6720/3","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/20/6720/3","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/20/6720/3"}}},"commit":{"parents":[{"commit":"07689535a4ff6132c5280538095d782ffb539dd5","subject":"fix(tvix/eval): implement C++ Nix version part comparison algorithm","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d07689535a4ff6132c5280538095d782ffb539dd5"}]}],"author":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 11:47:23.000000000","tz":120},"committer":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 12:13:30.000000000","tz":120},"subject":"fix(tvix/eval): compare versions with an extra empty component","message":"fix(tvix/eval): compare versions with an extra empty component\n\nThis is necessary because builtins.compareVersions compares versions in\na subtly not-quite-but-still-lexicographical way: `pre` for example can\nhave an effect if it is post-fixed: `2.3 \u003c 2.3pre`. This is a violation\nof the rule that in a lexicographical ordering, the longer string is\nconsidered greater if they are otherwise equal. builtins.compareVersion\nis comparing lexicographically though, if you do the following\ntransformation beforehand:\n\n  2.3 --split--\u003e [ \"2\" \"3\" ] --append--\u003e [ \"2\" \"3\" \"\" ]\n  2.3pre --split--\u003e [ \"2\" \"3\" \"pre\" ] --append--\u003e [ \"2\" \"3\" \"pre\" \"\" ]\n\nComparing the transformed version is then done lexicographically:\n\n  2.3 \u003c 2.3.0pre since [ \"2\" \"3\" \"\" ] \u003c [ \"2\" \"3\" \"0\" \"pre\" ]\n\nHere, the `pre` rule never comes into effect because no comparison on it\nhappens, instead we use the longer string rule of a lexicographical\ncomparison.\n\nIn the C++ codebase, the reason for this behavior is that the\niterator-esque construct they use always yields the empty string before\nit exposes it has been fully consumed. This is probably intentional to\nsupport the postfixed `pre` which is, for example, used by NixOS\nversions (e.g. unstable post 22.05 is 22.11-pre). We replicate this\nbehavior using the `Chain` iterator in `VersionPartsIter::new_for_cmp`.\n\nChange-Id: I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dccc2de4dd04a51016401868da4a2a714e8f164e0"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003dccc2de4dd04a51016401868da4a2a714e8f164e0"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"07689535a4ff6132c5280538095d782ffb539dd5","is_merged_in_target_branch":false,"change_id":"I46642e6da5eac7c0883cdce860622cdba04cd12b","change_number":6719,"patch_set_number":3,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"1563d95319985a9f81c686df7feca7ef5b02b9de":{"kind":"NO_CHANGE","_number":4,"created":"2022-09-21 13:08:29.000000000","uploader":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"ref":"refs/changes/20/6720/4","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/20/6720/4","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/4 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/4 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/4 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/20/6720/4"}}},"commit":{"parents":[{"commit":"3477e98895ed03611bed4f6226ac405aec25390a","subject":"fix(tvix/eval): implement C++ Nix version part comparison algorithm","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d3477e98895ed03611bed4f6226ac405aec25390a"}]}],"author":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 11:47:23.000000000","tz":120},"committer":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 13:08:27.000000000","tz":120},"subject":"fix(tvix/eval): compare versions with an extra empty component","message":"fix(tvix/eval): compare versions with an extra empty component\n\nThis is necessary because builtins.compareVersions compares versions in\na subtly not-quite-but-still-lexicographical way: `pre` for example can\nhave an effect if it is post-fixed: `2.3 \u003c 2.3pre`. This is a violation\nof the rule that in a lexicographical ordering, the longer string is\nconsidered greater if they are otherwise equal. builtins.compareVersion\nis comparing lexicographically though, if you do the following\ntransformation beforehand:\n\n  2.3 --split--\u003e [ \"2\" \"3\" ] --append--\u003e [ \"2\" \"3\" \"\" ]\n  2.3pre --split--\u003e [ \"2\" \"3\" \"pre\" ] --append--\u003e [ \"2\" \"3\" \"pre\" \"\" ]\n\nComparing the transformed version is then done lexicographically:\n\n  2.3 \u003c 2.3.0pre since [ \"2\" \"3\" \"\" ] \u003c [ \"2\" \"3\" \"0\" \"pre\" ]\n\nHere, the `pre` rule never comes into effect because no comparison on it\nhappens, instead we use the longer string rule of a lexicographical\ncomparison.\n\nIn the C++ codebase, the reason for this behavior is that the\niterator-esque construct they use always yields the empty string before\nit exposes it has been fully consumed. This is probably intentional to\nsupport the postfixed `pre` which is, for example, used by NixOS\nversions (e.g. unstable post 22.05 is 22.11-pre). We replicate this\nbehavior using the `Chain` iterator in `VersionPartsIter::new_for_cmp`.\n\nChange-Id: I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d1563d95319985a9f81c686df7feca7ef5b02b9de"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d1563d95319985a9f81c686df7feca7ef5b02b9de"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"3477e98895ed03611bed4f6226ac405aec25390a","is_merged_in_target_branch":false,"change_id":"I46642e6da5eac7c0883cdce860622cdba04cd12b","change_number":6719,"patch_set_number":4,"change_status":"MERGED"}],"branch":"refs/heads/canon"},"083fc1dbe59e28bb25cc1dc7405ee45d9d9244b7":{"kind":"NO_CODE_CHANGE","_number":5,"created":"2022-09-21 14:23:46.000000000","uploader":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"},"ref":"refs/changes/20/6720/5","fetch":{"anonymous http":{"url":"https://cl.tvl.fyi/depot","ref":"refs/changes/20/6720/5","commands":{"Checkout":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/5 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/5 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://cl.tvl.fyi/depot refs/changes/20/6720/5 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://cl.tvl.fyi/depot refs/changes/20/6720/5"}}},"commit":{"parents":[{"commit":"9a8a6a33f9265a3844e91f2c1aab0b28ac46decf","subject":"fix(tvix/eval): implement C++ Nix version part comparison algorithm","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d9a8a6a33f9265a3844e91f2c1aab0b28ac46decf"}]}],"author":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 11:47:23.000000000","tz":120},"committer":{"name":"sterni","email":"sternenseemann@systemli.org","date":"2022-09-21 14:23:46.000000000","tz":0},"subject":"fix(tvix/eval): compare versions with an extra empty component","message":"fix(tvix/eval): compare versions with an extra empty component\n\nThis is necessary because builtins.compareVersions compares versions in\na subtly not-quite-but-still-lexicographical way: `pre` for example can\nhave an effect if it is post-fixed: `2.3 \u003c 2.3pre`. This is a violation\nof the rule that in a lexicographical ordering, the longer string is\nconsidered greater if they are otherwise equal. builtins.compareVersion\nis comparing lexicographically though, if you do the following\ntransformation beforehand:\n\n  2.3 --split--\u003e [ \"2\" \"3\" ] --append--\u003e [ \"2\" \"3\" \"\" ]\n  2.3pre --split--\u003e [ \"2\" \"3\" \"pre\" ] --append--\u003e [ \"2\" \"3\" \"pre\" \"\" ]\n\nComparing the transformed version is then done lexicographically:\n\n  2.3 \u003c 2.3.0pre since [ \"2\" \"3\" \"\" ] \u003c [ \"2\" \"3\" \"0\" \"pre\" ]\n\nHere, the `pre` rule never comes into effect because no comparison on it\nhappens, instead we use the longer string rule of a lexicographical\ncomparison.\n\nIn the C++ codebase, the reason for this behavior is that the\niterator-esque construct they use always yields the empty string before\nit exposes it has been fully consumed. This is probably intentional to\nsupport the postfixed `pre` which is, for example, used by NixOS\nversions (e.g. unstable post 22.05 is 22.11-pre). We replicate this\nbehavior using the `Chain` iterator in `VersionPartsIter::new_for_cmp`.\n\nChange-Id: I021c69aa27b0b7deb949dffe50ed18b6de3a7b1f\nReviewed-on: https://cl.tvl.fyi/c/depot/+/6720\nTested-by: BuildkiteCI\nReviewed-by: tazjin \u003ctazjin@tvl.su\u003e\n","web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d083fc1dbe59e28bb25cc1dc7405ee45d9d9244b7"}],"resolve_conflicts_web_links":[{"name":"cgit","tooltip":"Open in GitWeb","url":"https://code.tvl.fyi/commit/?id\u003d083fc1dbe59e28bb25cc1dc7405ee45d9d9244b7"}]},"parents_data":[{"branch_name":"refs/heads/canon","commit_id":"9a8a6a33f9265a3844e91f2c1aab0b28ac46decf","is_merged_in_target_branch":true,"change_id":"I46642e6da5eac7c0883cdce860622cdba04cd12b","change_number":6719,"patch_set_number":5,"change_status":"MERGED"}],"branch":"refs/heads/canon","description":"Rebase"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~PrologRule","status":"CLOSED","labels":[{"label":"Autosubmit","status":"MAY"},{"label":"Conformant-Commit-Message","status":"OK","applied_by":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"}},{"label":"All-Comments-Resolved","status":"OK","applied_by":{"_account_id":1000034,"name":"sterni","email":"sternenseemann@systemli.org","username":"sterni"}},{"label":"Verified","status":"OK","applied_by":{"_account_id":1000014,"name":"BuildkiteCI","username":"buildkite","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"OK","applied_by":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"}}]},{"rule_name":"Code-Owners","status":"CLOSED"}],"submit_requirements":[{"name":"All-Comments-Resolved","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:All-Comments-Resolved\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:All-Comments-Resolved\u003dgerrit~PrologRule"],"failing_atoms":[]}},{"name":"Verified","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:Verified\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:Verified\u003dgerrit~PrologRule"],"failing_atoms":[]}},{"name":"Code-Owners","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"rule:Code-Owners","fulfilled":true,"status":"PASS","passing_atoms":["Code-Owners"],"failing_atoms":[]}},{"name":"Conformant-Commit-Message","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:Conformant-Commit-Message\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:Conformant-Commit-Message\u003dgerrit~PrologRule"],"failing_atoms":[]}},{"name":"Code-Review","status":"SATISFIED","is_legacy":true,"submittability_expression_result":{"expression":"label:Code-Review\u003dgerrit~PrologRule","fulfilled":true,"status":"PASS","passing_atoms":["label:Code-Review\u003dgerrit~PrologRule"],"failing_atoms":[]}}]}
