1. Einführung

Dieses Dokument enthält Informationen für Entwickler über die LinuxCNC-Infrastruktur und beschreibt die besten Praktiken für das Einbringen von Code- und Dokumentations-Updates in das LinuxCNC-Projekt.

In diesem Dokument bedeutet "Quelle" sowohl den Quellcode der Programme und Bibliotheken als auch den Quelltext der Dokumentation.

2. Kommunikation unter LinuxCNC-Entwicklern

Die Projektentwickler kommunizieren hauptsächlich auf zwei Arten miteinander:

3. Das LinuxCNC Source Forge-Projekt

We use Source Forge for mailing lists.

4. Das Git Revisionskontrollsystem

All of the LinuxCNC source is maintained in the Git revision control system.

4.1. LinuxCNC offizielles Git Repository

The official LinuxCNC git repo is at https://github.com/linuxcnc/linuxcnc/

Jeder kann eine schreibgeschützte Kopie des LinuxCNC-Quellbaums über git erhalten:

git clone https://github.com/linuxcnc/linuxcnc linuxcnc-dev

Wenn Sie ein Entwickler mit Schreibrechten (genannt "push" in Anlehnung an das git-Kommando) sind, folgen Sie den Anweisungen in github, um ein Repository einzurichten, von dem aus Sie pushen können.

Beachten Sie, dass der Clone-Befehl das lokale LinuxCNC Repo in ein Verzeichnis namens linuxcnc-dev legt, anstatt des Standardverzeichnisses linuxcnc. Dies wurde so gewählt, da die LinuxCNC-Software standardmäßig die Configurations-Dateien (.ini) und G-Code-Programme in einem Verzeichnis in dem Pfad $HOME/linuxcnc erwartet. Dies soll Verwirrungen zwischen der Entwickung im Git Repository und der Ausführung helfen zu vermeiden.

Problem-Meldungen (engl. issues) und Anforderungen zur Integration eigener Änderungen (genannt pull requests, kurz: PR) sind auf GitHub willkommen: https://github.com/LinuxCNC/linuxcnc/issues https://github.com/LinuxCNC/linuxcnc/pulls

4.2. Verwendung von Git im LinuxCNC-Projekt

Wir verwenden die hier beschriebenen Git-Workflows "merging upwards" und "topic branches":

Wir haben einen Entwicklungszweig namens master und einen oder mehrere stabile Entwicklungszweige (engl. branches) mit Namen wie 2.6 und 2.7, welche die Versionsnummer der daraus jeweils hervorgehenden Veröffentlichung angeben.

Fehlerbehebungen gehen in den ältesten anwendbaren stabilen branch, und dieser branch wird in den nächst neueren stabilen branch zusammengeführt, und so weiter bis zu master. Der Committer des Bugfixes kann die Zusammenführung selbst durchführen, oder sie jemand anderem überlassen.

Neue Funktionen gehen im Allgemeinen in den "Master"-branch, aber einige Arten von Funktionen (insbesondere gut isolierte Gerätetreiber und Dokumentationen) können (nach dem Ermessen der Verantwortlichen für den stabilen branch) in den stabilen branch wandern und dort zusammengeführt werden, genau wie Bugfixes.

4.3. Git-Tutorials

Es gibt viele ausgezeichnete, kostenlose Git-Tutorials im Internet.

Die erste Anlaufstelle ist wahrscheinlich die Manpage "gittutorial". Auf diese Manpage kann man zugreifen, bspw. durch die Ausführung von "man gittutorial" in einem Terminal (wenn man die git-Manpages installiert hat, bei Debian im Paket "git-man"). Das gittutorial und die dazugehörige Dokumentation sind auch hier online verfügbar:

For a more thorough documentation of git see the "Pro Git" book: https://git-scm.com/book

Ein weiteres Online-Tutorial, das empfohlen wurde, ist "Git for the Lazy": https://wiki.spheredev.org/index.php/Git_for_the_lazy

5. Überblick über den Prozess

Ein Überblick darüber, wie man Änderungen am Quelltext vornimmt, sieht folgendermaßen aus:

  • Communicate with the project developers and let us know what you’re hacking on. Explain what you are doing, and why.

  • Clone the git repo.

  • Make your changes in a local branch.

  • Adding documentation and writing tests is an important part of adding a new feature. Otherwise, others won’t know how to use your feature, and if other changes break your feature it can go unnoticed without a test.

  • Kommunizieren Sie Ihre Änderungen mit den anderen Projektentwicklern auf eine der folgenden Arten:

    • Push your branch to github and create a github pull request to https://github.com/linuxcnc/linuxcnc (this requires a github account), or

    • Push your branch to a publicly visible git repo (such as github, or your own publicly-accessible server, etc) and share that location on the emc-developers mailing list, or

    • Email your commits to the LinuxCNC-developers mailing list (<emc-developers@lists.sourceforge.net>) (use git format-patch to create the patches).

  • Advocate for your patch:

    • Explain what problem it addresses and why it should be included in LinuxCNC.

    • Seien Sie offen für Fragen und Rückmeldungen aus der Entwicklergemeinschaft.

    • Es ist nicht ungewöhnlich, dass ein Patch mehrere Überarbeitungen durchläuft, bevor er angenommen wird.

