2014-12-15 10 views
8

W naszym systemie kompilacji (ze źródłami pod kontrolą wersji git), chciałbym otrzymać statyczny analizator kodu (pylint, w tym przypadku) wiadomości dla każdej kompilacji. I chcę, żeby były przyrostowe: w raporcie nowej wersji pokazane są tylko wiadomości wprowadzone przez nowe zatwierdzenia.Otrzymuj statyczne komunikaty analizatora kodu tylko z "git diff"?

Mogę łatwo uzyskać "stare" i "nowe" zatwierdzenia. Następnie ogólną ścieżką jest uruchomienie analizatora w "nowym" zatwierdzeniu, a następnie, dla każdej linii kodu źródłowego z komunikatem, ustalenie, czy linia jest nowa/zmodyfikowana, czy też jest nienaruszona ze "starego" zatwierdzenia. Następnie drukuj tylko wiadomości z nowych/zmodyfikowanych linii.

Czy istnieje prostszy sposób osiągnięcia tego celu dla pylint? Czy istnieje istniejąca implementacja czegoś podobnego?

+1

nie próbowałem tego, ale wygląda obiecująco: https: //github.com/edx/diff-cover –

+0

@IsmailBadawi: Dziękuję, to przydatne narzędzie!Chociaż o ile widzę, że może on dostarczać tylko wysokiej jakości raporty od pylintów, a nie komunikatów o błędach. – user3608247

Odpowiedz

0

Możesz uzyskać listę plików zmienionych pomiędzy zatwierdzeniami i przekazać ją do pylintu. Z github pullrequest workflow wygląda to tak:

git --no-pager diff --name-only FETCH_HEAD $(git merge-base FETCH_HEAD master) | grep .py | xargs pylint 
+0

To da mi wszystkie wiadomości pylint ze zmodyfikowanych plików, a nie tylko te, które zostały wprowadzone przez nowe zatwierdzenie. – user3608247

+0

@ user3608247 spróbuj użyć prostszego celu, np. 'Git diff-index -name-only HEAD | grep .py | xargs pylint' – kweerious

0

Komenda git diff-tree ma --diff-filter argumentu, który może być używany do filtrowania dla określonego rodzaju modyfikacji:

Z git diff-tree documentation:

--diff-filter = [(A | C | D | M | R | T | U | X | B) ... [*]]
Wybierz tylko pliki, które zostały dodane (A), skopiowane (C), usunięte (D), Zmodyfikowany (M), Zmieniony (R), mają swój typ (tj. Zwykły plik, dowiązanie symboliczne, sub moduł, ...) zmieniono (T), są Unmerged (U), są nieznani (X), lub ich parowanie Broken (B). Można użyć dowolnej kombinacji znaków filtrujących (w tym żadnej).

Jeśli chcesz uzyskać listę nazw wszystkich dodanych plików można użyć polecenia tak:

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

opcja w tym przypadku -r oznacza diff drzewa rekurencyjnie. Opcja --name-only powoduje tylko drukowanie nazw plików bez ich statusu i uniemożliwia drukowanie nagłówka diff.

Ponieważ jest to jedna z komend git diff, pobiera również dodatkowe argumenty, które umożliwiają filtrowanie listy plików. Jeśli interesują Cię tylko pliki kończące się na '.py' w określonej ścieżce, możesz dodać do polecenia -- 'path/*.py'.

Jeśli lista plików jest wysyłana dalej do narzędzia takiego jak xargs, może być sens dodanie opcji -z. Ta opcja powoduje, że lista nazw plików ma być rozdzielana przez bajt zerowy zamiast nowego wiersza. To sprawia, że ​​polecenie jest odporne na różne znaki specjalne, które mogą występować w nazwach plików (w tym spacje). Odbierający koniec musi to uświadomić. Dla opcji xargs można użyć opcji --null.

Kompletny polecenia, które uruchamia pylint na dodanych plików z rozszerzeniem „.py” pomiędzy dwoma zobowiązuje może zatem wyglądać następująco:

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