Was wünschen Sie sich von einer Forge?
(lobste.rs)- Nutzer von Jujutsu und anderen Versionsverwaltungssystemen sowie reine Git-Workflows, die von großen Forges nicht ausreichend abgedeckt werden, stehen zur Diskussion
- Im Mittelpunkt steht nicht die Implementierung als SPA/JS oder serverseitig gerendertes HTML, sondern wie ein Repository Versionsverwaltungsfunktionen darstellt und funktionieren lässt
- Es gibt Ideen wie Tangled, GitHubs stacked PRs und Forgefed, aber es ist schwer, einen Ort zu finden, an dem sich Nutzermeinungen zum Design sammeln
- Dazu gehören auch stacked PR/MR und alternative Kollaborationsmodelle; ein zentrales Thema ist die Versionsverwaltungserfahrung jenseits bestehender Forges
- Die Darstellung von Repository-Objekten wie Tags, Commits, Trees und Blobs ist bei den meisten Forges weitgehend ähnlich, und abgesehen von kleinen Formatunterschieden gibt es kaum Diskussionen dazu
1 Kommentare
Meinungen auf Lobste.rs
Code-Review-Kommentare dürfen für mich absolut nicht außerhalb des Repositories selbst liegen
Wertvollen historischen Kontext in Mailinglisten, Datenbank-Silos oder einer separaten Schicht zu speichern, die nicht an einen HEAD-Commit-Hash gebunden ist, ist grundsätzlich dieselbe Art von Risiko wie bei GitHub
Fossil geht teilweise in diese Richtung, behandelt aber nur Issues; Code Review läuft dort weiterhin über E-Mail-Patches: https://fossil-scm.org/home/doc/tip/www/contribute.wiki
Sobald diese Informationen erst einmal im Versionsverwaltungssystem liegen, kann man darauf tolle Web-UIs, RSS-Feeds und Mailinglisten aufsetzen
Die zweite Funktion wäre eingebaute Unterstützung für eine Merge Queue. In nicht ganz trivialen Projekten sollten einzelne Beitragende nicht direkt in den main-Branch pushen dürfen; markiert man einen bestimmten Commit als „bereit zur Integration“, sollte ein Bot die vorgeschlagenen Änderungen serialisieren, CI optimal planen und main auf einen verifizierten Hash vorrücken
Die dritte Funktion ist CI als isolierter Ausführungsdienst für heterogene Umgebungen wie Windows und macOS: https://gregoryszorc.com/blog/2021/…
Jeder sollte ein Konto anlegen und Issues eröffnen können, aber es darf keinen Spam geben
GitHub macht das derzeit ziemlich gut. Man sieht gelegentlich Spam, aber nach einer Missbrauchsmeldung wird er sehr schnell entfernt. Dahinter steckt vermutlich eine Mischung aus Automatisierung und einem echten Team zur Klassifizierung
Ich schaue mir Fossil als „Forge“ für Hobbyprojekte an; viele externe Beiträge erwarte ich nicht, daher wäre Code Review eher ein Nice-to-have
Stattdessen will ich eine SQLite-DB, die sich synchronisieren, versenden und beliebig abfragen lässt
Das nächste große Refactoring, an dem ich bei git-pr arbeiten will, ist, die SQLite-DB über einen SSH-Befehl verfügbar zu machen:
ssh pr.pico.sh sqlSQLite ist überall vorhanden, universell und allgemein nutzbar, aber es fehlt die Usability, es als Teil einer Forge zu behandeln
Ich frage mich nur, woran Kommentare später „angeheftet“ wären und wie Nutzer sie finden sollen, wenn Historie umgeschrieben wird, etwa durch Force-Pushes oder Squash-Merges
Auf GitHub ist der Bezugspunkt der Pull Request, sodass man die Diskussion sehen kann, selbst wenn sich die enthaltenen Commits ändern
Ich frage mich, ob dieses System ebenfalls ein separates PR-Konzept vorsieht, das im Repository gespeichert wird, oder ob eher etwas enger Integriertes gemeint ist
Andererseits nutze ich
jjerfolgreich, also ist es in der Praxis vielleicht gar kein großes ProblemWenn man sowohl Gerrit als auch E-Mail nutzt, ist es schade, dass das Pull-Request-Modell so dominant ist
Besonders dann, wenn Maintainer kleinere Stilprobleme nicht kommentieren, sondern einfach direkt beheben könnten und Beitragende sich um solche Stilfragen vermutlich kaum scheren
Noch bedauerlicher ist aber, dass es für Darcs oder Pijul, die ich inzwischen immer häufiger nutze, überhaupt keinen Workflow außerhalb von E-Mail gibt
Statt E-Mail hätte ich gern etwas XMPP-basiertes. Damit ließe sich in Echtzeit und verteilt an gerade in Arbeit befindlichen Patches zusammenarbeiten, etwa mit einem MUC pro Patchset
MUCs können wie Voice-Chats geöffnet werden, und Dinge wie Rollen, Anhänge, Reaktionen, Suche, MAM, Moderation und Tombstoning nach Abschluss sind bereits per XEP definiert
Für Abonnements könnte man PubSub nutzen und auch als Transport für CI
Für echte Praxistauglichkeit bräuchte man wohl einen dedizierten Client, aber vieles könnte auch in beliebigen Clients einfach funktionieren
Realistisch gesehen ist das vielleicht eher Ausdruck meiner jüngsten Faszination dafür, wie weit sich alte föderierte Technologien unerwartet ausdehnen lassen
Code Review und Freigabe sind der Flaschenhals
Die Kommunikation mit Code-Einreichenden hat sehr hohe Latenzen, dauert oft Wochen oder Monate und ist zudem unzuverlässig. Manche eröffnen einen PR und verschwinden dann
Das GitHub-Modell, das von Hin-und-her-Kommunikation ausgeht, bricht hier völlig zusammen
Es wäre gut, wenn man während des Reviews den Code direkt ändern und Commits wie mit
git-absorbamendieren könnte. Wegen Kleinigkeiten wie Tippfehlern mit dem Einreichenden hin und her zu gehen, ist Zeitverschwendung, und der GitHub-Hack mit Edit Suggestion ist umständlich und macht die Historie unübersichtlichIch will denselben Code nicht noch einmal reviewen. Wenn nur eine Funktion oder ein Commit problematisch ist, sollte ich den Rest vorab freigeben können und nach einem Force-Push des Einreichenden nicht alles noch einmal ansehen müssen
Es wäre gut, wenn man nur Teile eines PR mergen oder Commits aus einem PR entfernen könnte, ohne ihn zu schließen. Manchmal will man zwar die Funktion selbst nicht, aber die dafür geleistete Vorarbeit ist es wert, erhalten zu bleiben; umgekehrt schleichen sich manchmal unnötige „Aufräumarbeiten“ oder Formatierungen ein
Wenn der ursprüngliche Einreichende nicht reagiert, sollten andere an einem PR mitarbeiten, ihn verfeinern und Probleme beheben können. Im GitHub-Modell geht das theoretisch, praktisch wirkt es aber eher wie ein versteckter Trick, einen PR auf einen anderen PR zu bauen, und dieser Code samt Benachrichtigungen ist im Zielprojekt nicht sichtbar. Wenn Leute forken und dann PRs mit Korrekturen einreichen, entstehen nur Verwirrung und Merge-Konflikte
Oft ist eingereichter Code eigentlich ganz brauchbar, man möchte aber noch kleine Verbesserungen. Aus Sicht des Einreichenden fühlt es sich frustrierend an, als würde der PR als Geisel gehalten, bis alle hübschen Abschlussarbeiten erledigt sind, und aus Sicht der Maintainer besteht das Risiko, sofort zu mergen und dann nie mehr Folgeverbesserungen zu bekommen, weil der Einreichende verschwindet. Es wäre gut, eine Möglichkeit zu haben, vorläufig zu mergen, aber mit der Verpflichtung, später noch aufzuräumen. Das könnte etwa bedeuten, in einen Staging-Branch zu mergen, aber nicht in den Stable-Branch zu cherry-picken, bis das FIXME behoben ist
In populären Open-Source-Projekten gibt es oft genau 1 Person, die Code-Reviews und Freigaben geben kann, die das Projekt wirklich voranbringen, während 500 Personen beitragen und sich gegenseitig helfen wollen. Das GitHub-Modell nutzt diese überschüssige Beitragenden-Kapazität überhaupt nicht. Statt Zusammenarbeit zu fördern, verwandelt es sie in Krisen, Chaos und wütenden Gruppendruck. Es braucht bessere Unterstützung für Fork-Verwaltung und das Kopieren von Code zwischen Forks, damit andere experimentieren und ein Projekt voranbringen können, ohne an einer einzelnen Maintainer-Person zu hängen, und damit Maintainer leicht populäre, funktionierende Änderungen aus mehreren Forks auswählen können
In Organisationen war diese Einstellung meines Wissens sogar der Standard, aber unabhängig davon kann man in diesem Fall per Force-Push direkt sauber nachbessern
Für kleine Änderungen, die kein Hin und Her wert sind, mache ich das immer so
Das fühlt sich meist eher nach Monaten oder Jahren als nach Tagen an
Manchmal bin ich selbst der Maintainer, und ich gebe zu, dass ich auch nicht immer schneller bin
Ich möchte Dinge wie „Gehe zur Definition“ oder Hover-Popups mit Signaturen und Doku-Kommentaren
Das geht natürlich, wenn man den Branch auscheckt und im bevorzugten Editor reviewt, aber wie gesagt: Review ist der Flaschenhals
Der Zusatzaufwand, beim Review mehrerer PRs ständig Branches zu wechseln, ist einfach zu groß
Es braucht einen Einzelnutzerbetrieb, oder zumindest einen Einzelnutzer-Modus
Warum sollte ich URLs wie https://code.chrismorgan.example/chrismorgan/repository-name in Kauf nehmen? https://code.chrismorgan.example/repository-name reicht doch
Das meine ich völlig ernst, und unter https://github.com/go-gitea/gitea/issues/11028 sieht man, dass das offenbar viele wollen
Einer der drei Hauptgründe, warum ich kein Fediverse-Konto habe, ist sogar, dass die Adressen schrecklich aussehen
Wenn man wie bei einer primären E-Mail-Adresse @me@chrismorgan.info verwendet, könnte das für manche Leute einfach wie „@me“ aussehen, und @chrismorgan@chrismorgan.info finde ich schon beim Anschauen unangenehm
Das hat ATProto sehr gut gelöst. Domainnamen eignen sich hervorragend als Handles, und wenn man mehrere Nutzer braucht, reichen Subdomains völlig aus
Auch auf einer gemeinsamen Forge könnte man mit Subdomains logisch einen Einzelnutzercharakter herstellen. Es wäre interessant, sich statt github.com/chris-morgan einmal chris-morgan.github.com vorzustellen
Ästhetik ist wichtig
Der Weg zum Einzelnutzerbetrieb hat noch größere Folgen. Selbst wenn man etwas wie Mastodon auf einen Einzelnutzerfall heruntertrimmt, bleibt es schwergewichtig, während Fediverse-Projekte, die von Anfang an für Einzelnutzer entworfen wurden, dafür viel besser geeignet sind
Ich möchte meinen Server selbst betreiben, aber lokal nur ich als Nutzer sein und wegen möglicher weiterer Nutzer keine Kompromisse eingehen müssen
Das bedeutet bei Forges auch, dass ich nicht mit generischen Benutzernamen wie
gitpushen will, sondern wie bei normalem SSH mit einem Benutzernamen wiechrisWenn man unter einer Forge das Übliche versteht, ist Föderation natürlich nötig. Aber auf dem jeweiligen „Home Server“ hätte ich gern jeweils nur einen lokalen Nutzer
Wenn du eine Domain mit deinem Namen nutzt, hast du dort nicht ein ähnliches Problem?
Mir gefiel Nesbitts Artikel zu diesem Thema
Besonders bessere Kommunikation mit Downstream fand ich gut
Es sollte möglich sein, lokales Code Review im Editor der Wahl zu machen
Ich will nicht in einem trägen Web-Interface gefangen sein, das unveränderbare Schriftarten und grauenhaftes Syntax-Highlighting erzwingt
Im Moment nutze ich einen Workflow mit eigenen Tools für Neovim, um Side-by-Side-Diffs gut lesbar zu machen, und mit dem Befehl
git pr, um Pull Requests auszucheckenAber sobald ich auch nur ein bisschen mehr will, etwa Review-Kommentare hinterlassen, bin ich von irgendeiner CLI oder einem Tool abhängig, das mit der GitHub-API spricht und in fünf Jahren vermutlich nicht mehr gepflegt wird
Genauer gesagt braucht es nicht nur Werkzeuge, die lokal „ausführbar“ sind, sondern eher Local-first-Tools, die lokal mit Editor und Co. integriert sind
Dass das schwer zu einer Funktion erster Klasse wird, liegt am hohen Aufwand. Ein einziges Web-Interface „funktioniert“ auf allen Plattformen und in allen Editor-Umgebungen, weil es den Nutzern aufgezwungen wird; engere Integration bedeutet aber bei N Editoren und Umgebungen auch N Integrationen
Dasselbe gilt für CI. Ich möchte nicht einen Commit in einen Branch pushen und dann 15 Minuten warten, bis etwas anspringt, sondern Tests auf Linux, FreeBSD und macOS einfach starten können
Etwa in der Form
run-remotely some-command --on freebsd,linux,macIm Kern wäre das ein Local-first- und dezentralisiertes CI-System, das zugleich ein zentrales System als Single Source of Truth unterstützt, um sicherzustellen, dass vor dem Merge aller Code dasselbe „freigegebene“ System durchlaufen hat
Das geht über ein simples
ssh user@host command ...hinaus, weil Quellcode kopiert, gecacht und nötige Abhängigkeiten installiert werden müssen, damit man jedes Mal denselben vertrauenswürdigen Zustand erhältIch sehe das allerdings nicht als Forge-Funktion. Es sollte als Werkzeug für die Ausführung von Jobs bereitstehen, das auch ohne bestimmte Forge nutzbar ist und von jeder Forge aufgerufen werden kann
Ich denke, es müsste ein wenig „treiberbasiert“ sein. Man sollte denselben Job vollständig lokal ausführen oder an ein entferntes System senden können, das ihn startet. Dieser Job könnte in einer virtuellen Maschine, in einem Container oder direkt laufen
Es sollte auch Versionsverwaltungssysteme jenseits von Git unterstützen
Issues, Wikis usw. sollten sich in praktischen Formaten importieren und exportieren lassen, damit man nicht an ein bestimmtes System gebunden ist
Self-Hosting sollte ebenfalls einfach sein
Vermutlich gibt es einen kleineren Bereich, der in der Praxis wirklich wichtig ist
Heptapod aus dem Schwesterkommentar ist für Mercurial, und sourcehut, ebenfalls
Fossil hat eine eigene Forge, und allura, die Apache-Version von SourceForge, bietet Subversion an
Es wäre schön, wenn eine Forge auf der CI-Ebene etwas Bazel-artiges anbieten würde
Nicht im Sinn von „man kann Bazel in CI ausführen“, sondern in einer Form, die Menschen auf natürliche Weise dazu bringt, gute Tests und Builds mit Abhängigkeiten zu schreiben, statt grundlos CI-Zeit zu verbrennen
In diesem Zusammenhang denke ich, dass das Modell „ein Projekt = ein Repository“ viele Probleme geschaffen hat
Man könnte es als bessere Monorepo-Unterstützung beschreiben, aber im Kern sollten Dinge wie CI und Issues auf einen größeren Bereich als nur „das Top-Level dieses Verzeichnisses“ bezogen werden können
Viele Projekte zerteilen Repositories wegen Forge- oder CI-Gründen, und in diesem Zustand zu arbeiten macht keinen Spaß
Als Reviewer hätte ich außerdem gern Inline-Aufteilung von Patches
Gemeint ist, dass ich die Teile auswählen und nur diese freigeben kann, die ich gut finde, sodass zufriedenstellende Teile integriert werden können
Gestapelte PRs erscheinen mir immer noch als zu schwergewichtiges Konzept
Wenn jemand „4 Dateien ändern“ möchte und das als einen einzigen PR betrachtet, sollte ein Reviewer sagen können: „Okay, diese 2 Dateien sind in Ordnung“, und dieses Bündel von Änderungen als separaten Teil des PR abspalten oder sogar nur dieses Fragment als eigenen Commit mergen können
Auch heutige gestapelte PRs behandeln einen PR noch als atomare Einheit. In den meisten Systemen fühlt sich ein PR einfach zu schwer an
Die Begründung war: „Das ist nur eine Teilmenge der Datei, daher kann man nicht wissen, ob es kompiliert“
Ich stimme dieser Position überhaupt nicht zu, aber bei solchen Dingen in einer Web-Ansicht müsste man ziemlich vorsichtig sein, deshalb fiel mir das beim Lesen dieses Kommentars ein
Natürlich einmal abgesehen von dem Punkt weiter oben, dass man als Repository-Eigentümer den Branch einfach per Force-Push in die bevorzugte Fassung bringen kann
Es braucht eine CI/CD-Konfiguration ohne Aufwand
make build,make test,make uploadsollten reichenDen Rest kann man im Makefile lassen, von wo aus man dann zu einem besseren Build-System weitergehen kann
Ich möchte von der Idee bis zu veröffentlichten Build-Artefakten in unter 2 Minuten kommen
Statt wie die meisten CI/CD-Systeme eine Konfigurationsdatei an einem bekannten Ort zu verwenden, könnte man einfach drei Shell-Skripte mit bekannten Namen in ein bekanntes Verzeichnis legen
Als Bonus könnte man sie bei Bedarf für Windows auch als
.bat-Dateien anlegenDas kann je nach Betriebssystem unterschiedlich sein, und man möchte es vielleicht nicht ins Makefile packen
Der Vorteil ist, dass alle Jobs in ihrer eigenen pty unter zmx laufen
Man kann sich an einen fehlgeschlagenen Job anhängen und ihn mit Pfeil nach oben und Enter erneut starten
Ich hätte gern Sicherheitshinweise mit Guardrails, damit qualitativ hochwertige Daten veröffentlicht werden
Es braucht ein commit-zentriertes Ökosystem, damit alle Projekte sinnvolle Daten veröffentlichen können, und für Projekte, die es möchten, sollte es auch eine Integration geben, mit der sie direkt CVEs ausstellen können