6. Git-Konfiguration

Um für die Aufnahme in den LinuxCNC-Quellcode in Betracht gezogen zu werden, müssen Commits korrekte Author-Felder haben, die den Autor des Commits identifizieren. Eine gute Möglichkeit, dies sicherzustellen, ist die Einstellung der globalen Git-Konfiguration:

git config --global user.name "Your full name"
git config --global user.email "you@example.com"

Benutzen Sie Ihren richtigen Namen und eine direkt nutzbare E-Mail Adresse.

7. Effektive Nutzung von Git

7.1. Commit-Inhalte

Halten Sie Ihre Commits klein und auf den Punkt. Jeder Commit sollte eine logische Änderung am Projektarchiv bewirken.

7.2. Schreiben Sie gute Commit-Nachrichten

Halten Sie die Commit-Meldungen etwa 72 Spalten breit (damit sie in einem Terminalfenster mit Standardgröße nicht umbrechen, wenn sie von git log angezeigt werden).

Verwenden Sie die erste Zeile als Zusammenfassung der Absicht der Änderung (fast wie die Betreffzeile einer E-Mail). Danach folgt eine Leerzeile und dann eine längere Nachricht, in der die Änderung erläutert wird. Beispiel:

7.3. Ein git commit muss im richtigen Entwicklungszweit ausgeführt werden

Fehlerbehebungen sollten im ältesten anwendbaren branch durchgeführt werden. Neue Funktionalität sollte in den Master-Zweig kommen. Wenn Sie sich nicht sicher sind, wo eine Änderung hingehört, fragen Sie im IRC oder auf der Mailingliste.

7.4. Verwenden Sie mehrere Commits, um Änderungen zu organisieren

Organisieren Sie Ihre Änderungen gegebenenfalls in einem Zweig (engl. branch, eine zusammengehörige Folge von Commits), wobei jeder Commit ein logischer Schritt auf dem Weg zum endgültigen Ziel ist. Beispielsweise sollten Sie zunächst einen komplexen Code in eine neue Funktion umwandeln. Beheben Sie dann in einem zweiten Commit einen zugrunde liegenden Fehler. Dann, im dritten Commit, fügen Sie eine neue Funktion hinzu, die durch das Refactoring einfacher geworden ist und die ohne die Behebung des Fehlers nicht funktioniert hätte.

Das ist hilfreich für die Prüfer, denn es ist einfacher zu sehen, dass der Schritt "Code in eine neue Funktion umwandeln" richtig war, wenn keine anderen Änderungen darin enthalten sind; es ist einfacher zu sehen, dass der Fehler behoben ist, wenn die Änderung, die ihn behebt, getrennt von der neuen Funktion ist; und so weiter.

7.5. Folgen Sie den Stil des umgebenden Codes

Bemühen Sie sich, dem vorherrschenden Einrückungsstil des umgebenden Codes zu folgen. Insbesondere Änderungen an Leerzeichen erschweren es anderen Entwicklern, Änderungen im Laufe der Zeit zu verfolgen. Wenn eine Neuformatierung des Codes erforderlich ist, sollten Sie diese getrennt von semantischen Änderungen vornehmen.

7.6. Werden Sie RTAPI_SUCCESS los, verwenden Sie stattdessen 0

Der Test "retval < 0" sollte Ihnen bekannt vorkommen; es ist die gleiche Art von Test, den Sie im Userspace (gibt -1 für Fehler zurück) und im Kernelspace (gibt -ERRNO für Fehler zurück).

7.7. Vereinfachen Sie den komplizierten Verlauf, bevor Sie ihn mit anderen Entwicklern teilen

Mit Git ist es möglich, jede Bearbeitung und jeden Fehlstart als separaten Commit aufzuzeichnen. Dies ist sehr praktisch, um während der Entwicklung Kontrollpunkte zu setzen, aber oft möchte man diese Fehlstarts nicht mit anderen teilen.

Git bietet zwei Möglichkeiten, die Historie zu bereinigen, die beide frei durchgeführt werden können, bevor Sie die Änderung freigeben:

