Erhalten Sie statische Code Analyzer Nachrichten nur von 'git diff'?

8

In unserem Build-System (mit Quellen unter git version control) möchte ich die statischen Codeanalysator ( pylint , in diesem Fall) Nachrichten für jeden Build erhalten. Und ich möchte sie inkrementell: Im neuen Build-Report werden nur die Nachrichten angezeigt, die durch neue Commits eingeführt wurden.

Ich kann leicht die "alten" und "neuen" Commits bekommen. Der allgemeine Pfad besteht dann darin, den Analysator auf dem 'neuen' Commit auszuführen und dann für jede Quellcodezeile mit einer Nachricht festzustellen, ob diese Zeile neu / modifiziert ist oder ob sie von dem 'alten' Commit intakt ist. Drucken Sie dann nur Nachrichten von neuen / geänderten Zeilen.

Gibt es einen einfacheren Weg, dieses Ziel für pylint zu erreichen? Oder gibt es eine bestehende Implementierung von etwas Ähnlichem?

    
Konstantin Shemyak 15.12.2014, 14:49
quelle

2 Antworten

0

Sie können eine Liste der Dateien erhalten, die zwischen den Commits geändert wurden, und sie dann an pylint übergeben. Mit github pullrequest workflow sieht das so aus:

%Vor%     
artkoshelev 24.12.2014 16:19
quelle
0

Der Befehl git diff-tree hat ein Argument --diff-filter , mit dem nach einem bestimmten Modifikationstyp gefiltert werden kann:

Aus der git diff-tree-Dokumentation :

  

- Diff-Filter = [(A | C | D | M | R | T | U | X | B) ... [*]]
  Wählen Sie nur Dateien aus, die hinzugefügt (A), kopiert (C), gelöscht (D), modifiziert (M), umbenannt (R) sind, deren Typ (dh reguläre Datei, Symlink, Submodul, ...) geändert wurde (T), sind Entfesselt (U), sind Unbekannt (X) oder haben ihre Paarung Gebrochen (B). Jede Kombination der Filterzeichen (einschließlich keiner) kann verwendet werden.

Wenn Sie eine Liste der Namen aller hinzugefügten Dateien erhalten möchten, könnten Sie einen Befehl wie folgt verwenden:

git diff-tree -r --name-only --diff-filter A <oldCommit>..<newCommit>

Die Option -r bedeutet in diesem Fall, die Bäume rekursiv zu differentieren. Die Option --name-only bewirkt, dass nur die Dateinamen ohne ihren Status gedruckt werden und das Drucken des Diff-Headers verhindert wird.

Da dies einer der git diff-Befehle ist, werden zusätzliche Argumente benötigt, die das Filtern der Dateiliste ermöglichen. Wenn Sie nur an Dateien interessiert sind, die auf einem bestimmten Pfad mit '.py' enden, können Sie -- 'path/*.py' zum Befehl hinzufügen.

Wenn die Liste der Dateien weiter an ein Tool wie xargs gesendet wird, kann es sinnvoll sein, die Option -z hinzuzufügen. Diese Option bewirkt, dass die Liste der Dateinamen durch ein Nullbyte anstelle einer Newline getrennt wird. Dies macht den Befehl robust gegenüber verschiedenen Sonderzeichen, die in Dateinamen vorkommen können (einschließlich Leerzeichen). Das empfangende Ende muss dann darauf aufmerksam gemacht werden. Für xargs wäre die Option --null .

Ein vollständiger Befehl, der pylint auf hinzugefügte Dateien mit der Erweiterung '.py' zwischen zwei Commits ausführt, könnte daher wie folgt aussehen:

git diff-tree -r -z --name-only --diff-filter A <oldCommit>..<newCommit> -- '*.py' | xargs --null pylint

    
mmlr 09.12.2017 19:20
quelle

Tags und Links