)]}'
{
  "log": [
    {
      "commit": "19d66c2d96909b16635f38e4552015c49f45fb7b",
      "tree": "f11e8858489298cda104ae5039caba969f4114ef",
      "parents": [
        "06477cae89d2e1aef7860d5b6cbc29f5de71ffc5"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:51:45 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:51:45 2017 -0700"
      },
      "message": "change request.handle() to request.callHandler()\n\nHandle was already used for sftp\u0027s session \u0027handle\u0027 which is the name\nused in the other code and sftp specs.\n"
    },
    {
      "commit": "06477cae89d2e1aef7860d5b6cbc29f5de71ffc5",
      "tree": "1488c6bcb8624e40665b8b9483c39599cee9af05",
      "parents": [
        "6eeffbb80592965a0c8c8b3eeec4796a62485cca"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:47:32 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:47:32 2017 -0700"
      },
      "message": "minor fix to doc comment\n"
    },
    {
      "commit": "6eeffbb80592965a0c8c8b3eeec4796a62485cca",
      "tree": "00cff1d1ece04b4186dcb637c787a60717c48d9e",
      "parents": [
        "db5d9a73ca684291aba08a6ea78f6837f627f11d"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:38:09 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:38:09 2017 -0700"
      },
      "message": "don\u0027t use read locks when making a change\n"
    },
    {
      "commit": "db5d9a73ca684291aba08a6ea78f6837f627f11d",
      "tree": "f8bb39d93c3a5d111b93738b1b7332ef659d858a",
      "parents": [
        "7040a0b760f624e399562ea489de19fa171672f7",
        "4c02ab5a94fb5fc4381fa8ba8f5a2ad77004a7ba"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:33:02 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 20 17:33:02 2017 -0700"
      },
      "message": "Merge pull request #197 from mjgarton/master\n\nFix #196; Increase offset correctly"
    },
    {
      "commit": "4c02ab5a94fb5fc4381fa8ba8f5a2ad77004a7ba",
      "tree": "f8bb39d93c3a5d111b93738b1b7332ef659d858a",
      "parents": [
        "725c3d861fa549d9526e86705c7416e366000f77",
        "7040a0b760f624e399562ea489de19fa171672f7"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:18:07 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 20 17:18:07 2017 -0700"
      },
      "message": "Merge branch \u0027master\u0027 into master"
    },
    {
      "commit": "7040a0b760f624e399562ea489de19fa171672f7",
      "tree": "3987d1d234376a44d1d07557bcc0da3795737d4a",
      "parents": [
        "aedf9a737ad25606bf3d9decfcf539634ce2f0ea",
        "3b9263e3f56cac3f1ff7360befbe3ab6fefd083c"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:07:51 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 20 17:07:51 2017 -0700"
      },
      "message": "Merge pull request #198 from holtwilkins/patch-1\n\nFixes to mkdir example"
    },
    {
      "commit": "aedf9a737ad25606bf3d9decfcf539634ce2f0ea",
      "tree": "055fe89e974c6c8bf023c78eb4b66d7c91ec7401",
      "parents": [
        "cffd2fabb0d5bb855fb0c85ca72acb4df74ffc97"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:03:15 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 17:03:15 2017 -0700"
      },
      "message": "Fix #192 all Request methods use pointer recivers\n\nPrevents subtle copy bugs and made the 1 required Request copy explicit.\n"
    },
    {
      "commit": "cffd2fabb0d5bb855fb0c85ca72acb4df74ffc97",
      "tree": "5884d96dd5dbc9fe9f5f32fca9f13599141a3012",
      "parents": [
        "bc6b56aae0166afb42f1a6efca6118a493802a0c"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 15:51:26 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 16:15:01 2017 -0700"
      },
      "message": "Fix #195 Handler wrappers deal with errors\n\nTLDR; have the Handler wrappers generate the response packets for the\nerrors instead of returning the errors.\n\nErrors from the handers was returned up the stack to the request-server\nhandler call. In cases of errors the packet for the error was then\ngenerated using the passed in packet (the incoming packet).\n\nFor file read/write/list operations the incoming packet data (includeing\nID) is put in a queue/channel so that it can be handled by the same file\nhandling code returned by the handler.\n\nDue to gorouting scheduling, in some cases the packets in the channel\nwon\u0027t line up with the incoming packets. That is the worker that took an\nincoming packet with one ID might respond with a packet with a different\nID. This doesn\u0027t matter as the reply order of packets doesn\u0027t matter.\n\nBUT when this response packet that doesn\u0027t match IDs with the incoming\npacket system returns an error, it uses the incoming packets ID to\ngenerate the error packet. So the error response would use that ID and\nthe packet from the queue, once processed, would also use that ID\n(because on success  it uses the ID from the packet in the queue).\n\nThis patch fixes the issue by having the code that works with the\npackets, either incoming or from the queue, generate the error packet.\nSo there is no chance of them getting out of sync.\n"
    },
    {
      "commit": "bc6b56aae0166afb42f1a6efca6118a493802a0c",
      "tree": "78fdc0c5d3d8e547529acd6c439f144b06969064",
      "parents": [
        "bd3f00a6eae0c9d8d8b88cfdccbf16811b37a298"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 15:23:55 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 15:23:55 2017 -0700"
      },
      "message": "packageManager to use pointer receivers everywhere\n\nHad a problem with getting a copy because a value receiver called a\npointer receiver.\n"
    },
    {
      "commit": "bd3f00a6eae0c9d8d8b88cfdccbf16811b37a298",
      "tree": "6d49ae622d4038748a3e93f1db1d0a87c05a94f0",
      "parents": [
        "26ceac758ee6b63a39dffc4d47289357a579559a",
        "f2782dd6fa79f417fbf131478ad7e3b2f8866113"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 15:09:04 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 20 15:09:04 2017 -0700"
      },
      "message": "Merge pull request #194 from pkg/move-handle-ptr-request\n\nMove Request.handle to *Request"
    },
    {
      "commit": "26ceac758ee6b63a39dffc4d47289357a579559a",
      "tree": "478ba11e1af6428df0046d07d677a86fb61457fc",
      "parents": [
        "6c3cc26627737754e0206e02c2a015db1662fa04"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 14:39:32 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Aug 20 14:54:45 2017 -0700"
      },
      "message": "add os.ErrNotExist handling into statusFromError\n\nAnd remove errorAdapter() as this makes it unnecessary.\n"
    },
    {
      "commit": "3b9263e3f56cac3f1ff7360befbe3ab6fefd083c",
      "tree": "2f86e8ade04d5ef80bb9493bae011e6d2537253f",
      "parents": [
        "6c3cc26627737754e0206e02c2a015db1662fa04"
      ],
      "author": {
        "name": "holtwilkins",
        "email": "holtwilkins@gmail.com",
        "time": "Fri Aug 18 11:04:12 2017 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 18 11:04:12 2017 +1000"
      },
      "message": "Fixes to mkdir example\n\n* Adjusting name of `ssh_fx_failure` variable to match go formatting\r\n* Fixing logic error for absolute paths"
    },
    {
      "commit": "6c3cc26627737754e0206e02c2a015db1662fa04",
      "tree": "189402a42fc3f7d2d327109265e4dec03a711de9",
      "parents": [
        "1a91f318a0be84de50afcf22d3b3d78bfe32025c",
        "653e2f10439e6a54853eb7d1611d32005e20f48f"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Aug 16 19:18:48 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 16 19:18:48 2017 -0700"
      },
      "message": "Merge pull request #191 from sandreas/master\n\nvarious improvements / potential fix for issue #8"
    },
    {
      "commit": "725c3d861fa549d9526e86705c7416e366000f77",
      "tree": "0c135fc3cc6343520817652696549bbae789121b",
      "parents": [
        "1a91f318a0be84de50afcf22d3b3d78bfe32025c"
      ],
      "author": {
        "name": "Martin Garton",
        "email": "mgarton@utilitywarehouse.co.uk",
        "time": "Wed Aug 16 15:53:40 2017 +0100"
      },
      "committer": {
        "name": "Martin Garton",
        "email": "mgarton@utilitywarehouse.co.uk",
        "time": "Wed Aug 16 15:53:40 2017 +0100"
      },
      "message": "Fix #196; Increase offset correctly\n\nIf a ListerAt implementation chooses to return fewer than MaxFileList\nentries, the next offset it increased by MaxFileList in any case and so\nwe get unwanted results.  Instead, increase the offset by the correct\nnumber as returned by ListAt.\n"
    },
    {
      "commit": "653e2f10439e6a54853eb7d1611d32005e20f48f",
      "tree": "189402a42fc3f7d2d327109265e4dec03a711de9",
      "parents": [
        "4d7bb970c49d8a86d12e2cd34952dc80dbc7cb0d",
        "1a91f318a0be84de50afcf22d3b3d78bfe32025c"
      ],
      "author": {
        "name": "sandreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Sun Aug 13 17:00:45 2017 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 13 17:00:45 2017 +0200"
      },
      "message": "Merge branch \u0027master\u0027 into master"
    },
    {
      "commit": "4d7bb970c49d8a86d12e2cd34952dc80dbc7cb0d",
      "tree": "bea46f54d363e0fa4b5522eedbcfb2e8d4862efe",
      "parents": [
        "939f0f39340521ee58a1a397b928d75c0395facf"
      ],
      "author": {
        "name": "andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Sun Aug 13 14:00:08 2017 +0200"
      },
      "committer": {
        "name": "andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Sun Aug 13 14:00:08 2017 +0200"
      },
      "message": "Resolved conflict with SftpServerWorkerCount\nSplitted cleanPath into cleanPacketPath and cleanPath for better handling of slashes in file paths\nAdded test for cleanPath func\nRemoved code duplication \u003d\u003e filepath.ToSlash(filepath.Clean(...)) \u003d\u003e cleanPath(...)\nFixed tests for runLs to match year or time\nRenamed constants to fit hound rules\n"
    },
    {
      "commit": "f2782dd6fa79f417fbf131478ad7e3b2f8866113",
      "tree": "2d84aebea8d9da3c8eeff41ef5d342577cb642f8",
      "parents": [
        "1a91f318a0be84de50afcf22d3b3d78bfe32025c"
      ],
      "author": {
        "name": "Dave Cheney",
        "email": "dave@cheney.net",
        "time": "Sun Aug 13 17:22:00 2017 +1000"
      },
      "committer": {
        "name": "Dave Cheney",
        "email": "dave@cheney.net",
        "time": "Sun Aug 13 17:22:00 2017 +1000"
      },
      "message": "Move Request.handle to *Request\n\nUpdates #192\n\nMove handle() onto *Request, this has flow on effects to the interface\ntypes declared in request-interface.go, the examples and the tests.\n\nThe decision to address #192 started with advice from gopl.io, but I\nthink has uncovered several bugs as many of the request methods operate\non copies of data stored in the RequestServer\u0027s cache. I think this is\nunintentional, but may point to some correctness issues, see #193.\n"
    },
    {
      "commit": "1a91f318a0be84de50afcf22d3b3d78bfe32025c",
      "tree": "51a4cca83d3037a23701b938567b3c3a445fd79e",
      "parents": [
        "733115c415560ff2068431f5e9a540e387694fc8"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Aug 10 17:53:41 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Aug 10 17:53:41 2017 -0700"
      },
      "message": "make (sS)ftpServerWorkerCount constant public\n\nThe number of workers is important for some functionality in\nrequest-server extentions. It is a constant, so making it public\nseems easy and safe.\n"
    },
    {
      "commit": "733115c415560ff2068431f5e9a540e387694fc8",
      "tree": "2ea608a6b12b573f9e88fab8009fdc6a4e8ccf7f",
      "parents": [
        "22f089b9c4056cf774ebd695b687d469f2ad4650"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jul 27 18:22:11 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Aug 10 15:36:41 2017 -0700"
      },
      "message": "Fixes #184; better fix for file batching\n\nI didn\u0027t like how the initial fix for #184 required the handler author\nto track the token/offset for the filelist. I came up with a way to do\nit that mimic\u0027d the FileReader handler interface using a method\nsomething like ReaderAt except for file lists.\n\nchanged MaxFileinfoList to a var for testing and tweaking\n\nRenaming FileInfoer interface to FileLister.\nFileInfoer -\u003e FileLister\nFileinfo -\u003e Filelist\n"
    },
    {
      "commit": "939f0f39340521ee58a1a397b928d75c0395facf",
      "tree": "1d8aa2487a1e45ca0518535fe41d5dd4bd251e31",
      "parents": [
        "2401c5c95f26d2595de5885af7458b1dfa4ef6aa"
      ],
      "author": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 12:50:08 2017 +0200"
      },
      "committer": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 12:50:08 2017 +0200"
      },
      "message": "Fixed possible double slash in request\n"
    },
    {
      "commit": "2401c5c95f26d2595de5885af7458b1dfa4ef6aa",
      "tree": "2cdb5f25170f6fdced8281c8cbf03c78138f118e",
      "parents": [
        "9b5881464176f0df5f3a7486b385c5074dee51af"
      ],
      "author": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 12:10:05 2017 +0200"
      },
      "committer": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 12:10:05 2017 +0200"
      },
      "message": "Changed default user and group to root and count links for directories to 0 on non *nix systems\n"
    },
    {
      "commit": "9b5881464176f0df5f3a7486b385c5074dee51af",
      "tree": "fb14348dcbbd527adf3791c61f52fb8596c932bf",
      "parents": [
        "ec08c0d53b2801b8009c113a5be8395b32e667de"
      ],
      "author": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 07:49:14 2017 +0200"
      },
      "committer": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 07:49:14 2017 +0200"
      },
      "message": "Fixed time.Parse in runLs tests\nFixed runLs tests on Windows\n"
    },
    {
      "commit": "ec08c0d53b2801b8009c113a5be8395b32e667de",
      "tree": "3e148f8b56424ad9e1f7dde62bd704cbebe67fff",
      "parents": [
        "f7ea598f7f39a8d820f48e0c54b1baf2293db17d"
      ],
      "author": {
        "name": "andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 07:34:48 2017 +0200"
      },
      "committer": {
        "name": "andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 07:34:48 2017 +0200"
      },
      "message": "Moved permission detection for runLs to server.go\nMake runLs return the recommended format in stubs, even if it does not contain all information\nRemoved unused parameter\n"
    },
    {
      "commit": "f7ea598f7f39a8d820f48e0c54b1baf2293db17d",
      "tree": "bf182f90c770c7b8a79e4e750b134d8a41f5d677",
      "parents": [
        "11608a1d3160ae0b8ca94856c27ad21bf2cf4fed"
      ],
      "author": {
        "name": "andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 07:12:50 2017 +0200"
      },
      "committer": {
        "name": "andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Thu Aug 10 07:12:50 2017 +0200"
      },
      "message": "Added os independent test for runLs function\n"
    },
    {
      "commit": "11608a1d3160ae0b8ca94856c27ad21bf2cf4fed",
      "tree": "4d4c91aa7498c9cc012c7c053730e47f3559a844",
      "parents": [
        "505f2cb49ee1bfd789cc5423b0c9e51003c02b37"
      ],
      "author": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Wed Aug 09 19:43:14 2017 +0200"
      },
      "committer": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Wed Aug 09 19:43:14 2017 +0200"
      },
      "message": "Added initial test setup for runLs\n"
    },
    {
      "commit": "505f2cb49ee1bfd789cc5423b0c9e51003c02b37",
      "tree": "7fe24d3672a8640a23e351bde0784ba63a5b08ce",
      "parents": [
        "babb028c61f0232c209080f0d33d59fb653ceb55"
      ],
      "author": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Wed Aug 09 17:25:44 2017 +0200"
      },
      "committer": {
        "name": "Andreas",
        "email": "andreas.schroden@gmail.com",
        "time": "Wed Aug 09 17:25:44 2017 +0200"
      },
      "message": "Fixed issues with backslashes on windows systems\n"
    },
    {
      "commit": "22f089b9c4056cf774ebd695b687d469f2ad4650",
      "tree": "39b74140eea2111c58bbb21706cd6cc0c5343db4",
      "parents": [
        "babb028c61f0232c209080f0d33d59fb653ceb55"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Jul 25 21:04:32 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Jul 25 21:04:32 2017 -0700"
      },
      "message": "Document internal inconsistency error\n"
    },
    {
      "commit": "babb028c61f0232c209080f0d33d59fb653ceb55",
      "tree": "f4e645e8585056dc5f55dcc13300490329179a32",
      "parents": [
        "08f9799191795e9a9935d655a5c693e2b5e32b54"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jul 23 17:47:38 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jul 23 17:47:47 2017 -0700"
      },
      "message": "Fix #189; add ClientOption type\n\nConvert func(*Client)error places to use that type.\n\nDid this mainly for consistency with ServerOption and improved\ndocumentation.\n"
    },
    {
      "commit": "08f9799191795e9a9935d655a5c693e2b5e32b54",
      "tree": "93e4552b7b4ceedf90e36215fcd43a77396268be",
      "parents": [
        "4f3e725e885c021085d2fb8a9cc26e30ea1a992f"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jul 23 16:40:34 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jul 23 16:40:34 2017 -0700"
      },
      "message": "Fix #185; add max packet size check and docs\n"
    },
    {
      "commit": "4f3e725e885c021085d2fb8a9cc26e30ea1a992f",
      "tree": "885f7e3a5dbf346adea7a7fc7b3f928d1a6dc908",
      "parents": [
        "c325f9a7fedf8f931b2a91f79b230dc036cf09f3"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jul 20 15:25:28 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jul 20 15:28:11 2017 -0700"
      },
      "message": "Fixes #188; eliminates duplicated core code\n\nmatch contained lots of cut-n-pasted code from filepath/match.go in the\ncore libraries. Particularly Match() and Join() were changed in such a\nway that made them functionally equivalent to the versions in\npath/match.go. This removes the duplicate code and just calls the path\nversions.\n"
    },
    {
      "commit": "c325f9a7fedf8f931b2a91f79b230dc036cf09f3",
      "tree": "bc2632863bdf47ac8cd00eeeebd1963afd545531",
      "parents": [
        "314a5ccb89b21e053d7d96c3a706eacaf2b18231"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Jul 19 19:25:49 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Jul 19 19:25:49 2017 -0700"
      },
      "message": "nicer debugging output for a few packet types\n"
    },
    {
      "commit": "314a5ccb89b21e053d7d96c3a706eacaf2b18231",
      "tree": "90cf909dcaab74e5b2991adff4559ce6dc7f015d",
      "parents": [
        "d02a2715ba36c6dd07ac3ee39b93a327087bb288"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 10 17:03:35 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 10 17:03:35 2017 -0700"
      },
      "message": "keep 1.7 compat for now (remove a sort.Slice)\n\nNot in performance critical code, so a more expensive option but\nbackward compatibile version is ok for now. Will switch back once 1.7\ncompatibility is no longer required.\n"
    },
    {
      "commit": "d02a2715ba36c6dd07ac3ee39b93a327087bb288",
      "tree": "1894c2a927ff75ce5375abcdde7024f459089342",
      "parents": [
        "e97b9a47e1814100cb55a58e85a4fe610a0c3982"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 10 16:43:58 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 10 16:43:58 2017 -0700"
      },
      "message": "Fixes #184; request server file list batching\n\nThe request server needs to support batching of file list requests. To\naddress this the methods LsSave(string) and LsNext()string are added to\nthe Request object. They should work to store a token to keep your place.\n\nThe Handler should now return an EOF when the end of the directory list is\nreached. If it doesn\u0027t but returns an empty list, the wrapper will send the EOF\nfor you.\n\nThe old behaviour of just returning 1 batch and sending the EOF is preserved if\nyou don\u0027t set the token (you don\u0027t use LsSave). It will return the 1 list and\nEOF on the next underlying readdir call. This is to preserve backwards\ncompatibility and it not the recommended way to handle file lists.\n"
    },
    {
      "commit": "e97b9a47e1814100cb55a58e85a4fe610a0c3982",
      "tree": "fb9c34196fd295ad9b44c232a41def64acfabe2a",
      "parents": [
        "07d4ed1b5cbabc006ee52e8734f74198914263c9"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 03 17:53:55 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 03 17:53:55 2017 -0700"
      },
      "message": "avoid data race in worker creation\n\nThere is a data race with the waitgroup (wg) object used to synchronize\nthe workers with the server exit. The workers called wg.Add()\nasynchronously and it was possible for the Wait() to get hit before any\nof the Add() calls were made in certain conditions. I only ever saw this\nsporatically in the travis tests.\n\nThis fixes it by making the wg.Add() calls synchronous.\n"
    },
    {
      "commit": "07d4ed1b5cbabc006ee52e8734f74198914263c9",
      "tree": "7ff4206c534f9d31376a64ccf89f6e37d976ec30",
      "parents": [
        "8e0c78ade58962a47c4b3f2ead79d64d4efea141"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 03 17:38:09 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 03 17:45:58 2017 -0700"
      },
      "message": "don\u0027t copy lock\n\ngovet pointed out that I was copying a lock when creating/assigning the\nconnection object. It didn\u0027t cause any issues, but was a bad practice.\n"
    },
    {
      "commit": "8e0c78ade58962a47c4b3f2ead79d64d4efea141",
      "tree": "4e304e05fc909660979ce7953522077fed7ff1ae",
      "parents": [
        "4553269743755b02f6aefd5c4a7ba47c19be25ec"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 03 13:14:51 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Jul 03 13:14:51 2017 -0700"
      },
      "message": "fix spelling error in comment\n"
    },
    {
      "commit": "4553269743755b02f6aefd5c4a7ba47c19be25ec",
      "tree": "b78deb3754f0c338b58bee8dbf2cafba9a213707",
      "parents": [
        "9b3eae7bd484b438587841217f38cdd8661e1202"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jun 29 14:49:54 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jun 29 14:49:54 2017 -0700"
      },
      "message": "Fix #182; use ssh connection meta-data in example\n"
    },
    {
      "commit": "9b3eae7bd484b438587841217f38cdd8661e1202",
      "tree": "f41519df5ac7a2e1bb365d6f3d5b0dc8716ba82a",
      "parents": [
        "737aa1dc61e93af5e18282c7bc6e34e22ee7dfa6"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jun 29 14:48:40 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jun 29 14:48:40 2017 -0700"
      },
      "message": "ignore test keys in all examples\n"
    },
    {
      "commit": "737aa1dc61e93af5e18282c7bc6e34e22ee7dfa6",
      "tree": "ee701ad59802e802e1135e1be1c798c779dbcaf4",
      "parents": [
        "ca043ca452cac768d3b7bab7140076218dad0445"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jun 29 11:27:52 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Jun 29 11:27:52 2017 -0700"
      },
      "message": "Fixes #181: client deadlock on server death\n\nThe client was deadlocking if you killed the server when a file transfer\nwas occuring. The problem occured when you had many requests sent and\nwere waiting on responses when the server dies. The errors for all those\npending requests get sent along the response channel which is also used\nfor the errors reported by the new requests being made. The new request\nchannel send is in the same loop as the channel reading, so when it\nblocked due to all other errors filling the channel it deadlocked the\nprogram.\n\nThere were 2 possible fixes, changing the new request error channel\nusage to be in a separate goroutine to keep it from blocking the loop or\nto increase the size of the buffer to handle all the errors. This\nimplements the latter.\n\nIncluded is a test that reproduces the problem most of the time. Due to\nthe required timing of the issue, it was impossible to reproduce 100% of\nthe time.\n"
    },
    {
      "commit": "ca043ca452cac768d3b7bab7140076218dad0445",
      "tree": "605ae6a328efdfb9c4205ac67c4f949ab13ef5c7",
      "parents": [
        "516f73358825b579ad5ddaf6abb80346bd96e54c"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jun 25 19:21:59 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jun 25 19:21:59 2017 -0700"
      },
      "message": "add ReadFrom benchmark\n"
    },
    {
      "commit": "516f73358825b579ad5ddaf6abb80346bd96e54c",
      "tree": "05db58d050e9490047b2f79c9204be07727fa8b6",
      "parents": [
        "a5f8514e29e90a859e93871b1582e5c81f466f82"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jun 18 18:46:58 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Jun 18 18:46:58 2017 -0700"
      },
      "message": "Add Mkdir example (mkdir -p like functionality)\n\nThis gives an example of using Mkdir and handing errors.\n\nFixes #131\n"
    },
    {
      "commit": "a5f8514e29e90a859e93871b1582e5c81f466f82",
      "tree": "42bdfa36f8fabc5c0c94b3fcaa277041860f1b37",
      "parents": [
        "dddd9cf3c7889aa0fefd2e8a529367a3e1f3b669",
        "a3ba1138031130c87c46232ae5bbfcf97d51ec45"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed May 10 17:00:41 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 10 17:00:41 2017 -0700"
      },
      "message": "Merge pull request #179 from xiu/hostkeycallback\n\nFixes #177: adds HostKeyCallback to ssh.ClientConfig"
    },
    {
      "commit": "a3ba1138031130c87c46232ae5bbfcf97d51ec45",
      "tree": "42bdfa36f8fabc5c0c94b3fcaa277041860f1b37",
      "parents": [
        "dddd9cf3c7889aa0fefd2e8a529367a3e1f3b669"
      ],
      "author": {
        "name": "xiu",
        "email": "guillaume@herail.net",
        "time": "Wed Apr 26 18:31:26 2017 +0200"
      },
      "committer": {
        "name": "xiu",
        "email": "guillaume@herail.net",
        "time": "Wed Apr 26 18:31:26 2017 +0200"
      },
      "message": "Fixes #177: adds HostKeyCallback to ssh.ClientConfig\n\nThis is needed since https://github.com/golang/go/issues/19767\n"
    },
    {
      "commit": "dddd9cf3c7889aa0fefd2e8a529367a3e1f3b669",
      "tree": "5127607d3368775bc236fdad437bf471ede3f5a5",
      "parents": [
        "2482bdeeb81a3168c08510aec789d10a511cb523"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Apr 25 15:30:31 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Apr 25 15:30:31 2017 -0700"
      },
      "message": "soften contrib text a bit\n"
    },
    {
      "commit": "2482bdeeb81a3168c08510aec789d10a511cb523",
      "tree": "9aecd3a3461be667c3f9ca91955f204083cea303",
      "parents": [
        "adb5b39283f4d03e75f8358004c6f57831109c96"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 22:28:26 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 22:28:26 2017 -0700"
      },
      "message": "remove unused packet cases from request.update\n\nfstat and fsetstat are not converted to versions that work on path\ninstead of working with open filehandle. So I removed them from the\nrequest.update method which updates the request object for methods that\nare working on an opened file.\n"
    },
    {
      "commit": "adb5b39283f4d03e75f8358004c6f57831109c96",
      "tree": "044b9843b8c84a61d1a723b214540dcc88e6ee98",
      "parents": [
        "032a92899007cd6edfe3f3f8b529490415eb22de"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:53:56 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:53:56 2017 -0700"
      },
      "message": "convert fsetstat to setstat in request-server\n\nHandle fsetstat in same was a fstat, by pulling path from stored file\ninfo and processing in that form. Makes handlers simpler while\npreserving functionality.\n"
    },
    {
      "commit": "032a92899007cd6edfe3f3f8b529490415eb22de",
      "tree": "09ecc0634200ea229b43900cb8d151d48d5bd630",
      "parents": [
        "4cfaeaf9b7137f50fc92a49045f5c34c95bfc464"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:51:06 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:51:06 2017 -0700"
      },
      "message": "Propagate Flags from setstat packet to request\n\nHad file attributes, but not the flags which are required for the\nattributes to be meaningful. The stats stuff in the request-server is\nvery simplistic, but I want it to be able to be used even if a PITA.\n"
    },
    {
      "commit": "4cfaeaf9b7137f50fc92a49045f5c34c95bfc464",
      "tree": "5d16c905f754241a43da2187020611160cde94b5",
      "parents": [
        "9b982bd499576568a396a72ba74098ce7d16ef73"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 19:42:51 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:39:51 2017 -0700"
      },
      "message": "fix hang on fstat calls in request server\n\nSupport fstat by converting to a standard Stat call and processing that.\nI didn\u0027t want to add another special case to the request backend, I\nwanted to keep it only having to support Stat.\n"
    },
    {
      "commit": "9b982bd499576568a396a72ba74098ce7d16ef73",
      "tree": "752d71e3cd9b14750bfb6e98a9eb9203a9fd5cc2",
      "parents": [
        "a3c585f638413cbac2d7469f14589db482ac4a36"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 19:05:13 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:39:51 2017 -0700"
      },
      "message": "Add test to replicate fstat hang\n"
    },
    {
      "commit": "a3c585f638413cbac2d7469f14589db482ac4a36",
      "tree": "5125bde43dd272932835cbd81c01def465e38d2f",
      "parents": [
        "700027f436f0641aebd85d8e4d5ae61b6eb201c2"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:36:09 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 21:36:09 2017 -0700"
      },
      "message": "Fix several Setstat typos in request-server\n\nAdded a test that breaks w/ old code which has typos but is fixed with\ntypos fixed. Also added switch-default error message that would have\nhelped diagnose this (should have been there already).\n"
    },
    {
      "commit": "700027f436f0641aebd85d8e4d5ae61b6eb201c2",
      "tree": "3ab95958fd1c31c9c0b40f05f7becffd490a788f",
      "parents": [
        "63cbed8bae688a2cc83d845c89a97edbe8976554"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Apr 22 15:29:14 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 24 11:52:02 2017 -0700"
      },
      "message": "drain inFlight packets in read/write methods\n\nFixes issue #167\n\nFile read/write client methods were breaking out of the packet handling\nloops with packets still \u0027in flight\u0027 (packets sent without reply from\nserver) when errors occured. This caused problems after the fact with\nthe returning packets interfearing with later calls.\n\nThis change makes sure all the in flight packets are processed (even if\njust discarded) before breaking out of the loop and returning.\n"
    },
    {
      "commit": "63cbed8bae688a2cc83d845c89a97edbe8976554",
      "tree": "3754870aa967cd81deac091bf825b400a763ba13",
      "parents": [
        "ced55b1bf0fc9ad8da4ee5dd10153bd1a989e2ee"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 16:37:11 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 16:37:11 2017 -0700"
      },
      "message": "forgot to remove a tmp comment\n"
    },
    {
      "commit": "ced55b1bf0fc9ad8da4ee5dd10153bd1a989e2ee",
      "tree": "985fce94dd69609d1c520b9dde8efa8f28ec009a",
      "parents": [
        "5024cb048c13b2e174c0f8dfbab5f1f279d7ef4c"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 14:27:25 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 14:27:25 2017 -0700"
      },
      "message": "request-server to use new packet ordering code\n\nThe 2 servers now use all the same packet managing code to ensure\nordered processing and reply packets.\n"
    },
    {
      "commit": "5024cb048c13b2e174c0f8dfbab5f1f279d7ef4c",
      "tree": "18d9b7fecfc497b25d0d600c0e4380cbc8afca42",
      "parents": [
        "447b7fabc1d521d349b1d3d4f5bc0821229bc132"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 13:47:05 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 13:47:05 2017 -0700"
      },
      "message": "Move packer ordering code into packet-manager\n\nThe worker/packet mangement code needs to be in the packet manager so\nthe request-server can utilize it as well. This also improves the\nencapsulation of the method as it relied on internal data that should be\nbetter isolated inside the file/struct.\n"
    },
    {
      "commit": "447b7fabc1d521d349b1d3d4f5bc0821229bc132",
      "tree": "290ec83b0981235d6a79cc3cd6f1c7c3851e451a",
      "parents": [
        "027e3db83beaed3581d89b1838de314b9be61824"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 11:32:22 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sun Apr 23 11:32:22 2017 -0700"
      },
      "message": "small naming and output tweaks for tests\n"
    },
    {
      "commit": "027e3db83beaed3581d89b1838de314b9be61824",
      "tree": "f61f17501b21c2645127aac0f29c372f6cceb1a1",
      "parents": [
        "693e43ceb6ac7b485f4a774e9c05ecc2eef1a028"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 17 17:52:26 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 17 17:52:26 2017 -0700"
      },
      "message": "handle all status packet results the same\n"
    },
    {
      "commit": "693e43ceb6ac7b485f4a774e9c05ecc2eef1a028",
      "tree": "91b5bc65581426b3ef0dee3d26dd36e8e9af5333",
      "parents": [
        "d1bd7b3f9c3d154aa127b55035481b23c1aae5a9"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Apr 08 20:22:27 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 17 17:24:15 2017 -0700"
      },
      "message": "add a test to replicate close happening out of order\n"
    },
    {
      "commit": "d1bd7b3f9c3d154aa127b55035481b23c1aae5a9",
      "tree": "9eee364b8b01104fcd51519aec8909e6fa527247",
      "parents": [
        "5fd073bcc3a1fe4c0146a37628fd64c3396d43fd"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:19:14 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 17 17:24:15 2017 -0700"
      },
      "message": "ensure packets are processed in order\n\nFile operations that happen after the open packet has been received,\nlike reading/writing, can be done with the pool as the order they are\nrun in doesn\u0027t matter (the packets contain the file offsets).\n\nCommand operations, on the other hand, need to be serialized.\n\nThis flips between a pool of workers for file operations and a single\nworker for everything else. It flips on Open and Close packets.\n"
    },
    {
      "commit": "5fd073bcc3a1fe4c0146a37628fd64c3396d43fd",
      "tree": "c2a7d93dff0bfea4c2f0bd563c57dd8e8427628b",
      "parents": [
        "cb456b384cd3aae0ca1838cd59af8b6bb3363d67"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Mar 25 17:07:47 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Apr 17 17:24:15 2017 -0700"
      },
      "message": "decouple packet channel from server struct\n\nlooking to create 2 pools, so I want to pass the channel in\n"
    },
    {
      "commit": "cb456b384cd3aae0ca1838cd59af8b6bb3363d67",
      "tree": "63aa5e0c67379f14b419b503b9e7cbc0fd505045",
      "parents": [
        "6c86161fec09fa4d543f4ae7fc67dfab22abf457"
      ],
      "author": {
        "name": "Pavel Borzenkov",
        "email": "pavel.borzenkov@gmail.com",
        "time": "Fri Apr 07 09:08:41 2017 +0000"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Apr 08 20:29:37 2017 -0700"
      },
      "message": "Fix race between client\u0027s close and write\n\nAfter commit 506f3a7 which removed clientConn mutex around\nconn.sendPacket, it is now possible for conn.Close and conn.Write to\nrace (https://travis-ci.org/pkg/sftp/jobs/219048782#L1838). The problem\nis really hard to reproduce, but I believe this patch fixes it.\n\nNow clientConn.Mutex protects \u0027inflight\u0027 map only, and conn.Mutex\nserializes connection writes/close.\n\nSigned-off-by: Pavel Borzenkov \u003cpavel.borzenkov@gmail.com\u003e\n"
    },
    {
      "commit": "6c86161fec09fa4d543f4ae7fc67dfab22abf457",
      "tree": "86e67662671beb6f8a2868f40f415e3df5a95c3e",
      "parents": [
        "a91edeefacf3e7e1f7bc09da3b9152fef843dd07"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 15:39:53 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 15:40:33 2017 -0700"
      },
      "message": "limit osx checks due to long waits\n"
    },
    {
      "commit": "a91edeefacf3e7e1f7bc09da3b9152fef843dd07",
      "tree": "b1704543163cedb9dca1ae4a954ace9be9473b4b",
      "parents": [
        "506f3a7848764bb32e66db7f517284c7dcd3a1f2"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:38:13 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:38:13 2017 -0700"
      },
      "message": "incoming out of order packet manager test\n"
    },
    {
      "commit": "506f3a7848764bb32e66db7f517284c7dcd3a1f2",
      "tree": "76dfc475ee5640e770c9883dbaf75d2ada5e3afe",
      "parents": [
        "9aa225fc15d588a8c781acf9a944186b9f3e7df6"
      ],
      "author": {
        "name": "Pavel Borzenkov",
        "email": "pavel.borzenkov@gmail.com",
        "time": "Wed Apr 05 09:53:22 2017 +0000"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:15:57 2017 -0700"
      },
      "message": "Fix deadlock when using Client + Service over io.Pipe\n\nClient + Server might deadlock while being connected via io.Pipe with\nhigh request concurrency. The scenario is as follows:\n\n  - Server is trying to send reply to a previous client\u0027s packet and is\n    waiting on Pipe\u0027s condvar for the client to read it:\n\n 3  0x0000000000460e39 in sync.(*Cond).Wait\n    at /usr/lib/go/src/sync/cond.go:57\n 4  0x0000000000464519 in io.(*pipe).write\n    at /usr/lib/go/src/io/pipe.go:90\n 5  0x0000000000464a4c in io.(*PipeWriter).Write\n    at /usr/lib/go/src/io/pipe.go:157\n 6  0x00000000007a0b66 in go.(*struct { io.Reader; io.WriteCloser }).Write\n    at \u003cautogenerated\u003e:246\n 7  0x0000000000790cf6 in github.com/pkg/sftp.(*conn).Write\n    at \u003cautogenerated\u003e:3\n 8  0x000000000073a68d in github.com/pkg/sftp.sendPacket\n    at ./packet.go:130\n 9  0x000000000073338c in github.com/pkg/sftp.(*conn).sendPacket\n    at ./conn.go:31\n10  0x00000000007374b4 in github.com/pkg/sftp.(*packetManager).maybeSendPackets\n    at ./packet-manager.go:87\n\n  - Client is sending a new packet and is waiting on Pipe\u0027s condvar for\n    the server to read it, while holding clientConn mutex:\n\n 5  0x0000000000464a4c in io.(*PipeWriter).Write\n    at /usr/lib/go/src/io/pipe.go:157\n 6  0x0000000000790cf6 in github.com/pkg/sftp.(*conn).Write\n    at \u003cautogenerated\u003e:3\n 7  0x000000000073a68d in github.com/pkg/sftp.sendPacket\n    at ./packet.go:130\n 8  0x000000000073338c in github.com/pkg/sftp.(*conn).sendPacket\n    at ./conn.go:31\n 9  0x0000000000733bfb in github.com/pkg/sftp.(*clientConn).dispatchRequest\n    at ./conn.go:105\n10  0x0000000000733a0b in github.com/pkg/sftp.(*clientConn).sendPacket\n    at ./conn.go:97\n\n  - Client\u0027s receive loop is processing a reply from the server and is\n    trying to acquire clientConn mutex:\n\n4  0x000000000046108d in sync.(*Mutex).Lock\n   at /usr/lib/go/src/sync/mutex.go:87\n5  0x00000000007336cb in github.com/pkg/sftp.(*clientConn).recv\n   at ./conn.go:69\n6  0x000000000073350d in github.com/pkg/sftp.(*clientConn).loop\n   at ./conn.go:49\n7  0x000000000045ab51 in runtime.goexit\n   at /usr/lib/go/src/runtime/asm_amd64.s:2197\n\nIn this scenario neither server nor client can progress. Fix this by\nreleasing clienConn mutex *before* trying to send the packet.\n\nSigned-off-by: Pavel Borzenkov \u003cpavel.borzenkov@gmail.com\u003e\n"
    },
    {
      "commit": "9aa225fc15d588a8c781acf9a944186b9f3e7df6",
      "tree": "3e286d662d3397fe8e5ee05f9172cf5488f218e7",
      "parents": [
        "1d032678cc88f1ab0283250971b0447a706bef19"
      ],
      "author": {
        "name": "Pavel Borzenkov",
        "email": "pavel.borzenkov@gmail.com",
        "time": "Mon Mar 27 18:29:37 2017 +0300"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:15:57 2017 -0700"
      },
      "message": "Don\u0027t copy Server struct in sendPacket/sendError\n\nServer struct contains Mutex which might be copied in inconsistent\nstate. Avoid this by declaring methods on pointer receiver.\n\nThis calms down go race detector.\n\nSigned-off-by: Pavel Borzenkov \u003cpavel.borzenkov@gmail.com\u003e\n"
    },
    {
      "commit": "1d032678cc88f1ab0283250971b0447a706bef19",
      "tree": "37d7a700b2ffa9bd62eda7b0c96efe6e2d376e21",
      "parents": [
        "ee0946f83b67be3067ca0cddaef3ddccdddc50da"
      ],
      "author": {
        "name": "Pavel Borzenkov",
        "email": "pavel.borzenkov@gmail.com",
        "time": "Wed Apr 05 09:08:03 2017 +0000"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:15:57 2017 -0700"
      },
      "message": "test: add new test to verify concurrent requests handling\n\nThe tests issues several requests in parallel to verify that the server\ncan handle concurrent requests correctly. Right now the test fails with\nrace detector enabled. This will be fixed by the following patch.\n\nSigned-off-by: Pavel Borzenkov \u003cpavel.borzenkov@gmail.com\u003e\n"
    },
    {
      "commit": "ee0946f83b67be3067ca0cddaef3ddccdddc50da",
      "tree": "1b2f1a9bc4001832b38c9046ea8ddfba59de0001",
      "parents": [
        "df2f92e1bf86f5805e2d9356f67c3992a897ca6c"
      ],
      "author": {
        "name": "Pavel Borzenkov",
        "email": "pavel.borzenkov@gmail.com",
        "time": "Wed Apr 05 09:05:42 2017 +0000"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:15:57 2017 -0700"
      },
      "message": "test: close the server to avoid goroutine leak\n\nSigned-off-by: Pavel Borzenkov \u003cpavel.borzenkov@gmail.com\u003e\n"
    },
    {
      "commit": "df2f92e1bf86f5805e2d9356f67c3992a897ca6c",
      "tree": "3bc512a1bece8fdef05f8453d1a8228038ab1ae7",
      "parents": [
        "f581f816668ae3c9aecee151cdaa1afa814a40de"
      ],
      "author": {
        "name": "Pavel Borzenkov",
        "email": "pavel.borzenkov@gmail.com",
        "time": "Mon Mar 27 18:33:59 2017 +0300"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Apr 05 14:15:57 2017 -0700"
      },
      "message": "packet-manager: sort incoming request ID queue\n\nIncoming queue is not guaranteed to contain request IDs in ascending\norder. Such state may be achieved by using a single sftp.Client\nconnection from multiple goroutines. Sort incoming queue to avoid\nlivelock due to different request/response order, like this:\n\n2017/03/27 18:29:07 incoming: [55 56 54 57 58]\n2017/03/27 18:29:07 outgoing: [54 55 56 57 58]\n\nFor single-threaded clients request/response order will remain intact\nand nothing should break.\n\nSigned-off-by: Pavel Borzenkov \u003cpavel.borzenkov@gmail.com\u003e\n"
    },
    {
      "commit": "f581f816668ae3c9aecee151cdaa1afa814a40de",
      "tree": "ac124f0a2f9818c475050114e1390cbbfdcf0bbf",
      "parents": [
        "c0171352dc6c9311f4a35e0f08930536ee37f7de"
      ],
      "author": {
        "name": "Artyom Pervukhin",
        "email": "artyom@evasive.ru",
        "time": "Tue Feb 28 21:44:56 2017 +0300"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Mar 25 16:48:13 2017 -0700"
      },
      "message": "Pass actual errors from FileReader/FileWriter implementations\n\nFixes #163\n"
    },
    {
      "commit": "c0171352dc6c9311f4a35e0f08930536ee37f7de",
      "tree": "c71d1367653e6b21c8c393a510b310c0c69ac822",
      "parents": [
        "ebb577494559ac0776b6e7c682ecde6c334666fd"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 15 16:28:16 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "Use sort.Slice() for go1.8+\n\nI noticed a significan slowdown in throughput tested by the benchmarks\nwhen using the pre go1.8 sort.Sort() method for sorting. So I decided to\nsplit this out and use build flags so people could regain the\nperformance loss by upgrading to go1.8+.\n"
    },
    {
      "commit": "ebb577494559ac0776b6e7c682ecde6c334666fd",
      "tree": "90dbb5c992c50eabebcc4703dc5c2d532e4a1942",
      "parents": [
        "c0a31022aeb97647fc9442152eecad9c19d5d356"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 15 11:23:19 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "improve top level comment\n"
    },
    {
      "commit": "c0a31022aeb97647fc9442152eecad9c19d5d356",
      "tree": "29b6d628dc0ef5a27e1d03a9945c482ee85724e3",
      "parents": [
        "db7c5041e22ffcb1668e417dd0eb4bb3e8c2b4e7"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 15 11:22:06 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "sorting incoming packet ids is redundant\n\nHaving this outside the worker pool means tcp will ensure packet\nordering is consistent with what the client sent.\n"
    },
    {
      "commit": "db7c5041e22ffcb1668e417dd0eb4bb3e8c2b4e7",
      "tree": "8f776926c6d772a388869e559c6ac5b297b2b29d",
      "parents": [
        "5152c21cf96358e55caa3213cfe965208c498af1"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 14 20:26:21 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "change sort.Slice() to sort.Sort() for 1.7 compat\n"
    },
    {
      "commit": "5152c21cf96358e55caa3213cfe965208c498af1",
      "tree": "2d99321d8a55c30ab530467940790136323020fc",
      "parents": [
        "ded0784f459e936af628152b69811476afad6652"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 14 18:02:17 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "integrate packageManager into servers\n"
    },
    {
      "commit": "ded0784f459e936af628152b69811476afad6652",
      "tree": "504574ec79a583d20a88058863fcc0edc0dc4152",
      "parents": [
        "243a742d21e0b714784da51c0abc7602482d9f2c"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 14 17:49:31 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "code that manages incoming/outgoing packet order\n\nMakes sure that outgoing packets order matches incoming packets order.\nThis is not required by spec but some clients seem to require it (eg.\nwinscp).\n"
    },
    {
      "commit": "243a742d21e0b714784da51c0abc7602482d9f2c",
      "tree": "fd1ade3ba279dcb1b89384e935f88a960008aefd",
      "parents": [
        "51cb116815c32c76a45365e63b31b099b44d776e"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 14 17:43:51 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "add id() to responsePacket interface\n\nand add id() to couple of packet structs missing it\nused 0 for structs without ID as it doesn\u0027t matter for them\n"
    },
    {
      "commit": "51cb116815c32c76a45365e63b31b099b44d776e",
      "tree": "9aa2c007a3fe4ad25cec7238c144c8ac3de26b81",
      "parents": [
        "89c474ca1d8dcced18326fcb82d46fda6647c5d5"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Mar 13 18:24:32 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "better name: packet -\u003e requestPacket\n"
    },
    {
      "commit": "89c474ca1d8dcced18326fcb82d46fda6647c5d5",
      "tree": "3f95ca6f67a04a6ea4f26c1e44d93c3208f9cdb5",
      "parents": [
        "2519062c9d20d0f09e300cd517f684d5f432d49c"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Mar 13 17:52:53 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:04 2017 -0700"
      },
      "message": "new name for id (now ider) interface\n\nmore in line with go naming scheme for interfaces\nbetter greppability\n"
    },
    {
      "commit": "2519062c9d20d0f09e300cd517f684d5f432d49c",
      "tree": "518adf2bc6572a53b6ad2b6304c4fe4ba6515216",
      "parents": [
        "0b429718464b8644fa9fe1e1c6e4a6e4ca7e1b26"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Mar 13 17:01:06 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:03 2017 -0700"
      },
      "message": "move request packet out of request specific names\n\nrequest-* naming is used for the request API. We\u0027re now using the packet\ntype and building code in it more generally, so we want to denote that\nin the filename.\n"
    },
    {
      "commit": "0b429718464b8644fa9fe1e1c6e4a6e4ca7e1b26",
      "tree": "e340bbce96a4da5dcea8cd5e49fd7c9560896a5d",
      "parents": [
        "4f1fe4fe3bfaae885d5d92a93697b16616f39f24"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Mar 13 16:49:47 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:03 2017 -0700"
      },
      "message": "packet unmarshalling code into main server loop\n\nThis means we are now passing full packets to the workers. This makes\nthe request id\u0027s available which is required for fixing packet ordering.\nBenchmark tests weren\u0027t affected at all.\n"
    },
    {
      "commit": "4f1fe4fe3bfaae885d5d92a93697b16616f39f24",
      "tree": "8c5e34a7c8385ced57dda30093c557418a89624e",
      "parents": [
        "890b9f1a4a4495d9982c580dd2a68da2fbb44011"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Mar 13 16:02:25 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:03 2017 -0700"
      },
      "message": "Use common packet typing code\n\nRemove duplication due to request code being separate.\n"
    },
    {
      "commit": "890b9f1a4a4495d9982c580dd2a68da2fbb44011",
      "tree": "4ce3fc13f720506560597770d72b5fdd0207600b",
      "parents": [
        "62d5779aab08c3e7a61d44192871e500ac0f3319"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Mon Mar 13 15:54:55 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Mar 23 16:15:03 2017 -0700"
      },
      "message": "change readonly checks to interface type checks\n"
    },
    {
      "commit": "62d5779aab08c3e7a61d44192871e500ac0f3319",
      "tree": "ba38d833acd10410392b14700c1f6a1e4ecebea7",
      "parents": [
        "8f9da7f630446dd8f3d363329be58c938b0a1eb1"
      ],
      "author": {
        "name": "unclejack",
        "email": "unclejack@users.noreply.github.com",
        "time": "Wed Mar 15 15:31:42 2017 +0200"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 15 12:45:09 2017 -0700"
      },
      "message": "server_standalone: handle readonly properly\n\nSigned-off-by: Cristian Staretu \u003ccristian.staretu@gmail.com\u003e\n"
    },
    {
      "commit": "8f9da7f630446dd8f3d363329be58c938b0a1eb1",
      "tree": "25c4b6ca865c3ee41cf6543e3c1f2b6a8882d860",
      "parents": [
        "7aa3e486569d7333a1fbed548e18493bfbe06d55"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 14 12:27:51 2017 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 14 12:27:51 2017 -0700"
      },
      "message": "quick fix to get benchmarks running\n\nbenchmarks were broken due to double closing of a channel in some tests.\nI just commented out the problematic closes which probably means it\u0027s\nleaking in the tests but at least they run now. Should probably try to\nfigure out what happened here at some point.\n"
    },
    {
      "commit": "7aa3e486569d7333a1fbed548e18493bfbe06d55",
      "tree": "90b1796bba2b8acee4eecaccd5fee1f3d10e80be",
      "parents": [
        "b5277106ccae6e2dda35cc606776298d904d03e3"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 07 12:29:34 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 07 12:29:34 2017 -0800"
      },
      "message": "Have example sftp servers handle session EOF\n\nAs the EOF is expected when the client quits the session, have the\nexample servers handle it more gracefully so it is less confusing.\n\nFixes #169\n"
    },
    {
      "commit": "b5277106ccae6e2dda35cc606776298d904d03e3",
      "tree": "d59ba99be3edc3b5db8068e06dcf42e3626234a3",
      "parents": [
        "1077779d4478e66c237c7be3a98ea98ff76f99ce"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 07 12:28:52 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Mar 07 12:28:52 2017 -0800"
      },
      "message": "users in example servers should be the same\n"
    },
    {
      "commit": "1077779d4478e66c237c7be3a98ea98ff76f99ce",
      "tree": "49abaceefaa1f07f91c5a02c9e3645ed85afe2a6",
      "parents": [
        "725c6ac61d08ba06efc2339667acc0139672376e"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 20:54:40 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 20:54:40 2017 -0800"
      },
      "message": "Revert \"rename files with OS specific request test code\"\n\nTests pass but doesn\u0027t build. :P\n\nNeed to figure out better way to organize this code.\n\nThis reverts commit 322a18e28ba4b13785b9840dad2716762957435c.\n"
    },
    {
      "commit": "725c6ac61d08ba06efc2339667acc0139672376e",
      "tree": "1955477fc35d86c5e78ccb249a860857d2dd490b",
      "parents": [
        "322a18e28ba4b13785b9840dad2716762957435c"
      ],
      "author": {
        "name": "George Xie",
        "email": "george@xiegeo.com",
        "time": "Wed Mar 01 15:54:43 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 20:04:44 2017 -0800"
      },
      "message": "make path more Unix like on windows servers\n"
    },
    {
      "commit": "322a18e28ba4b13785b9840dad2716762957435c",
      "tree": "edf5de302ada072af5f3d646c0fdfd3d5f03aa48",
      "parents": [
        "81c5ef6a75a71801873c45335506b2e2eee650d7"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 19:53:59 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 19:53:59 2017 -0800"
      },
      "message": "rename files with OS specific request test code\n\nAdded _test so they will only be compiled as part of the tests.\n"
    },
    {
      "commit": "81c5ef6a75a71801873c45335506b2e2eee650d7",
      "tree": "4abe944142d1b1127adbe8e87a07135f8c04c776",
      "parents": [
        "f025fae65c2ee1d35fd47cc434635ae57cbdd0b5"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 19:51:32 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 19:51:32 2017 -0800"
      },
      "message": "rework fileinfo.Sys() output test for windows\n\nsplit out the unix specific test code\n"
    },
    {
      "commit": "f025fae65c2ee1d35fd47cc434635ae57cbdd0b5",
      "tree": "b6781ad0883c49364d3bc4b3a718c41e107cec76",
      "parents": [
        "c690dc3a0d0b89bce8a5d8d0c2d65934bd36acdf"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 19:50:37 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 19:50:37 2017 -0800"
      },
      "message": "rework build tags for unix request test support code\n"
    },
    {
      "commit": "c690dc3a0d0b89bce8a5d8d0c2d65934bd36acdf",
      "tree": "59bb9a69f2da63c6f56f136389333b331f8a1224",
      "parents": [
        "1189af57876f9ce079097fe9f33a7cd9488df41d"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 11:22:04 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Wed Mar 01 11:22:04 2017 -0800"
      },
      "message": "mv windows only code into windows only file\n\nrelated to issue #160\n"
    },
    {
      "commit": "1189af57876f9ce079097fe9f33a7cd9488df41d",
      "tree": "d5e4461275fc4070b2210e842cf5bf651a4ec61f",
      "parents": [
        "94df0a367c78a139a5351d2a3ec204b61170ded9"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Feb 28 11:56:06 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Feb 28 11:56:06 2017 -0800"
      },
      "message": "missed commit in fix for #157\n\nAdding the change to the fakeFileInfoSys() on windows to return the\nwindows type.\n"
    },
    {
      "commit": "94df0a367c78a139a5351d2a3ec204b61170ded9",
      "tree": "499d17c7c87b0b5e2da5f7f55032736409f40616",
      "parents": [
        "e1c86753b9f100f5bf4e75e4f6564f00fcfab7c7"
      ],
      "author": {
        "name": "unclejack",
        "email": "unclejack@users.noreply.github.com",
        "time": "Sat Feb 25 14:17:42 2017 +0200"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Feb 25 12:56:13 2017 -0800"
      },
      "message": "client,packet: remove redundant select \u0026 return\n\nSigned-off-by: Cristian Staretu \u003ccristian.staretu@gmail.com\u003e\n"
    },
    {
      "commit": "e1c86753b9f100f5bf4e75e4f6564f00fcfab7c7",
      "tree": "fa3a2c8053049e2fba21be4e5d0c32d8df01f613",
      "parents": [
        "2eb63db49dd5037d873d683695775acbfec45e01"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Fri Feb 24 20:06:51 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Fri Feb 24 20:06:51 2017 -0800"
      },
      "message": "OS specific syscall.Stat_t use into separate file\n\nThe use of Stat_t in request-example.go is unix specific and broke the\nWindows OS builds. This is the minimal change to fix that.\n\nThis fixes #157.\n"
    },
    {
      "commit": "2eb63db49dd5037d873d683695775acbfec45e01",
      "tree": "58fc82685490ea7f21b0cab0064df65eb4a40eb9",
      "parents": [
        "14edf2c3f1eef467e8e937cb9ddcff5cc6840828"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Fri Feb 24 16:55:41 2017 -0800"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Fri Feb 24 16:55:41 2017 -0800"
      },
      "message": "travis limited to current, previous stable and tip\n\nThis closes #161\n"
    },
    {
      "commit": "14edf2c3f1eef467e8e937cb9ddcff5cc6840828",
      "tree": "53c021ddf7414ee26c0132d23c44eafe703350ad",
      "parents": [
        "43d52d4faa61ee09028a6d8a275f653a52b78261",
        "a4eb07c02938b616eb8200119bd89c57375ca502"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Feb 18 18:33:50 2017 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Feb 18 18:33:50 2017 -0800"
      },
      "message": "Merge pull request #130 from eikenb/request\n\nRequest based server."
    },
    {
      "commit": "a4eb07c02938b616eb8200119bd89c57375ca502",
      "tree": "53c021ddf7414ee26c0132d23c44eafe703350ad",
      "parents": [
        "044c5f4c92682e6be0ac520831ebbae8ed3035a1"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Thu Oct 20 18:42:47 2016 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Feb 18 18:20:37 2017 -0800"
      },
      "message": "NewRequest() now takes method as first param\n"
    },
    {
      "commit": "044c5f4c92682e6be0ac520831ebbae8ed3035a1",
      "tree": "e63ec761a94022eaf192e16cc762f4d818b26c97",
      "parents": [
        "5d2bc881971ee1047ae915043c39a8c06602d4cf"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Sep 13 14:09:14 2016 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Feb 18 18:20:37 2017 -0800"
      },
      "message": "make linter happy with NewRequest comment\n"
    },
    {
      "commit": "5d2bc881971ee1047ae915043c39a8c06602d4cf",
      "tree": "307f1455024e6315e0dfd41fd10311c9ab2d7edc",
      "parents": [
        "df02b6e10d85b9b49a63de728ea8d5a720920bd8"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Sep 13 14:05:32 2016 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Feb 18 18:20:37 2017 -0800"
      },
      "message": "use modtime field instead of time.Now()\n"
    },
    {
      "commit": "df02b6e10d85b9b49a63de728ea8d5a720920bd8",
      "tree": "91b8014b3f04df2a1c931d9d7b0c5e9b34febda3",
      "parents": [
        "7e76fd545168179e7c8a51fceb13a5f1d7f60071"
      ],
      "author": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Tue Sep 13 14:03:00 2016 -0700"
      },
      "committer": {
        "name": "John Eikenberry",
        "email": "jae@zhar.net",
        "time": "Sat Feb 18 18:20:37 2017 -0800"
      },
      "message": "make NewRequest public\n"
    }
  ],
  "next": "7e76fd545168179e7c8a51fceb13a5f1d7f60071"
}
