Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 481 – Migration von CPython zu Git, Github und Phabricator

Autor:
Donald Stufft <donald at stufft.io>
Status:
Zurückgezogen
Typ:
Prozess
Erstellt:
29-Nov-2014
Post-History:
29-Nov-2014

Inhaltsverzeichnis

Zusammenfassung

Hinweis

Diese PEP wurde zurückgezogen. Wenn Sie nach der PEP suchen, die den Umzug nach Github dokumentiert, verweisen Sie bitte auf PEP 512.

Diese PEP schlägt die Migration des Repository-Hostings von CPython und der unterstützenden Repositories zu Git und Github vor. Sie schlägt auch die Hinzufügung von Phabricator als Alternative zu Github Pull Requests zur Bearbeitung von Änderungsreviews vor. Diese spezielle PEP wird als Alternative zu PEP 474 und PEP 462 angeboten, die darauf abzielen, die gleichen Gesamtleistungen zu erzielen, sich aber auf Tools beschränkt, die Mercurial unterstützen und vollständig Open Source sind.

Begründung

CPython ist ein Open-Source-Projekt, das auf eine Reihe von Freiwilligen angewiesen ist, die ihre Zeit spenden. Als Open-Source-Projekt ist es darauf angewiesen, neue Freiwillige zu gewinnen und bestehende zu halten, um weiterhin eine gesunde Arbeitskraft zur Verfügung zu haben. Zusätzlich zur Erhöhung der für das Projekt verfügbaren Arbeitskraft muss auch die effektive Nutzung der vorhandenen Arbeitskraft ermöglicht werden.

Die aktuelle Toolchain des CPython-Projekts ist eine benutzerdefinierte und einzigartige Kombination von Werkzeugen, die einen Workflow vorschreibt, der einem in vielen älteren Projekten ähnelnden Workflow ähnelt, der aber mit der Zeit immer weniger beliebt wird.

Die Einzigartigkeit der CPython-Toolchain und des Workflows bedeutet, dass jeder neue Mitwirkende Zeit darauf verwenden muss, die Tools und den Workflow zu lernen, bevor er mit der Mitarbeit an CPython beginnen kann. Sobald ein neuer Mitwirkender den Prozess des Lernens des CPython-Workflows durchlaufen hat, ist es auch unwahrscheinlich, dass er dieses Wissen auf zukünftige Projekte anwenden kann, zu denen er beitragen möchte. Dies wirkt als Beitragshürde, die potenzielle neue Mitwirkende abschrecken wird.

Zusätzlich sind die von CPython verwendeten Werkzeuge unterwartet, veraltet und es fehlen wichtige Funktionen, die es Committern ermöglichen, ihre Zeit bei der Überprüfung und Genehmigung von Änderungen effektiver zu nutzen. Die Tatsache, dass sie unterwartet sind, bedeutet, dass Fehler wahrscheinlich länger bestehen bleiben, wenn sie überhaupt behoben werden, und dass sie wahrscheinlich für längere Zeit ausfallen werden. Die Tatsache, dass sie veraltet sind, bedeutet, dass sie die Fähigkeiten der modernen Webplattform nicht effektiv nutzen. Schließlich bedeutet die Tatsache, dass ihnen mehrere wichtige Funktionen fehlen, wie z. B. das Vortesten von Commits und ein automatisches Merge-Tool, dass Committer unnötige Zusatzarbeit leisten müssen, um selbst die einfachsten Änderungen zu committen.

Versionskontrollsystem

Die erste Entscheidung, die getroffen werden muss, ist das VCS des primären serverseitigen Repositories. Derzeit verwendet das CPython-Repository sowie eine Reihe von unterstützenden Repositories Mercurial. Bei der Bewertung des VCS müssen wir die Fähigkeiten des VCS selbst sowie den Netzwerkeffekt und den Bekanntheitsgrad der Community rund um dieses VCS berücksichtigen.

Es gibt wirklich nur zwei reale Optionen dafür: Mercurial und Git. Zwischen beiden sind die technischen Fähigkeiten weitgehend gleichwertig. Aus diesem Grund wird diese PEP die technischen Argumente über das VCS-System weitgehend ignorieren und sich stattdessen auf die sozialen Aspekte konzentrieren.

Es ist nicht möglich, genaue Zahlen über die Anzahl der Projekte oder Personen zu erhalten, die ein bestimmtes VCS verwenden. Wir können dies jedoch anhand mehrerer Informationsquellen darüber ableiten, welches VCS Projekte verwenden.

