)]}'
{
  "log": [
    {
      "commit": "13dc5ccd13a636dcde03324ef7586728caa59db2",
      "tree": "79cd8122870a48a5d1a16c0baed521fe815c1043",
      "parents": [
        "60df29a234a03bb6b94c030c1661dbc8d1421156"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Mar 27 14:50:45 2012 -0500"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Thu Mar 29 20:35:04 2012 -0500"
      },
      "message": "A) Add/move functions to \u0027functions\u0027 file\n\nAdd ini*() and tests\nAdd GetOSVersion()\nAdd install_package(), yum_install()\nAdd *_service()\n\nRebased\n\nChange-Id: I570dba5ed4d2b988cdd1771cf6bed0aaf8e0fe27\n"
    },
    {
      "commit": "408b009ccda94a95d3b3999f6db2bd62e92cdfb9",
      "tree": "7011b3ccd44a5e9d943514b84c6ae3f9b1e5616a",
      "parents": [
        "17ff9763da677f3db0339a395c558cdb881d5d56"
      ],
      "author": {
        "name": "Chmouel Boudjnah",
        "email": "chmouel@chmouel.com",
        "time": "Thu Mar 15 23:21:55 2012 +0000"
      },
      "committer": {
        "name": "Chmouel Boudjnah",
        "email": "chmouel@chmouel.com",
        "time": "Wed Mar 28 11:34:51 2012 +0100"
      },
      "message": "Allow skipping exercises.\n\n- Catch a special exit signal 55 to notify that we want to skip an\n  excercise.\n- Move is_enabled_service to functions.\n- Fix bug 928390.\n\nChange-Id: Iebf7a6f30a0f305a2a70173fb6b988bc07e34292\n"
    },
    {
      "commit": "27e326995aaddf9e34cdf54a56f0ed02fc04bfcc",
      "tree": "9abba1609d309b887f2960db9c00c92fb2f7bc0a",
      "parents": [
        "09407d90a841c05d83f82b588af0769161326a4d"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Fri Mar 16 16:16:56 2012 -0500"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Mon Mar 19 10:06:15 2012 -0500"
      },
      "message": "Simplify die_if_error\n\n* Replace die_if_error() with the simpler die()\n* Attempt to clean up unnecessary trace output\n* Formatting cleanups on all exercise scripts\n\nChange-Id: I72a542b3a59ee9bf12bee6bcc605edd7579205e0\n"
    },
    {
      "commit": "d0b21e2d1967f650ddd123c1ecc1659b1baff783",
      "tree": "cc42f9cac1da7cdd8e2740d949f99584658a977f",
      "parents": [
        "51aa401ff1bc5a217c53dcdfe74c3d13a6a991f6"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Wed Mar 07 14:52:25 2012 -0600"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Wed Mar 07 15:36:50 2012 -0600"
      },
      "message": "Fix dependency list generation corner cases\n\n* Handle empty install lists in apt_get() and pip_install()\n* pip_install now uses get_packages() to get the dependency list\n\nFixes bug 948714\n\nChange-Id: I174a60976df18c670eab2067edcd1871c51d07d6\n"
    },
    {
      "commit": "489bd2a62b5949665bc7c4a05a52d27a987e0489",
      "tree": "baed5bdd9d9f3bdba8d1325125f61f7a72ddc56a",
      "parents": [
        "4807df8e5bc0e5e78536ecea37a0ca7621720524"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Fri Mar 02 10:44:29 2012 -0600"
      },
      "committer": {
        "name": "Jesse Andrews",
        "email": "anotherjesse@gmail.com",
        "time": "Fri Mar 02 17:55:37 2012 -0800"
      },
      "message": "Improve exercise robustness\n\n* Test returns and exit codes on most command invocations\n* Add start and end banners to make output easier to find in\n  long log files\n* Adds die_if_error(), die_if_not_set() and is_set() to functions\n* Add some function tests\n\nFixes bug 944593\n\nChange-Id: I55e2962c5fec9aad237b674732b1e922ad37a62e\n"
    },
    {
      "commit": "7f9aa71bcea98a27d144a71841842069106bb3bc",
      "tree": "eb8e97edcb4e24eea5ad92cbf4b114bc90ef1203",
      "parents": [
        "d1ee828f339ac8efe1f6d693f13ee9a871dc8fc5"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Jan 31 12:11:56 2012 -0600"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Jan 31 12:18:16 2012 -0600"
      },
      "message": "Extract common functions into a separate file\n\nThis is the start of an effort to organize devstack\u0027s code\nto better document the requirements for configuring the individual\ncomponents.\n\nChange-Id: I3476b76b9d1f9ee63687fb9898a98729118cbd84\n"
    }
  ]
}
