Meine allerersten Schritte beim Mitwirken an der Freie-Software-Gemeinschaft (bestehende Projekte)

In den vergangenen Tagen habe ich der Freie-Software-Gemeinschaft weitaus weniger beigetragen, als ich von ihr profitiert habe, und das, was ich beigetragen habe, beschränkte sich auf kleine, einfache persönliche Projekte sowie Beiträge ohne Code (etwa einige Übersetzungen, das Hochladen einiger Screenshots auf Debian Screenshots und das Verfassen von Beiträgen für die Free Software Chinese Site). Im vergangenen Jahr habe ich C/C++, Qt, Assemblersprache und etwas Rust gelernt, und ich denke, es ist an der Zeit, etwas Sinnvolles für die Freie-Software-Gemeinschaft und die Freie-Software-Bewegung zu tun.

HAFTUNGSAUSSCHLUSS: Das ist keine Anleitung! Ich schreibe diesen Beitrag nur, um meine eigenen Erfahrungen zu teilen. Bitte ziehe die einschlägige Dokumentation zu Rate und wende dich an Expertinnen und Experten, um mehr darüber zu erfahren, wie man zur Freie-Software-Gemeinschaft beitragen kann.

Warum ich KDE gewählt habe

Ursprünglich hatte ich darüber nachgedacht, zu postmarketOS beizutragen. Allerdings hatte ich das Gefühl, dass meine Fähigkeiten bei Weitem nicht ausreichten, und ich beschloss, mit etwas relativ Einfachem zu beginnen. Da ich mit C++ und Qt besser vertraut bin, habe ich KDE für meinen ersten Beitrag zur Gemeinschaft gewählt.

Gefühle

Meine Fähigkeit, Quellcode zu lesen, ist schwach. Etwa Anfang 2025 versuchte ich, den Quellcode von PDF Arranger zu lesen, und fühlte mich krank und überwältigt.

Dank der Erfahrung aus dem Erlernen von Reverse Engineering, das das Lesen von Assemblersprache erfordert, hat sich jedoch auch meine Fähigkeit verbessert, Quellcode in Hochsprachen zu lesen. Deshalb denke ich, dass ich einen echten Beitrag zu Freier Software versuchen sollte, um meine Fähigkeiten in einer realen Umgebung zu üben.

Bevor ich den Quellbaum öffnete, war ich etwas nervös, und ich hatte Angst, vom Quellcode überwältigt zu werden, so wie es mir beim Lesen des PDF-Arranger-Quellcodes ergangen war. Dank der Ermutigung meines Freundes Integral fand ich den Mut, diesen Schritt zu gehen.

Werkzeuge

Eine der von KDE empfohlenen Entwicklungsumgebungen ist die neueste Version von Fedora KDE. Da ich Qubes OS verwende, ist es für mich sehr einfach, schnell eine eigenständige HVM einzurichten und meine gesamte Arbeit darin zu erledigen.

Danach richtete ich kde-builder gemäß der offiziellen Dokumentation für KDE-Entwicklerinnen und -Entwickler ein.

Arbeit

Ich ging die Fehlerliste durch, die auf KDEs offiziellem Bugzilla gehostet wird. Mir fiel ein Fehler auf, der sehr leicht zu beheben schien, aber nachdem ich den Quellcode geholt und das Binärprogramm gebaut hatte, stellte ich fest, dass der Fehler in meiner Umgebung mit der neuesten Version von Ark nicht reproduzierbar war.

Dann ging ich zurück zur Fehlerliste und entdeckte einen weiteren Fehler, der trivial wirkte. Die Systemumgebung und die Softwareversion im Fehlerbericht waren dieselben wie bei mir (Fedora KDE, 26.04), und der Fehler war in der Anwendung aus Fedora’s offiziellem Repository reproduzierbar. Nachdem ich das bestätigt hatte, holte ich den Quellcode und baute ihn.

Ich startete GDB auf dem Binärprogramm ~/kde/build/konsole/bin/konsole. Nachdem ich die im Fehlerbericht genannte Zeichenkette (calt,liga,ss03, ss07,ss09) in das Feld eingefügt hatte, sah ich diese Ausgabe in der Konsole:

The tag name must be exactly 4 characters long!

Nach mehreren Gesprächen mit einem LLM fand ich mithilfe eines GDB-Python-Skripts einen Weg, die Zeile im Quellcode zu lokalisieren, die diese Meldung ausgibt:

