2017-03-27 6 views
0

Ich schreibe eine Mac-Anwendung, die mir erlauben wird, nur die Zeilen, die bestimmten Text enthalten, als Teilzeichenfolge zu staffeln. Im Grunde versuche ich, das Feature zu erstellen, das Source Tree seinen Benutzern bietet. Staging ausgewählte Zeilen in den hunks. Meine Auswahllogik wäre, die Zeilen auszuwählen, die einen bestimmten Text als Teilstring enthalten. Aber ich konnte nicht herausfinden, wie dies mit libgit2 zu erreichen ist.libgit2: Wie man bestimmte Zeilen in einem Brocken

Ich habe die Repo-ähnliche Dann

int error = git_repository_open(&repo, gitRepoString.UTF8String); 

initialisiert Ich bin ein Diff Indexverzeichnis zu arbeiten, wie unten zu schaffen.

Danach bin ich in der Lage, durch die hunks und die Zeilen in jedem Brocken mit den Rückruffunktionen wie unten zu iterieren.

error = git_diff_foreach(diff, each_file_cb, 
            each_binary_cb, 
            each_hunk_cb, 
            each_line_cb, 
            &d); 

und die Callbacks werden für jede Zeile im Brocken aufgerufen.

int each_line_cb(const git_diff_delta *delta, 
       const git_diff_hunk *hunk, 
       const git_diff_line *line, 
       void *payload) 
{ 
    return 0; 
} 

Jetzt erkenne ich, dass ich irgendwie einen Patch erstellen müssen und nur die notwendigen Linien im diff zum Patch hinzufügen.

Kann jemand bitte in die richtige Richtung führen? Wenn libgit2 das noch nicht erlaubt, gibt es noch eine andere Bibliothek, die mich das tun lässt. Auch Atlassian Quellbaum scheint Libgit2 unter der Haube zu verwenden. Wie hätten sie das umsetzen können?

Übrigens, die git CLI erlaubt das mit patchen wie in dieser Antwort beschrieben. https://stackoverflow.com/a/32311872/569497

+0

Es gibt nicht eine einfache Möglichkeit ist noch, dies zu tun. Wir haben eine Reihe von Patches in unserem Fork (https://github.com/stinb/libgit2/tree/gitahead), die Unterstützung für die teilweise Patch-Anwendung hinzufügen. Ich würde gerne versuchen, diese bald auf den neuesten Stand zu bringen. Ich werde einen Link zur PR veröffentlichen, nachdem ich sie eingereicht habe. –

+0

BTW, ich weiß nicht, wie SourceTree es tut, aber ich vermute, dass es nicht auf libgit2 Funktionalität angewiesen ist. –

+1

FWIW, ich habe eine Pull-Anfrage (https://github.com/libgit2/libgit2/pull/4184) eingereicht, um die teilweise Patch-Anwendung zu aktivieren. Wenn das zusammengeführt wird, kann ich eine Antwort hinzufügen, die erklärt, wie man es benutzt, um das Staging einzelner Stücke und Linien zu implementieren. –

Antwort

1

Ich habe dies manuell implementiert. Es stellte sich als einfacher heraus, als ich erwartet hatte.

Mein Ansatz ein großes Stück für die Anwendung:

  • die Linien der Zieldatei in ein Array Aufgeteilt
  • Sammeln Sie den „Kontext“ und „alte“ Zeilen aus dem Stück, und stellen Sie sicher, sie passen die vorhandenen Inhalte
  • Sammeln Sie den „Kontext“ und „neue“ Linien, und den Array-Kontext/abgelöste Abschnitt in meiner Linie
  • schreiben Sie die Daten wieder aus und versuchen, bestehende Zeilenende ersetzen
übereinstimmen

Es sollte einfach sein, nur bestimmte Linien anzuwenden.

Mein Code ist hier (in Swift, Objective Git): https://github.com/Uncommon/Xit/blob/369dd52d444d4650759c22414121dd2a6be282d2/Xit/XTDiffDelta.swift

Verwandte Themen