Die Statistiken von Open Hub (ehemals Ohloh) [1] zeigen, dass 37 % der von Open Hub indizierten Repositories Git verwenden (nur zweitrangig hinter SVN mit 48 %), während Mercurial nur 2 % hat (nur Bazaar mit 1 % schlagend). Dies macht Git auf Open Hub etwas mehr als 18 Mal so beliebt wie Mercurial.

Eine weitere Informationsquelle über die Beliebtheit der verschiedenen VCS ist PyPI selbst. Diese Quelle richtet sich stärker an die Python-Community selbst, da sie für Python entwickelte Projekte repräsentiert. Leider hat PyPI keinen Standardort für die Darstellung dieser Informationen, sodass dies eine manuelle Verarbeitung erfordert. Wenn wir unsere Suche auf die Top 100 Projekte auf PyPI (geordnet nach Downloadzahlen) beschränken, können wir sehen, dass 62 % davon Git verwenden, während 22 % Mercurial und 13 % etwas anderes verwenden. Dies macht Git für die Top 100 Projekte auf PyPI knapp 3 Mal so beliebt wie Mercurial.

Offensichtlich ist Git nach diesen Zahlen mit Abstand das beliebtere DVCS für Open-Source-Projekte, und die Wahl des beliebteren VCS hat eine Reihe von positiven Vorteilen.

Für neue Mitwirkende erhöht es die Wahrscheinlichkeit, dass sie die Grundlagen von Git bereits im Rahmen der Arbeit an einem anderen Projekt gelernt haben, oder dass sie, wenn sie Git gerade lernen, dieses Wissen auf andere Projekte anwenden können. Darüber hinaus bedeutet eine größere Community mehr Leute, die Anleitungen schreiben, Fragen beantworten und Artikel über Git verfassen, was es für einen neuen Benutzer einfacher macht, Antworten und Informationen über das Tool zu finden, das er lernen möchte.

Ein weiterer Vorteil ist, dass aufgrund einer größeren Community mehr Tools *darum herum* geschrieben werden. Dies erhöht die Optionen für alles, von GUI-Clients über Hilfsskripte bis hin zu Repository-Hosting usw.

Repository-Hosting

Diese PEP schlägt die Zulassung von GitHub Pull Requests vor, jedoch hat GitHub keine Möglichkeit, Pull Requests für ein Repository einzureichen, das nicht auf GitHub gehostet wird. Diese PEP schlägt auch vor, dass zusätzlich zu GitHub Pull Requests die Differential-App von Phabricator verwendet werden kann, um vorgeschlagene Änderungen einzureichen, und Phabricator *erlaubt* das Einreichen von Änderungen für ein Repository, das nicht auf Phabricator gehostet wird.

Aus diesem Grund schlägt diese PEP die Nutzung von GitHub als kanonischen Speicherort des Repositories vor, mit einem schreibgeschützten Spiegel auf Phabricator. Sollte GitHub zu irgendeinem Zeitpunkt in der Zukunft nicht mehr gewünscht sein, kann das Repository-Hosting einfach vollständig auf Phabricator verschoben werden und die Möglichkeit, GitHub Pull Requests zu akzeptieren, entfällt.

Zusätzlich zum Hosting der Repositories auf Github wird eine schreibgeschützte Kopie aller Repositories auch auf der PSF-Infrastruktur gespiegelt.

Code-Review

Derzeit verwendet CPython eine benutzerdefinierte Abzweigung (Fork) von Rietveld, die modifiziert wurde, um nicht auf Google App Engine zu laufen, was derzeit nur von einer Person gewartet werden kann. Außerdem fehlen Funktionen, die in vielen modernen Code-Review-Tools vorhanden sind.

Diese PEP schlägt vor, sowohl Github Pull Requests als auch Phabricator-Änderungen zuzulassen, um Änderungen vorzuschlagen und Code zu überprüfen. Sie schlägt beide vor, damit Mitwirkende auswählen können, welches Tool ihnen am besten ermöglicht, Änderungen einzureichen, und Gutachter sich auf die Überprüfung von Änderungen in den Tools konzentrieren können, die sie am besten mögen.

GitHub Pull Requests

