Commit Graph generieren (ähnlich BitBucket)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo zusammen.

Ich suche eine Lösung um mit Python einen "Commit Log", wie man ihn von BitBucket kennt, zu generieren. Siehe als Beispiel: https://bitbucket.org/birkenfeld/sphinx/changesets

Hat jemand von euch eine gute Idee wie man das umsetzen könnte?
Eine Möglichkeit wäre Graphviz zu verwenden, allerdings habe ich nach meiner Erfahrung dort keinen so guten Einfluss auf pixelgenaue Ausrichtung.
Eine andere Idee ist matplotlib, allerdings habe ich hier kein gutes Beispiel gefunden welches einem solchen Commit Graph auch nur im Ansatz ähnlich ist.

Das Ziel was ich anstrebe ist eine Darstellung ähnlich dem Beispiel von BitBucket. Also eine HTML Seite in dem links der Graph und Rechts daneben eine passende Tabelle mit Text dargestellt wird.

Würde mich freuen wenn jemand von euch ein Module oder Package kennt oder andere gute Beispiele z.B. für matplotlib hat.
lunar

@Zap: Ist Dein Problem nun, wie Du die logische Information gelangst, sprich geordnete Commits in einer Datenstruktur erhältst, oder hast Du die Graphen schon als Datenstruktur vorliegen und weißt nur nicht, wie Du ihn konkret zeichnen kannst?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Die Logische Struktur habe ich, zumindest gedanklich, und die wird recht simpel ausfallen.

Mal rein exemplarisch:

Code: Alles auswählen

class Node:
    def __init__(self, line, parent):
        self.line = line
        self.parent = parent

a = Node("line1")
b = Node("line1", a)
c = Node("line1", b)
x = Node("line2", c)
d = Node("line1", x)
#Abbildung auf der Zeitachse: [a, b, c, x, d]
Als ASCII Graph würde die Geschichte theoretisch so aussehen.

Code: Alles auswählen

O   : d
 \
  O : x
 /
O   : c
|
O   : b
|
O   : a
Es geht mir also rein um das Zeichnen (der Darstellung) mittels einer geeigneten lib.
lunar

@Zap: Ich kenne keine Bibliothek, die auf solche Graphen spezialisiert wäre. matplotlib ist primär eine Bibliothek zum Plotten von Funktionen und Datensätzen, und für
generische Graphen weniger geeignet.

Versuche zuerst, Graphviz zu nutzen. Zwar kannst Du Knoten in Graphviz nicht exakt positionieren, Ausrichtung und Anordnung aber relativ gut kontrollieren. Die Graphviz-Dokumentation enthält mehrere Beispiele dazu, und mit git-cola gibt es mindestens ein Git-Frontend, welches Commit-Graphen mit Graphviz zeichnet. Kommst Du mit Graphviz nicht zurecht, kannst Du immer noch Alternativen suchen, die dann aber in jedem Fall aufwendiger zu nutzen sind, da Graphviz im Bezug auf das Layout von Graphen so ziemlich das beste ist, was Du bekommen kannst.

Ich bezweifele ohnehin, dass das Zeichnen Dein wichtigstes Problem ist, da ich nicht das Gefühl habe, dass Deine „gedanklich“ entworfene Struktur dem Problem gerecht wird. Insbesondere kann man den gezeigten Graphen aus dieser Struktur nicht ableiten, da die Datenstruktur nicht hergibt, warum x rechts, d aber links stehen sollte. Hinzu kommt, dass Deine Struktur von einem einzigen Vaterknoten ausgeht, sprich einen Baum beschreibt, Commits in DVCS aber keinen Baum bilden. Es ist möglich und üblich, dass ein Commit zwei oder – je nach DVCS – mehr Elternknoten hat, hauptsächlich bei Merge-Commits.
BlackJack

@Zap: Vielleicht hilft es ja sich Bitbucket in einem Browser anzuschauen der kein HTML5 kann, also kein Canvas kennt, und ausserdem noch die Tabellenzeilen zu lang darstellt. Zufällig habe ich so etwas hier:

Bild :-)

Da sieht man ganz gut wie man die einzelnen zu zeichnenden Abschnitte aufbauen muss.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

BlackJack hat geschrieben:@Zap: Vielleicht hilft es ja sich Bitbucket in einem Browser anzuschauen der kein HTML5 kann, also kein Canvas kennt, und ausserdem noch die Tabellenzeilen zu lang darstellt.
Internet Explorer :twisted:?
the more they change the more they stay the same
BlackJack

@Dav1d: Igitt Nein — alter Konqueror.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

lunar hat geschrieben:Ich bezweifele ohnehin, dass das Zeichnen Dein wichtigstes Problem ist, da ich nicht das Gefühl habe, dass Deine „gedanklich“ entworfene Struktur dem Problem gerecht wird. Insbesondere kann man den gezeigten Graphen aus dieser Struktur nicht ableiten, da die Datenstruktur nicht hergibt, warum x rechts, d aber links stehen sollte. Hinzu kommt, dass Deine Struktur von einem einzigen Vaterknoten ausgeht, sprich einen Baum beschreibt, Commits in DVCS aber keinen Baum bilden. Es ist möglich und üblich, dass ein Commit zwei oder – je nach DVCS – mehr Elternknoten hat, hauptsächlich bei Merge-Commits.
@Lunar: Du unterschätzt mich :P
Meine Datenbasis ist eine andere und beinhaltet keine Merges. Die Knoten haben ganz bewusst nur einen Elternknoten.
Ich habe lediglich ein minimales Beispiel geliefert um einen solchen ASCII Graphen zu zeigen. Mehr sollte es nicht werden ;)
Warum x rechts steht liegt daran, dass es an die Pseudo-ID "line2" und nicht wie die anderen an "line1" gebunden ist. Zugegeben keine besonders schlaue Lösung um die 2 Stränge zu unterscheiden. Aber nochmal, das hat nichts mit der realen Datenbasis zu tun. (Echte IDs hätten hier auch keinem geholfen)

Zu deinem eigentlichen Vorschlag:
Ja, es sieht auch für mich noch so aus, als wenn es am sinnvollsten wäre Graphviz zu verwenden.

@BlackJack: Denke zwar nicht das mir der Screenshot weiterhilft - aber trotzdem Danke! :)


Da Graphviz absolute positionierung supported und ich klar benennen kann in welcher Zeile und Spalte ein Knoten liegt, kann ich diese in einer Matrix abbilden und anschließend die entsprechenden Kanten zwischen Kindern und ihren Eltern ziehen. Mal schauen wie viel Einfluss ich habe um ein pixelgenaues Resultat zu erstellen. (Hatte diese Anforderung bisher nicht an Graphviz)

Vielen Dank für den Input.
Antworten