)]}'
{
  "log": [
    {
      "commit": "42ce131a83dd2398e840358b4075df2dd28030fa",
      "tree": "08b81c3e460585d1a19f87866025add09121d0d0",
      "parents": [
        "3c730e5184a6ffdf475da598464b3e3370aa35bd"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Sep 01 14:28:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 14:28:14 2026"
      },
      "message": "Round memory_percent() result to 2 decimal places (#2992)\n\n`memory_percent()` was the only `*_percent` API returning a raw\nunrounded float (e.g. `0.04722285270690918`).\n\nIt now rounds to 2 decimal places rather than the 1 used by the other\npercent APIs, because per-process memory percents cluster far below 1%:\non a 64 GB machine 0.1% is 64 MB, so with 1 decimal most processes would\nread 0.0 and a 70 MB process would be indistinguishable from a 130 MB\none. CPU and system-wide percents meaningfully span the whole 0-100\nrange, so 1 decimal costs them nothing; here the second decimal carries\nreal information."
    },
    {
      "commit": "3c730e5184a6ffdf475da598464b3e3370aa35bd",
      "tree": "78548f213cacae44c5d93698e0944e0806445bc2",
      "parents": [
        "655c27638638b4c10c10b5386052b3ade5f397bc"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 08:37:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 08:37:43 2026"
      },
      "message": "Bump astral-sh/setup-uv from 9.0.0 to 10.0.1 in the github-actions group (#2991)"
    },
    {
      "commit": "655c27638638b4c10c10b5386052b3ade5f397bc",
      "tree": "5eb9ef581f26efce4c0ca5558648d071ad7238ad",
      "parents": [
        "437466875753ca2a91e70d593b1f863760c2d1b8"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 27 12:19:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 12:19:11 2026"
      },
      "message": "Rename memory_info_ex() to memory_extras(), return only the extra fields (#2988)\n\nRework of the `memory_info_ex()` method introduced during the 8.0 memory\nAPI reorganization (#2731). Since both the old and new form are\nunreleased we\u0027re not breaking anything and we\u0027re still in time.\n\n`memory_info_ex()` returned `memory_info()` fields + platform-specific\nextras. The superset turned out to be a bad idea: it never saved a\nsyscall (it always did the work of both methods, and under `oneshot()`\ntwo separate calls cost the same), and packing two reads into one tuple\nimplied an atomicity that isn\u0027t really there (rss comes from statm,\nrss_anon/rss_file/rss_shmem from status). On top of that, the name\nneeded not to be confused with the old `memory_info_ex()`, deprecated in\n4.0 and removed in 7.0.\n\nSo: the method is now called `memory_extras()` and returns only the\nextra platform-specific metrics. Also, since platforms with no extra\nfields have nothing to return, the method is not exposed on platforms\nthat have nothing to offer."
    },
    {
      "commit": "437466875753ca2a91e70d593b1f863760c2d1b8",
      "tree": "2600960426d9228b6eabe1878cd6e9730faafd1e",
      "parents": [
        "908e23cc3a766580633e8cef03e4abfc8550fad8"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 26 22:37:19 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 22:37:19 2026"
      },
      "message": "[macOS] memory_info_ex(): drop task_for_pid(), return `phys_footprint` (#2987)\n\n`task_for_pid()` has historically been a pain. From the code:\n\n```c\n// - it can *block* forever, including for PIDs of our own user, see:\n//   https://github.com/giampaolo/psutil/issues/2885\n// - it\u0027s not documented\n// - errno is set only sometimes\n// - sometimes errno is ENOENT (?!?)\n// - for PIDs !\u003d getpid() or PIDs which are not members of the procmod\n//   it requires root\n//\n// As such we can only guess what the heck went wrong and fail either\n// with NoSuchProcess or give up with AccessDenied. References:\n// - https://github.com/giampaolo/psutil/issues/1181\n// - https://github.com/giampaolo/psutil/issues/1209\n// - https://github.com/giampaolo/psutil/issues/1291#issuecomment-396062519\n```\n\nSo we drop it, and no longer return `peak_rss`, `rss_anon`, `rss_file`\nand `compressed` fields in `memory_info_ex()`. This is not a big loss,\nsince `memory_info_ex()` on macOS failed with `AccessDenied` for all\nPIDs except self.\n\nInstead we now make `memory_info_ex()` return `phys_footprint` and\n`peak_footprint`, by using `proc_pid_rusage()` syscall, which at least\nsucceeds for all PIDs owned by our user.\n\n*IMPORTANT*: `phys_footprint` is VERY useful, because it\u0027s the metrics\nreported by macOS Activity Monitor.\n\n`proc_pid_rusage()` requires macOS 10.9, so with this change we also\ndrop support for macOS 10.7 and 10.8, which is not a big loss either,\nbecause according to `print_downloads.py` script the total number of\ndownloads is literally **zero**."
    },
    {
      "commit": "908e23cc3a766580633e8cef03e4abfc8550fad8",
      "tree": "2e8755650875e4a6549bd82976f38877d7475f9c",
      "parents": [
        "74446706522d92796b667360c778f5b7da3f4a2f"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 26 17:42:37 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 26 17:42:37 2026"
      },
      "message": "Cleanup docs/Makefile a bit\n"
    },
    {
      "commit": "74446706522d92796b667360c778f5b7da3f4a2f",
      "tree": "1446a19821604858426dc019bf7e20e4aeff7223",
      "parents": [
        "cb97af1a443e0c91da58b75d92f68ff8007ef57f"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 16:52:16 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 16:52:16 2026"
      },
      "message": "Doc: unify dev and archived banners into one dismissible component\n"
    },
    {
      "commit": "cb97af1a443e0c91da58b75d92f68ff8007ef57f",
      "tree": "ec3ed8c9431a833d0fd936b9699d43faf8907ba6",
      "parents": [
        "772617e7439391f68645dce3c52606ef8e996f56"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 15:30:21 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 15:30:21 2026"
      },
      "message": "Remove role main\n"
    },
    {
      "commit": "772617e7439391f68645dce3c52606ef8e996f56",
      "tree": "c4c66b79561453e65379ef4c565f5776ab1448c6",
      "parents": [
        "bd6683d748a6595b23439937cd0c39b9472916b2"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 15:25:23 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 15:25:23 2026"
      },
      "message": "Exclude blog years from SEO search\n"
    },
    {
      "commit": "bd6683d748a6595b23439937cd0c39b9472916b2",
      "tree": "7edd498d7e28cb94fc6e77d79fd60b23d3d296d8",
      "parents": [
        "d77cf39abb5b423bde4bb0420eba78203281376b"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 15:10:55 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 24 15:10:55 2026"
      },
      "message": "Doc: show hamburger menu for TOC for res below 1280\n"
    },
    {
      "commit": "d77cf39abb5b423bde4bb0420eba78203281376b",
      "tree": "65c155fe91930649e62f6740964b41f315533d8e",
      "parents": [
        "a33255dc3d40fa7d82beb292a6edea5aab772951"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 19 16:29:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 19 16:29:45 2026"
      },
      "message": "Doc: admonitions style\n"
    },
    {
      "commit": "a33255dc3d40fa7d82beb292a6edea5aab772951",
      "tree": "12a337f82346dab6d8722b7e3ab3487dfe7530b9",
      "parents": [
        "f5162ad156c971355bb377f19faa7697ffcddd55"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 16:53:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 16:53:04 2026"
      },
      "message": "Docs: show a \"copy page\" button near title (#2981)\n\nIt copies the page\u0027s RsT source to your clipboard. Handy for for pasting\na whole page into an LLM. Useful to paste the whole page content into \nan LLM."
    },
    {
      "commit": "f5162ad156c971355bb377f19faa7697ffcddd55",
      "tree": "1cadc368078f7abc9d4f297d99fe6ff2cb7f4972",
      "parents": [
        "c5bac1842cbcc0ec9e3a93c1a2bbe7b5287d0d00"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 14:25:57 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 14:25:57 2026"
      },
      "message": "Doc: style\n"
    },
    {
      "commit": "c5bac1842cbcc0ec9e3a93c1a2bbe7b5287d0d00",
      "tree": "5823a6512e23b0be89fb920bdd0e24e57efe4922",
      "parents": [
        "0da780b289c8131e0f45404fe91762eba124771d"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 13:55:59 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 13:55:59 2026"
      },
      "message": "refresh_adoption_stats.py: use retry on 429 (too many requests)\n"
    },
    {
      "commit": "0da780b289c8131e0f45404fe91762eba124771d",
      "tree": "f779dc8f655f1f078126c0b7f2578e72c184773e",
      "parents": [
        "8f1479429627a840b9d713193d837f4675304efe"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 10:34:43 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 10:34:43 2026"
      },
      "message": "Doc: link versions without index.html\n"
    },
    {
      "commit": "8f1479429627a840b9d713193d837f4675304efe",
      "tree": "0ce77cf84ea6097073c3b686c3ea3984dc83660c",
      "parents": [
        "135bd801a28cda7199dcda859be4ae2513850e8b"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 10:13:22 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 10:13:22 2026"
      },
      "message": "Doc: noindex past releases\n"
    },
    {
      "commit": "135bd801a28cda7199dcda859be4ae2513850e8b",
      "tree": "cd6e1fdd73923075d087b38cb6db58249782dd3d",
      "parents": [
        "22baeb2efcea583995e75c2b9bb7a57b3156fab9"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 10:01:55 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 10:01:55 2026"
      },
      "message": "Docs versioning (#2980)\n\nAdds a versions selector in the top bar"
    },
    {
      "commit": "22baeb2efcea583995e75c2b9bb7a57b3156fab9",
      "tree": "fbb9230f4dcab56f9c0c233e6544e257fcfbf066",
      "parents": [
        "bb82857b20c87994b4f772a7df78b66c95eb72ce"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 09:04:42 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 17 09:04:42 2026"
      },
      "message": "Move docs scripts in a separate dir\n"
    },
    {
      "commit": "bb82857b20c87994b4f772a7df78b66c95eb72ce",
      "tree": "cd70810422e590f4ceb79bb44ca5632df46230df",
      "parents": [
        "93e5ddd6df84187f18c43a5a8eb66adf2047008d"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 14 16:13:50 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 14 16:13:50 2026"
      },
      "message": "Doc: show number of blog comments\n"
    },
    {
      "commit": "93e5ddd6df84187f18c43a5a8eb66adf2047008d",
      "tree": "5cfbfe306251984b91498b63a250c68d38f4d6cd",
      "parents": [
        "c45300a88f7ed9612ff5dd3fa5a0eabf34955e51"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 14 14:59:57 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 14 14:59:57 2026"
      },
      "message": "Doc: remove version[added / changed] entries for old psutil releases\n"
    },
    {
      "commit": "c45300a88f7ed9612ff5dd3fa5a0eabf34955e51",
      "tree": "f04c068e84953d3d30e7affcb1f1445eac0c6fcb",
      "parents": [
        "380bd2b59c67b0e1b04bbf3a90b11744f4f96644"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 14 10:25:25 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 14 10:25:25 2026"
      },
      "message": "Update changelog.rst\n"
    },
    {
      "commit": "380bd2b59c67b0e1b04bbf3a90b11744f4f96644",
      "tree": "fbcdd8ac3304cde3e2b5f6c1d234d2a7149968c3",
      "parents": [
        "5fcc850ec27c34162a2b6746157e0fed189bf199"
      ],
      "author": {
        "name": "Robert Kirkman",
        "email": "31490854+robertkirkman@users.noreply.github.com",
        "time": "Fri Aug 14 09:57:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 09:57:40 2026"
      },
      "message": "[Android] Add support for Android and add support for `disk_partitions()` on Android (#2891)\n\nFixes these two commands on Android\n\n```bash\npip install psutil\npython -c \"import psutil; print(psutil.disk_partitions())\"\n```\n\n---------\n\nCo-authored-by: Giampaolo Rodola \u003cg.rodola@gmail.com\u003e"
    },
    {
      "commit": "5fcc850ec27c34162a2b6746157e0fed189bf199",
      "tree": "273e08f2c608a872165d7790ad86e50dc9b23b31",
      "parents": [
        "fdb53fd77596d2f1d8db13fe5e8ce3687689d9a3"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 13 17:18:29 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 13 17:18:29 2026"
      },
      "message": "CI: make docs.yml pipeline update download stats when it runs\n"
    },
    {
      "commit": "fdb53fd77596d2f1d8db13fe5e8ce3687689d9a3",
      "tree": "b0345de29e1f573201b32667f7a74ccd66e9637d",
      "parents": [
        "ef010ec4fd01f060f0d0efae24336cb6b0b2be04"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 13 17:09:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 17:09:35 2026"
      },
      "message": "[macOS] fix RuntimeError from host_statistics64() (#2853) (#2978)\n\nFixes:\n- https://github.com/giampaolo/psutil/issues/2853\n\nCo-authored-by: Claude Fable 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ef010ec4fd01f060f0d0efae24336cb6b0b2be04",
      "tree": "5e6fb87b779c19fd3edf81854c3ef06f080bdc63",
      "parents": [
        "d7b0f3de1d9c0036ba03ce8d22d0e45b4a19304f"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 13 13:35:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 13:35:45 2026"
      },
      "message": "Promote bytes2human() to the public API as psutil.bytes2human() (#2977)\n\npsutil exposes many values in bytes, and this helper is already used\nextensively by its scripts and documentation. Making it public would\nprovide a convenient and consistent way to format those values."
    },
    {
      "commit": "d7b0f3de1d9c0036ba03ce8d22d0e45b4a19304f",
      "tree": "dd16196a2d4331b6395470d3a9aee4ff5288984b",
      "parents": [
        "08010488fa0b5198c04a06241c78870ecd20157a"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 13 09:54:15 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 13 09:54:15 2026"
      },
      "message": "Doc: forgot to git add changelog.css\n"
    },
    {
      "commit": "08010488fa0b5198c04a06241c78870ecd20157a",
      "tree": "4ac2872eaf3a8b0f0fbb8261dc3232cf097f45d4",
      "parents": [
        "10325a989d67e08cb4f86ba990599f490ee5a4e8"
      ],
      "author": {
        "name": "Fabian C.",
        "email": "156585059+fabiancrt@users.noreply.github.com",
        "time": "Thu Aug 13 08:12:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 08:12:33 2026"
      },
      "message": "linux: follow up on cpulist parsing (#2973)\n\n`_get_eligible_cpus()` was only parsing a single `N-M` range, so a value\nlike `0-3,8` would fall back to all CPUs instead of returning the actual\neligible CPU list.\n\nThis adds `_parse_cpulist()` returning the expanded CPU IDs and uses it\nin `_get_eligible_cpus()`.\n\nFor example:\n\n`0-3,8` -\u003e `[0, 1, 2, 3, 8]`\n\nAlso added parser coverage and a regression test for the non-contiguous\n`Cpus_allowed_list` case.\n\nTested with:\n\n* `tests/test_linux.py`: 131 passed, 4 skipped\n* Ruff\n* Black\n* `git diff --check`"
    },
    {
      "commit": "10325a989d67e08cb4f86ba990599f490ee5a4e8",
      "tree": "f0bca30a3939f680bcf2d84c73bff55044912c72",
      "parents": [
        "76bb19fde7dcfd8dce79d6daf8232723fffdec9d"
      ],
      "author": {
        "name": "Alex Chen",
        "email": "l46983284@gmail.com",
        "time": "Thu Aug 13 07:31:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 07:31:45 2026"
      },
      "message": "[Windows] disk_partitions: use wide-char APIs to fix UnicodeDecodeError (#1959) (#2975)\n\nFixes #1959.\n\nOn Windows, `psutil.disk_partitions()` crashed with `UnicodeDecodeError`\non systems whose ANSI code page is not UTF-8 (e.g. cp1251): the ANSI\nvariants of `GetLogicalDriveStrings`, `FindFirstVolumeMountPoint` and\n`GetVolumeInformation` return bytes in the system ANSI code page, and\nthe `(ssss)` tuple format decodes them as strict UTF-8.\n\nFollowing the maintainer\u0027s direction in the issue (use\n`GetVolumeInformationW`), this switches the whole function family to\nwide-char APIs: `GetLogicalDriveStringsW`, `GetDriveTypeW`,\n`GetVolumeInformationW`,\n`FindFirstVolumeMountPointW`/`FindNextVolumeMountPointW`, building\nstrings via `PyUnicode_FromWideChar`. Widening `GetVolumeInformation`\nalone would not have been enough: the actual crash vector in the issue\n(byte 0xc5 in position 4 of a mount-point path under cp1251) comes from\n`FindFirstVolumeMountPoint`. `psutil_QueryDosDevice` is converted to\n`QueryDosDeviceW` as well — it had the same class of mismatch in\nreverse: the input path was UTF-8-decoded while `QueryDosDevice` returns\nANSI bytes, so device targets with non-ASCII characters could never\nmatch.\n\nAdds a regression test asserting the unicode contract of all four tuple\nfields (the original crash requires a live non-UTF8 ANSI code page and\ncannot be reproduced from Python on en-US CI).\n\n---------\n\nSigned-off-by: Alex Chen \u003cl46983284@gmail.com\u003e\nCo-authored-by: Giampaolo Rodola \u003cg.rodola@gmail.com\u003e\nCo-authored-by: github-actions[bot] \u003cgithub-actions[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "76bb19fde7dcfd8dce79d6daf8232723fffdec9d",
      "tree": "d7c7189d366088eedaf5b66edec278b301fdb3f7",
      "parents": [
        "e5b4dfddd9c916421ad103fd1577b0d0c18ae1ff"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 22:54:14 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 22:54:14 2026"
      },
      "message": "CI: try to fix occasional psleak from git+https flakyness\n"
    },
    {
      "commit": "e5b4dfddd9c916421ad103fd1577b0d0c18ae1ff",
      "tree": "e73aac9a7dfd2e10b4851c5fd68556aa7e05c076",
      "parents": [
        "837fe7d51a84ac40fe6d95f8c818bc8bd7f6f2ab"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 22:34:38 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 22:34:38 2026"
      },
      "message": "CI: pick up psleak from git+https - should solve occasional flakyness\n"
    },
    {
      "commit": "837fe7d51a84ac40fe6d95f8c818bc8bd7f6f2ab",
      "tree": "4c3c862010c978e6393219f11d52afbb156b02ce",
      "parents": [
        "74942d19364f766e01a87d1d0435ffd17c177df6"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 22:26:24 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 22:26:24 2026"
      },
      "message": "CI: run tests also on py3.14 free-threaded\n"
    },
    {
      "commit": "74942d19364f766e01a87d1d0435ffd17c177df6",
      "tree": "cc1f69b54702196f0558e0ea241888d5d7f28f8c",
      "parents": [
        "6b382071652b4fd8e33e205242e701e2144829cf"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 21:51:52 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 21:51:52 2026"
      },
      "message": "CI: define wheel versions in wheel.yml instead of pyproject.toml\n"
    },
    {
      "commit": "6b382071652b4fd8e33e205242e701e2144829cf",
      "tree": "6d143122c729ff8e5e726bed28c571724b7d62af",
      "parents": [
        "68dc7cc52e9d1ff41e580f11007b9f84efa125c3"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 20:07:55 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 20:07:55 2026"
      },
      "message": "CI: provide better names in the web UI (os, arch, pyver)\n"
    },
    {
      "commit": "68dc7cc52e9d1ff41e580f11007b9f84efa125c3",
      "tree": "77f49004564a26db3185292c66cb0c61c4f9019c",
      "parents": [
        "ed15168073684249534ce7d54befcf8bf3de0081"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 17:42:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 17:42:11 2026"
      },
      "message": "Publish Linux wheels for ppc64le and s390x (#2976)\n\npsutil currently ships Linux wheels for x86_64 and aarch64 only, so\neveryone on ppc64le or s390x compiles from source on every install.\nLooking at 30 days of PyPI download stats via\n`scripts/internal/print_downloads.py --all` ppc64le and s390x account\nfor around 340K downloads / month, so let\u0027s provide them:\n\n```\nCPUs                                  Downloads        %\n--------------------------------------------------------\nx86_64                              329,772,424    84.23\naarch64                              49,120,936    12.55\nunknown                              12,215,007     3.12\nppc64le                                 177,119     0.05\ns390x                                   167,645     0.04\narmv7l                                   27,096     0.01\ni686                                     24,305     0.01\nriscv64                                   2,201     0.00\nother                                       754     0.00\narmv6l                                      656     0.00\nppc64                                       533     0.00\nloongarch64                                 147     0.00\nmips                                         21     0.00\nsw_64                                        19     0.00\nsparc64                                      12     0.00\nwasm32                                       11     0.00\nmips64                                       10     0.00\nppc                                           9     0.00\ne2k                                           3     0.00\n```"
    },
    {
      "commit": "ed15168073684249534ce7d54befcf8bf3de0081",
      "tree": "3578baacc41a03526d081754816abb23b52426c3",
      "parents": [
        "f3bd932cba1556123f65182d4005612b1736e415"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 13:09:07 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 13:09:07 2026"
      },
      "message": "CI: speed up wheels.yml\n"
    },
    {
      "commit": "f3bd932cba1556123f65182d4005612b1736e415",
      "tree": "8076c0f5a25ab0cbb025c7a8b739f586a209d27f",
      "parents": [
        "51aa68e2a6035b696485a0aa0ed8e2ca96c101df"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Wed Aug 12 10:20:05 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 10:20:05 2026"
      },
      "message": "CI: separate wheels.yml and tests.yml (#2974)\n\nThis makes the CI config a lot simpler. We have a tests.yml which only\nrun unit tests on all major platforms, and a separate wheels.yml which\nonly takes care of creating wheels. This is simpler to handle, and also\nremoves complexity from pyproject.toml. Also, the overall CI completes\nfaster."
    },
    {
      "commit": "51aa68e2a6035b696485a0aa0ed8e2ca96c101df",
      "tree": "1d7ed82cf09d30f33c4d05f5c1361b3e418777e2",
      "parents": [
        "1b3fb50196af50a1897f07520c792262af041301"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 22:37:22 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 22:37:22 2026"
      },
      "message": "Add label_role.py sphinx ext + update model in changelog bot\n"
    },
    {
      "commit": "1b3fb50196af50a1897f07520c792262af041301",
      "tree": "6c9cdfc1565f1f2c22c0bf93e847fd15931c7286",
      "parents": [
        "c658be45fae5dacff81f69906b01b64b15a63ce3"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 22:36:55 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 22:36:55 2026"
      },
      "message": "Add label_role.py sphinx ext + update model in changelog bot\n"
    },
    {
      "commit": "c658be45fae5dacff81f69906b01b64b15a63ce3",
      "tree": "1729b3c9e43616769c3c0c05c46e091098ea564c",
      "parents": [
        "85a00455c39a514c6950abd15e863377236f6c00"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 13:17:36 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 13:17:36 2026"
      },
      "message": "Update changelog and issue label bots\n"
    },
    {
      "commit": "85a00455c39a514c6950abd15e863377236f6c00",
      "tree": "91267a467bb72461e9863338a573ed61b87c3be3",
      "parents": [
        "79b9488256716b2782c34152df4c2f40c43731f7"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 12:08:10 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 12:08:10 2026"
      },
      "message": "Changelog: show labeled issues first\n"
    },
    {
      "commit": "79b9488256716b2782c34152df4c2f40c43731f7",
      "tree": "c4d7922ed0449330ec4178c22da0317bfca8fad7",
      "parents": [
        "4c2d843ed24b3beb5d92387d9505dbf1d9578741"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 06:56:05 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Tue Aug 11 06:56:05 2026"
      },
      "message": "Changelog: show critical, build-fail and memleak labels in different colors\n"
    },
    {
      "commit": "4c2d843ed24b3beb5d92387d9505dbf1d9578741",
      "tree": "e3cf2cad2507fbb7c605ba165d8042f2f388c010",
      "parents": [
        "f69353cd95c8c3549c639a7f17f744eb03ab9e40"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 10 16:12:40 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 10 16:12:40 2026"
      },
      "message": "changelog.rst: restructure it completely and add sections\n"
    },
    {
      "commit": "f69353cd95c8c3549c639a7f17f744eb03ab9e40",
      "tree": "59aa9bdc783413ee51832b9eb46e15eb49d5367a",
      "parents": [
        "feab334c97835e059e5076466cdd6ac5ec3cf290"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 10 10:37:13 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Mon Aug 10 10:37:13 2026"
      },
      "message": "Reword changelog 8.0.0 entry by topics\n"
    },
    {
      "commit": "feab334c97835e059e5076466cdd6ac5ec3cf290",
      "tree": "65551bd24f8f17f44f9aa97aedd9dbe8f13a549d",
      "parents": [
        "564ac04a0c087cc7c824e6b156f9dfc393738443"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 20:54:02 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 20:54:02 2026"
      },
      "message": "Add pytest hook to avoid crash in case of unicode-related failure\n"
    },
    {
      "commit": "564ac04a0c087cc7c824e6b156f9dfc393738443",
      "tree": "29a01a943a6b6b5064e8fac6240c1008b7f7b779",
      "parents": [
        "e6909d1e9588e25617145460fcffc7111622a75a"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 20:01:05 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 20:01:05 2026"
      },
      "message": "Doc: reword some doc, especially platforms.rst\n\nSigned-off-by: Giampaolo Rodola \u003cg.rodola@gmail.com\u003e\n"
    },
    {
      "commit": "e6909d1e9588e25617145460fcffc7111622a75a",
      "tree": "b2f6cb4ef5a2c8ecbdf1aad7084b712aa26312a3",
      "parents": [
        "4dc5490c803bcadf1dde917ec7b6f494065901c2"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 01:05:41 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 01:05:41 2026"
      },
      "message": "Test / POSIX: compare context switch deltas, not totals\n"
    },
    {
      "commit": "4dc5490c803bcadf1dde917ec7b6f494065901c2",
      "tree": "279ddabac3b617a921d768d8d71473c12e1ae362",
      "parents": [
        "e883c5eff7d28bfbfd391677b8220db3583c6deb"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 01:05:40 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 01:05:40 2026"
      },
      "message": "Test / Linux: skip test_against_lscpu when lscpu reports no core count\n"
    },
    {
      "commit": "e883c5eff7d28bfbfd391677b8220db3583c6deb",
      "tree": "9d173b1b88e75e719c92e29f27e3a1829c352779",
      "parents": [
        "7276316192d2fa34a5fe3a99a94db63a6bebb7d7"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 00:31:15 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sun Aug 09 00:31:15 2026"
      },
      "message": "Add cfarm-test.sh script\n"
    },
    {
      "commit": "7276316192d2fa34a5fe3a99a94db63a6bebb7d7",
      "tree": "0a966cfe78c964e7551d96406fef724f63947286",
      "parents": [
        "42f1d73451d80ffcd63ce459f132d2ae1686167b"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 23:19:39 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 23:19:39 2026"
      },
      "message": "Test / Linux: fix test_emulate_fallbacks reusing a closed file object\n"
    },
    {
      "commit": "42f1d73451d80ffcd63ce459f132d2ae1686167b",
      "tree": "2df55b42148fa92fab82c1c4b5218d8fb096759b",
      "parents": [
        "25601bc2fae27d6a31a5a47a35a016c2c5792e7e"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 23:19:39 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 23:19:39 2026"
      },
      "message": "Test / Linux: fix CPU count tests using possible instead of online CPUs (#2683)\n"
    },
    {
      "commit": "25601bc2fae27d6a31a5a47a35a016c2c5792e7e",
      "tree": "708a4f85aec21be51c7c4295b0a74c71d4d3482c",
      "parents": [
        "58a0c9e16d6ac3e3798c682bc5588612f35f4b73"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 23:04:51 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 23:04:51 2026"
      },
      "message": "[Linux] try to fix mocked cpu_freq() test added in 2e09ea45\n"
    },
    {
      "commit": "58a0c9e16d6ac3e3798c682bc5588612f35f4b73",
      "tree": "dde7fbbdcd844df5452ca5a0af499401503cc420",
      "parents": [
        "6b4d22464574416bd955884c733474489ae42c2f"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:48:54 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:48:54 2026"
      },
      "message": "Fix CPU count core test observed on Asahi Linux / M1\n"
    },
    {
      "commit": "6b4d22464574416bd955884c733474489ae42c2f",
      "tree": "260a99bf70697d16f1ee17ec8956082de02916cb",
      "parents": [
        "2e09ea45c3e1102a7cc5ec385cb83acc4c4eadd0"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:38:14 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:38:14 2026"
      },
      "message": "Fix flaky battery test on Linux\n"
    },
    {
      "commit": "2e09ea45c3e1102a7cc5ec385cb83acc4c4eadd0",
      "tree": "a49d1c29c6fbf687a9c5a57f823df67b4ceaa79b",
      "parents": [
        "b0c59d7e154caee0e6e16c933893d3b336cf8df3"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:33:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 22:33:52 2026"
      },
      "message": "[Linux] cpu_freq(percpu\u003dTrue) returns one entry per policy instead of per CPU (#2512) (#2969)\n\nFixes #2512, closes #2562.\n\n`cpu_freq(percpu\u003dTrue)` enumerated\n`/sys/devices/system/cpu/cpufreq/policy*` and returned one entry per\npolicy. Where a policy governs several CPUs it therefore reported fewer\nentries than `cpu_count()`. Each policy is now asked which CPUs it\naffects, and CPUs governed by no policy (offline ones) are left out\nrather than reported as zeroes.\n\nBased on @justeph\u0027s patch in #2562, with the CPU list built from the\npolicies instead of `range(cpu_count_logical())`, so offline CPUs stay\nexcluded and #2628 is not reintroduced."
    },
    {
      "commit": "b0c59d7e154caee0e6e16c933893d3b336cf8df3",
      "tree": "0539645ba746748ae2dc52ac1dfb0dcd79ed6af2",
      "parents": [
        "708baa303aca3b588b0645e47a90c49569f2e41b"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:07:16 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 22:07:16 2026"
      },
      "message": "Revert 5e68c491 where I broke ru_maxrss test on OSX\n"
    },
    {
      "commit": "708baa303aca3b588b0645e47a90c49569f2e41b",
      "tree": "5b1481ff14a427e5c80bee3a65584bba225ded0b",
      "parents": [
        "6ef1a922596aaf310b781f35cf3081d15f180112",
        "32c0471822a3df599c77b79c307407f8b8eccb52"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:45:27 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:45:27 2026"
      },
      "message": "Merge branch \u0027master\u0027 of github.com:giampaolo/psutil\n"
    },
    {
      "commit": "32c0471822a3df599c77b79c307407f8b8eccb52",
      "tree": "5b1481ff14a427e5c80bee3a65584bba225ded0b",
      "parents": [
        "5e68c49180724d070d04f8455c9eb8378c0ced75"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:45:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 21:45:18 2026"
      },
      "message": "[Linux] cpu_freq() fallback is wrong on ppc and s390x (#2968)\n\n`_cpu_get_cpuinfo_freq()` matches lines starting with `\"cpu MHz\"`, which is\nfine on x86. `ppc` archs reports this as `\"clock\"` and not `\"cpu MHz\"`, so we\nreturn nothing.\n\n```\n$ python3 -c \"import psutil; print(psutil.cpu_freq())\"\nNone\n$ grep -m1 clock /proc/cpuinfo\nclock         : 2750.000000MHz\n```\n\nAlso s390x archs prints two lines per CPU (source):\n\n```\n\"cpu MHz dynamic : %d\\n\"\n\"cpu MHz static  : %d\\n\"\n```\n\n...so the returned values are wrong (double counted).\n\nRelated:\n- #2750\n- #2557 \n- #1197\n\nFixes #2967"
    },
    {
      "commit": "6ef1a922596aaf310b781f35cf3081d15f180112",
      "tree": "f0806df95da6cd80e5f38a5801667f8656eb4451",
      "parents": [
        "6e01deb376039b2b442777c00e78ac959b1ac554"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:07:22 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:07:22 2026"
      },
      "message": "Test / Linux: fix test_ips broadcast check on /32 and ptp interfaces\n"
    },
    {
      "commit": "6e01deb376039b2b442777c00e78ac959b1ac554",
      "tree": "5ec1805d8ce2bd3b21deff07c5d8790981309127",
      "parents": [
        "5e68c49180724d070d04f8455c9eb8378c0ced75"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:07:21 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 21:07:21 2026"
      },
      "message": "Test / POSIX: don\u0027t try to signal a zombie owned by another user\n"
    },
    {
      "commit": "5e68c49180724d070d04f8455c9eb8378c0ced75",
      "tree": "3cf7ffa682ae59a3da4549bd7a462970fe2566ee",
      "parents": [
        "89844bc69ca068e451988631d147ea9bec39a245"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 19:19:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 19:19:45 2026"
      },
      "message": "Fix tests failing on Debian 13 ppc64le\n"
    },
    {
      "commit": "89844bc69ca068e451988631d147ea9bec39a245",
      "tree": "1374e5c11c99350a906516f52d0eedd7cdd0f215",
      "parents": [
        "cfbdb39228b59c9b44454af01c38813cc02132e6"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 19:19:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 19:19:45 2026"
      },
      "message": "Test / Linux: skip cpu_stats() checks when vmstat wraps counters at 32 bits\n"
    },
    {
      "commit": "cfbdb39228b59c9b44454af01c38813cc02132e6",
      "tree": "8ec4f2b0fe2cb487aa06e8ef0eb43c3464c4c172",
      "parents": [
        "abd844ac95bcf7b3024f4f3bc6a0abfbbadcf2ec"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 16:59:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 16:59:27 2026"
      },
      "message": "[Linux] cpu_affinity() segfault  (#2966)\n\nFound running the test suite on a Debian 11 box (Python 3.9.2):\n\n```\n  tests/test_process.py::TestProcess::test_children PASSED\n  tests/test_process.py::TestProcess::test_children_duplicates PASSED\n  tests/test_process.py::TestProcess::test_children_mocked_ctime PASSED\n  tests/test_process.py::TestProcess::test_children_recursive PASSED\n  tests/test_process.py::TestProcess::test_cmdline PASSED\n  tests/test_process.py::TestProcess::test_cpu_affinity PASSED\n  tests/test_process.py::TestProcess::test_cpu_affinity_all_combinations PASSED\n  tests/test_process.py::TestProcess::test_cpu_affinity_errs Fatal Python error: Segmentation fault\n\n  Current thread 0x00007f26b109c740 (most recent call first):\n    File \"/home/grodola/psutil/psutil/__init__.py\", line 1066 in cpu_affinity\n    File \"/home/grodola/psutil/psutil/__init__.py\", line 384 in wrapper\n    File \"/home/grodola/psutil/tests/test_process.py\", line 904 in test_cpu_affinity_errs\n    File \"/usr/lib/python3.9/unittest/case.py\", line 550 in _callTestMethod\n    File \"/usr/lib/python3.9/unittest/case.py\", line 593 in run\n    File \"/usr/lib/python3.9/unittest/case.py\", line 653 in __call__\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/unittest.py\", line 351 in runtest\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/runner.py\", line 178 in pytest_runtest_call\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_callers.py\", line 121 in _multicall\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_manager.py\", line 120 in _hookexec\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_hooks.py\", line 512 in __call__\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/runner.py\", line 246 in \u003clambda\u003e\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/runner.py\", line 344 in from_call\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/runner.py\", line 245 in call_and_report\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/runner.py\", line 136 in runtestprotocol\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/runner.py\", line 117 in pytest_runtest_protocol\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_callers.py\", line 121 in _multicall\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_manager.py\", line 120 in _hookexec\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_hooks.py\", line 512 in __call__\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/main.py\", line 367 in pytest_runtestloop\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_callers.py\", line 121 in _multicall\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_manager.py\", line 120 in _hookexec\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_hooks.py\", line 512 in __call__\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/main.py\", line 343 in _main\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/main.py\", line 289 in wrap_session\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/mailine_main\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_callers.py\", line 121 in _multicall\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_manec\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pluggy/_hooks.py\", line 512 in __call__\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/con main\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/_pytest/config/__init__.py\", line 201 in console_main\n    File \"/home/grodola/psutil/.venv/lib/python3.9/site-packages/pytest/__ma\n    File \"/usr/lib/python3.9/runpy.py\", line 87 in _run_code\n    File \"/usr/lib/python3.9/runpy.py\", line 197 in _run_module_as_main\n  Segmentation fault\n  make: *** [Makefile:118: test] Error 139\n```\n\nThiis is invisible on 3.12+, where small ints became immortal (PEP 683)\nand why CI never caught it (cibuildwheel runs Python 3.14)\n\nThis is a regression introduced in #2860, which split the inline\n`pylist_append_obj(py_list, PyLong_FromLong(cpu))` call into a named\nvariable and added the decrefs. Fix is to restore the inline form, which\nis what the other eight pylist_append_obj() call sites do."
    },
    {
      "commit": "abd844ac95bcf7b3024f4f3bc6a0abfbbadcf2ec",
      "tree": "995784eb34a13af6d50771ade79d5dc666854324",
      "parents": [
        "1d017fc49396ebb5e3acc7f27dcbd469f1d00c7f"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 16:23:06 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 16:23:06 2026"
      },
      "message": "Make pytest config and deps work with pytest \u003c 9, so tests can run on Python 3.9\n"
    },
    {
      "commit": "1d017fc49396ebb5e3acc7f27dcbd469f1d00c7f",
      "tree": "0cf10a384ed329252cf985968863c14ab4fd72cb",
      "parents": [
        "dc539f1b99a3cef1cbe5d1f4b69e62d7664c1aa0"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 14:10:34 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 14:10:34 2026"
      },
      "message": "install_pip.py: also install on python 3.9\n"
    },
    {
      "commit": "dc539f1b99a3cef1cbe5d1f4b69e62d7664c1aa0",
      "tree": "cf8b276b59a8f01dcb855feda5f86c7e6f647c95",
      "parents": [
        "554eda7751aa0354aff31002478c66517f56b281"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 13:40:06 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 13:40:06 2026"
      },
      "message": "Fix flaky tests observed on Almal Linux sparc64\n"
    },
    {
      "commit": "554eda7751aa0354aff31002478c66517f56b281",
      "tree": "90d8b708c0e04adef9244a77c9e2fee86c332480",
      "parents": [
        "fdfbb5525bd0ab7683aed1616356e1be0a11bd6e"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 13:17:31 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 13:17:31 2026"
      },
      "message": "Test / Linux: skip variable proc name if it\u0027s a kernel process\n"
    },
    {
      "commit": "fdfbb5525bd0ab7683aed1616356e1be0a11bd6e",
      "tree": "68e185f25994e395bc7088437420d16a40ad48a0",
      "parents": [
        "fbc286172a19427791b751211bd7bdbd0ae16dc6"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 12:56:12 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 12:56:12 2026"
      },
      "message": "Linux Alpine / MUSL: document that users() return an empty list\n"
    },
    {
      "commit": "fbc286172a19427791b751211bd7bdbd0ae16dc6",
      "tree": "357649ef6bfda85409b43695b85b99bfc1872805",
      "parents": [
        "a13ca34d347b947fba06cffae0ba563434e37c26",
        "ef3d9af1062e3e5d59e431e957b75fd4287b053e"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 12:43:54 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 12:43:54 2026"
      },
      "message": "Merge branch \u0027master\u0027 of github.com:giampaolo/psutil\n"
    },
    {
      "commit": "ef3d9af1062e3e5d59e431e957b75fd4287b053e",
      "tree": "357649ef6bfda85409b43695b85b99bfc1872805",
      "parents": [
        "8a5d53df33e28831f4833803b89e40e857d5632d"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 12:43:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 12:43:26 2026"
      },
      "message": "Fix #2964: net_if_addrs() returned a bogus broadcast address for /32 addresses (#2965)\n\nFound this while running the test suite on an Alpine box on the GCC compile farm. \nThe machine has an interface configured with a `/32` address:\n\n```text\nFAILED tests/test_linux.py::TestNetIfAddrs::test_ips\ntests/test_linux.py:1088: in test_ips\n    assert addr.broadcast \u003d\u003d get_ipv4_broadcast(name)\nE   AssertionError: assert \u002789.234.156.160\u0027 \u003d\u003d \u00270.0.0.0\u0027\n```\n\npsutil reports the interface\u0027s own IP as the broadcast address:\n\n```console\n$ ip -4 addr show eth0\n2: eth0: \u003cBROADCAST,MULTICAST,UP,LOWER_UP\u003e mtu 1500 ...\n    inet 89.234.156.160/32 scope global eth0\n```\n\n```python\n\u003e\u003e\u003e psutil.net_if_addrs()[\"eth0\"][0].broadcast\n\u002789.234.156.160\u0027\n```\n\nThat\u0027s wrong. A `/32` represents a single host, so it has no broadcast address. \n\nThe problem is in `psutil/arch/posix/net.c`. We read `ifa_broadaddr` whenever \nthe interface has `IFF_BROADCAST`. But `IFF_BROADCAST` only says that the \ninterface supports broadcasting; it doesn\u0027t mean every address assigned to it \nhas a broadcast address.\n\nThis is not specific to musl or Alpine; glibc behaves the same way. \nThe fix should be to return `None` when the netmask represents a single-host \nnetwork."
    },
    {
      "commit": "a13ca34d347b947fba06cffae0ba563434e37c26",
      "tree": "00a6a27867215bd58a8832030227984ec5c6581b",
      "parents": [
        "29257b2a6635fbf91a501f68fe96efde3facd5a8"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:44:33 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:44:33 2026"
      },
      "message": "Fix test_pmap crashing on non-UTF8 output emitted by the test suite itself\n"
    },
    {
      "commit": "29257b2a6635fbf91a501f68fe96efde3facd5a8",
      "tree": "e95fc4e287bac68b2e72b28a3b9cb64192662ebe",
      "parents": [
        "8370ce8a23ddb97aea5e92c02d5bc1bbbb6d103a"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:40:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:40:45 2026"
      },
      "message": "Skip script test if requests is not installed\n"
    },
    {
      "commit": "8370ce8a23ddb97aea5e92c02d5bc1bbbb6d103a",
      "tree": "8a554f771d446a768847ddc7b094cd2b49c712a1",
      "parents": [
        "926d1aca1bfee35325ab98e0b001c9820078f583"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:39:49 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:39:49 2026"
      },
      "message": "Fix heap_info()/heap_trim() availability tests on MUSL\n"
    },
    {
      "commit": "926d1aca1bfee35325ab98e0b001c9820078f583",
      "tree": "47c49633a8677d9f80bed32be7386b39ca68463a",
      "parents": [
        "8a5d53df33e28831f4833803b89e40e857d5632d"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:37:30 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:37:30 2026"
      },
      "message": "Skip script test if pyperf is not installed\n"
    },
    {
      "commit": "8a5d53df33e28831f4833803b89e40e857d5632d",
      "tree": "fcf792d87fb195afa9988c1b8c9344eedc0f89cd",
      "parents": [
        "49a82be7d885da119cc262c03dcd14bb43950fa9"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:33:43 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:33:43 2026"
      },
      "message": "Fix tests running in a venv: subprocesses were unable to import pytest\n"
    },
    {
      "commit": "49a82be7d885da119cc262c03dcd14bb43950fa9",
      "tree": "c0f9d0f18623484ae4ddd9b98baeaa2edf84a8a5",
      "parents": [
        "bff3f6aa558b31284547e3025c675ace4939f107"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:26:49 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:26:49 2026"
      },
      "message": "Linux alpine: skip tests relying on CLI tools not providing all opts\n"
    },
    {
      "commit": "bff3f6aa558b31284547e3025c675ace4939f107",
      "tree": "083db1de083e3d671e7264bbf2ee6baf83ce1581",
      "parents": [
        "5c73b1984dd9c77bc9bf7ecce58e2662b40ffb1c"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:12:28 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:12:28 2026"
      },
      "message": "Skip tests depending on vmstat CLI if not avail\n"
    },
    {
      "commit": "5c73b1984dd9c77bc9bf7ecce58e2662b40ffb1c",
      "tree": "41a1b6894e98ed497d4b33b550c00c4f83f3d44f",
      "parents": [
        "1b437524289c24a420787cc8a865de7c5ac5b6af"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:11:18 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 11:11:18 2026"
      },
      "message": "Tests: introduce @requires_cli decorator\n"
    },
    {
      "commit": "1b437524289c24a420787cc8a865de7c5ac5b6af",
      "tree": "a7e5c0763ad3f6d8e18843ca4e8b7315f36a9b9e",
      "parents": [
        "9699c3ab676cad2192d7d91d0ba63cb46fba69ba"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 10:58:05 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 10:58:05 2026"
      },
      "message": "Fix flaky cmdline() test on Linux, where cmdline needs time to initialize\n\nFixes:\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d FAILURES\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n_________________ TestFSAPIsWithInvalidPath.test_proc_cmdline\n__________________\n[gw0] linux -- Python 3.14.6 /tmp/tmp.tTbljNMNGA/venv/bin/python\ntests/test_unicode.py:209: in test_proc_cmdline\n    assert cmdline \u003d\u003d cmd\nE   AssertionError: assert [] \u003d\u003d\n[\u0027/tmp/@psutil-331-p4b034snf\\udcc0\\udc80\u0027, \u0027-c\u0027, \u0027import time;\n[time.sleep(0.1) for x in range(100)]\u0027]\nE\nE     Right contains 3 more items, first extra item:\n\u0027/tmp/@psutil-331-p4b034snf\\udcc0\\udc80\u0027\nE\nE     Full diff:\nE     + []\nE     - [\nE     -     \u0027/tmp/@psutil-331-p4b034snf\\udcc0\\udc80\u0027,\nE     -     \u0027-c\u0027,\nE     -     \u0027import time; [time.sleep(0.1) for x in range(100)]\u0027,\nE     - ]\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d test_all: slowest 5 APIs (cumulative)\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n"
    },
    {
      "commit": "9699c3ab676cad2192d7d91d0ba63cb46fba69ba",
      "tree": "7e5ab138d3b17c2e3496969353cf101a78504580",
      "parents": [
        "ca528ca5cbc3b09c1654d3fcb215ae4e1a52d626"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 10:33:54 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 10:33:54 2026"
      },
      "message": "Monkey patch pytest-instafail to ALSO show full failure summary at the end\n\nRef: https://github.com/pytest-dev/pytest-instafail/issues/21\n"
    },
    {
      "commit": "ca528ca5cbc3b09c1654d3fcb215ae4e1a52d626",
      "tree": "07037a56ca5ef1cf17817fb5a63385466c4313e0",
      "parents": [
        "f2543a930ce783bd628f6ac1f6dee401b3146a68"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 10:09:46 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 10:09:46 2026"
      },
      "message": "Makefile: support make \u003c 4\n"
    },
    {
      "commit": "f2543a930ce783bd628f6ac1f6dee401b3146a68",
      "tree": "c3ee2d06b27887f62b01c68f6f05c974a642d627",
      "parents": [
        "e12eb9e5f6ae4e0dbbcc9f5f72ee24044046e14c"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 09:51:05 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 09:51:05 2026"
      },
      "message": "Makefile: restore BSD make compatibility\n"
    },
    {
      "commit": "e12eb9e5f6ae4e0dbbcc9f5f72ee24044046e14c",
      "tree": "b924e695a41eea355ea55572bc39e6f35487b2d8",
      "parents": [
        "448333256b0fba0af2ddcf54394eb1de846c5a97"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 09:14:17 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Sat Aug 08 09:14:17 2026"
      },
      "message": "Fix Makefile parsing on GNU make \u003c 4.3\n"
    },
    {
      "commit": "448333256b0fba0af2ddcf54394eb1de846c5a97",
      "tree": "876a17aecfcdf73d772abe97f22f5e9893e67958",
      "parents": [
        "430bdcdccf5d7ff27925a7187f1e4808768c6913"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 22:32:31 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 22:32:31 2026"
      },
      "message": "Triage bot: don\u0027t apply unix/bsd alongside a named OS\n"
    },
    {
      "commit": "430bdcdccf5d7ff27925a7187f1e4808768c6913",
      "tree": "c443213f25162237fe7157632aa2d3273d7506b0",
      "parents": [
        "2db596c940f8b869ab057abd70dde27e98310477"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 22:31:11 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 22:31:11 2026"
      },
      "message": "Vulture: remove dead code\n"
    },
    {
      "commit": "2db596c940f8b869ab057abd70dde27e98310477",
      "tree": "a64e291d990201b4d5119d26160399145bff4cf4",
      "parents": [
        "631f98e55203c09bcb0029f876a61e077c5962f0"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 21:04:13 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 21:04:13 2026"
      },
      "message": "Some Makefile fixes\n"
    },
    {
      "commit": "631f98e55203c09bcb0029f876a61e077c5962f0",
      "tree": "174cc43dcb279aa3b87c3bc499f4254e4a32d922",
      "parents": [
        "accc073a34ff8a8c26d2a7cc82f9dcdf848a7dff"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 19:28:10 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 19:28:10 2026"
      },
      "message": "Finally drop deprecated \"setup.py develop\" install; use uv/pip instead\n"
    },
    {
      "commit": "accc073a34ff8a8c26d2a7cc82f9dcdf848a7dff",
      "tree": "81d9f0b1bfe3d4fde764c0c4b1dc6f81c5a56c48",
      "parents": [
        "33acd63b7c14b3b5beac3ed7cfafaacd0bedec05"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 19:11:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 19:11:21 2026"
      },
      "message": "CI: install uv from install-pydeps.sh, drop the setup-uv action (#2963)\n\ninstall-pydeps.sh` now installs `uv` itself when it isn\u0027t already\navailable, using pip with `--only-binary\u003d:all:` so it never tries to\ncompile it from the sdist. Where uv publishes no wheel (BSD, AIX, SunOS)\nthe install fails cleanly and the script falls back to pip, which is\nwhat those platforms were doing anyway.\n\nAlso moved docs deps into pyproject under a `docs` group."
    },
    {
      "commit": "33acd63b7c14b3b5beac3ed7cfafaacd0bedec05",
      "tree": "aef5b74b08158e6813068999e753fb8cea2c92a3",
      "parents": [
        "6cdec09ac6fd6f90f45ae554bc9eac3cc7db909e"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Fri Aug 07 00:16:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 00:16:14 2026"
      },
      "message": "[AIX] files refactoring (move, rename) (#2962)\n\nMove files around and give them the same structure / names as on other\nplatforms."
    },
    {
      "commit": "6cdec09ac6fd6f90f45ae554bc9eac3cc7db909e",
      "tree": "742580cb264430acaef55cd90f6e7fdfa3706d90",
      "parents": [
        "05c34441b11b4d236faa8138e72f412c69e646a9",
        "fdd83454caed1652d01d1f4f453aa953384b863e"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 23:02:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 23:02:14 2026"
      },
      "message": "AIX: split _psutil_aix.c into arch/aix/{proc,disk,mem,cpu,net,sys}.c #2961\n\nSplit the monolithic _psutil_aix.c module into per-subsystem files under arch/aix/, matching the layout the other platforms already use (proc.c, mem.c, disk.c, etc.).\n\nThe split is done so that git blame keeps pointing at the original author @wiggin15 instead of at this refactor, which is something I wish I knew when I did the same change for BSDs some years ago. The technique:\n\nhttps://devblogs.microsoft.com/oldnewthing/20241218-00/?p\u003d110655\nhttps://devblogs.microsoft.com/oldnewthing/20190916-00/?p\u003d102892\nEach destination file is git-moved in its own branch, and trimmed in a second commit, then the branches are joined with an octopus merge. This way git blame follows renames natively, and GitHub\u0027s blame view shows the same. Same original author, same date, and no attribution to me."
    },
    {
      "commit": "fdd83454caed1652d01d1f4f453aa953384b863e",
      "tree": "742580cb264430acaef55cd90f6e7fdfa3706d90",
      "parents": [
        "84e94dfc6f80c6780c08eb007764e81c074168f5"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:40:31 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:40:31 2026"
      },
      "message": "AIX: prune per-file includes in arch/aix\n"
    },
    {
      "commit": "84e94dfc6f80c6780c08eb007764e81c074168f5",
      "tree": "affe40cae7e4606ac1fb130b82477d66b17f24e0",
      "parents": [
        "ffbfa0a887d49ea3b591b8e042d56a489747535c"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:36:28 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:36:28 2026"
      },
      "message": "AIX: add arch/aix/init.h and export the split functions\n"
    },
    {
      "commit": "ffbfa0a887d49ea3b591b8e042d56a489747535c",
      "tree": "2d102561cace4b296a010665260d3298cc3b2c43",
      "parents": [
        "cf736641bb24ade9b06db300537303b790e8cd60"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:34:47 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:34:47 2026"
      },
      "message": "AIX: fix relative include paths after arch/aix split\n"
    },
    {
      "commit": "cf736641bb24ade9b06db300537303b790e8cd60",
      "tree": "9c1397cb3729dc0b0cdbcde091a577f57bd78946",
      "parents": [
        "fa8fef1380fa70ec6b1bbde22d30acd0c0ab8695"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:34:24 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:34:24 2026"
      },
      "message": "AIX: update build files after arch/aix split\n"
    },
    {
      "commit": "fa8fef1380fa70ec6b1bbde22d30acd0c0ab8695",
      "tree": "41568f6993abf1fa1608580a4d71bbf41c6350b2",
      "parents": [
        "eb15379a2752d39bd00c355bc96cf25388b456bb",
        "74bcf00d8aee13cacaaa35cf1684ac0769720206",
        "d1ff5433bd9cd1d883fb9b9a17f11708c9e8eaba",
        "3793a4edb5f4a3e42e370c9afc74a8bcc5c8e190",
        "59d0559eeaa728111959aa5e0de3059fc83b4b66",
        "96b9231f0eca45b9067d3bbb54d11528fb7d12c5"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:55 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:55 2026"
      },
      "message": "Merge branches \u0027aix-disk\u0027, \u0027aix-net\u0027, \u0027aix-cpu\u0027, \u0027aix-mem\u0027 and \u0027aix-sys\u0027 into aix-refact\n"
    },
    {
      "commit": "74bcf00d8aee13cacaaa35cf1684ac0769720206",
      "tree": "d469e7b2de41a62b8a5529fa9722681a8c53aaa4",
      "parents": [
        "65184f39e253ae713dcb789c3367d1ad51e9c3ea"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: move disk code to arch/aix/disk.c\n"
    },
    {
      "commit": "d1ff5433bd9cd1d883fb9b9a17f11708c9e8eaba",
      "tree": "056becd3536ec6c3f042ae235d054017a16eae44",
      "parents": [
        "894b540652443eb2e0d8105037389686fb35108c"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: move net code to arch/aix/net.c\n"
    },
    {
      "commit": "3793a4edb5f4a3e42e370c9afc74a8bcc5c8e190",
      "tree": "cd7c10c49a67bc7d895bb0335f3ca261f87d714f",
      "parents": [
        "02deba92cd4c99369603009916288669aceb93f6"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: move cpu code to arch/aix/cpu.c\n"
    },
    {
      "commit": "59d0559eeaa728111959aa5e0de3059fc83b4b66",
      "tree": "8b64af25451340a423271ed4504eccdaee48894c",
      "parents": [
        "078603893c83d6f082b5315331620032c5bb5d2d"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: move mem code to arch/aix/mem.c\n"
    },
    {
      "commit": "96b9231f0eca45b9067d3bbb54d11528fb7d12c5",
      "tree": "72b8402a6c52cf018a8659715eb8a6f3b55b6b25",
      "parents": [
        "a46430e9c13946cebe5c9c344e20ed2c815cbb50"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: move sys code to arch/aix/sys.c\n"
    },
    {
      "commit": "65184f39e253ae713dcb789c3367d1ad51e9c3ea",
      "tree": "1d2a77f7b8309dc10072c1ffdfb7d359d63cc1d6",
      "parents": [
        "05c34441b11b4d236faa8138e72f412c69e646a9"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: rename _psutil_aix.c to arch/aix/disk.c\n"
    },
    {
      "commit": "894b540652443eb2e0d8105037389686fb35108c",
      "tree": "ec42c9810392a7525fc0fb82f8acf8550a37579c",
      "parents": [
        "05c34441b11b4d236faa8138e72f412c69e646a9"
      ],
      "author": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "committer": {
        "name": "Giampaolo Rodola",
        "email": "g.rodola@gmail.com",
        "time": "Thu Aug 06 22:30:45 2026"
      },
      "message": "AIX: rename _psutil_aix.c to arch/aix/net.c\n"
    }
  ],
  "next": "02deba92cd4c99369603009916288669aceb93f6"
}
