Patch-Queue – wie organisieren?

Ich habe in letzter Zeit angefangen, Patches für ein Open-Source-Projekt (Boost, konkret die Graph Library) zu erstellen. Da ich selbst dort keine Commit-Rechte habe, bin ich darauf angewiesen, dass Entwickler mit solchen Rechten meine Änderungen für mich einchecken. Und da die auch nicht 24h verfügbar sind, dauert es eine Weile, bis die Sachen eingecheckt sind. Ich will aber ggf. mit Folgeänderungen weitermachen, die die vom ersten Patch geänderten Stellen nochmals ändern. Und da geht dann schnell das Chaos los :-(

Bevor jetzt gleich tolle Tipps kommen, dass das mit diesem oder jenem Versionsverwaltungssystem ja alles ganz einfach geht: Das Chaos dürfte zuallererstmal dadurch verursacht sein, dass ich gar nicht so recht weiß, was ich von einer Lösung erwarte. Der erste Schritt ist also eine saubere Anforderungsanalyse:

  • Diff gegen noch nicht eingecheckte Patches: Ich möchte sehen, welche Änderungen sich in meiner working copy befinden, die über die bereits erzeugten (aber noch nicht eingecheckten) Patches hinausgehen. Die Differenz zum Trunk reicht also nicht.
  • Status von Patches: Ich muss Patches als erledigt markieren können, wenn sie eingecheckt sind.
  • Zusammenfassen von Patches: Wenn ich Patches noch nicht eingesendet habe (oder ggf. auch dann noch), will ich mehrere Patches zu einem großen zusammenfassen können.
  • Selektives Anwenden von Patches: Ich will leicht meine/eine Working Copy auf einen Stand bringen können, der den Trunk (oder eine bestimmte Revision) und nur bestimmte Patches enthält. Das ist beispielsweise nötig, um zu prüfen, dass die voneinander unabhängig sind.
  • Unterstützung bei der Erstellung von Patches: Optimal (aber auch optional und eher nice-to-have) wäre, aus den lokalen Änderungen in der lokalen working copy gegenüber dem Trunk (ggf. zuzüglich einer Auswahl von Patches) einen Patch erstellen zu können – aber nicht mit sämtlichen Änderungen, sondern Auswahlmöglichkeiten bezüglich der Dateien und der einzelnen Änderungen darin. Das geht aber zur Not auch manuell, ggf. mit Nachbearbeiten.

Hat jemand eine Idee, wie man diese Funktionalität am besten umsetzt? Gibt es für so etwas fertige Tools? Ist es vielleicht mit bestimmten Versionsverwaltungssystemen besonders einfach? Git wird ja ständig für alles Mögliche in höchsten Tönen gelobt. Nutzt es vielleicht auch hier? Wenn ja, wie lassen sich obige Anforderungen auf die Begrifflichkeiten von Git (oder einem anderen System) abbilden?

4 thoughts on “Patch-Queue – wie organisieren?

  1. Ich habe jetzt den Tipp bekommen, dass es mit git irgendwie gehen soll … Mal tiefer einarbeiten und dann schauen, ob das wirklich so leicht benutzbar ist, dass man sich eine Verwaltungsschicht oben drauf sparen kann.

  2. Hey Jens,
    mit Git lässt sich fast alles realisieren, was Du beschrieben hast :)
    Ich beschreib mal kurz die wichtigsten Dinge und liefer Anhaltspunkte für Dich zum weiterbilden :) Ach ja, git help $befehl ist immer sehr hilfreich ;)
    Dein “Patch” entspricht im wesentlichen ‘nem commit bei git. Commits basieren auf dem aktuellen Stand deiner (lokalen) Working Copy, dem sogenannten HEAD. Bei der Erstellung kannst du Dateien auch selektiv hinzufügen (git add -p oder sowas, git frägt dann weiter nach). Commits bauen auf einander auf und bilden die sogenannte History. In der kannst Du Dich nach belieben bewegen (vor und zurück mittels git checkout $commitid). Du kannst auch mit mehreren branches arbeiten und dort Patches sammeln, die Du dann in den Haupt-Branch (“master”) einpflegen kannst (git merge, mit –squash oder so auch als ein einzelner commit möglich…git rebase ist auch sehr interessant). Soweit ich weiß kann git Patches in vielen verschiedenen Formaten aus einem oder mehreren Commits generieren, damit sollte die Einsendung also auch kein Problem darstellen (siehe git format-patch).
    Allerdings gibt es zwei unschöne Nachteile:
    1. git ist nur von der Kommandozeile aus wirklich effizient benutzbar. Für manche ist das ein Problem. Es gibt zwar viele IDEs, die git ganz gut unterstützen und umsetzen, allerdings ist das mir persönlich zu blöd ;)
    2. wenn boost nicht selbst git verwendet (weiß grad nicht wie das bei denen ist) dann wirst Du keine Möglichkeit haben um Patches automatisiert als erledigt/eingepflegt zu kennzeichnen, sondern kannst dies nur über Umwege tun (per branch oder tag müsste es aber trotzdem noch recht komfortabel möglich sein).
    Hoffe das hilft dir etwas weiter :)

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht.

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>