)]}'
{
  "log": [
    {
      "commit": "16dd8b3ed94d5cd217d22a26c18dca52bfca115e",
      "tree": "62994b309b39fc5d4920808f506e763feb3b6f07",
      "parents": [
        "e38cad092ff96dc0178a19fe6f33f13db99eebb0"
      ],
      "author": {
        "name": "Sean Dague",
        "email": "sean.dague@samsung.com",
        "time": "Mon Feb 03 09:10:54 2014 +0900"
      },
      "committer": {
        "name": "Chmouel Boudjnah",
        "email": "chmouel@enovance.com",
        "time": "Wed Feb 05 07:52:54 2014 +0100"
      },
      "message": "introduce if/then \u0026 for/do rules\n\nwe mostly have a consistent style on if/then \u0026 for/do in devstack,\nexcept when we don\u0027t. This attempts to build a set of rules to\nenforce this.\n\nBecause there are times when lines are legitimately long, and there\nis a continuation, this starts off ignoring if and for loops with\ncontinuations. But for short versions, we should enforce this.\n\nChanges to make devstack pass are included. The fact that the\ncleanup patch was so small is pretty solid reason that this is\nactually the style we\u0027ve all agreed to.\n\nPart of a git stash from hong kong that I finally cleaned up.\n\nChange-Id: I6376d7afd59cc5ebba9ed69e5ee784a3d5934a10\n"
    },
    {
      "commit": "cd7d956fbc30eae3c1694b187ea605a5f0d960d3",
      "tree": "18c30423780b6642155ebcefb7212db542a27681",
      "parents": [
        "78411958fd086acc0270c2380dd61f03ebd1f451"
      ],
      "author": {
        "name": "Andrea Frittoli",
        "email": "andrea.frittoli@hp.com",
        "time": "Thu Dec 05 08:09:12 2013 +0000"
      },
      "committer": {
        "name": "Andrea Frittoli",
        "email": "andrea.frittoli@hp.com",
        "time": "Thu Dec 12 12:24:55 2013 +0000"
      },
      "message": "Handle the case of pipe char in value for iniset\n\niniset did not handle the case of \"|\" in the value\nto be injected. Fix this by replacing | with \\000 (NULL).\n\nFixes bug #1258050\n\nChange-Id: I8882c2f3f177ebdfa0c66270dbbc7fd50f30b065\n"
    },
    {
      "commit": "2ac8b3f3c2ebe586802d7789cf152b13fe0d0497",
      "tree": "118837bd091932efab16e3fd59ec1e5f1824c6f9",
      "parents": [
        "df8410c387034bec1b82c8f9d9fd949967f7080b"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Wed Dec 04 17:20:28 2013 -0600"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Mon Dec 09 10:30:02 2013 -0600"
      },
      "message": "Fix a couple of INI whitespace bugs\n\n* iniset() bails if no section or option (attribute) is supplied\n* merge_config_file() properly skips lines with only whitespace\n\n* Also split the ini-tests into their own script\n\nBug 1257954\n\nChange-Id: Ie31c5bd0df8dfed129fbcf1e37228aaf25e9305d\n"
    },
    {
      "commit": "922c8ae6804304841167fcca662726e1e26b556a",
      "tree": "63f613b8c9262c5c2cb47d7eb57f3aedfcd933ff",
      "parents": [
        "101b4248428b4c3d7757e15ff4e19d3b4f85a51f"
      ],
      "author": {
        "name": "Sean Dague",
        "email": "sdague@linux.vnet.ibm.com",
        "time": "Tue Oct 22 10:06:06 2013 -0400"
      },
      "committer": {
        "name": "Sean Dague",
        "email": "sdague@linux.vnet.ibm.com",
        "time": "Tue Oct 22 13:02:29 2013 -0400"
      },
      "message": "clean up whitespace issues on exercises and friends\n\nChange-Id: I812a73e46ddd4d5fed4d304d9ef92c1de243f497\n"
    },
    {
      "commit": "893e66360caf3bcf0578d4541b3c17d089c33b02",
      "tree": "c91bd45ede20b9739c5dd39bec08d8ee32937af5",
      "parents": [
        "7ab1f22c606ae55883ac47298c810062965a1527"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Fri Sep 13 15:05:51 2013 -0500"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Fri Oct 11 11:41:58 2013 -0500"
      },
      "message": "Add meta-config via local.conf\n\nThis defines a new local.conf file that is designed to take the place of all\nof the \u0027pass-through\u0027[1] configuration options that have been defined in DevStack.\n\n* new local.conf file can contain multiple config file settings to be\n  merged in to existing project config files\n* localrc can be embedded into local.conf and will auto-extract if\n  localrc does not exist\n* Adds functions get_meta_section(), get_meta_section_files(),\n  merge_config_file() and merge_config_group()\n* Adds EXTRA_OPTS, EXTRA_BAREMETAL_OPTS, Q_DHCP_EXTRA_DEFAULT_OPTS and\n  Q_SRV_EXTRA_DEFAULT_OPTS to the deprecated warning list at the end of stack.sh\n\n[1] Pass-through options are those that do not configure or change DevStack\u0027s behaviour\nbut simply set a value in a project config file.  This includes most of the EXTRA_XXX_OPTS\nconfiguration variables.\n\nChange-Id: I367cadc86116621e9574ac203aafdab483d810d3\n"
    },
    {
      "commit": "04762cd823302ca9992b67419e55ad5fc4dbf8fe",
      "tree": "e63e3640a10c7ea85f23edc7951bd3858823620f",
      "parents": [
        "8db8f38c65d7d0f2c79e78794b974966b4e3f68d"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Aug 27 17:06:14 2013 -0500"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Aug 27 17:48:49 2013 -0500"
      },
      "message": "Fix is_package_installed() check with dpkg\n\nis_package_installed() incorrectly returned \u00270\u0027 for packages that\nhad \u0027un\u0027 status in the dpkg database.\n\nChange-Id: I81b77486c2ed7717ed81cb2c2572fe6c4b394ffc\n"
    },
    {
      "commit": "d4f69b21f530059be8d3a7001ebbd1ce53aa7926",
      "tree": "bce63e7c8dbe5fad1417562697d9c1fb0c156177",
      "parents": [
        "89b58846b5604cdf976074a68004840cc6865bdb"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Wed Jul 24 12:24:43 2013 -0500"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Wed Jul 24 12:25:35 2013 -0500"
      },
      "message": "Remove python-netaddr requirement\n\nRemove python-netaddr as a DevStack (stack.sh) requirement,\nthis does not change any individual project requirements.\n\nSpecifically it replaces address_in_net() and adds cidr2netmask()\nand maskip() functions.\n\nChange-Id: Ic604437fde2e057faced40a310ab282f3eb27726\n"
    },
    {
      "commit": "239f3246ad741cb824a283642a54dfe5935b74dd",
      "tree": "9bf82112f59953fecdf2d01986bbec76f67534c0",
      "parents": [
        "0d71d1ec56f6063b88e2f11ed057aefe6d7311d2"
      ],
      "author": {
        "name": "Lianhao Lu",
        "email": "lianhao.lu@intel.com",
        "time": "Fri Mar 01 15:54:02 2013 +0800"
      },
      "committer": {
        "name": "Lianhao Lu",
        "email": "lianhao.lu@intel.com",
        "time": "Wed Mar 06 09:42:14 2013 +0800"
      },
      "message": "Support MultiStrOpt options in configuration file.\n\nFixed bug #1136964.\n\n1. Added 3 ini functions to support MultiStrOpt:\n  Function \"iniset_multiline config-file section option value1 value2\nvalue3 ...\" sets a MultiStrOpt option in an ini file.\n\n  Function \"iniget_multiline config-file section option\" gets the\nMultiStrOpt option values.\n\n  Function \"iniadd config-file section option value1 value2 value3...\"\nappends an option without relacing the old values, which would result\nthe option to be MultiStrOpt.\n\n2. Modified the nova configuation to correctly enable notification for\nceilometer.\n\nChange-Id: I1c27db1a6e58b35bc4428e761f40627988f69e37\n"
    },
    {
      "commit": "588eb4129d34ea58fd40438eb1c6edd1a9f9a2d0",
      "tree": "b040aef13d23173489fecfcc0704a1212eae75e7",
      "parents": [
        "701718a844a5efc9932cd28870057ac779a49e92"
      ],
      "author": {
        "name": "Attila Fazekas",
        "email": "afazekas@redhat.com",
        "time": "Thu Dec 20 10:57:16 2012 +0100"
      },
      "committer": {
        "name": "Attila Fazekas",
        "email": "afazekas@redhat.com",
        "time": "Thu Dec 20 11:00:42 2012 +0100"
      },
      "message": "Fix iniset and his friends\n\n* In python the white spaces are part of the section name\n* Handle options with empty value\n* Support paths with white spaces\n\nChange-Id: I69a584608853cfdb8b7dce1e24d929216ef2fc41\n"
    },
    {
      "commit": "00011c0847a9972b78051954e272f54e9d07ef51",
      "tree": "d700284b823a9464196dd59f96b2f45dba4a20ec",
      "parents": [
        "e5f8d1228a139ae13da5f2fbdfd09b3b43fd52fd"
      ],
      "author": {
        "name": "Vincent Untz",
        "email": "vuntz@suse.com",
        "time": "Thu Dec 06 09:56:32 2012 +0100"
      },
      "committer": {
        "name": "Vincent Untz",
        "email": "vuntz@suse.com",
        "time": "Fri Dec 07 09:06:07 2012 +0100"
      },
      "message": "Add is_fedora and exit_distro_not_supported functions\n\nBetween is_fedora, is_ubuntu and is_suse, we can make the code a bit\nsimpler to read. We also use exit_distro_not_supported to identify\nplaces where we need implementation details for new distros.\n\nAs \"/sbin/service --skip-redirect\" is Fedora-specific, guard this with a\nis_fedora test too.\n\nChange-Id: Ic77c0697ed9be0dbb5df8e73da93463e76025f0c\n"
    },
    {
      "commit": "e83356217b48308b3a4dc975940c79a22e159238",
      "tree": "e3f2becea6bcd4acf1d3b1f7e8ea5043e6d022e3",
      "parents": [
        "140b58ba1938090174a4e2733792e12da4c155e0"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Nov 27 17:00:11 2012 -0600"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Tue Nov 27 17:00:16 2012 -0600"
      },
      "message": "Fix ini functions to handle spaces in section names\n\nThis allows section names to look like:\n\n[ default ]\n\nOpenSSL is the primary offender for this usage.\n\nChange-Id: If5c711107e73cebab9d4a26ca02a7ce572224377\n"
    },
    {
      "commit": "71ebc6ff65e6ae3982a7e8a7ecf9ff80fd18d6bb",
      "tree": "67c928b32f58d7eaef0d1c75a32790c3dc33100d",
      "parents": [
        "c132625d1dcdc4d8ea824c0efb2b7428ab07341f"
      ],
      "author": {
        "name": "Vincent Untz",
        "email": "vuntz@suse.com",
        "time": "Tue Jun 12 13:45:15 2012 +0200"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Sun Sep 09 17:40:19 2012 -0500"
      },
      "message": "Add is_package_installed function to know if a package is installed\n\nThis helps reduce the distro-dependent code in stack.sh, and also fixes\nthe bug where \"rpm -qa | grep sudo\" will work if gnome-sudoku is\ninstalled.\n\nRebased\n\nChange-Id: Ib1330b29b915b41d9724197edd791f0d4e0fe373\n"
    },
    {
      "commit": "f04178fd12731a58c899c309ad43f55d339909c5",
      "tree": "0183e5361383370cd5b0c104ece6b45731379f50",
      "parents": [
        "08bc3048b10b7dbe62b38109274b0cd32a460de9"
      ],
      "author": {
        "name": "Doug Hellmann",
        "email": "doug.hellmann@dreamhost.com",
        "time": "Thu Jul 05 17:10:03 2012 -0400"
      },
      "committer": {
        "name": "Doug Hellmann",
        "email": "doug.hellmann@dreamhost.com",
        "time": "Fri Jul 06 15:52:06 2012 -0400"
      },
      "message": "add functions to manipulate ENABLED_SERVICES\n\nEditing ENABLED_SERVICES directly can get tricky when\nthe user wants to disable something. This patch includes\ntwo new functions for adding or removing services\nsafely, and a third (for completeness) to clear the\nsettings entirely before adding a minimal set of\nservices.\n\nIt also moves the logic for dealing with \"negated\"\nservices into a function so it can be tested and\napplied by the new functions for manipulating\nENABLED_SERVICES.\n\nChange-Id: I88f205f3666b86e6f0b6a94e0ec32a26c4bc6873\nSigned-off-by: Doug Hellmann \u003cdoug.hellmann@dreamhost.com\u003e\n"
    },
    {
      "commit": "bf3923174e40b7931963bcba455d837e0ec864e3",
      "tree": "7a7ceef651ae7a152e598e4921f7b6dc03cba952",
      "parents": [
        "ef352b51c5b8840c70c396196d3a9c155a40fd02"
      ],
      "author": {
        "name": "Vincent Untz",
        "email": "vuntz@suse.com",
        "time": "Wed Jun 13 11:26:31 2012 +0200"
      },
      "committer": {
        "name": "Vincent Untz",
        "email": "vuntz@suse.com",
        "time": "Thu Jun 14 15:52:44 2012 +0200"
      },
      "message": "Remove test.ini when done with it during tests\n\nThe file is created in the tests, and so should also be removed.\n\nChange-Id: I8c087cc5cc71ac80b7c4974e2a69a747a929bedf\n"
    },
    {
      "commit": "09e636e435ed15302e3960affef0a450fa7accf6",
      "tree": "27416092e0e4e26238ee076b6fdef4c283e41374",
      "parents": [
        "e474403d5e950bc275916e752075ed0976c62128"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Mon Mar 19 16:31:12 2012 -0500"
      },
      "committer": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Thu Apr 05 18:10:13 2012 -0500"
      },
      "message": "B) Use keystone config files from source; move to /etc/keystone\n\n* Put all config files in /etc/keystone\n* keystone.conf rewritten\n* logging.conf.sample rewritten to logging.conf\n* default_catalog.templates copied from devstack/files\n* iniset() now properly adds options that do not previously exist\n\nFixed to re-configure the catalog templated backend; sql is the\ndefault in trunk now but DevStack needs a bit more work before\nit can use it.\n\nChange-Id: Ic7060ef897e47495cd08ca3786e49fdebadf6723\n"
    },
    {
      "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": "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": "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"
    }
  ]
}
