)]}'
{
  "log": [
    {
      "commit": "db93eec18d8f1e840b32ba2cdf8baf2510f6e1a5",
      "tree": "1118c5e17cb6e4104f84e7fda909428686a7bb3e",
      "parents": [
        "05a69d2f3833c285b399558ba7ab4a57f194a88d"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 11:04:59 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 23:37:47 2015 +0200"
      },
      "message": "tests: add CLI dummy command-exec tool\n\nThis adds some common CLI testtool code as well as a tool that has a\nbunch of commands to be poked for their correct processing.\n\nThe tool doesn\u0027t work correctly from a script at stdin at this point\nbecause the vty code will throw away all buffered when it sees EOF, so\nthe tail end of the input file is lost.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ba32db1e854ff2b26861a2d4e4193a9f1b3816cd",
      "tree": "ac1e4d87ad17a4ae653576009800b4077c4db00f",
      "parents": [
        "6f2a67031cfb21362fc7ecd3251761799c8ffe27"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Tue Nov 19 14:11:40 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 22 21:15:11 2014 +0200"
      },
      "message": "tests: Add tests for timers\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8f399b0e4fff2344d75ebf709e1ce55f15269db2",
      "tree": "e9a2384156a90267a846b03c51435618b2427b1c",
      "parents": [
        "2b00515a9b639fd1e057f3ebf10ded2dde920764"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Mon Sep 30 12:27:50 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 01 17:38:29 2014 +0200"
      },
      "message": "tests: add a test program for lib/command.c\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4d474fa3297c0d5d632e2c0bff6ccb0edbedaa5d",
      "tree": "61ca2f19e552df821eb2dc06cd9e06c81993aacf",
      "parents": [
        "c78a46c27f6dfdd42fe0800cebabc1e49cb0a4bf"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Nov 19 15:00:06 2013 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Mar 21 06:28:48 2014 +0100"
      },
      "message": "lib: fix backtraces broken by 837d16c...\n\n837d16c (\"*: use array_size() helper macro\") accidentally changed one of\nthe expressions in the backtrace code, which afterwards read:\n\nzlog_backtrace_sigsafe():\n  if (((size \u003d backtrace(array,array_size(array)) \u003c\u003d 0) ||\n\nwhich boils down to: (size \u003d backtrace(...)  \u003c\u003d 0).  The braces were\nintended to go:      (size \u003d backtrace(...)) \u003c\u003d 0.\n\nAll in all, this makes a nice textbook example of the original author\nbeing too clever (trying to save a single line by pulling the assignment\ninto the condition) and the next person touching the code tripping over\nit...\n\nThis code occurs another time in zlog_backtrace() where it is actually\ncorrect.  Pulling out the assignment nonetheless.  Also, new test\nprogram.\n\nCc: Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\nCc: Balaji.G \u003cbalajig81@gmail.com\u003e\nCc: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "fa713d9ee5ed30dedd0a290be9aaff780a2896be",
      "tree": "1d263cce70c341f3f2a73a47d4b1cd5a38b09129",
      "parents": [
        "bfac8dcd2fe7ed099a679b5c8245599c6d0312ed"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Fri Jul 05 15:35:37 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Sep 19 18:04:40 2013 +0200"
      },
      "message": "zebra: rework recursive route resolution\n\nChange the datastructure for recursive routes. This brings the following\nbenefits:\n\nBy using struct nexthop also to store nexthops obtained by recursive\nresolution, we can get rid of quite a bit of code duplication in the fib\nmanagement. (rt_netlink, rt_socket, ...)\n\nWith the new datastructure we can make use of all available paths when\nrecursive routes are resolved with multipath routes.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f281ab9752393fcc7cbb54c50edb66f25c2a31fb",
      "tree": "53be958c127d21c6bc0e2e2abd02f33a3fde16c2",
      "parents": [
        "f2b53dac4c72811c06779c596c6162b994eb427a"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Feb 26 16:21:20 2013 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Sun Apr 14 16:01:05 2013 +0200"
      },
      "message": "tests: add DejaGNU framework\n\nDejaGNU seems to be the \u0027standard\u0027 GNU test framework (which by itself\ndoesn\u0027t say much), but it seems relatively usable and the \"remote\nsystem\" capabilities might come in handy for virtualisation-based tests\nfor kernel interactions or something.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8d083b9ec5bb0375ebb6d8b2b05c848febd92cb5",
      "tree": "42786e058df85f087e48022c33e85f2a9464b1aa",
      "parents": [
        "f6295c29070631b24a391f79d4d37ab9c0807ecc"
      ],
      "author": {
        "name": "Leonid Rosenboim",
        "email": "lrosenbo@wrs.com",
        "time": "Tue Nov 06 11:44:04 2012 -0800"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jan 16 01:10:24 2013 +0100"
      },
      "message": "build: update .gitignore for all test programs\n"
    },
    {
      "commit": "28971c8cb1138700e87dc7da673e59b5596bb51b",
      "tree": "0e55c3f830681449cd96bb36eb04a6a1293d8b44",
      "parents": [
        "67174041d2d9d8908f8b2c915bc0d186d8442c68"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:50 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:50:48 2012 +0200"
      },
      "message": "lib/table: add route_table_get_next() and iterator\n\n  * lib/table.[ch]\n\n    - Add a function (route_table_get_next()) to get the route_node in\n      a tree that succeeds a given prefix in iteration order.\n\n      This allows one to reliably walk nodes in a tree while allowing\n      modifications, and is useful for achieving scale and\n      performance. Other approaches are also possible -- the main plus\n      point of this one is that it does not require any state about\n      the walk to be maintained in the table data structures.\n\n    - Add an iterator for walking the nodes in a tree. This introduces\n      a new structure (route_table_iter_t) and the following main\n      functions.\n\n        route_table_iter_init()\n        route_table_iter_pause()\n        route_table_iter_next()\n        route_table_iter_cleanup()\n\n      The iterator normally uses node pointers and the existing\n      route_next() function to walk nodes efficiently. When an\n      iteration is \u0027paused\u0027 with route_table_iter_pause(), it stores\n      the last prefix processed. The next call to\n      route_table_iter_next() transparently invokes\n      route_table_get_next() with the prefix to resume iteration.\n\n  * bgpd/bgp_table.[ch]\n\n    Add wrappers for the new table features described above.\n\n  * tests/table_test.c\n\n    Add tests for the new table code.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d68cbf9261869e532dfdd14dbb4122b3f3feb0d4",
      "tree": "5cc873e6a38a3db9ad5fb4dfe579624ff7693c13",
      "parents": [
        "3998bfd76620a676fbd77f19c5c6ea80a4cc88d2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sat Oct 21 18:35:27 2006 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 20:00:46 2008 +0100"
      },
      "message": "[administrivia] Git should ignore backup files and .loT files\n"
    },
    {
      "commit": "3c5a0a4f8fe3811affff6d5e123379eedb083571",
      "tree": "79e285e0bd04c6ef0dfcde9cf0ce8fda8abecbe1",
      "parents": [
        "750e814693050bc97391eec618aad9db798ee5e8"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Feb 19 17:30:10 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:49:33 2008 +0100"
      },
      "message": "[administrivia] Add .gitignore files, based on .cvsignores.\n"
    }
  ]
}
