)]}'
{
  "log": [
    {
      "commit": "365421b99a6e76cd3c2e3dbb02638005e456abf8",
      "tree": "48cbc1b72603ee7de32522140fded56e21ca9559",
      "parents": [
        "e79678af5ed1621cd8740879b496a0d3716ab8b1"
      ],
      "author": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Fri Feb 06 15:27:43 2015 -0500"
      },
      "committer": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Fri Feb 06 15:27:43 2015 -0500"
      },
      "message": "isolate unit tests from stackrc HOST_IP check\n\nThe HOST_IP check in stackrc is useful for real users, but some cloud\nnodes that infra runs don\u0027t detect it correctly, and it\u0027s not actually\nrequired for unit tests to work right.\n\nChange-Id: Id2aaa713aea91825021e9d8d49d19f3e40a8e6c9\n"
    },
    {
      "commit": "537532931da4103e1a873684476dac6d7fe56489",
      "tree": "e35fe8f6032774a831ccfbf2a4d72a68654bbb38",
      "parents": [
        "5f6f43ed9f67a86cad03c1d0c673429814467d6d"
      ],
      "author": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Thu Dec 04 19:38:15 2014 -0500"
      },
      "committer": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Thu Jan 15 13:06:14 2015 -0500"
      },
      "message": "Make changes such that -o nounset runs\n\nThis makes a bunch of variable cleanups that will let -o nounset\nfunction, for the time being we hide nounset behind another setting\nvariable so that it\u0027s not on by default.\n\nBecause this is bash, and things are only executed on demand, this\nprobably only works in the config it was run in. Expect cleaning up\nall the paths to be something that takes quite a while.\n\nThis also includes a new set of unit tests around the trueorfalse\nfunction, because my change in how it worked, didn\u0027t. Tests are good\nm\u0027kay.\n\nChange-Id: I71a896623ea9e1f042a73dc0678ce85acf0dc87d\n"
    },
    {
      "commit": "1f65fd64ce2f4ed32a706f9bcb28c2ee0cf51e5b",
      "tree": "17da92dbb44093a59992333a3351cb5850983386",
      "parents": [
        "bfdddebc28e088ce9449feac8740901b82cc1c9b"
      ],
      "author": {
        "name": "Doug Wiegley",
        "email": "dougw@a10networks.com",
        "time": "Sat Dec 13 11:56:16 2014 -0700"
      },
      "committer": {
        "name": "Doug Wiegley",
        "email": "dougw@a10networks.com",
        "time": "Sun Dec 14 20:50:00 2014 -0700"
      },
      "message": "Clear multi-line sections before adding lines\n\nWith multiline support for local.conf, the first line is created with\niniset, which will set *all* previous lines to the same thing, and then\nsubsequent lines will be added. Modify the multiline support to first\nclear existing lines from the section.\n\nThis causes fatal errors with neutron.conf, which defines drivers with a bunch\nof service_provider\u003d options, and the current code ends up with the first\ndriver defined in local.conf being present twice.\n\nChange-Id: If132a94e53545d9134859aa508da7b9819ede2f8\n"
    },
    {
      "commit": "c187b88e698a203a222b38cbf3a045b520918042",
      "tree": "075bf71137754c344504efc767848ff70cc619f8",
      "parents": [
        "5853160c6e0a0c7601beea122d5f690ca6bba082"
      ],
      "author": {
        "name": "Julien Danjou",
        "email": "julien@danjou.info",
        "time": "Tue Dec 09 15:41:55 2014 +0100"
      },
      "committer": {
        "name": "Julien Danjou",
        "email": "julien@danjou.info",
        "time": "Tue Dec 09 15:41:55 2014 +0100"
      },
      "message": "Add tooz support from Oslo\n\nChange-Id: I4ccf4bf08e10c0ba651f973aa62562af85ea0f19\n"
    },
    {
      "commit": "aecd189f80533b2680184d648f393bd0f5479882",
      "tree": "b4e4194920fc2e89297390bf93d0d84106015d80",
      "parents": [
        "576aaae6f74c55ab65280c287f3b12a274e6e683"
      ],
      "author": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Wed Nov 19 15:19:51 2014 -0500"
      },
      "committer": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Thu Nov 20 08:32:26 2014 -0500"
      },
      "message": "add unit tests for GIT* definitions\n\nThis adds unit tests for all the GIT* definitions, ensuring that for\nlibraries we think should be defined, they are. It exposed a bug in\nglance_store definitions in the process.\n\nThe GITDIR definition for python-openstackclient is moved to stackrc\nfor testability.\n\nChange-Id: Ibd9ab665f0362a84f4f7e80e80da56a4737f584e\n"
    },
    {
      "commit": "9f20ea13826234ac2c508ea1d50a0822b68d42dc",
      "tree": "741cd1b7e72ea2bd15764471278dc58d7827efdf",
      "parents": [
        "9bfdea87a6ceea667a3c674215099ce8a967a3c2"
      ],
      "author": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Mon Nov 17 15:14:49 2014 -0500"
      },
      "committer": {
        "name": "Sean Dague",
        "email": "sean@dague.net",
        "time": "Tue Nov 18 11:33:47 2014 +0000"
      },
      "message": "make run_tests.sh run devstack unit tests\n\nrun_tests.sh was created as an entry point for bashate. We stopped\nusing it now that we know how to run bashate directly in the gate. \nWe lost running an unrelated bashate test when that happened.\n\nDevstack does have unit tests. We don\u0027t run them. We should. \nEspecially when working on things like the LIBS_FROM_GIT which is\nsufficiently tricky that we really need to add unit tests to ensure\nthat we don\u0027t break it.\n\nChange-Id: Ife067855569e2eae4c085471d326e8086de37332"
    },
    {
      "commit": "f3bf8b6cc0dc94684a3bbecc4cc1e2169506f804",
      "tree": "2bbc4cc3bbeef0641dfd7aeaff81e3c770d547e3",
      "parents": [
        "6fe32059de58964c8f089977539262f288df4601"
      ],
      "author": {
        "name": "Ian Wienand",
        "email": "iwienand@redhat.com",
        "time": "Wed Oct 29 21:53:56 2014 +1100"
      },
      "committer": {
        "name": "Ian Wienand",
        "email": "iwienand@redhat.com",
        "time": "Wed Oct 29 22:12:17 2014 +1100"
      },
      "message": "Revert \"Single quote iniset argument in merge_config_file\"\n\nThis reverts commit e2c9fee8ed846aba124a2fc1bba245790ed7ba90.\n\nWe have decided that we don\u0027t want to support the json-style argument\nas described by bug#1374118 (see thread at [1]).\n\nThis restores the old behavior of sending the argument in\ndouble-quotes so environment variables get expanded.  As a bonus,\ntests for this are added.\n\n[1] http://lists.openstack.org/pipermail/openstack-dev/2014-October/049341.html\n\nChange-Id: I9fc99f3716cc53366907878adb00ae6cf3898f14\nCloses-Bug:#1386413\n"
    },
    {
      "commit": "751ad1aadf8447c2b6945b6ae4ab73bf71a244ca",
      "tree": "dd29652859f3a425f8a7f2853149c157d743f6f4",
      "parents": [
        "ddfbacef9fd0bd64b38674524f7829b42ed08bbd"
      ],
      "author": {
        "name": "Robert Li",
        "email": "baoli@cisco.com",
        "time": "Wed Oct 15 21:40:53 2014 -0400"
      },
      "committer": {
        "name": "Robert Li",
        "email": "baoli@cisco.com",
        "time": "Wed Oct 15 21:44:31 2014 -0400"
      },
      "message": "Allow multi-line config items in meta-section of local.conf\n\nIt would behave such as the contents from each meta-section in\nlocal.conf is copied to the destination files. One exception is the multiline\noptions not grouped together. In that case, the contents will be grouped\ntogether in its destination config file.\n\nCheck tests/test_config.sh for examples.\n\nThis was originally committed in https://review.openstack.org/128805.\nBut the original change used AWK syntax that is not supported in AWK\n3.1.8, and caused syntax error on servers with that AWK version. This\npatch makes the necessary change so that it\u0027s compatible with AWK\n3.1.8.\n\nChange-Id: Id1e1fe01f05bd0f19ea6e89c4f4c0f8be695dfce\nPartial-Bug: #1374118\n"
    },
    {
      "commit": "e0d6a46b8afaeacc070a84f58ecf8e03ffe8275c",
      "tree": "7ad40b60df1239e2ef553031685ef84daa21fd9b",
      "parents": [
        "a7eb07a3e22eb0362b28cec4bd289201a9adf699"
      ],
      "author": {
        "name": "Kevin Benton",
        "email": "blak111@gmail.com",
        "time": "Tue Oct 14 04:54:42 2014 -0700"
      },
      "committer": {
        "name": "Kevin Benton",
        "email": "blak111@gmail.com",
        "time": "Tue Oct 14 04:54:42 2014 -0700"
      },
      "message": "Add test case for colon in value\n\nAdds a test case for a colon in a value\n\nChange-Id: Ica56b8af5fa59a008cfe96424b1d3e17fd6cf7d6\n"
    },
    {
      "commit": "a7eb07a3e22eb0362b28cec4bd289201a9adf699",
      "tree": "f71ea7688ba146a393e4e17acfecf2592a486cef",
      "parents": [
        "e9c70ab4097cd8d1991a893811dbd862ee001f10"
      ],
      "author": {
        "name": "Kevin Benton",
        "email": "blak111@gmail.com",
        "time": "Tue Oct 14 04:35:59 2014 -0700"
      },
      "committer": {
        "name": "Kevin Benton",
        "email": "blak111@gmail.com",
        "time": "Tue Oct 14 04:38:56 2014 -0700"
      },
      "message": "Revert \"Allow multi-line config items in meta-section of local.conf\"\n\nThis reverts commit 6ff21acf4c4d4ef08bbef419ba582cade4da8da7.\n\nThis commit has broken config options with colons in them.\nThe following is a sample configuration that no longer works:\n\n[[post-config|/etc/neutron/plugins/ml2/ml2_conf.ini]]\n[restproxy]\nserver_ssl\u003dFalse\nservers\u003d10.211.1.9:80\nserver_ssl\u003dFalse\n\nWith the above config and the code present that this reverts,\nthe \u0027servers\u0027 option will come out blank.\n\nChange-Id: I328852d2d941605051a1bf5eaf0f7674191f8c48\n"
    },
    {
      "commit": "6ff21acf4c4d4ef08bbef419ba582cade4da8da7",
      "tree": "b5acb9e70c03cb15be733339b742f3bf9d10ae87",
      "parents": [
        "cc87c2871dc436b2134f60e9fa4663723a094ebd"
      ],
      "author": {
        "name": "Robert Li",
        "email": "baoli@cisco.com",
        "time": "Fri Oct 10 12:43:05 2014 -0400"
      },
      "committer": {
        "name": "Robert Li",
        "email": "baoli@cisco.com",
        "time": "Fri Oct 10 12:53:24 2014 -0400"
      },
      "message": "Allow multi-line config items in meta-section of local.conf\n\nIt would behave such as the contents from each meta-section in\nlocal.conf is copied to the destination files. One exception is the multiline\noptions not grouped together. In that case, the contents will be grouped\ntogether in its destination config file.\n\nCheck tests/test_config.sh for examples.\n\nChange-Id: I8c046b558eeb98ed221f6f1a59182d4179956ced\nPartial-Bug: #1374118\n"
    },
    {
      "commit": "cc87c2871dc436b2134f60e9fa4663723a094ebd",
      "tree": "253024468ea6f45620386034ba09b0fa654043ee",
      "parents": [
        "284492cc1194bb2f156f860d35b5a1a46ac5b179"
      ],
      "author": {
        "name": "Fergal Mc Carthy",
        "email": "fergal.mccarthy@hp.com",
        "time": "Thu Oct 09 16:16:42 2014 -0400"
      },
      "committer": {
        "name": "Robert Li",
        "email": "baoli@cisco.com",
        "time": "Fri Oct 10 08:25:38 2014 -0400"
      },
      "message": "local.conf processing doesn\u0027t handle \u0027\u003d\u0027 in values\n\nWhen attempting to add a libvirt section with a volume_drivers entry\nto $NOVA_CONF, via a post-config block in the local.conf file, I\nencountered problems; the value for this attribute takes the form\n\n    driver\u003dpython.import.path.to.driver\n\nbut the value actually populated in the $NOVA_CONF was truncated at the\nequals.\n\nTaking the iscsi driver setting specified in the official nova.conf\ndocumentation as an example, if I have the following in my local.conf\nfile:\n\n[[post-config|$NOVA_CONF]]\n[libvirt]\nvolume_drivers \u003d iscsi\u003dnova.virt.libvirt.volume.LibvirtISCSIVolumeDriver\n\nI will see that the generated $NOVA_CONF has the following:\n\n[libvirt]\nvolume_driver \u003d iscsi\n\nThis occurs because the existing handling for a post-config setion, as\nimplemented in merge_config_file(), splits the line on the equals sign,\nand then uses the first and seconds elements of the resulting array as\nattribute name and value respectively.\n\nHowever when an equals occurs as part of the value this results in the\nvalue being truncated at the first equals in the value.\n\nThe fix I\u0027ve implemented, based upon review feedback, extracts the\ncontents of $0 before the first equals as the attr name, and extracts\nthe remainder after the equals as the value. Then it strips the leading\nand trailing whitespaces from both as appropriate.\n\nI\u0027ve also added test5 to tests/test_config.sh to test for, and verify,\ncorrect operation when this scenario is encountered.  Similarly I\u0027ve\nadded test6 to ensure that trailing spaces in values are stripped\ncorrectly.\n\nChange-Id: Id0cb1e6e1cece21bc5dbf427c4d756af86fbd927\nCloses-Bug: #1374482\n"
    },
    {
      "commit": "e2c9fee8ed846aba124a2fc1bba245790ed7ba90",
      "tree": "589865dd5959c3e0f9645dd1282c2a6dd4ee93d3",
      "parents": [
        "690e3c25742f47fd2a42d6407ffa30bc99288dc0"
      ],
      "author": {
        "name": "Ian Wienand",
        "email": "iwienand@redhat.com",
        "time": "Fri Sep 26 09:42:11 2014 +1000"
      },
      "committer": {
        "name": "Ian Wienand",
        "email": "iwienand@redhat.com",
        "time": "Tue Oct 07 12:16:00 2014 +1100"
      },
      "message": "Single quote iniset argument in merge_config_file\n\nIf we don\u0027t single quote the extracted argument to iniset we drop any\nquotes from the source.  Add a simple test-case for this.\n\nPartial-bug: #1374118\n\nChange-Id: If2f47b64b11015e727a011c7e5f6e8ad378b90eb\n"
    },
    {
      "commit": "2f27a0ed3c609bfcd6344a55c121e56d5569afc9",
      "tree": "abe0c02c1d2fd9d57f6b786ff8105896969d0e3c",
      "parents": [
        "58deafcd63ae996e0973c864e249c4a3cb82a74f"
      ],
      "author": {
        "name": "Chris Dent",
        "email": "chdent@redhat.com",
        "time": "Tue Sep 09 13:46:02 2014 +0100"
      },
      "committer": {
        "name": "Chris Dent",
        "email": "chdent@redhat.com",
        "time": "Thu Sep 11 18:59:39 2014 +0100"
      },
      "message": "Replace screen_it() with run_process() throughout\n\nrun_process will use screen if USE_SCREEN\u003dTrue (the default),\notherwise it will simply start the requested service. Therefore\nwherever screen_it used, run_process can be instead.\n\nWhere stop_screen was found it has been replaced with stop_process.\n\nA tail_log function has been added which will tail a logfile in a\nscreen if USE_SCREEN is True.\n\nlib/template has been updated to reflect the use of the new\nfunctions.\n\nWhen using sg the quoting in run_process gets very complicated.\nTo get around this run_process and the functions it calls accepts\nan optional third argument. If set it is a group to be used with sg.\n\nChange-Id: Ia3843818014f7c6c7526ef3aa9676bbddb8a85ca\n"
    },
    {
      "commit": "3159a821c2e0662278746c5311e187bcfd4d8b75",
      "tree": "619916b47ee265729ca2c120870addd5c3b13e84",
      "parents": [
        "4bd4264960917b6bcd197326020a8a894d1d47f4"
      ],
      "author": {
        "name": "Dean Troyer",
        "email": "dtroyer@gmail.com",
        "time": "Wed Aug 27 14:13:58 2014 -0500"
      },
      "committer": {
        "name": "Chris Dent",
        "email": "chdent@redhat.com",
        "time": "Tue Sep 09 13:54:01 2014 +0100"
      },
      "message": "Run processes without screen\n\nThis introduces new run_process() and screen_service() functions and sets the\ngroundwork to change how DevStack starts services.  screen_service() is simply a\ndirect call to the screen portion of the old screen_it() function and is intended\nto run commands that only need to run under screen, such as log file watchers.\n\nrun_process() is a replacement for screen_it() (which remains until all of the\nservices are updated).  The usage is similar but requires updates to every current\nscreen_it() call to remove everything that requires the command to be interpreted\nby a shell.\n\nThe old run_process() and _run_process() functions are still present as\nold_run_process() and _old_run_process() to support the deprecated screen_it()\nfunction.  These will all go away in the future once all services have been\nconfirmed to have been changed over.\n\nThere is a similar new set of stop process functions stop_process() and\nscreen_stop_service().  The old screen_stop() will also remain for the deprecation\nperiod.\n\nAs an initial test/demostration this review also includes the changes for\nlib/cinder to demonstrate what is required for every service.\n\nI included the scripts I used to test this; tests/fake-service.sh and\ntests/run-process.sh are quite rough around the edges and may bite.  They should\nmature into productive members of the testing ecosystem someday.\n\nChange-Id: I03322bf0208353ebd267811735c66f13a516637b\n"
    },
    {
      "commit": "410f5c0016a9d3b1fbd42b95ce1402a1c614e3d3",
      "tree": "51b01c296832b71b71aac47f6ef3969d57163ab9",
      "parents": [
        "4fbb8137af8c3e0e5805db7337651048f11b6bb2"
      ],
      "author": {
        "name": "Ryota MIBU",
        "email": "r-mibu@cq.jp.nec.com",
        "time": "Fri Apr 04 02:00:31 2014 +0900"
      },
      "committer": {
        "name": "Ryota MIBU",
        "email": "r-mibu@cq.jp.nec.com",
        "time": "Tue Jun 17 15:43:07 2014 +0900"
      },
      "message": "Fix unsubstituted filename creation\n\nSince merge_config_file() tries to create an unsubstituted config file,\nstack.sh fails due to permission denied in the file creation when you\nuse \u0027[[post-config|/$Q_PLUGIN_CONF_FILE]]\u0027 and the file does not exist.\n\nThis patch deletes unnecessary \u0027touch\u0027 command, because the file will\nbe made by \u0027iniset\u0027 function in the next command line with evaled\nstring from \u0027configfile\u0027.\n\nThis patch also fixes merge_config_group() to use evaled \u0027configfile\u0027\nwhen it checks the directory of the config file exists.\n\nChange-Id: I608847a34143b5c6a1708c180186dd88a32dd44b\nCloses-bug: #1294213\n"
    },
    {
      "commit": "aee18c749b0e3a1a3a6907a33db76ae83b8d41d9",
      "tree": "01a8ab5abb9867986f3e848918abd9e749b691cd",
      "parents": [
        "0ed4af02da0bd4a0f757dd8c2156913e6c7a724c"
      ],
      "author": {
        "name": "Ian Wienand",
        "email": "iwienand@redhat.com",
        "time": "Fri Feb 21 15:35:08 2014 +1100"
      },
      "committer": {
        "name": "Ian Wienand",
        "email": "iwienand@redhat.com",
        "time": "Fri Feb 28 07:59:03 2014 +1100"
      },
      "message": "Enforce function declaration format in bash8\n\nCheck that function calls look like ^function foo {$ in bash8, and fix\nall existing failures of that check.  Add a note to HACKING.rst\n\nChange-Id: Ic19eecb39e0b20273d1bcd551a42fe400d54e938\n"
    },
    {
      "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"
    }
  ]
}
