)]}'
{
  "log": [
    {
      "commit": "0b1a8ec5494281a809d294ef99179f26fa56be7f",
      "tree": "d77b461f03c4a3bd96e0d3531a30be04aeec8aa2",
      "parents": [
        "59a1020505d98edad569d009bc565337d0f5c17e"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Mon Aug 14 21:25:10 2023 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 14 21:25:10 2023 -0700"
      },
      "message": "Call `shutdown()` before `close()` to resolve potential flakiness. (#34)\n\nBumps the version to 1.6.0 for a new official release."
    },
    {
      "commit": "59a1020505d98edad569d009bc565337d0f5c17e",
      "tree": "d9b9d6d6edc6e6db40392cc9047f6f9ac96e23af",
      "parents": [
        "2cf11dce4f00c9562a84b4c4a0aa2a31d0969b2b"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Mon Jul 24 17:57:00 2023 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 24 17:57:00 2023 -0700"
      },
      "message": "Add 3.12 testing to github CI (#33)\n\n"
    },
    {
      "commit": "2cf11dce4f00c9562a84b4c4a0aa2a31d0969b2b",
      "tree": "e173e59a01991c34d4d50495d4dfd5fbdfaac3be",
      "parents": [
        "edcd88408dfde0247ce598b4075c2c128a72d074"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Fri Jul 08 08:27:23 2022 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Fri Jul 08 08:27:23 2022 -0700"
      },
      "message": "Use os._exit in the child instead of sys.exit.\n"
    },
    {
      "commit": "edcd88408dfde0247ce598b4075c2c128a72d074",
      "tree": "2a893ca42b772e7fd87e590819b75b528238ac13",
      "parents": [
        "092674265db43b7706a7d71381c8498091f65f72"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Thu Jul 07 12:24:54 2022 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 07 12:24:54 2022 -0700"
      },
      "message": "Adds an optional timeout that a port will remain bound to after the CLI exits (#31)\n\n* Add CLI unittests.\r\n* Allow tests to launch their own portserver.\r\n* Add -h --help support to the CLI."
    },
    {
      "commit": "092674265db43b7706a7d71381c8498091f65f72",
      "tree": "396772264b63be57b90c1a9b90dd17a8878203f6",
      "parents": [
        "884182b32aa2d786ebfc1d094f96688166d2ef66"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Fri Jun 17 15:47:27 2022 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Fri Jun 17 15:47:27 2022 -0700"
      },
      "message": "Avoid the need for an internal patch.\n\nportserver isn\u0027t really a module so how its test finds and imports it\nvaries based on situation (see also the existing win32 special code).\n"
    },
    {
      "commit": "884182b32aa2d786ebfc1d094f96688166d2ef66",
      "tree": "42be4c7f7214ac60b4f5321b3a4b35b60ce68a58",
      "parents": [
        "e7a5816b2b96f08ecdcc69301c77bad6ca6dd876"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Fri Jun 17 14:52:49 2022 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 17 14:52:49 2022 -0700"
      },
      "message": "lint cleanups; drop 3.6 from CI and metadata. (#32)\n\n"
    },
    {
      "commit": "e7a5816b2b96f08ecdcc69301c77bad6ca6dd876",
      "tree": "2ee79e738a477650b60ee8e7b88b7cb8a4e6c31e",
      "parents": [
        "6bae8e26ae402a8aa302ed944cb3a21b0adffa10"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Tue Jun 14 17:02:12 2022 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 14 17:02:12 2022 -0700"
      },
      "message": "Add 3.11 to CI, remove Travis. (#30)\n\n* Add 3.11 to CI, remove Travis.\r\n* more verbose py.test by default so we can see a list of what was run/skipped rather than dots."
    },
    {
      "commit": "6bae8e26ae402a8aa302ed944cb3a21b0adffa10",
      "tree": "57f4a244a0adde5df0b34cdd528e1b0aa9b33d6b",
      "parents": [
        "c885829fa319ff63dfb610c5dfc26bfbf14040dd"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Wed Jun 08 14:05:44 2022 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Wed Jun 08 14:05:44 2022 -0700"
      },
      "message": "Remove link to Travis CI, delete travis config.\n\ntravis-ci.org is no longer a thing and doesn\u0027t add value for us.\n"
    },
    {
      "commit": "c885829fa319ff63dfb610c5dfc26bfbf14040dd",
      "tree": "5516f6216f6c0d88cf331b12522e28d3f869e48f",
      "parents": [
        "569bb79bcd8e6c4e6c077cb03a5859d7ffe46bab"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Wed Jun 08 13:54:24 2022 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Wed Jun 08 13:54:24 2022 -0700"
      },
      "message": "Remove trailing space.\n"
    },
    {
      "commit": "569bb79bcd8e6c4e6c077cb03a5859d7ffe46bab",
      "tree": "4880c3ce179baed58faf50d2e532259f58097afb",
      "parents": [
        "b05ca660bc9ce2ff9753256238927b91e234c34b"
      ],
      "author": {
        "name": "Yu Feng",
        "email": "rainwoodman@gmail.com",
        "time": "Wed Jun 08 13:15:56 2022 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 08 13:15:56 2022 -0700"
      },
      "message": "Avoid picking an unreturned port twice. (#29)\n\n* Avoid picking an unreturned port twice.\r\n* Update ChangeLog.md\r\n* bump version to 1.5.2"
    },
    {
      "commit": "b05ca660bc9ce2ff9753256238927b91e234c34b",
      "tree": "b715c7258d430f8d6e0c099c876bafa2596b3059",
      "parents": [
        "30d279a5675f7c1af7f289a4328bd3fc77bf3416"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue Nov 09 02:49:19 2021 +0000"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue Nov 09 02:49:19 2021 +0000"
      },
      "message": "Lower the threshold for success on the flaky test.\n"
    },
    {
      "commit": "30d279a5675f7c1af7f289a4328bd3fc77bf3416",
      "tree": "f3c70c0684caf18697bb1416bf5bdf4c7cb211ba",
      "parents": [
        "d5a84793a54bbe4fa6357f1e68ce1bfc0580704e"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Mon Nov 08 18:44:25 2021 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 08 18:44:25 2021 -0800"
      },
      "message": "bind(0) before probing for random available ports. (#28)\n\nWhen not using a portserver, assume that the OS knows best. This\r\nshould improve reliability.\r\n\r\nThough the best thing to do is to use a portserver..."
    },
    {
      "commit": "d5a84793a54bbe4fa6357f1e68ce1bfc0580704e",
      "tree": "f6c090af8bf59c06677bfae486884c51d6f5c87d",
      "parents": [
        "c283eb1aeaa355408cee1ddd4e49eb0fc4c02dce"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Mon Nov 08 18:16:34 2021 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 08 18:16:34 2021 -0800"
      },
      "message": "1.5.0 Release (#27)\n\n* 1.5.0 Release.\r\n* Use 3.10 in CI instead of a beta."
    },
    {
      "commit": "c283eb1aeaa355408cee1ddd4e49eb0fc4c02dce",
      "tree": "62072c4c5f654210f2930dd4a808cb4d14c01bb9",
      "parents": [
        "0b178b8e500065f7ad71204c0d1c066766d5d01b"
      ],
      "author": {
        "name": "Patrice Vignola",
        "email": "vignola.patrice@gmail.com",
        "time": "Sun Jul 11 18:34:38 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 11 18:34:38 2021 -0700"
      },
      "message": "Add Windows support for the port server (#25)\n\nAdd Windows support for the port server and Windows named pipe support to the portpicker client.\r\n\r\nContributed by Patrice Vignola"
    },
    {
      "commit": "0b178b8e500065f7ad71204c0d1c066766d5d01b",
      "tree": "4e545697867b13d090e734d40d81bf7a66499cf4",
      "parents": [
        "9ac10595f1b053b86841dd0fc42cfdfc168bd52a"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:59:11 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:59:11 2021 -0700"
      },
      "message": "Update description to mention portserver.\n"
    },
    {
      "commit": "9ac10595f1b053b86841dd0fc42cfdfc168bd52a",
      "tree": "e6fdda231ff9aaafdda1231978ce7c77a6687f8c",
      "parents": [
        "c0fe06c65bc2fe6d981cac2b4d12f73e197d70be"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:34:55 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:34:55 2021 -0700"
      },
      "message": "Correct badge hyperlink :)\n"
    },
    {
      "commit": "c0fe06c65bc2fe6d981cac2b4d12f73e197d70be",
      "tree": "62eefdd163e1465e0e9729eb0a14eebba4c5a60b",
      "parents": [
        "e9faffbd1287aec48b074c1966ca943a01a19ba4"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:33:58 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:33:58 2021 -0700"
      },
      "message": "Correct badge hyperlink :)\n"
    },
    {
      "commit": "e9faffbd1287aec48b074c1966ca943a01a19ba4",
      "tree": "5d5a523765a2c33d16172dc366c32b718077bf94",
      "parents": [
        "c33bdd51b8d2e0a24b05a17b8e9b2192f0977dc8"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:32:59 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Mon May 24 15:32:59 2021 -0700"
      },
      "message": "Add GH action badge, describe py2, reformat.\n"
    },
    {
      "commit": "c33bdd51b8d2e0a24b05a17b8e9b2192f0977dc8",
      "tree": "1eb21d5e1153f19e6c3626f251d6644c1dc9450f",
      "parents": [
        "2f3d53514ea498517ff004b5fa48a3fd37e39f9e"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Mon May 24 15:29:39 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 24 15:29:39 2021 -0700"
      },
      "message": "Fixes to support Python 3.10, require 3.6+ (#24)\n\nSwitch from asyncio.coroutine to async def to support 3.10.\r\n  https://www.python.org/dev/peps/pep-0492/\r\nDrop the use of the loop\u003d parameter in portserver for 3.10.\r\nRefactor portserver_test to launch a subprocess instead of mock.\r\nThis will wind up as 1.4.0.\r\n\r\nUse tox for our testing.\r\nTest on 3.10 in CI.\r\nRequire 3.6+.\r\nAdd a package.sh."
    },
    {
      "commit": "2f3d53514ea498517ff004b5fa48a3fd37e39f9e",
      "tree": "1902fa8be93eea7f81369fc4e041c282c899cf19",
      "parents": [
        "3e39fd0c16508f1a4a481ad1156b3c204de4617c"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Mon May 24 14:18:51 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 24 14:18:51 2021 -0700"
      },
      "message": "Initial github actions config. (#23)\n\nConfgure GitHub Actions CI as travis-ci.org is going away and there\u0027s no compelling reason to migrate to travis-ci.com."
    },
    {
      "commit": "3e39fd0c16508f1a4a481ad1156b3c204de4617c",
      "tree": "bbb1e26528f48e4d5c52f0a3ca11efa62a50c4f8",
      "parents": [
        "b32576bddcf6cd0213399e3e27414f0c18941609"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 22:07:31 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 22:07:31 2021 -0700"
      },
      "message": "ignore tox and build stuff\n"
    },
    {
      "commit": "b32576bddcf6cd0213399e3e27414f0c18941609",
      "tree": "bb39541fdf9960a500e21e98f9a256ae92e961e5",
      "parents": [
        "a7a76548255dd427cba624cb8c0f07f1849abdbc"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 22:01:41 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 22:01:41 2021 -0700"
      },
      "message": "goodbye setup.py!\n"
    },
    {
      "commit": "a7a76548255dd427cba624cb8c0f07f1849abdbc",
      "tree": "ecb82836766958f7108cc459b9f936ba4fc88924",
      "parents": [
        "391cbf2ecd7895a7cb11d2ee0e962aec051e71cc"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Tue May 11 21:58:35 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 11 21:58:35 2021 -0700"
      },
      "message": "Switch to setup.cfg and pyproject.toml, supported 3.x only, dub this 1.3.9 (#21)\n\nEntirely configuration changes, no code change."
    },
    {
      "commit": "391cbf2ecd7895a7cb11d2ee0e962aec051e71cc",
      "tree": "faae3bd2203b05c4935c42416862462da6c21302",
      "parents": [
        "11593a7e338adcc527f3eb324c21440d566c508d"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "gps@google.com",
        "time": "Tue May 11 20:37:28 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 11 20:37:28 2021 -0700"
      },
      "message": "Travis config update. (#22)\n\n* test on supported Python 3 versions.\r\n* switch away from test.sh for CI\r\n* drop 2.7.  it\u0027s EOL."
    },
    {
      "commit": "11593a7e338adcc527f3eb324c21440d566c508d",
      "tree": "858de1d2df586963f1e93356756fcca315e6810a",
      "parents": [
        "8266a96350f5e51a36e95fa671baa59b154d61ff"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:37:57 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:37:57 2021 -0700"
      },
      "message": "old py2 testing on CI requires virtualenv not venv\n"
    },
    {
      "commit": "8266a96350f5e51a36e95fa671baa59b154d61ff",
      "tree": "4c2242ce2802fad08c63bbdf628aa7324e6f2464",
      "parents": [
        "0ed70c710697599c32d403b614e368f26cd08cfa"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:32:36 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:32:36 2021 -0700"
      },
      "message": "Switch to travis testing on focal 20.04.\n"
    },
    {
      "commit": "0ed70c710697599c32d403b614e368f26cd08cfa",
      "tree": "93d5a09068a3bf4029a6754f5cd8c1f5d9e35c2d",
      "parents": [
        "1153eb1c96670c73ab8af73f124f66f750612ebe"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:23:28 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:23:28 2021 -0700"
      },
      "message": "Make portserver_test pass on 3.9, Fixes issue #19.\n\nAlso update the declarations in setup.py (I expect I should\nreally move this to setup.cfg).\n"
    },
    {
      "commit": "1153eb1c96670c73ab8af73f124f66f750612ebe",
      "tree": "49a5261f91b22646fa1f4865aac7f8427048db37",
      "parents": [
        "26420252a40f228a71f3db3fe838fde228ae3c1c"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:22:52 2021 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "gps@google.com",
        "time": "Tue May 11 19:22:52 2021 -0700"
      },
      "message": "Don\u0027t test on py2 when unavailable.\n"
    },
    {
      "commit": "26420252a40f228a71f3db3fe838fde228ae3c1c",
      "tree": "76a709ac27fcf24623674f2938b917a98448b7a1",
      "parents": [
        "bf6250b121cd610c3280cd748b5702a2be040f41"
      ],
      "author": {
        "name": "ujjwalsh",
        "email": "ujjwal.cpp@gmail.com",
        "time": "Wed Dec 23 05:18:09 2020 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 22 15:48:09 2020 -0800"
      },
      "message": "Added Support for Linux On Power (#20)\n\n"
    },
    {
      "commit": "bf6250b121cd610c3280cd748b5702a2be040f41",
      "tree": "86fcc07a848bcfa37886b2ecc21e0344ad1187da",
      "parents": [
        "f737189ea7a2d4b97048a2f4e37609e293b03546"
      ],
      "author": {
        "name": "T. Wouters",
        "email": "thomas@python.org",
        "time": "Mon Aug 05 17:10:58 2019 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Mon Aug 05 17:10:58 2019 -0700"
      },
      "message": "Make portpicker_test more robust, especially when run on a busy CI host. For (#15)\n\ntests that use portpiker without server, don\u0027t fail on the first failure to\r\ngrab a port; try a few times. For testIsPortFree, don\u0027t fail outright when a\r\nport is stolen after portpicker guessed it was free, but try a few times. As\r\na general measure, expecting \u003e95% success rate seems rasonable.\r\n\r\nRewrite testPickPortsWithError, which appeared to be trying to test the two\r\nparts of _pick_unused_port_without_server by playing chance games (that\r\nfailed ~10-15% of the time), so that it explicitly covers both parts by\r\nmocking out the right function. The actual picking of the port can still\r\nfail, since portpicker without server is inherently flaky, so try a few\r\ntimes before giving up.\r\n\r\nWith these changes, there were no failures in 10000 runs of the test (many\r\nin parallel)."
    },
    {
      "commit": "f737189ea7a2d4b97048a2f4e37609e293b03546",
      "tree": "d3589223451b5f4455cfb559691392f29fa185b1",
      "parents": [
        "9221d9887f2c647806948632fcdf2d87fce6b74a"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 08:59:20 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 08:59:20 2019 -0800"
      },
      "message": "We need those stinkin\u0027 badges!\n"
    },
    {
      "commit": "9221d9887f2c647806948632fcdf2d87fce6b74a",
      "tree": "7c9fa4b064c0d9b564ba86c388adc84fa90231d0",
      "parents": [
        "d1eb0227cea81ac6cf24f2d7a02297334786b141"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 08:50:18 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 08:50:18 2019 -0800"
      },
      "message": "use xenial for travis, prepare for 1.3.1\n"
    },
    {
      "commit": "d1eb0227cea81ac6cf24f2d7a02297334786b141",
      "tree": "4c1e3ed09072cacc6fa53a25e19b13fd9e1600f6",
      "parents": [
        "dcd15eed13814210627e135fa100f79fa7b7ec6f"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 08:36:48 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 08:36:48 2019 -0800"
      },
      "message": "Initial travis CI config.\n"
    },
    {
      "commit": "dcd15eed13814210627e135fa100f79fa7b7ec6f",
      "tree": "ae5ec2e46e9e7fbd62083dab2b16a2eb8f780cae",
      "parents": [
        "233f6b01d456bf355f7b283525c68475560a3ba1"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 07:39:20 2019 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 05 07:39:20 2019 -0800"
      },
      "message": "start a 1.3.1 changelog"
    },
    {
      "commit": "233f6b01d456bf355f7b283525c68475560a3ba1",
      "tree": "50e3e8fab1c74963a958959934ef3e5d284045c6",
      "parents": [
        "58f5beb1275c6424802c59a169eb09d479d79818"
      ],
      "author": {
        "name": "Timo Ewalds",
        "email": "timo@ewalds.ca",
        "time": "Tue Mar 05 15:36:39 2019 +0000"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Mar 05 07:36:39 2019 -0800"
      },
      "message": "Handle a rare race condition with reserved ports. (#14)\n\n"
    },
    {
      "commit": "58f5beb1275c6424802c59a169eb09d479d79818",
      "tree": "1a0a6f04e850a3e6157fccbf04b7a914e2d49b2d",
      "parents": [
        "32099aa22ed940b52134b85206e3cbda3a917129"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Thu Jan 17 17:36:37 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Thu Jan 17 17:36:37 2019 -0800"
      },
      "message": "Have exception name end in Error; Update the docs.\n\nUpdate the docstrings and changelog, have the new exception name\nend in Error rather than Exception.\n"
    },
    {
      "commit": "32099aa22ed940b52134b85206e3cbda3a917129",
      "tree": "799007d7365a0d5d21a812635e7294a26a3732c2",
      "parents": [
        "88a6088a91fd494f20b3a0faf97b6f59f63f80e9"
      ],
      "author": {
        "name": "Eric Petersen",
        "email": "eric@ericpetersen.io",
        "time": "Thu Jan 17 17:28:32 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Thu Jan 17 17:28:32 2019 -0800"
      },
      "message": "Don\u0027t continually ask the OS for a port, raise an exception (#13)\n\nDon\u0027t continually ask the OS for a port, raise an exception instead of\r\nreturning None if no port could be found from `pick_unused_port()`.\r\n\r\nOn very busy machines, we might not be able to get a port from the OS\r\nthat is free on both TCP and UDP. Rather than spinning forever, only try\r\na handful of times.\r\n"
    },
    {
      "commit": "88a6088a91fd494f20b3a0faf97b6f59f63f80e9",
      "tree": "1dac8155128940e9c976bef31fecf415626e1868",
      "parents": [
        "f367069ea7d8cb72a825850946739acdd504b9b2"
      ],
      "author": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Jan 15 13:17:53 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith [Google LLC]",
        "email": "greg@krypto.org",
        "time": "Tue Jan 15 13:17:53 2019 -0800"
      },
      "message": "Bump version number to 1.3.0 and describe changes.\n"
    },
    {
      "commit": "f367069ea7d8cb72a825850946739acdd504b9b2",
      "tree": "2f158438ebc996daed19886618eadf80901bfa3a",
      "parents": [
        "58a905a60d48e0a48d5e7b966fc0067085bae63b"
      ],
      "author": {
        "name": "Eric Petersen",
        "email": "eric@ericpetersen.io",
        "time": "Tue Jan 15 13:08:40 2019 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Jan 15 13:08:40 2019 -0800"
      },
      "message": "Add a portserver_address kwarg to pick_unused_port (#12)\n\nThis lets the caller specify the address of a portserver without having\r\nto modify the environment."
    },
    {
      "commit": "58a905a60d48e0a48d5e7b966fc0067085bae63b",
      "tree": "2883b7eb01b30f61a1ce33bc9d235dfaadb992ec",
      "parents": [
        "c399d72474f4e993339a0da8c74536c441e7e15e"
      ],
      "author": {
        "name": "Nehal J Wani",
        "email": "nehaljw.kkd1@gmail.com",
        "time": "Wed May 02 06:29:15 2018 +0530"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue May 01 17:59:15 2018 -0700"
      },
      "message": "Check the presence of AF_UNIX \u0026 IPPROTO_IPV6.\n\n* Proceed with defaults if socket.IPPROTO_IPV6 is not exported\r\n\r\nThis patch adds a way around: https://bugs.python.org/issue29515\r\n\r\n* Add fallback to AF_INET if AF_UNIX is unavailable\r\n\r\nxref: https://github.com/google/python_portpicker/issues/4\r\n"
    },
    {
      "commit": "c399d72474f4e993339a0da8c74536c441e7e15e",
      "tree": "44e1c493392a06f61defff6f4d855accc27134b2",
      "parents": [
        "a096df0a0affe49d6ddf98396658c510e94faa4c"
      ],
      "author": {
        "name": "Piper Chester",
        "email": "piperchester@users.noreply.github.com",
        "time": "Tue Nov 07 10:29:27 2017 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Nov 07 10:29:27 2017 -0800"
      },
      "message": "Fix missing word in README (#10)\n\n"
    },
    {
      "commit": "a096df0a0affe49d6ddf98396658c510e94faa4c",
      "tree": "f413efc2a5469db2fb2ef0c2f0d4580d6638134c",
      "parents": [
        "b0990a649da7c34c27607d76f0f1af301e65e7d5"
      ],
      "author": {
        "name": "Douglas Greiman",
        "email": "dgreiman@google.com",
        "time": "Fri Nov 03 14:54:33 2017 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Fri Nov 03 14:54:33 2017 -0700"
      },
      "message": "Switch from distutils to setuptools (#9)\n\nThis allows wheels to be built for this package."
    },
    {
      "commit": "b0990a649da7c34c27607d76f0f1af301e65e7d5",
      "tree": "7aaf136a1b11bfac442848bb8e60c3dd00038946",
      "parents": [
        "6e8e445c9d1f704c945deb0e5484c2f7f8329532"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Mon Oct 09 10:39:17 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 09 10:39:17 2017 -0700"
      },
      "message": "Update the version to 1.2.0 + describe changes. (#8)\n\n"
    },
    {
      "commit": "6e8e445c9d1f704c945deb0e5484c2f7f8329532",
      "tree": "ae7f38324a5043dc64beb3805e0b5359f3135dc3",
      "parents": [
        "914f47ef62853a2a72d554c23d8f8d940980d7d9"
      ],
      "author": {
        "name": "Timo Ewalds",
        "email": "timo@ewalds.ca",
        "time": "Thu Oct 05 19:30:45 2017 +0100"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Thu Oct 05 11:30:45 2017 -0700"
      },
      "message": "Add a way to reserve ports and return the ports so they get reused. (#7)\n\nThis way portpicker can also be used to manage a set of ports you were assigned from somewhere other than a portserver."
    },
    {
      "commit": "914f47ef62853a2a72d554c23d8f8d940980d7d9",
      "tree": "d2e48d2ed3b4fd021d7128b9f42ee1cb1d5a3195",
      "parents": [
        "8b09a986041f79f4220a6e8fb7524c78948c4a6f"
      ],
      "author": {
        "name": "Nicolas Dumazet",
        "email": "nicdumz@gmail.com",
        "time": "Tue Aug 22 13:35:04 2017 -0700"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Aug 22 13:35:04 2017 -0700"
      },
      "message": "Print error details in get_port_from_port_server (#6)\n\nPrint socket error details in get_port_from_port_server to aid debugging unexpected portserver infrastructure failures."
    },
    {
      "commit": "8b09a986041f79f4220a6e8fb7524c78948c4a6f",
      "tree": "43ff0f1aee1611eb76bd2cd7914cbd57f51afcff",
      "parents": [
        "cb5fdca2f1e7d8c7db38fc6c9e0706b27425bc8c",
        "947aae39b23d1add837e7432b448de901b137eb8"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Mon Jan 25 14:43:21 2016 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Mon Jan 25 14:43:21 2016 -0800"
      },
      "message": "Merge pull request #2 from duggelz/master\n\nChange default port range to 15000-24999 and fix a portserver bug.  v1.1.1."
    },
    {
      "commit": "947aae39b23d1add837e7432b448de901b137eb8",
      "tree": "43ff0f1aee1611eb76bd2cd7914cbd57f51afcff",
      "parents": [
        "898bee48b5f8f6f65075d45164195133b4a23988"
      ],
      "author": {
        "name": "Doug Greiman",
        "email": "dgreiman@google.com",
        "time": "Wed Jan 20 14:44:31 2016 -0800"
      },
      "committer": {
        "name": "Doug Greiman",
        "email": "dgreiman@google.com",
        "time": "Wed Jan 20 14:44:31 2016 -0800"
      },
      "message": "Update version to 1.1.1\n"
    },
    {
      "commit": "898bee48b5f8f6f65075d45164195133b4a23988",
      "tree": "31977f162f3f30838985aa157fbffd108f705eec",
      "parents": [
        "4cc0f9fa73882dac5d0a8908c29e603a6ae91de3"
      ],
      "author": {
        "name": "Doug Greiman",
        "email": "dgreiman@google.com",
        "time": "Tue Jan 19 16:53:58 2016 -0800"
      },
      "committer": {
        "name": "Doug Greiman",
        "email": "dgreiman@google.com",
        "time": "Tue Jan 19 17:14:57 2016 -0800"
      },
      "message": "Fix bug in get_port_for_process\n\nAdded unit tests for corner cases where process id \u003d\u003d port number.\n"
    },
    {
      "commit": "4cc0f9fa73882dac5d0a8908c29e603a6ae91de3",
      "tree": "6e5565bc6286233e1e3ca282b6831fd26dd3f116",
      "parents": [
        "cb5fdca2f1e7d8c7db38fc6c9e0706b27425bc8c"
      ],
      "author": {
        "name": "Doug Greiman",
        "email": "dgreiman@google.com",
        "time": "Tue Jan 19 16:04:09 2016 -0800"
      },
      "committer": {
        "name": "Doug Greiman",
        "email": "dgreiman@google.com",
        "time": "Tue Jan 19 16:13:51 2016 -0800"
      },
      "message": "Change default port range to avoid ephemeral ports\n\nThe old range was 32768-60000, which collides with both the Linux range\nof ephemeral ports, and the IANA recommended range.  The new range is\n15000-24999, chosen to avoid ranges used by many different operating\nsystems and packages.\n\nSee https://www.cymru.com/jtk/misc/ephemeralports.html\n"
    },
    {
      "commit": "cb5fdca2f1e7d8c7db38fc6c9e0706b27425bc8c",
      "tree": "6770e2f9322ac2da629a79ab42632402289dd393",
      "parents": [
        "90ab29b4a4f835fd0395228a050a4aa4e02f9cdd"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Dec 15 18:18:10 2015 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Tue Dec 15 18:18:10 2015 -0800"
      },
      "message": "add 3.5 to the trove categories"
    },
    {
      "commit": "90ab29b4a4f835fd0395228a050a4aa4e02f9cdd",
      "tree": "2d87f8bdd5a338ce9cff6d8b522d93ee62e57250",
      "parents": [
        "ff089ad94c37bd865769a93cb86889d8d85cda10",
        "48e564ea0b5ef7aeb52a27fe7a3de83b3d72a5a9"
      ],
      "author": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Wed Dec 02 19:13:23 2015 -0800"
      },
      "committer": {
        "name": "Gregory P. Smith",
        "email": "greg@krypto.org",
        "time": "Wed Dec 02 19:13:23 2015 -0800"
      },
      "message": "Merge pull request #1 from pmarks-net/master\n\nUse both IPv4+IPv6 sockets to check whether a port is free."
    },
    {
      "commit": "48e564ea0b5ef7aeb52a27fe7a3de83b3d72a5a9",
      "tree": "2d87f8bdd5a338ce9cff6d8b522d93ee62e57250",
      "parents": [
        "7a79cf69829adb351aef39f52ef76b64169aa2bc"
      ],
      "author": {
        "name": "Paul Marks",
        "email": "pmarks@google.com",
        "time": "Wed Dec 02 17:43:38 2015 -0800"
      },
      "committer": {
        "name": "Paul Marks",
        "email": "pmarks@google.com",
        "time": "Wed Dec 02 17:43:38 2015 -0800"
      },
      "message": "Simplify is_port_free(), as discussed in the code review.\n"
    },
    {
      "commit": "7a79cf69829adb351aef39f52ef76b64169aa2bc",
      "tree": "e4dc84d2f6225a95af091b45ed63a4bce1ee723c",
      "parents": [
        "ff089ad94c37bd865769a93cb86889d8d85cda10"
      ],
      "author": {
        "name": "Paul Marks",
        "email": "pmarks@google.com",
        "time": "Tue Dec 01 19:54:17 2015 -0800"
      },
      "committer": {
        "name": "Paul Marks",
        "email": "pmarks@google.com",
        "time": "Tue Dec 01 19:54:17 2015 -0800"
      },
      "message": "Use both IPv4+IPv6 sockets to check whether a port is free.\n\nThis allows the portpicker to function in dual-stack and IPv4/IPv6-only\nenvironments.\n\nFor a port to be considered available, the kernel must support at least\none of (IPv6, IPv4), and the port must be available on each supported\nfamily.\n\nUse identical/redundant implementations of bind() and is_port_free()\nbetween portpicker and portserver.  I am assuming that these were\nintentionally designed as self-contained programs, instead of sharing a\ncommon library.\n"
    },
    {
      "commit": "ff089ad94c37bd865769a93cb86889d8d85cda10",
      "tree": "1c5e40cad4a75e2da42c4923067fa9bd439055d8",
      "parents": [
        "6a52d4349b87e5f4ecdcacd614fe0240ce438912"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 17:43:08 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 17:43:08 2015 -0700"
      },
      "message": "Include the ChangeLog.md file in the next release.\n"
    },
    {
      "commit": "6a52d4349b87e5f4ecdcacd614fe0240ce438912",
      "tree": "686e4a19454240b9b0cff253a36e201d400546ec",
      "parents": [
        "964879c05a5c15c0d2d2cf819db610a1d24776e9"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 17:30:58 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 17:30:58 2015 -0700"
      },
      "message": "Add maintainer_email.\n"
    },
    {
      "commit": "964879c05a5c15c0d2d2cf819db610a1d24776e9",
      "tree": "00233967ae6344b9e21c8488aeff0124c4ce080c",
      "parents": [
        "f9de88c8973980a219c7c8a71162edcce5a160cf"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 17:28:05 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 17:28:05 2015 -0700"
      },
      "message": "Use pep8_style function names.  Keep compatibility.\n\nUpdates version to 1.1.0 and adds a change log.\n"
    },
    {
      "commit": "f9de88c8973980a219c7c8a71162edcce5a160cf",
      "tree": "4df3d39661b9439bc109c52401ee05f7595873e3",
      "parents": [
        "5f03134b0a4a4430e5b9583105506bcae3725861"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 16:45:49 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 16:45:49 2015 -0700"
      },
      "message": "Increase version number to 1.0.1.\n"
    },
    {
      "commit": "5f03134b0a4a4430e5b9583105506bcae3725861",
      "tree": "85ffacdebe3c3b016d9a40ad52145b02b0011883",
      "parents": [
        "9f3d53ba121cc75e34d8a7f3909a1ac0d1caaf29"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 16:38:01 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 16:38:01 2015 -0700"
      },
      "message": "Reformat all code with YAPF.\n"
    },
    {
      "commit": "9f3d53ba121cc75e34d8a7f3909a1ac0d1caaf29",
      "tree": "c90af8b5d5d9e26fe2167a3ba48d4ea3dd06216a",
      "parents": [
        "12455c78865e2fda2730563b6fed09493eb7a894"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 16:08:48 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Apr 01 16:08:48 2015 -0700"
      },
      "message": "Re-indent to 4 space PEP-8 indentation.\n\nOur internal Python style is 2 space indents, that is rightfully\nconsidered ugly in an open source code base.  Fixed.\n"
    },
    {
      "commit": "12455c78865e2fda2730563b6fed09493eb7a894",
      "tree": "d9bc0762c690c513fb72b5dfd70c57c39858c18c",
      "parents": [
        "7490ae7e61163eff46c2743fd33781b434de232a"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Mar 25 01:45:31 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Wed Mar 25 01:45:31 2015 -0700"
      },
      "message": "Make GetPortFromPortServer() a public API.\n\nIt was formerly internal only.\n\nNormal users should just use PickUnusedPort() but there are rare times\nwhen a test framework _only_ wants a port if it came from a specific server.\n"
    },
    {
      "commit": "7490ae7e61163eff46c2743fd33781b434de232a",
      "tree": "0536e4d8fc909c546b4be5d76b245af1bbc62097",
      "parents": [
        "e857532c26c258fc8873fed4c6f8b914b15e435f"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:42:44 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:42:44 2015 -0700"
      },
      "message": "Ignore the MANIFEST file generated by distutils.\n"
    },
    {
      "commit": "e857532c26c258fc8873fed4c6f8b914b15e435f",
      "tree": "122f22586fa586b4a9dfbd33d4bc50ad3f433735",
      "parents": [
        "b5c4987d63008f4b9db247a526762d8902cd6165"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:42:11 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:42:11 2015 -0700"
      },
      "message": "Correct the classifiers for PyPI upload.\n"
    },
    {
      "commit": "b5c4987d63008f4b9db247a526762d8902cd6165",
      "tree": "d39800f960b973eca0a3b8874081708abf439045",
      "parents": [
        "d40b7b17c72e54e6ce598040a28f51081d59f73d"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:35:41 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:35:41 2015 -0700"
      },
      "message": "ignore the setup.py upload dist directory.\n"
    },
    {
      "commit": "d40b7b17c72e54e6ce598040a28f51081d59f73d",
      "tree": "3732b3c70be423de24034a42b4aa3b06a33e0b7f",
      "parents": [
        "56fceff11bf90f020acd4000568a0a56299f8ffe"
      ],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:33:26 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:33:26 2015 -0700"
      },
      "message": "ignore the setup.py \u0026 test.sh created build subdir\n"
    },
    {
      "commit": "56fceff11bf90f020acd4000568a0a56299f8ffe",
      "tree": "35b863a6d689bbe03f1035d5774214b182e8a668",
      "parents": [],
      "author": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:22:24 2015 -0700"
      },
      "committer": {
        "name": "Gregory Smith",
        "email": "gps@google.com",
        "time": "Fri Mar 20 18:22:24 2015 -0700"
      },
      "message": "Enjoy, World!  (initial release)\n"
    }
  ]
}