python
import gdb

TARGET = b"The tag name must be exactly 4 characters long!"

class FilteredWrite(gdb.Breakpoint):
    def stop(self):
        fd = int(gdb.parse_and_eval("$rdi"))
        if fd not in (1, 2):
            return False

        buf = int(gdb.parse_and_eval("$rsi"))
        count = int(gdb.parse_and_eval("$rdx"))

        try:
            data = gdb.selected_inferior().read_memory(buf, count).tobytes()
        except gdb.MemoryError:
            return False

        if TARGET in data:
            gdb.write("\n=== matched output ===\n")
            gdb.write(data.decode("utf-8", "replace") + "\n")
            gdb.execute("bt full")
            return True

        return False

FilteredWrite("write")

Nach einer GDB-Sitzung bestätigte ich, dass die Warnung aus der Datei kfontchooser.cpp in kwidgetsaddons ausgelöst wurde. Ich fand auch die Funktion, die die Warnung auslöst:

void KFontChooserPrivate::slotFeaturesChanged(const QString &features)
{
    m_selectedFont.clearFeatures();

    if (features.isEmpty()) {
        return;
    }

    const QStringList rawFeaturesList = features.split(QLatin1Char(','), Qt::SkipEmptyParts);
    for (const QString &feature : rawFeaturesList) {
        auto f = QStringView(feature).trimmed();
        if (f.isEmpty()) {
            continue;
        }
        QList<QStringView> parts = f.split(QStringLiteral("="), Qt::SkipEmptyParts);
        if (parts.length() == 2) {
            const auto tag = QFont::Tag::fromString(parts[0]);
            bool ok = false;
            const int number = parts[1].toInt(&ok);
            if (tag.has_value() && ok) {
                m_selectedFont.setFeature(tag.value(), number);
            }
        } else if (f.size() <= 4) {
            const auto tag = QFont::Tag::fromString(feature);
            if (tag.has_value()) {
                m_selectedFont.setFeature(tag.value(), 1);
            }
        }
    }

    Q_EMIT q->fontSelected(m_selectedFont);
}

Mir fiel auf, dass das Ergebnis des Teilens getrimmt wurde:

auto f = QStringView(feature).trimmed();

aber die ursprüngliche, nicht getrimmte Zeichenkette weiterhin als Tag verwendet wurde:

const auto tag = QFont::Tag::fromString(feature);

Das scheint ein Fehler des Entwicklers zu sein. Um das Problem zu beheben, müssen wir nur die nicht getrimmte Zeichenkette durch die getrimmte ersetzen:

const auto tag = QFont::Tag::fromString(f);

Danach war es an der Zeit, einen Branch zu erstellen, die Änderung in diesen Branch zu committen und einen Merge Request einzureichen. Aufgrund meiner begrenzten Erfahrung mit Git stieß ich jedoch auf ein Problem:

warning: redirecting to https://invent.kde.org/rebellfs/kwidgetsaddons.git/
Enumerating objects: 21973, done.
Counting objects: 100% (21973/21973), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2790/2790), done.
Writing objects: 100% (21973/21973), 41.17 MiB | ... KiB/s, done.
Total 21973 (delta 13428), reused 21374 (delta 12884), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (13428/13428), done.
remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Push declined - commits failed audit
remote: Should the audit failures above mention issues regarding your name, please ensure that your Git username has been set to your full name.
remote: Please see https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup for more details on ensuring Git has been fully configured.
remote: In the event that your full name has been set and is shown above as being rejected, please file a Sysadmin ticket at https://go.kde.org/systickets
To https://invent.kde.org/rebellfs/kwidgetsaddons
! [remote rejected]     work/rebel1725/fix523757 -> work/rebel1725/fix523757 (pre-receive hook declined)
error: failed to push some refs to 'https://invent.kde.org/rebellfs/kwidgetsaddons'

Schließlich reichte ich die Änderung über den Browser ein, da es sich nur um eine triviale Änderung an einer einzigen Datei handelte.

Fazit

Heute habe ich meinen allerersten Beitrag zur Freie-Software-Gemeinschaft geleistet und bin zugleich ein brandneuer Freie-Software-Mitwirkender geworden. In Zukunft hoffe ich, immer mehr beizutragen, meine Fähigkeiten zu schärfen und der Gemeinschaft sowie der Freie-Software-Bewegung noch nützlicher zu sein.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy