)]}'
{
  "commit": "e44f15ba3ee873b5df5e8e5d8cc018df288472ef",
  "tree": "8718076d76999f67df5c99c70f6a211709976c45",
  "parents": [
    "588ef84ecef2c9782598529ba6511d4cb72ec158"
  ],
  "author": {
    "name": "Eric Sunshine",
    "email": "sunshine@sunshineco.com",
    "time": "Tue Sep 10 00:10:12 2024 -0400"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Tue Sep 10 10:01:40 2024 -0700"
  },
  "message": "chainlint: make error messages self-explanatory\n\nThe annotations emitted by chainlint to indicate detected problems are\noverly terse, so much so that developers new to the project -- those who\nshould most benefit from the linting -- may find them baffling. For\ninstance, although the author of chainlint and seasoned Git developers\nmay understand that \"?!AMP?!\" is an abbreviation of \"ampersand\" and\nindicates a break in the \u0026\u0026-chain, this may not be obvious to newcomers.\n\nThe \"?!LOOP?!\" case is particularly serious because that terse single\nword does nothing to convey that the loop body should end with\n\"|| return 1\" (or \"|| exit 1\" in a subshell) to ensure that a failing\ncommand in the body aborts the loop immediately. Moreover, unlike\n\u0026\u0026-chaining which is ubiquitous in Git tests, the \"|| return 1\" idiom is\nrelatively infrequent, thus may be harder for a newcomer to discover by\nconsulting nearby code.\n\nAddress these shortcomings by emitting human-readable messages which\nboth explain the problem and give a strong hint about how to correct it.\n\nSigned-off-by: Eric Sunshine \u003csunshine@sunshineco.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1a7611ad43c44ace7bfb57ad7a17ad896c3534db",
      "old_mode": 33261,
      "old_path": "t/chainlint.pl",
      "new_id": "ad264994781c5155d54cb1faceea14ccc60e0720",
      "new_mode": 33261,
      "new_path": "t/chainlint.pl"
    },
    {
      "type": "modify",
      "old_id": "338ecd5861271afe26fe58f628e77b816ab90931",
      "old_mode": 33188,
      "old_path": "t/chainlint/arithmetic-expansion.expect",
      "new_id": "5677e16cad6146a6765d252f8415129481481144",
      "new_mode": 33188,
      "new_path": "t/chainlint/arithmetic-expansion.expect"
    },
    {
      "type": "modify",
      "old_id": "b62e3d58c36b9bb35cd52e33712c07764835c3b7",
      "old_mode": 33188,
      "old_path": "t/chainlint/block.expect",
      "new_id": "3d3f854c0d654dea495c78ecad1eddc7317cb832",
      "new_mode": 33188,
      "new_path": "t/chainlint/block.expect"
    },
    {
      "type": "modify",
      "old_id": "9a1838736f9f7666829e0952fa82d752733fd4a2",
      "old_mode": 33188,
      "old_path": "t/chainlint/broken-chain.expect",
      "new_id": "b7b1ce8509b726ae4e22824d72da39eaa8ef48d7",
      "new_mode": 33188,
      "new_path": "t/chainlint/broken-chain.expect"
    },
    {
      "type": "modify",
      "old_id": "c04c61ff36668cdadf127369d0122e63788f7aae",
      "old_mode": 33188,
      "old_path": "t/chainlint/case.expect",
      "new_id": "0a3b09e47091c5a5011351f680e896ff058ad2da",
      "new_mode": 33188,
      "new_path": "t/chainlint/case.expect"
    },
    {
      "type": "modify",
      "old_id": "4f815f8e14c1a2e396171d003598f183c583edcb",
      "old_mode": 33188,
      "old_path": "t/chainlint/chain-break-false.expect",
      "new_id": "f6a0a301e98ae1028aa2142094252dfd1ece91ff",
      "new_mode": 33188,
      "new_path": "t/chainlint/chain-break-false.expect"
    },
    {
      "type": "modify",
      "old_id": "a546b714a69c4960ac75a228a9aa6fe5f5634030",
      "old_mode": 33188,
      "old_path": "t/chainlint/chained-block.expect",
      "new_id": "f2501bba90416a5d4eea91931574b4271619879d",
      "new_mode": 33188,
      "new_path": "t/chainlint/chained-block.expect"
    },
    {
      "type": "modify",
      "old_id": "f78b268291c7ac1dbad6241a1bb315b6fc288d1c",
      "old_mode": 33188,
      "old_path": "t/chainlint/chained-subshell.expect",
      "new_id": "93fb1a6578b86e165d995ada27d5adf44cf3a9c1",
      "new_mode": 33188,
      "new_path": "t/chainlint/chained-subshell.expect"
    },
    {
      "type": "modify",
      "old_id": "5e31b36db65bb9ffda850039f50b03dbd86a9ea5",
      "old_mode": 33188,
      "old_path": "t/chainlint/command-substitution.expect",
      "new_id": "73809fd585447f73c869e65266ec7560eaa83da4",
      "new_mode": 33188,
      "new_path": "t/chainlint/command-substitution.expect"
    },
    {
      "type": "modify",
      "old_id": "3a740103db19f675c09d382da83b64f8d8647e36",
      "old_mode": 33188,
      "old_path": "t/chainlint/complex-if-in-cuddled-loop.expect",
      "new_id": "e66bb2d5d01f4627366b13e44e414b73f531de7a",
      "new_mode": 33188,
      "new_path": "t/chainlint/complex-if-in-cuddled-loop.expect"
    },
    {
      "type": "modify",
      "old_id": "b06d6383116c351aa56669e76861d7d33fb820e4",
      "old_mode": 33188,
      "old_path": "t/chainlint/cuddled.expect",
      "new_id": "1864b3fc8b2d7e62ed1f560113e42cc41a2fdfac",
      "new_mode": 33188,
      "new_path": "t/chainlint/cuddled.expect"
    },
    {
      "type": "modify",
      "old_id": "908aeedf96ef74b58ab9eabf2efc437b424d992f",
      "old_mode": 33188,
      "old_path": "t/chainlint/for-loop.expect",
      "new_id": "5029eacce34c48e99b1bfece576fa97baec874d5",
      "new_mode": 33188,
      "new_path": "t/chainlint/for-loop.expect"
    },
    {
      "type": "modify",
      "old_id": "c226246b2595fa87c81e62ae508c75cef25676a4",
      "old_mode": 33188,
      "old_path": "t/chainlint/function.expect",
      "new_id": "9e46a3554a1149b8b8cc18884d41288eff703994",
      "new_mode": 33188,
      "new_path": "t/chainlint/function.expect"
    },
    {
      "type": "modify",
      "old_id": "4323acc93d5cb77f77b0ec23e82ed0a8f47e7282",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-body-indent.expect",
      "new_id": "4306faee8611f7d0d54890bf45eec8de7308f6da",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-body-indent.expect"
    },
    {
      "type": "modify",
      "old_id": "a93a1fa3aafe2712c6b50b1df09203ca33fbfa7c",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-body-pathological.expect",
      "new_id": "2f8ea03a47daf8a7d9a5e4e8379035b43d607885",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-body-pathological.expect"
    },
    {
      "type": "modify",
      "old_id": "ddf1c412af5a24267213e577c7db3eb0c799f2c6",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-body.expect",
      "new_id": "df8d79bc0a1650d2880bcc8580c00bae42a268a9",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-body.expect"
    },
    {
      "type": "modify",
      "old_id": "20dba4b452114bb00e7b06b075c1047fb651fcf8",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-double.expect",
      "new_id": "e5e981889f51f598dec590f5a13fdc1b5b067420",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-double.expect"
    },
    {
      "type": "modify",
      "old_id": "277a11202d7b131456f71cddebdb52ad9e627e10",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-indent-operator.expect",
      "new_id": "ec0e61505b75b4480db462013472c93a7fc17761",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-indent-operator.expect"
    },
    {
      "type": "modify",
      "old_id": "41b55f6437303b70cd21dc8b66d4306ddb1d3ff4",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-multi-line-command-subst.expect",
      "new_id": "8128f15b92d35b839294623d47776f0eb63189a0",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-multi-line-command-subst.expect"
    },
    {
      "type": "modify",
      "old_id": "c71828589e57c691dfb47105f2464928e503eea8",
      "old_mode": 33188,
      "old_path": "t/chainlint/here-doc-multi-line-string.expect",
      "new_id": "a03a04ff3d9f8650b8d5d4873b9997d9eb6db670",
      "new_mode": 33188,
      "new_path": "t/chainlint/here-doc-multi-line-string.expect"
    },
    {
      "type": "modify",
      "old_id": "9daf3d294af3288a829b5d8362e85600a3a41371",
      "old_mode": 33188,
      "old_path": "t/chainlint/if-condition-split.expect",
      "new_id": "6d2a03dfdb2f4f0bc15420fd1054b49c1b7df0d6",
      "new_mode": 33188,
      "new_path": "t/chainlint/if-condition-split.expect"
    },
    {
      "type": "modify",
      "old_id": "ff8c60dbdb026cd57216020e1506cf2378c6e4a7",
      "old_mode": 33188,
      "old_path": "t/chainlint/if-in-loop.expect",
      "new_id": "7e3ba740de679c74c7caadff64d4e5a60858f53c",
      "new_mode": 33188,
      "new_path": "t/chainlint/if-in-loop.expect"
    },
    {
      "type": "modify",
      "old_id": "965d7e41a2ce75e520940dfa9b4e489f261a9449",
      "old_mode": 33188,
      "old_path": "t/chainlint/if-then-else.expect",
      "new_id": "924caa2e4eaa10e74d60b101cbad237ec963372f",
      "new_mode": 33188,
      "new_path": "t/chainlint/if-then-else.expect"
    },
    {
      "type": "modify",
      "old_id": "0285c0b22c9802aa7418c5518c529dce53c6cf33",
      "old_mode": 33188,
      "old_path": "t/chainlint/inline-comment.expect",
      "new_id": "4b4080124e94a9d85f97b8fc1ca7d6207fee59a6",
      "new_mode": 33188,
      "new_path": "t/chainlint/inline-comment.expect"
    },
    {
      "type": "modify",
      "old_id": "40c06f0d5397abc5c977e5f91d479d0f400cea2f",
      "old_mode": 33188,
      "old_path": "t/chainlint/loop-detect-failure.expect",
      "new_id": "7d846b878d6577695bc721a4f6055e22bb065253",
      "new_mode": 33188,
      "new_path": "t/chainlint/loop-detect-failure.expect"
    },
    {
      "type": "modify",
      "old_id": "4e8c67c91493a6ed80f26ffc868c20438329fadc",
      "old_mode": 33188,
      "old_path": "t/chainlint/loop-in-if.expect",
      "new_id": "32e076ad1be59bc6aa86df58cbeed101545e1a34",
      "new_mode": 33188,
      "new_path": "t/chainlint/loop-in-if.expect"
    },
    {
      "type": "modify",
      "old_id": "62c54e3a5e879f870bc0e554d481fc51dc304808",
      "old_mode": 33188,
      "old_path": "t/chainlint/multi-line-string.expect",
      "new_id": "9d332975258ad348dcb128b80bb3f24cc24b51b7",
      "new_mode": 33188,
      "new_path": "t/chainlint/multi-line-string.expect"
    },
    {
      "type": "modify",
      "old_id": "a6ce52a1da809c8b37e92942df96d3bb1095070f",
      "old_mode": 33188,
      "old_path": "t/chainlint/negated-one-liner.expect",
      "new_id": "0a6f3c29b2a4cd201b4b1143a8990ef529ccf8e3",
      "new_mode": 33188,
      "new_path": "t/chainlint/negated-one-liner.expect"
    },
    {
      "type": "modify",
      "old_id": "0191c9c2948b43245d17a8f6ea2638af1308a6c8",
      "old_mode": 33188,
      "old_path": "t/chainlint/nested-cuddled-subshell.expect",
      "new_id": "fec2c74274b7940e9c6e76a4b39be16dd460308c",
      "new_mode": 33188,
      "new_path": "t/chainlint/nested-cuddled-subshell.expect"
    },
    {
      "type": "modify",
      "old_id": "70d9b68dc95681d4218f854191f654c84bd1d2ed",
      "old_mode": 33188,
      "old_path": "t/chainlint/nested-here-doc.expect",
      "new_id": "571f4c9514e36aff18028bb51fcc414c5e91d852",
      "new_mode": 33188,
      "new_path": "t/chainlint/nested-here-doc.expect"
    },
    {
      "type": "modify",
      "old_id": "c13c4d2f90afc5ff2ded16244c61366d0fef274e",
      "old_mode": 33188,
      "old_path": "t/chainlint/nested-loop-detect-failure.expect",
      "new_id": "b4aaa621a2ced84bc67acf1ea3965cdc7413d74b",
      "new_mode": 33188,
      "new_path": "t/chainlint/nested-loop-detect-failure.expect"
    },
    {
      "type": "modify",
      "old_id": "f89a8d03a85304fc04e1985616f7c35978177ec5",
      "old_mode": 33188,
      "old_path": "t/chainlint/nested-subshell-comment.expect",
      "new_id": "078c6f275f053c01d90138bced292faa90e5643f",
      "new_mode": 33188,
      "new_path": "t/chainlint/nested-subshell-comment.expect"
    },
    {
      "type": "modify",
      "old_id": "811e8a79129ec50aa8a881135bb3e66594f1c2e1",
      "old_mode": 33188,
      "old_path": "t/chainlint/nested-subshell.expect",
      "new_id": "a8d85d5d5b6e88dc5e9056b6846cb89d52059490",
      "new_mode": 33188,
      "new_path": "t/chainlint/nested-subshell.expect"
    },
    {
      "type": "modify",
      "old_id": "611b7b75cb1e6678fa27e364f6afbf437b65d71d",
      "old_mode": 33188,
      "old_path": "t/chainlint/not-heredoc.expect",
      "new_id": "5d51705a7a2cf3fe4b671e99adb147b2a7698778",
      "new_mode": 33188,
      "new_path": "t/chainlint/not-heredoc.expect"
    },
    {
      "type": "modify",
      "old_id": "49dcf065efb00a7d2310148f302718c780ffd0ae",
      "old_mode": 33188,
      "old_path": "t/chainlint/one-liner-for-loop.expect",
      "new_id": "e1fcbd363917d3711e3b2dcfd8ffb66c4c60fffe",
      "new_mode": 33188,
      "new_path": "t/chainlint/one-liner-for-loop.expect"
    },
    {
      "type": "modify",
      "old_id": "986181128383d3fc90584c10c7050f36cde5f6e2",
      "old_mode": 33188,
      "old_path": "t/chainlint/one-liner.expect",
      "new_id": "5deeb050707cb3d3fc9b813a80d9d32c5ddb8648",
      "new_mode": 33188,
      "new_path": "t/chainlint/one-liner.expect"
    },
    {
      "type": "modify",
      "old_id": "1bbe5a2ce172c05e9b6231e2180d0426b3eca4e3",
      "old_mode": 33188,
      "old_path": "t/chainlint/pipe.expect",
      "new_id": "d947c765840348db6cb2c9be5ea0d60266a7e6af",
      "new_mode": 33188,
      "new_path": "t/chainlint/pipe.expect"
    },
    {
      "type": "modify",
      "old_id": "866438310ca3387af7ca734fa0c82c3a53a78b40",
      "old_mode": 33188,
      "old_path": "t/chainlint/semicolon.expect",
      "new_id": "2b499fbe70c56c5c0cc1550ab33e47d6033ad524",
      "new_mode": 33188,
      "new_path": "t/chainlint/semicolon.expect"
    },
    {
      "type": "modify",
      "old_id": "5647500c82ff7548ae950525e3cb4a57f4e1992d",
      "old_mode": 33188,
      "old_path": "t/chainlint/subshell-here-doc.expect",
      "new_id": "e450caf948490432a2143926fb0d85c08ff14851",
      "new_mode": 33188,
      "new_path": "t/chainlint/subshell-here-doc.expect"
    },
    {
      "type": "modify",
      "old_id": "214316c6a06d7c460c67675186bc34a4ef17ba5b",
      "old_mode": 33188,
      "old_path": "t/chainlint/subshell-one-liner.expect",
      "new_id": "265d996a211a538f43af27004350f6af38fb6b4f",
      "new_mode": 33188,
      "new_path": "t/chainlint/subshell-one-liner.expect"
    },
    {
      "type": "modify",
      "old_id": "64f3235d262b777a1e2567e469e02d8663544974",
      "old_mode": 33188,
      "old_path": "t/chainlint/token-pasting.expect",
      "new_id": "387189b6de688e49df8de531d312d4af15755bd0",
      "new_mode": 33188,
      "new_path": "t/chainlint/token-pasting.expect"
    },
    {
      "type": "modify",
      "old_id": "f78e23cb632fc74b43f961365cbffb04a7f74c72",
      "old_mode": 33188,
      "old_path": "t/chainlint/unclosed-here-doc-indent.expect",
      "new_id": "156906c85a5db1bba7dfb9ccc5d918ca5b47ff5a",
      "new_mode": 33188,
      "new_path": "t/chainlint/unclosed-here-doc-indent.expect"
    },
    {
      "type": "modify",
      "old_id": "51304672cfffef738e768a780cc7d0303c3ded04",
      "old_mode": 33188,
      "old_path": "t/chainlint/unclosed-here-doc.expect",
      "new_id": "752c608862474260a06a64f09ab0c80e8c3a8dd1",
      "new_mode": 33188,
      "new_path": "t/chainlint/unclosed-here-doc.expect"
    },
    {
      "type": "modify",
      "old_id": "5ffabd5a93fca9a598e5310d4bb5e0aad2291c9d",
      "old_mode": 33188,
      "old_path": "t/chainlint/while-loop.expect",
      "new_id": "2ba55821654bb89fedfe5fc88ef4c0afff6300e9",
      "new_mode": 33188,
      "new_path": "t/chainlint/while-loop.expect"
    }
  ]
}
