I was reading the latest edition of Kevin Ottens’ excellent weekly web review and one particular article caught my eye: “The Git Commands I Run Before Reading Any Code“. In a nutshell, you can use the git version control tool to quickly assess a project’s health, what breaks, who’s a key figure, how bad emergencies are, and so on.So useful!I immediately wanted to apply this to KDE projects. So I took the commands from the post and made some shell aliases and functions for convenience:# git repo analysis toolsalias what-changes="echo 'What changes a lot?' && git log --format=format: --name-only --since='1 year ago' | rg -v 'po$|json$|desktop$' | sort | uniq -c | sort -nr | head -20"alias what-breaks="echo 'What breaks a lot?' && git log -i -E --grep='fix|bug|broke|bad|wrong|incorrect|problem' --name-only --format='' | sort | uniq -c | sort -nr | head -20"alias emergencies="echo 'And what were the emergencies?' && git log --oneline --since='1 year ago' | grep -iE 'revert|hotfix|emergency|urgent|rollback'"alias momentum="echo \"What's the project's momentum over the past 5 years?\" && git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c | tail -n 60"alias maintainers-recently="echo \"Who's been driving this project in the past year?\" && git shortlog -sn --no-merges --since='1 year ago' | rg -v 'l10n daemon script' | head -n 30"alias maintainers-alltime="echo 'And what about for all time?' && git shortlog -sn --no-merges | rg -v 'l10n daemon script' | head -n 30"function repo-analysis { what-changes echo what-breaks echo emergencies echo momentum echo maintainers-recently echo maintainers-alltime}Now let’s run it on Plasma. Here’s plasma-workspace, the core of Plasma:$ git clone ssh://git@invent.kde.org/plasma/plasma-workspace.git$ cd plasma-workspace $ repo-analysisWhat changes a lot? 1519 38 CMakeLists.txt 29 shell/shellcorona.cpp 24 runners/services/servicerunner.cpp 21 wallpapers/image/imagepackage/contents/ui/config.qml 19 libnotificationmanager/notifications.cpp 18 shell/org.kde.plasmashell.desktop.cmake 18 devicenotifications/devicenotifications.cpp 17 kcms/lookandfeel/kcm.cpp 16 wallpapers/image/plugin/model/packagelistmodel.cpp 16 kcms/cursortheme/xcursor/xcursor.knsrc 15 wallpapers/image/plugin/model/imagelistmodel.cpp 15 applets/notifications/global/Globals.qml 15 applets/devicenotifier/devicecontrol.cpp 14 wallpapers/image/plugin/imagebackend.cpp 14 shell/panelview.cpp 14 .kde-ci.yml 14 applets/systemtray/systemtray.cpp 13 runners/services/autotests/servicerunnertest.cpp 12 krunner/qml/RunCommand.qmlWhat breaks a lot? 225 shell/shellcorona.cpp 183 shell/panelview.cpp 83 CMakeLists.txt 74 applets/systemtray/package/contents/ui/main.qml 71 applets/digital-clock/package/contents/ui/DigitalClock.qml 63 klipper/klipper.cpp 62 applets/notifications/package/contents/ui/NotificationItem.qml 58 wallpapers/image/imagepackage/contents/ui/config.qml 56 shell/desktopview.cpp 56 libtaskmanager/tasksmodel.cpp 54 shell/main.cpp 54 applets/systemtray/systemtray.cpp 53 shell/shellcorona.h 52 krunner/view.cpp 48 applets/digital-clock/package/contents/ui/CalendarView.qml 47 runners/services/servicerunner.cpp 46 wallpapers/image/imagepackage/contents/ui/main.qml 45 applets/notifications/package/contents/ui/NotificationPopup.qml 44 applets/systemtray/package/contents/ui/ExpandedRepresentation.qml 43 startkde/startplasma.cppAnd what were the emergencies?4f526a7bd1 Revert “applets/systemtray: Prevent popups from overlapping with the panel”dca5788fee lookandfeel/components: Revert Plasma::setupPlasmaStyle2c0fd34541 Revert “ContainmentLayoutManager: send recursive mouse release events too”b6b230f4ff Revert “Read selenium-webdriver-at-spi-run location from CMake”b8651b56f6 hotfix: Remove doc translations without actual doc1f43f576e8 Revert “Add forceImageAnimation property to force animated image play”f0349b6c81 hotfix: remove stray .po file3ff7ae4269 Revert “CI: enable parallel testing”83bebc7896 Revert “Limit evaluateScript execution at 2 seconds”4f45f672be Revert “kcms/componentchooser: Don’t offer NoDisplay services”3bf0ff8f56 Revert “Disable linux-qt6-next while the regression in Qt gets fixed”80996f0633 Revert “kcms/wallpaper: set roleNames for WallpaperConfigModel”What’s the project’s momentum over the past 5 years? 148 2021-05 87 2021-06 62 2021-07 85 2021-08 121 2021-09 106 2021-10 146 2021-11 190 2021-12 191 2022-01 84 2022-02 168 2022-03 130 2022-04 146 2022-05 141 2022-06 136 2022-07 107 2022-08 232 2022-09 234 2022-10 181 2022-11 150 2022-12 154 2023-01 161 2023-02 156 2023-03 156 2023-04 163 2023-05 137 2023-06 186 2023-07 190 2023-08 275 2023-09 226 2023-10 283 2023-11 157 2023-12 131 2024-01 147 2024-02 249 2024-03 180 2024-04 188 2024-05 158 2024-06 128 2024-07 146 2024-08 169 2024-09 156 2024-10 116 2024-11 98 2024-12 145 2025-01 126 2025-02 120 2025-03 116 2025-04 131 2025-05 131 2025-06 132 2025-07 115 2025-08 110 2025-09 97 2025-10 147 2025-11 114 2025-12 140 2026-01 131 2026-02 119 2026-03 44 2026-04Who’s been driving this project in the past year? 116 Vlad Zahorodnii 113 Nicolas Fella 87 Christoph Wolk 82 Fushan Wen 78 Nate Graham 66 Kai Uwe Broulik 48 Bohdan Onofriichuk 37 Harald Sitter 34 Tobias Fella 31 Marco Martin 30 David Edmundson 25 Akseli Lahtinen 21 Ismael Asensio 17 David Redondo 16 Niccolò Venerandi 15 Bhushan Shah 11 Alexander Lohnau 11 Kristen McWilliam 9 Oliver Beard 9 Shubham Arora 8 Alexey Rochev 8 Han Young 8 Philipp Kiemle 7 Albert Astals Cid 6 Aleix Pol 6 Méven Car 5 Devin Lin 5 Joshua Goins 4 Alexander Wilms 4 Arjen HiemstraAnd what about for all time? 1543 Fushan Wen 1497 Marco Martin 1374 Kai Uwe Broulik 1030 David Edmundson 772 Nate Graham 658 Alexander Lohnau 551 Aleix Pol 548 Nicolas Fella 438 ivan tkachenko 385 Eike Hein 264 Sebastian Kügler 250 Martin Gräßlin 238 Harald Sitter 232 Martin Klapetek 223 Jonathan Riddell 207 Vlad Zahorodnii 194 David Redondo 190 Friedrich W. H. Kossebau 189 Laurent Montel 144 Bhushan Shah 134 Christoph Wolk 134 Ismael Asensio 126 Lukáš Tinkl 121 Niccolò Venerandi 117 Méven Car 105 Natalie Clarius 91 Konrad Materka 80 Vishesh Handa 80 Volker Krause 79 Ivan ČukićShellCorona both changing and breaking a lot is no great surprise to me; it’s fiddly and complicated. We need to do something about that. The number of emergencies doesn’t look too bad, and momentum feels fine too. The project also appears to have a nice healthy diversity of contributors. Excellent!It’s been quite illuminating to run these tools on KDE projects that I’m both more and less familiar with. Give it a try!