Mit git commit --amend können Sie zusätzliche Änderungen an dem letzten Commit vornehmen und optional auch die Commit-Nachricht ändern. Benutzen Sie dies, wenn Sie sofort merken, dass Sie etwas in der Commit-Nachricht vergessen haben, oder wenn Sie sich in der Commit-Nachricht vertippt haben.

Mit git rebase --interactive upstream-branch können Sie jeden Commit, den Sie seit dem Abzweig (engl. fork) Ihres Entwicklungszweigs vom Upstream-Branch (der Zweig im repository von dem Sie abgezweigt sind) gemacht haben, zurückgehen und dabei möglicherweise Commits bearbeiten, Commits verwerfen oder mit anderen Commits zusammenlegen (Squash). Rebase kann auch verwendet werden, um einzelne Commits in mehrere neue Commits aufzuteilen.

7.8. Stellen Sie sicher, dass jeder commit auch kompiliert werden kann

Wenn Ihre Änderung aus mehreren Patches besteht, kann git rebase -i verwendet werden, um diese Patches in eine Folge von Commits umzuordnen, die Schritte Ihrer Arbeit klarer darstellt. Eine mögliche Folge des Umordnens solcher Patches ist, dass man Abhängigkeiten falsch einordnen kann - zum Beispiel, wenn man die Verwendung einer Variable einführt und die Deklaration dieser Variable erst in einem späteren Patch folgt.

Beim Bauen des HEAD branches würde in einem solchen Fall nicht jeder Commit gebaut. Das machte dann git bisect kaputt - etwas, das jemand anderes später benutzen könnte, um den Commit zu finden, der einen Fehler eingeführte. Es ist also nicht nur wichtig, sicherzustellen, dass Ihr Zweig gebaut wird, sondern auch, dass jeder einzelne Commit erfolgreich kompiliert.

There’s an automatic way to check a branch for each commit being buildable - see https://dustin.sallings.org/2010/03/28/git-test-sequence.html and the code at https://github.com/dustin/bindir/blob/master/git-test-sequence. Use as follows (in this case testing every commit from origin/master to HEAD, including running regression tests):

cd linuxcnc-dev
git-test-sequence origin/master..  '(cd src && make && ../scripts/runtests)'

Dies meldet entweder All is well (engl. für Alles in Ordnung) oder Broke on <commit> (engl. für Fehler bei <commit>)

7.9. Umbenennen von Dateien

Bitte verwenden Sie die Möglichkeit Dateien umzubenennen mit Bedacht. Wie bei der Einrückung einzelner Dateien erschweren auch Umbenennungen die Verfolgung von Änderungen im Laufe der Zeit. Zumindest sollten Sie im IRC oder auf der Mailingliste einen Konsens darüber finden, dass die Umbenennung eine Verbesserung darstellt.

7.10. "Rebase" bevorzugen

Verwenden Sie git pull --rebase anstelle von git pull, um eine schöne lineare Historie zu erhalten. Wenn Sie rebasen, behalten Sie Ihre Arbeit immer als Revisionen, die vor origin/master liegen, so dass Sie Dinge wie git format-patch ausführen können, um Entwicklungen mit anderen zu teilen, ohne sie in das zentrale Repository zu pushen.

8. Übersetzungen

Das LinuxCNC-Projekt verwendet gettext, um die Software in viele Sprachen zu übersetzen. Wir begrüßen Beiträge und Hilfe in diesem Bereich! Das Verbessern und Erweitern der Übersetzungen ist einfach: Sie müssen keine Programmierkenntnisse haben und Sie müssen keine speziellen Übersetzungsprogramme oder andere Software installieren.

Der einfachste Weg, bei Übersetzungen zu helfen, ist die Nutzung von Weblate, einem Open-Source-Webdienst. Unser Übersetzungsprojekt finden Sie hier: https://hosted.weblate.org/projects/linuxcnc/

Die Dokumentation zur Verwendung von Weblate finden Sie hier: https://docs.weblate.org/en/latest/user/basic.html

Wenn Webdienste nicht Ihr Ding sind, können Sie auch mit einer Reihe lokaler Gettext-Übersetzer-Apps wie gtranslator, poedit und vielen anderen an Übersetzungen arbeiten.

9. Andere Möglichkeiten, einen Beitrag zu leisten

Es gibt viele Möglichkeiten, zu LinuxCNC beizutragen, die in diesem Dokument nicht behandelt werden. Diese Wege umfassen:

  • Beantwortung von Fragen im Forum, auf Mailinglisten und im IRC

  • Melden von Fehlern im Bug-Tracker, im Forum, auf Mailinglisten oder im IRC

  • Hilfe beim Testen experimenteller Funktionen