)]}'
{
  "log": [
    {
      "commit": "d0e39cbad2e12cbb23caa7d36ccbd4821285ac51",
      "tree": "7d233926774a9af8ca065a7dacc533f22f6a5a85",
      "parents": [
        "e4b1d20497b31ce639b6d8d8fb7079ea49686144"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Mon Sep 16 16:14:00 2024 +0200"
      },
      "committer": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Wed Sep 18 19:39:51 2024 +0000"
      },
      "message": "go/net/ssh: allow multiple AuthMethods\n\nChange-Id: Icdd8c12bc959f87271db4abba3219edd0ea1b7ca\nReviewed-on: https://review.monogon.dev/c/monogon/+/3434\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "c5d28e49c53c7dd0b1f88160514342a1e1b98958",
      "tree": "6e3c355798c5b8113fb44ed790ba6e9d58ad82a7",
      "parents": [
        "ca8d951b683a3f0c64da7f61d4f74567d50623ac"
      ],
      "author": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Tue Sep 17 20:38:31 2024 +0200"
      },
      "committer": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Tue Sep 17 21:36:22 2024 +0000"
      },
      "message": "go/net/ssh: improve throughput by more than 100x\n\nUse concurrent writes (this is safe for our usage) and use\nReadFromWithConcurrency to extract maximum concurrency from the process.\n\nIncrease the window to 1024 pending reqeuests for a bandwidth-delay\nproduct of 32MiB, sufficient for ~1Gbps at 300ms RTT.\n\nIn practice this improves upload performance from ~13Mbit/s on 15ms RTT\nup to over 1.5Gbit/s, now being limited by the weak network\nimplementation on the small GCP instance I tested this on. Maximum\nperformance with a bigger instance and \u003c1ms RTT was over 5Gbps, becoming\ndisk-limited.\n\nChange-Id: I2f08d2c815fd15794f497ed9dc7a7f8a2e351992\nReviewed-on: https://review.monogon.dev/c/monogon/+/3435\nTested-by: Jenkins CI\nReviewed-by: Tim Windelschmidt \u003ctim@monogon.tech\u003e\n"
    },
    {
      "commit": "04aa3df595521dab1fe8fb12b716d2826a37105f",
      "tree": "3e7dc34d941c09c7693ea8016108311de8e65f1b",
      "parents": [
        "f9c824951877cf295d7fd031073c2a3c0e09c804"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Thu Sep 12 14:07:25 2024 +0200"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Mon Sep 16 16:29:59 2024 +0000"
      },
      "message": "go/logging: add backends\n\nThese are (for now unused) backends for the common Leveled interface.\n\nChange-Id: Ic45e7ea26ad0143500489b05ac6bb20aa7fdbcfb\nReviewed-on: https://review.monogon.dev/c/monogon/+/3431\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "3c5d0635f855f16780792a6be311f71b4d59f20b",
      "tree": "4a48292bf17a874f2d627901ee4f7e9145c5b040",
      "parents": [
        "a036c4e792e4b497c512991291b0cc18bc12b5e3"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Thu Sep 12 10:49:12 2024 +0000"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Mon Sep 16 14:03:22 2024 +0000"
      },
      "message": "osbase/logtree.LeveledLogger -\u003e go/logging.Leveled\n\nThis factors out the common leveled logger interface out of the logtree.\nWe want to use the same interface outside of logtree/supervisor usage\nwithin the resolver code, which will be exposed to clients.\n\nChange-Id: I299e76d91e8cefddf8f36f1e58432418c4694df2\nReviewed-on: https://review.monogon.dev/c/monogon/+/3411\nReviewed-by: Tim Windelschmidt \u003ctim@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "6920c47bdd3cd6a0f78b4815bc6378c98c9d159e",
      "tree": "a0cae7630c3e3e3250660e25c4514b12c02a3092",
      "parents": [
        "cc27faac73b1bff4b0d31ffacb0d938022db75ea"
      ],
      "author": {
        "name": "Leopold Schabel",
        "email": "leo@monogon.tech",
        "time": "Sat Aug 10 19:40:35 2024 +0200"
      },
      "committer": {
        "name": "Leopold Schabel",
        "email": "leo@monogon.tech",
        "time": "Mon Aug 19 13:11:09 2024 +0000"
      },
      "message": "Document top-level directories\n\nChange-Id: I52889e4823cbeb841c7dc9da12b5fe4c6a79d663\nReviewed-on: https://review.monogon.dev/c/monogon/+/3310\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "82e6af71ad2b7927de8d754799271ee9f39506f9",
      "tree": "4da4ec95a6e4c5f58957c555d8646e46dbb25c6d",
      "parents": [
        "bceb1604c4d6ce1396c63083d2fd8aae98346cf3"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Tue Jul 23 00:05:42 2024 +0000"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Tue Aug 13 12:43:45 2024 +0000"
      },
      "message": "treewide: replace hardcoded runfiles paths\n\nWe hardcoded some of the runfiles paths to find specific files. This replaces the hardcoded paths by a call to rlocationpath. This prevents running a target without the correct dependencies at build time instead of at runtime\n\nChange-Id: I7ce56935ac80be6b28b824ccb0781ab401bd6521\nReviewed-on: https://review.monogon.dev/c/monogon/+/3301\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "9f21f5396aa18bc9f2f83c867ff883f49bbf02ae",
      "tree": "c232f42c84bd6b7ace576261a188134cb0c69771",
      "parents": [
        "f430fbfe35b70283090b6174cf5a920163c0148c"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Tue May 07 15:14:20 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Jul 04 12:19:37 2024 +0000"
      },
      "message": "treewide: introduce osbase package and move things around\n\nAll except localregistry moved from metropolis/pkg to osbase,\nlocalregistry moved to metropolis/test as its only used there anyway.\n\nChange-Id: If1a4bf377364bef0ac23169e1b90379c71b06d72\nReviewed-on: https://review.monogon.dev/c/monogon/+/3079\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "8ac3e566eda3f968966fbe712be5c9158b04d0c3",
      "tree": "87087014d39a6f00788c4868ebd16f9e3fcfebb6",
      "parents": [
        "4a472882b3e35a630922279579201ae6fcbeb081"
      ],
      "author": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Wed May 29 14:16:27 2024 +0000"
      },
      "committer": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Thu Jun 20 12:04:53 2024 +0000"
      },
      "message": "g/a/toposort: add deterministic version\n\nAdds a slower, but deterministic version of TopologicalOrder. To make\nimplementation easier, the visit recursive function is slightly\nrefactored.\nBoth implementations look very similar, but it adds more lines to keep a\ncommon implementation versus just having two separate functions.\n\nChange-Id: Ife4cbda128cf476005b75e216352b522b949d6a2\nReviewed-on: https://review.monogon.dev/c/monogon/+/3137\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "3b5a917c5a1ac49acad50eeacb5cf275efc3631e",
      "tree": "1da59c672acf3b68aab81fae38c6b6e5929b82a2",
      "parents": [
        "988403453448d27f6df6eea0a232e97c2a2e739b"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu May 23 13:33:52 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu May 23 12:44:02 2024 +0000"
      },
      "message": "treewide: initialize empty structs with var\n\nChange-Id: I72d3993eaf5fe57c77b1dda8218e36a8cc11813d\nReviewed-on: https://review.monogon.dev/c/monogon/+/3108\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "a42844a2d797d0ddc3a8eb0658ecd26f949277df",
      "tree": "61cefc86911d080e8dd37b81a3f3358ae1076055",
      "parents": [
        "5878603e42a090dca43467173a249d5a8be4533f"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Thu May 16 18:06:19 2024 +0200"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Wed May 22 12:12:27 2024 +0000"
      },
      "message": "go/qcow2: implement simple image generator\n\nThis is a write-at-once, write-only library for qcow2 images. We will\nuse it in tests to generate copy-on-write, snapshot-style images\n(instead of wasting disk space and iops copying the node image every\ntime).\n\nChange-Id: I3c8eaeb0c6fa1da44255eb7fc577168d6066d8e3\nReviewed-on: https://review.monogon.dev/c/monogon/+/3092\nTested-by: Jenkins CI\nReviewed-by: Jan Schär \u003cjan@monogon.tech\u003e\n"
    },
    {
      "commit": "073e7c4693e902852e4fa56f3000d60efee10e91",
      "tree": "ffc4d7bc848d0b1e366429028bcbb546d20a548c",
      "parents": [
        "b2778e4a5148af45254043a9663a2879f783a1f8"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Fri Apr 19 01:57:11 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Wed Apr 24 22:29:11 2024 +0000"
      },
      "message": "go/types/mapsets: use copy instead of loop\n\nChange-Id: I39da63e9ef7f91157d1ea9e5eadf6cef90342019\nReviewed-on: https://review.monogon.dev/c/monogon/+/3007\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "d5f851bb477638436826adec756fe562db526865",
      "tree": "d981b1c62d613b45fb55023da289098d7e377705",
      "parents": [
        "69fec522d5db79d07bb1f227c2ab39c57fdf2831"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Tue Apr 23 14:59:37 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Wed Apr 24 13:15:14 2024 +0000"
      },
      "message": "treewide: replace error comparisons and assertions with errors.Is\n\nChange-Id: Id2424eb155f2c6842c72c5fafd124d428ef901f2\nReviewed-on: https://review.monogon.dev/c/monogon/+/2994\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "88049727772bb3ad1f00307919da67c6d2743402",
      "tree": "13b0015edb805c3c39f7f77e0bead11436f68713",
      "parents": [
        "2006753ea2e8f51cdfc51ad085663fdae4ff8782"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Apr 11 23:09:23 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Wed Apr 17 15:04:59 2024 +0000"
      },
      "message": "treewide: fix t.Fatal calls in non-test goroutines\n\nFunctions that abruptly terminate a test, such as the\nFatal, Fatalf, FailNow, and Skip{,f,Now} methods of *testing.T,\nmust be called from the test goroutine itself, as they call\nruntime.Goexit internally to stop the calling goroutine, not the\ntest.\n\nChange-Id: I4926c802bfbb11aeec6e130b0f4fb2407879cbd4\nReviewed-on: https://review.monogon.dev/c/monogon/+/2972\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "9b2c15699524ad21a12c64d245f6fe25252a2afd",
      "tree": "ab4180fc195d09cea864b4d06be61a4a8769148c",
      "parents": [
        "49c9ab02d7ce200db6defbc82d95646ac4d64804"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Apr 11 01:39:25 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Mon Apr 15 21:31:42 2024 +0000"
      },
      "message": "treewide: add empty default case to switch statements\n\nWe are ignoring all other possible cases, but without a proper default\ncase this looks like the other ones where just forgotten.\n\nChange-Id: I7a6e490d91c4e7e8c89a2d2d2ace1a82b7c5391b\nReviewed-on: https://review.monogon.dev/c/monogon/+/2961\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "6b6428da110db384cad1f1d65c81f1874c8cecae",
      "tree": "f44e7d1ffcc410893a9851e76e81939b178853df",
      "parents": [
        "5e460a92353ec619f4f12fffbe3281d40c85cf61"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Apr 11 01:35:41 2024 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Mon Apr 15 21:31:42 2024 +0000"
      },
      "message": "treewide: remove redundant loop vars\n\nChange-Id: I61bada9e3df38e6a94cd6c8fe2d0d8f3ba41c1af\nReviewed-on: https://review.monogon.dev/c/monogon/+/2955\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "5f5f3300dec2d65eb0321a19f789cfdd65c12c17",
      "tree": "2bc9ab9c6b9a50dfec88838ec48272a7b78075bf",
      "parents": [
        "543756fdf954fc09f032bb91a59916a784b21cff"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Feb 22 23:50:24 2024 +0100"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Tue Mar 05 18:39:44 2024 +0000"
      },
      "message": "cloud/shepherd: move ssh client to own package\n\nChange-Id: I56ad16f8f2f355243c5c0414656bbfbbff1faef5\nReviewed-on: https://review.monogon.dev/c/monogon/+/2791\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "b6308cd63854e3ef48e6afcc4c1f51e0c6ac1203",
      "tree": "ca6a5e292e05e420b7f04250c1e189511a6de3f7",
      "parents": [
        "a85c86f5b2d80251811f3a659fe9570694dd6056"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Tue Oct 10 21:19:03 2023 +0200"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Nov 16 18:09:16 2023 +0000"
      },
      "message": "cloud: split shepherd up\n\nChange-Id: I8e386d9eaaf17543743e1e8a37a8d71426910d59\nReviewed-on: https://review.monogon.dev/c/monogon/+/2213\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "a85c86f5b2d80251811f3a659fe9570694dd6056",
      "tree": "987fdd08f23f5ccb5df390927db6905f3804d03b",
      "parents": [
        "b4f5024731f2f61b0f5b377fe9bcbb4934a5e83b"
      ],
      "author": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Nov 16 05:19:12 2023 +0100"
      },
      "committer": {
        "name": "Tim Windelschmidt",
        "email": "tim@monogon.tech",
        "time": "Thu Nov 16 18:09:06 2023 +0000"
      },
      "message": "go/types/mapsets: replace x/exp dependency with stdlib/cmp\n\nChange-Id: I5a97afb12ae161b607e2c5640ca9429dba1461b0\nReviewed-on: https://review.monogon.dev/c/monogon/+/2320\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "8ec6ef0931c7e3d3084bc3180a9d88c002a1618d",
      "tree": "d9963dad7d76071fcb3d42bc84123f2aaaaa4867",
      "parents": [
        "ea762f621a91400569c3118bbaef395336d90979"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Mon Nov 13 13:30:28 2023 +0100"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Mon Nov 13 20:11:06 2023 +0000"
      },
      "message": "go/types/mapsets: implement OrderedMap.{Count,Clear}\n\nChange-Id: Iaee5b914fe63ee7a60f796ef986535f6f8e72960\nReviewed-on: https://review.monogon.dev/c/monogon/+/2302\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "e0c0617e33e3b9c9a69b150189b1b13c010de9e0",
      "tree": "9908902859bf7245a07e27cb0e6c621f65f15a1d",
      "parents": [
        "48f22ce3a1558ad9994de3bde93f38e1aa997812"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Tue Sep 19 12:28:16 2023 +0000"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Tue Sep 26 10:01:57 2023 +0000"
      },
      "message": "go/clitable: factor out from metroctl\n\nWe need the same functionality in bmcli, so factor it out from metroctl\ninto a generic library.\n\nChange-Id: I3fb3dfaae44a64d204e9220f117f379c382c5c4f\nReviewed-on: https://review.monogon.dev/c/monogon/+/2172\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "de097947a7c54f1d5e0abb30b18539637a3245d2",
      "tree": "579a5de8cd4cb379d708f676bb6897acee00dffc",
      "parents": [
        "d69848409ba4f34102f709f591e1432e6b458856"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Tue Jun 27 13:55:10 2023 +0200"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Tue Jun 27 19:40:23 2023 +0000"
      },
      "message": "go/algorithm/cartesian: implement cartesian product\n\nChange-Id: I9553266ce64a104f5b8bab2e83d9d7234994cd4b\nReviewed-on: https://review.monogon.dev/c/monogon/+/1863\nReviewed-by: Tim Windelschmidt \u003ctim@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    },
    {
      "commit": "9ae5f77a472650a9f43186c585e395387cfc1f91",
      "tree": "29c4609795005a6ea517821013aef6b2e910d5ad",
      "parents": [
        "b565cc679cd5af598dc863890a3e1cce98eb1c57"
      ],
      "author": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Thu Apr 06 15:26:55 2023 +0200"
      },
      "committer": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Thu Apr 06 14:26:08 2023 +0000"
      },
      "message": "g/a/toposort: add bad reference validation\n\nIn a lot of cases where toposort is used to build dependency trees it\nmight be necessary to validate that the edges which make up the tree\ndo not reference nodes which are not present.\n\nThis is implemented by still implicitly creating nodes when AddEdge is\ncalled, which allows arbitrary ordering of AddEdge/AddNode calls, but\non explicit calls to AddNode the node is also marked as being explicitly\nadded.\nThis information is later used to implement ImplicitNodeReferences which\nreturns all invalid references in the graph.\n\nChange-Id: Ia19560b98d00dcc10b5d0ad0e12b212bea586c04\nReviewed-on: https://review.monogon.dev/c/monogon/+/1507\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "c64ba1ec847af9314790d8f13ff9ead06a9be45c",
      "tree": "d5e0fbb008fe2ac950241ff53770aeee4e7b3df8",
      "parents": [
        "e013f1b87807b7c0eb7440cec41e568ef288b499"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Wed Mar 15 19:15:13 2023 +0100"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Wed Mar 22 11:33:51 2023 +0000"
      },
      "message": "go/net/tinylb: init\n\nThis implements tinylb, a tiny round-robin load balancer for\nnet.Conn/net.Listener protocols.\n\nThis will be used to loadbalance connections to Kubernetes apiservers\nbefore cluster networking is available.\n\nChange-Id: I48892e1fe03e0648df60c674e7394ca69b32932d\nReviewed-on: https://review.monogon.dev/c/monogon/+/1369\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "7457ee940f2fff2df6e6eef89dcfbd3a9c67cfb9",
      "tree": "412f5828491b819c1f4e7f547a6dec12e20ac38b",
      "parents": [
        "e25b3a4154cd71c1efd4e26760f4e14d27ad005b"
      ],
      "author": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Wed Mar 15 19:06:28 2023 +0100"
      },
      "committer": {
        "name": "Serge Bazanski",
        "email": "serge@monogon.tech",
        "time": "Tue Mar 21 10:53:12 2023 +0000"
      },
      "message": "go/types/mapsets: add OrderedMap\n\nOh look, more Go generics.\n\nThis is a pretty standard Ordered/SortedMap type structure, with a\nlittle twist: it implements having a subordinate \u0027CycleIterator\u0027 which\nallows to iterate over it in a round-robin fashion, even as its\nunderlying OrderedMap is mutated.\n\nThis will be used, unsurprisingly, in a little TCP load balancer\nimplementation.\n\nChange-Id: Ic8ab6a7fbcd6e1faf6224fc93bcc997c09364190\nReviewed-on: https://review.monogon.dev/c/monogon/+/1334\nTested-by: Jenkins CI\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\n"
    },
    {
      "commit": "0b3aac94581f63b3024b261fa6a9f298d0cca52b",
      "tree": "5d08ccdc172f131c99b7acaabb108d2d4d4ce53b",
      "parents": [
        "cf33f6805a7842a1aa7fac377468d9ca54f8d05b"
      ],
      "author": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Thu Mar 16 16:49:56 2023 +0100"
      },
      "committer": {
        "name": "Lorenz Brun",
        "email": "lorenz@monogon.tech",
        "time": "Mon Mar 20 11:23:46 2023 +0000"
      },
      "message": "g/a/toposort: add topological sorting pkg\n\nThis adds a package which implements topological sorting.\nThere are existing Go packages out there which do this, but all of\nthem have various shortcomings, either in the API or in\nperformance or stability.\n\nThis uses a fairly simple DFS-based algorithm for doing the majority\nof the work. It uses generics for the nodes to allow for flexibility and\nis covered by a fuzz test to check for correctness.\n\nChange-Id: I4ae3f0b97ef801350b87cdae3a3d9a1ba63830e3\nReviewed-on: https://review.monogon.dev/c/monogon/+/1351\nTested-by: Jenkins CI\nReviewed-by: Serge Bazanski \u003cserge@monogon.tech\u003e\n"
    },
    {
      "commit": "3ccf69641de62c68a5740d8194d4f0776052dd63",
      "tree": "8a35f1aa01076a35890862f90c186da7fe4ebeda",
      "parents": [
        "d266812c63eb25cf9a586297785add76f5b1f073"
      ],
      "author": {
        "name": "Mateusz Zalega",
        "email": "mateusz@monogon.tech",
        "time": "Mon Jan 23 17:01:40 2023 +0000"
      },
      "committer": {
        "name": "Mateusz Zalega",
        "email": "mateusz@monogon.tech",
        "time": "Thu Feb 09 12:00:00 2023 +0000"
      },
      "message": "go/net/psample: init\n\nThis adds a minimal golang implementation facilitating network packet\nsampling based on \u0027psample\u0027 kernel module.\n\nMetropolis kernel configuration was modified both in order for this\nchange to be testable in a ktest, as well as to make sure Metropolis\nwill be able to run the included code.\n\nChange-Id: Ie6a4721455f26644b6be01aa6190cf87f21355f3\nReviewed-on: https://review.monogon.dev/c/monogon/+/1102\nReviewed-by: Lorenz Brun \u003clorenz@monogon.tech\u003e\nTested-by: Jenkins CI\n"
    }
  ]
}
