2014-12-15 15 views
8

Yapı sistemimizde (git sürüm kontrolü altındaki kaynaklarla), her yapı için statik kod analizcisini (bu durumda pylint) almak istiyorum. Ve onları aşamalı olarak istiyorum: yeni derleme raporunda, yalnızca yeni taahhütlerin getirdiği mesajlar gösteriliyor.Statik kod analizcisi mesajlarını sadece 'git diff' adresinden alın.

'Eski' ve 'yeni' işlemleri kolayca alabilirim. Daha sonra, genel yol analizciyi 'yeni' taahhüdünde çalıştırmak ve daha sonra, bir mesajla her bir kaynak kod satırı için, bu hattın yeni/modifiye olup olmadığını veya 'eski' taahhütten bağımsız olup olmadığını bulmaktır. Ardından, yalnızca yeni/değiştirilmiş satırlardan gelen mesajları yazdırın.

pylint için bu hedefe ulaşmanın daha basit bir yolu var mı? Ya da benzer bir şeyin var olan bir uygulaması var mı?

+1

Bunu denedim, ama umut verici görünüyor değil: https: //github.com/edx/diff-cover –

+0

@IsmailBadawi: Teşekkürler, bu kullanışlı bir araçtır!Gördüğüm kadarıyla, sadece hata mesajlarını değil, sadece pylint'ten kalite raporları sağlayabilir. – user3608247

cevap

0

Gönderilenler arasında değiştirilen dosyaların listesini alabilir ve daha sonra pylint'e aktarabilirsiniz. github pullrequest iş akışı sayesinde şuna benzer:

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

Bu, yalnızca yeni taahhüt tarafından tanıtılmış olanları değil, değiştirilmiş dosyalardaki tüm sesli mesajları bana verecektir. – user3608247

+0

@ user3608247 daha basit bir hedefle deneyin, 'git diff-index' gibi - sadece-only HEAD | grep .py | xargs pylint' – kweerious

0

git diff-tree komut modifikasyonu belirli bir türü için filtrelemek için kullanılabilecek bir --diff-filter argüman vardır: git diff-tree documentation itibaren

:

--diff-filter = [(A | C | D | M | R | T | U | X | B)… [*]]
Yalnızca Eklenmiş (A), Kopyalanan (C), Silinen dosyaları seçin. (D), Değiştirilmiş (M), Yeniden Adlandırılmış (R), kendi türüne (yani normal dosya, sembolik bağlantı, alt) sahiptir. Modül,…) değişti (T), Unmerged (U), Unknown (X), veya Broken (B) eşleşti. Filtre karakterlerinin (hiçbiri dahil) herhangi bir kombinasyonu kullanılabilir. Eğer böyle bir komutu kullanabilirsiniz tüm eklenen dosyaların adlarının bir listesini almak istiyorsanız

:

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

bu durumda -r seçenek yinelemeli ağaçları diff demektir. --name-only seçeneği, yalnızca dosya adlarının durumları olmadan yazdırılmasına neden olur ve fark başlığının yazdırılmasını engeller.

Bu, git diff komutlarından biri olduğu için, dosya listesini filtrelemeye izin veren ek argümanlar da alır. Belirli bir yoldan '.py' ile biten dosyalarla ilgileniyorsanız, komuta -- 'path/*.py' ekleyebilirsiniz.

Dosya listesi xargs gibi bir araca daha gönderilirse, -z seçeneğini eklemek mantıklı olabilir. Bu seçenek, dosya adlarının listesinin yeni satır yerine boş bayt ile sınırlanmasını sağlar. Bu, komutun dosya adlarında (boşluklar dahil) meydana gelebilecek çeşitli özel karakterlere karşı sağlam olmasını sağlar. Alıcı tarafın bundan haberdar olması gerekiyor. xargs için kullanma seçeneği --null olacaktır.

iki kaydedilmesini arasında '.py' uzantılı eklenen dosyalar üzerinde pylint çalışan tam bir komut bu nedenle bu gibi görünebilir:

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