GitHub ist eine sehr beliebte Code-Hosting-Seite und wird zunehmend zum primären Ort, an dem Menschen nach Projekten suchen, zu denen sie beitragen können. Die Ermöglichung von Beiträgen über GitHub bedeutet, dass Mitwirkende Tools nutzen können, mit denen sie wahrscheinlich bereits vertraut sind, oder wenn nicht, können sie dieses Wissen auf andere Projekte anwenden.

GitHub Pull Requests haben einen ziemlich großen Vorteil gegenüber dem älteren Modell „Patch an den Bug-Tracker senden“. Sie ermöglichen es Entwicklern, vollständig innerhalb ihres VCS mit Standard-VCS-Tools zu arbeiten, sodass keine Patch-Datei erstellt und herausgefunden werden muss, wo sie hochgeladen werden soll. Dies senkt die Hürde für das Einreichen einer Änderung zur Überprüfung.

Auf der Gutachterseite sind GitHub Pull Requests viel einfacher zu überprüfen. Sie bieten gut hervorgehobene Diff-Ansichten, die entweder im einheitlichen oder nebeneinanderliegenden Modus betrachtet werden können. Sie ermöglichen das Erweitern des Kontextes eines Diff bis hin zur gesamten Datei. Schließlich ermöglichen sie Inline-Kommentare und Kommentare zur gesamten Pull-Anfrage und präsentieren diese auf eine übersichtliche Weise, die auch nicht mehr zutreffende Kommentare ausblendet. Github bietet auch eine "gerenderte Diff"-Ansicht, die das einfache Anzeigen eines Diff von gerendertem Markup (wie rst) ermöglicht, anstatt das Diff des Roh-Markups überprüfen zu müssen.

Der Pull-Request-Workflow macht es auch trivial, die Möglichkeit zu aktivieren, eine Änderung vor dem eigentlichen Zusammenführen zu testen. Jede einzelne Pull-Anfrage kann eine beliebige Anzahl verschiedener Arten von "Commit-Status" haben, die den Commit (und damit die Pull-Anfrage) als ausstehend, erfolgreich, fehlerhaft oder fehlgeschlagen markieren. Dies macht es einfach, inline zu sehen, ob die Pull-Anfrage alle Tests besteht, ob der Mitwirkende eine CLA unterzeichnet hat usw.

Das eigentliche Zusammenführen eines Github Pull Requests ist sehr einfach. Ein Kernprüfer muss einfach auf die Schaltfläche "Zusammenführen" klicken, sobald der Status aller Prüfungen der Pull-Anfrage grün für erfolgreich ist.

GitHub bietet auch einen guten Workflow für die Einreichung von Pull Requests zu einem Projekt vollständig über die Weboberfläche. Dies würde es dem Python-Dokumentation ermöglichen, auf jeder Seite "Auf GitHub bearbeiten"-Schaltflächen zu haben, und Personen, die Dinge wie Tippfehler, Ungenauigkeiten entdecken oder einfach Verbesserungen an den von ihnen gerade geschriebenen Dokumenten vornehmen möchten, können einfach auf diese Schaltfläche klicken und einen In-Browser-Editor erhalten, der es ihnen ermöglicht, Änderungen vorzunehmen und eine Pull-Anfrage zu senden, alles bequem von ihrem Browser aus.

Phabricator

Zusätzlich zu GitHub Pull Requests schlägt diese PEP auch vor, eine Phabricator-Instanz einzurichten und auf die GitHub-gehosteten Repositories zu verweisen. Dies ermöglicht die Nutzung der Phabricator-Review-Anwendungen Differential und Audit.

Differential funktioniert ähnlich wie GitHub Pull Requests, außer dass für das Hochladen von Patches zu Phabricator die Installation des Befehlszeilentools arc erforderlich ist.

Ob Phabricator für ein bestimmtes Repository aktiviert werden soll, kann von Fall zu Fall entschieden werden. Diese PEP schlägt nur vor, dass es für das CPython-Repository aktiviert sein muss, für kleinere Repositories wie das PEP-Repository lohnt sich der Aufwand jedoch möglicherweise nicht.

Kritik

X ist nicht in Python geschrieben

Ein Merkmal, das die aktuelle Werkzeugkombination (Mercurial, Rietveld) aufweist, ist, dass die Hauptsprache aller Komponenten in Python geschrieben ist. Diese PEP vertritt die Meinung, dass wir uns auf die *besten* Werkzeuge für die jeweilige Aufgabe konzentrieren sollten und nicht auf die *besten* Werkzeuge, die zufällig in Python geschrieben sind. Die ehrenamtliche Zeit ist eine wertvolle Ressource für jedes Open-Source-Projekt, und wir können diese Zeit am besten respektieren und nutzen, indem wir uns auf die Vor- und Nachteile der Werkzeuge selbst konzentrieren und nicht auf die Sprache, in der ihre Autoren sie zufällig geschrieben haben.

