)]}'
{
  "commit": "4580bcd2354aab9369164d936f7ccaa21fc98c98",
  "tree": "ad2f4efb41eb47597029ccf0a57e8dca1cce07dc",
  "parents": [
    "fd372d9b1a69a01a676398882bbe3840bf51fe72"
  ],
  "author": {
    "name": "Koji Nakamaru",
    "email": "koji.nakamaru@gree.net",
    "time": "Fri Nov 14 06:04:30 2025 +0000"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Fri Nov 14 08:47:54 2025 -0800"
  },
  "message": "osxkeychain: avoid incorrectly skipping store operation\n\ngit-credential-osxkeychain skips storing a credential if its \"get\"\naction sets \"state[]\u003dosxkeychain:seen\u003d1\". This behavior was introduced\nin e1ab45b2 (osxkeychain: state to skip unnecessary store operations,\n2024-05-15), which appeared in v2.46.\n\nHowever, this state[] persists even if a credential returned by\n\"git-credential-osxkeychain get\" is invalid and a subsequent helper\u0027s\n\"get\" operation returns a valid credential. Another subsequent helper\n(such as [1]) may expect git-credential-osxkeychain to store the valid\ncredential, but the \"store\" operation is incorrectly skipped because it\nonly checks \"state[]\u003dosxkeychain:seen\u003d1\".\n\nTo solve this issue, \"state[]\u003dosxkeychain:seen\" needs to contain enough\ninformation to identify whether the current \"store\" input matches the\noutput from the previous \"get\" operation (and not a credential from\nanother helper).\n\nSet \"state[]\u003dosxkeychain:seen\" to a value encoding the credential output\nby \"get\", and compare it with a value encoding the credential input by\n\"store\".\n\n[1]: https://github.com/hickford/git-credential-oauth\n\nReported-by: Petter Sælen \u003cpetter@saelen.eu\u003e\nHelped-by: Junio C Hamano \u003cgitster@pobox.com\u003e\nHelped-by: brian m. carlson \u003csandals@crustytoothpaste.net\u003e\nSigned-off-by: Koji Nakamaru \u003ckoji.nakamaru@gree.net\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9680717abe44c6d2813d71884c5c8a19875bf36e",
      "old_mode": 33188,
      "old_path": "contrib/credential/osxkeychain/Makefile",
      "new_id": "c68445b82dc3e552059bd30b31eed8481dca3b28",
      "new_mode": 33188,
      "new_path": "contrib/credential/osxkeychain/Makefile"
    },
    {
      "type": "modify",
      "old_id": "611c9798b3ae5c1f8807fdcc86d27337abd0272f",
      "old_mode": 33188,
      "old_path": "contrib/credential/osxkeychain/git-credential-osxkeychain.c",
      "new_id": "b18026703418a9e2b0ab37fdbc5809b1359be81e",
      "new_mode": 33188,
      "new_path": "contrib/credential/osxkeychain/git-credential-osxkeychain.c"
    },
    {
      "type": "modify",
      "old_id": "3c7677f736c684ec5c3a82a9bdd4bfd6321717c0",
      "old_mode": 33188,
      "old_path": "contrib/credential/osxkeychain/meson.build",
      "new_id": "ec91d0c14b0eb1de7497c7512ce01598fd90dacd",
      "new_mode": 33188,
      "new_path": "contrib/credential/osxkeychain/meson.build"
    }
  ]
}
