It’s time for the end of 2017 KDE fundraiser, and so this is good a time as any during the year to take a step back and publish a retrospective on the work we’ve individually done in 2017.
For those maintaining a module or two this isn’t too hard to figure out what you’ve done with some git magic. But if you’ve made contributions to more than a few modules it can be a bit unwieldy trying to figure out what work you’ve actually done.
While it’s probably not too difficult to craft a find(1)
command to search recursively under a common directory for git modules, and then run git-log
to look for commits with a given author, it can take a significant amount of time to go through that list if you have a set of checkouts like mine.
Instead, I used kdesrc-build to help, using the --query
flag I blogged about a few days ago. Using kdesrc-build to query for a source directory isn’t very helpful here compared to raw use of find(1)
. Rather, it allowed me to allow use kdesrc-build’s own facilities for filtering through modules to build so that I could eliminate git modules I know I’ve had nothing to do with in a way that isn’t as easily expressible using find
flags.
In my case, I used a command like this:
kdesrc-build --query source-dir --resume-from extra-cmake-modules | \
cut -f 2 -d ':' | \
while read dir ; do \
[ -d "$dir" ] && cd "$dir" && \
git --no-pager log --since='2017-01-01' \
--pretty="tformat:$(basename $dir): %s" \
--author='mpyne@kde.org' --committer='mpyne@kde.org' ; \
done
What this does is to run kdesrc-build and have it generate its module list as normal, using the --resume-from
command to skip over a bunch of large modules I had nothing to do with, and output a line for each of those modules in the form “ki18n: /kdesrc/src/kf5/frameworks/ki18n”.
Each line is fed to cut(1)
, which prints just the part after the colon (sed(1)
would work as well). This path is fed into the while
loop, which extracts each input line into the $dir
variable, and uses that variable to make sure the directory is actually checked-out and if so, runs git-log
in that directory.
Git then actually does the search for any commits since the date given (2017-01-01) by the author(s) or committer(s) you pass. I use the --no-pager
flag before the git subcommand so that I don’t have to pipe to cat(1)
to avoid the automatic interactive result display.
Finally, I use the --pretty
flag to cause git to also include the basename of the directory when it is showing each commit. This helps organize where you did your work in a form that’s easy to slice-and-dice later.
So, what did I do this year? It was split up among these major categories:
- The kdesrc-build changes I already mentioned.
- KCoreAddons: Minor fixes, including to improve desktop entry specification parsing and legacy KDE service type handling. I then fixes a similar issue in KConfig.
- KI18N: Mark .h files generated by
uic
as ineligible for CMake’s AUTOMOC (fixes a warning of a new CMake policy) - KF5: Make it compile with Alpine Linux (which uses musl). This work was actually to support kdesrc-build in a Docker container, but I never got around to publishing that… :(. This touched KIO, Solid, KInit, KSysGuard.
- KWallet: Coverity fixes (on that note, we need someone to start running Coverity builds again…)
- and finally… completed Kacper Kasper’s port of JuK to KF5! This work was released with KDE Applications 17.12. There are still things missing but in some important internal ways, the port is even more complete than the port of JuK from KDE3 to KDE4 was. Unlike the KDE4 version which always used kde3support, JuK now doesn’t use any compatibility libraries, not even Kdelibs4Support, and should compile without warnings (deprecated uses or otherwise).
While it has been (and continues to be) difficult to find time to make a meaningful impact with a full-time job outside of software development and a growing family, I hope to be at least as productive in the year to come in 2018.
Happy New Year’s everyone and if you have some spare change lying around, please don’t hesitate to support the KDE fundraising drive! Every bit goes to work on something important, and each contribution helps.