Ein Anliegen ist die Möglichkeit, Werkzeuge anzupassen, um für uns zu funktionieren. Eines der Ziele hier ist es jedoch, Software *nicht* anzupassen, um für uns zu funktionieren, sondern uns selbst an einen standardmäßigeren Workflow anzupassen. Diese Standardisierung zahlt sich in der Möglichkeit aus, Werkzeuge sofort wiederverwenden zu können, wodurch Entwicklungszeit frei wird, um tatsächlich an Python selbst zu arbeiten, sowie den Wissensaustausch zwischen Projekten zu ermöglichen.

Wenn wir jedoch die Werkzeuge modifizieren müssen, ist Git selbst größtenteils in C geschrieben, genau wie CPython selbst. Es kann auch Befehle enthalten, die in jeder Sprache geschrieben sind, einschließlich Python. Phabricator ist in PHP geschrieben, was eine recht gängige Sprache in der Web-Welt ist und relativ leicht zu erlernen ist. GitHub selbst ist größtenteils in Ruby geschrieben, aber da es nicht Open Source ist, gibt es keine Möglichkeit, es zu modifizieren, sodass seine Implementierungssprache völlig bedeutungslos ist.

GitHub ist nicht Free/Open Source

GitHub ist ein wichtiger Teil dieses Vorschlags und jemand, der eher zu Ideologie als zu Pragmatismus neigt, könnte sich aus diesem Grund gegen diese PEP aussprechen. Diese PEP vertritt die Meinung, dass die Nutzung ausschließlich freier/Open-Source-Software zwar eine attraktive Idee und ein edles Ziel ist, aber die Zeit der Mitwirkenden durch die Bereitstellung guter, gut gewarteter Werkzeuge, die sie entweder bereits kennen oder, wenn sie sie lernen, auf andere Projekte anwenden können, eine wichtigere Angelegenheit ist als die Behandlung, ob etwas Free/Open Source ist, als harte Anforderung.

Die Geschichte hat uns jedoch gezeigt, dass manchmal wohlwollende proprietäre Unternehmen aufhören können, wohlwollend zu sein. Dies wird auf verschiedene Weise abgefedert.

  • Wir nutzen den GitHub Issue Tracker nicht, sowohl weil er für CPython nicht leistungsfähig genug ist, als auch weil für das primäre CPython-Repository die Möglichkeit, unsere Issues zu nehmen und sie woanders hinzulegen, wenn wir GitHub jemals verlassen müssen, davon abhängt, dass GitHub weiterhin API-Zugriff gewährt.
  • Wir nutzen den GitHub Pull Request-Workflow, jedoch leben alle diese Änderungen innerhalb von Git. Ein Spiegel der GitHub-Repositories kann also leicht alle diese Pull Requests enthalten. Wir würden potenziell alle Kommentare verlieren, wenn GitHub plötzlich "böse" würde, aber die Änderungen selbst würden immer noch existieren.
  • Wir nutzen die GitHub-Repository-Hosting-Funktion, aber da dies nur Git ist, ist ein Umzug von GitHub so einfach wie das Pushen des Repositories an einen anderen Ort. Die Datenportabilität für das Repository selbst ist extrem hoch.
  • Wir nutzen auch Phabricator, um eine Alternative für Personen anzubieten, die GitHub nicht nutzen möchten. Dies dient auch als Fallback-Option, die bereits vorhanden ist, wenn wir GitHub jemals nicht mehr nutzen müssen.

Die Abhängigkeit von GitHub bringt eine Reihe von Vorteilen mit sich, die über die Vorteile der Plattform selbst hinausgehen. Da es sich um ein kommerziell unterstütztes Unternehmen handelt, gibt es Vollzeitmitarbeiter, die für die Wartung seiner Dienste verantwortlich sind. Dazu gehört die Sicherstellung, dass sie hochfahren, dass sie für verschiedene Sicherheitslücken gepatcht sind und dass die Software und Infrastruktur im Laufe der Zeit weiter verbessert werden.

Mercurial ist besser als Git

