)]}'
{
  "commit": "abca927dbef2c310056b8a1a8be5561212b3243a",
  "tree": "97ca8e6995555078ba560db471d9b6a31f591f2e",
  "parents": [
    "89650285d8ef98173190a80f1d070a33092c9314"
  ],
  "author": {
    "name": "Jeff King",
    "email": "peff@peff.net",
    "time": "Sat Dec 10 05:31:11 2011 -0500"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Sun Dec 11 23:16:24 2011 -0800"
  },
  "message": "introduce credentials API\n\nThere are a few places in git that need to get a username\nand password credential from the user; the most notable one\nis HTTP authentication for smart-http pushing.\n\nRight now the only choices for providing credentials are to\nput them plaintext into your ~/.netrc, or to have git prompt\nyou (either on the terminal or via an askpass program). The\nformer is not very secure, and the latter is not very\nconvenient.\n\nUnfortunately, there is no \"always best\" solution for\npassword management. The details will depend on the tradeoff\nyou want between security and convenience, as well as how\ngit can integrate with other security systems (e.g., many\noperating systems provide a keychain or password wallet for\nsingle sign-on).\n\nThis patch provides an abstract notion of credentials as a\ndata item, and provides three basic operations:\n\n  - fill (i.e., acquire from external storage or from the\n    user)\n\n  - approve (mark a credential as \"working\" for further\n    storage)\n\n  - reject (mark a credential as \"not working\", so it can\n    be removed from storage)\n\nThese operations can be backed by external helper processes\nthat interact with system- or user-specific secure storage.\n\nSigned-off-by: Jeff King \u003cpeff@peff.net\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8572c8c0b0199589a8c1875825f5b2e7e4dc4a86",
      "old_mode": 33188,
      "old_path": ".gitignore",
      "new_id": "7d2fefce962747d20cc15a87c60a0994c68dd625",
      "new_mode": 33188,
      "new_path": ".gitignore"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f624aefc6faae828e7caabb4b335a9c659444768",
      "new_mode": 33188,
      "new_path": "Documentation/technical/api-credentials.txt"
    },
    {
      "type": "modify",
      "old_id": "b1c80a678b5fdb80ec71f0a1ad567a384feba4e8",
      "old_mode": 33188,
      "old_path": "Makefile",
      "new_id": "5ca363b82ae93fd8caa590a806124ab1b26c7a2a",
      "new_mode": 33188,
      "new_path": "Makefile"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "86397f392b8e6bd9580928653f6d1103b05f4417",
      "new_mode": 33188,
      "new_path": "credential.c"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2ea7d495d6bbcd4ad5496dbce759c45a880175ba",
      "new_mode": 33188,
      "new_path": "credential.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "54ae1f484ce6a70efaea7ec567d4115f43de3e02",
      "new_mode": 33261,
      "new_path": "t/lib-credential.sh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "81a455f4c32e7d6541747b98d930fdffc9623f6f",
      "new_mode": 33261,
      "new_path": "t/t0300-credentials.sh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dee200e7f2b636f4c4aaff438b6a9f174df31c75",
      "new_mode": 33188,
      "new_path": "test-credential.c"
    }
  ]
}