Ob Mercurial oder Git technisch besser ist, ist eine sehr subjektive Meinung. Diese PEP gibt nicht an, ob die Mechanik von Git oder Mercurial besser ist, sondern konzentriert sich stattdessen auf den Netzwerkeffekt, der für beide Optionen verfügbar ist. Da diese PEP den Wechsel zu Git vorschlägt, bleiben die Leute, die Mercurial bevorzugen, außen vor. Diese Benutzer können jedoch weiterhin mit Mercurial arbeiten, indem sie die [2] hg-git-Erweiterung für Mercurial verwenden, mit der es mit einem Repository arbeiten kann, das serverseitig Git ist.

CPython Workflow ist zu kompliziert

Ein Gefühl, das aus früheren Diskussionen kam, war, dass das Mehrzweig-Modell von CPython für Github Pull Requests zu kompliziert sei. Diese PEP ist der Überzeugung, dass diese Aussage nicht zutreffend ist.

Derzeit erfordert jede einzelne Änderung die manuelle Erstellung eines Patches für 2.7 und 3.x, was sich in dieser Hinsicht überhaupt nicht ändern wird.

Wenn jemand eine Korrektur für den aktuellen stabilen Branch (derzeit 3.4) einreicht, kann der GitHub Pull Request-Workflow verwendet werden, um im Browser einen Pull Request zu erstellen, um den aktuellen stabilen Branch in den Master-Branch zu mergen (vorausgesetzt, es gibt keine Merge-Konflikte). Bei einem Merge-Konflikt muss dieser lokal behandelt werden. Dies bietet eine Verbesserung gegenüber der aktuellen Situation, in der der Merge immer lokal erfolgen muss.

Wenn schließlich jemand eine Korrektur für den aktuellen Entwicklungsbranch einreicht, muss diese manuell in den stabilen Branch übernommen werden, wenn sie auch dort enthalten sein soll. Dies muss ebenfalls lokal im neuen Workflow erfolgen, könnte aber bei kleineren Änderungen einfach im GitHub Web-Editor erfolgen.

Wenn man sich das ansieht, glaube ich nicht, dass *irgendein* System die Komplexität, die mit der Wartung mehrerer langlaufender Branches verbunden ist, verbergen kann. Das Einzige, was das Werkzeug tun kann, ist, es so einfach wie möglich zu machen, Änderungen einzureichen.

Beispiel: Scientific Python

Eine der Kernideen hinter dem Umzug zu sowohl Git als auch Github ist, dass ein Merkmal eines DVCS, des Repository-Hostings und des verwendeten Workflows das soziale Netzwerk und die Größe der Community ist, die diese Werkzeuge nutzt. Dies können wir anhand eines Beispiels aus einer Untergemeinschaft der Python-Community sehen: Die Scientific Python-Community. Sie haben bereits die meisten Schlüsselkomponenten des SciPy-Stacks auf Github migriert, indem sie den Pull-Request-basierten Workflow verwenden. Dieser Prozess begann mit IPython, und als weitere Projekte hinzukamen, wurde er zu einem natürlichen Standard für neue Projekte in der Community.

Sie behaupten, große Vorteile aus diesem Schritt gezogen zu haben, da er Gelegenheitsmitwirkenden ermöglicht, problemlos zwischen verschiedenen Projekten innerhalb ihrer Subgemeinschaft zu wechseln, ohne einen speziellen, maßgeschneiderten Workflow und eine andere Toolchain für jedes Projekt lernen zu müssen. Sie haben festgestellt, dass, wenn Menschen ihre begrenzte Zeit für tatsächliche Beiträge aufwenden können, anstatt verschiedene Tools und Workflows zu lernen, sie nicht nur mehr zu einem Projekt beitragen, sondern auch weitere Projekte erschließen und zu ihnen beitragen. Dieser Schritt wird auch der zunehmenden Tendenz zugeschrieben, dass Mitglieder dieser Community ihre Forschung und Bildungsmaterialien sogar auf Github veröffentlichen.

Dieses Beispiel zeigt die wahre Stärke des Umzugs zu einer hochpopulären Toolchain und einem hochpopulären Workflow, da jede Abweichung eine weitere Hürde für neue und Gelegenheitsmitwirkende darstellt und die Zeit, die für das Erlernen dieses Workflows aufgewendet wird, mit anderen Projekten weniger wiederverwendbar macht.

Referenzen


Quelle: https://github.com/python/peps/blob/main/peps/pep-0481.rst

Zuletzt geändert: 2025-02-01 08:55:40 GMT