Git'e Commit Etmeden Önce Kod Kontrolü

Git sistemi programcılar için gerçekten bulunmaz bir nimet. Hem yazdığınız hemde ilerde yazacağınız kodlar için size birçok olanak sağlıyor. Örneğin çok kullanıcılı bir uygulamaya başlayacaksanız herkes gun içinde yazdığı kodları birbirine mail ile gondermesi artık kabul edilebilir birşey değil. Bunun için versiyon kontrol sistemleri var. Tabi en bilinenleri de git ve svn. Svn kullanıyorsanız google code size ucretsiz bir alan sağlayacaktır. Eğer git kullanıyorsanız da github aynı işi gormekte. Tabi sadece aynı işi gormekle de kalmıyor çok fazla yenilik getiriyor.

Some books are just great

Benim git sisteminde son farkettiğim bir yenilikde commit oncesinde işlem belirtme. Yani siz kodlarınızı commit(işleme) etmeden once belirttiğiniz kodları sistemde çalıştırabiliyorsunuz. Aklıma hemen bu konuda kullanabileceğim guzel bir uygulama geldi. Pyflakes ve Pylint gibi Python uygulamaları yazdığınız kodları satır satır PEP kurallarına gore inceliyor. Gereksiz bulduğu satırlar veya kod parçaları varsa bunları size bildiriyor. Ben de bu uygulamaları commit etmeden hemen once çalıştırırsam kodlaırmdaki eksiklikleri gorurum ve duzeltene kadar uğraşırım diye duşundum. Birazcık araştırmayla .git/hooks/pre-commit dosyasının tam olarak yapmak istediğime yaradığını oğrendim.

Öncelikle pyflakes'in nasıl çalıştığını bilmemiz lazım. Bunun için bilgisayarımıza kuralım.

sudo pip install flake8

Şimdi de bir hayli çarpık bir kod yazalım. İçerisinde çok fazla hata ve eksiklik olsun. Adını ben sacma.py koydum.

#!/usr/bin/python

import sys, string, random

def sallamasyon()
  kelimeler = string.uppercase
    print "kelime gonder: "+random.choice(letters)
    print ---

sallamasyon()

Şimdi bu yazdığımız kodu test edelim. Bunun için aşağıdaki komut yeterlidir.

flake8 sacma.py

Komutumuzun çıktısı aşağıdaki gibi olacaktır.

sacma.py:5: invalid syntax
def sallamasyon()
                 ^
sacma.py:3:11: E401 multiple imports on one line
sacma.py:5:1: E302 expected 2 blank lines, found 1
sacma.py:6:3: E111 indentation is not a multiple of four
sacma.py:6:3: E113 unexpected indentation
sacma.py:7:30: E701 multiple statements on one line (colon)
sacma.py:7:16: E702 multiple statements on one line (semicolon)
sacma.py:7:5: E113 unexpected indentation
sacma.py:7:16: E231 missing whitespace after ';'
sacma.py:7:37: E231 missing whitespace after ';'
sacma.py:7:12: E225 missing whitespace around operator
sacma.py:7:33: E225 missing whitespace around operator

Ne kadar da guzel ve temiz bir şekilde uyarıyor değil mi? Sıfır hata verene kadar duzeltirseniz sizin için çok faydalı olur.

Şimdi de bu işlemi her commit oncesi yapmasını sağlayalım. Bunun için proje klasorumuzdeki .git/hooks/pre-commit dosyasının içine bunları ekleyip kaydediyoruz. (.sample uzantılısında nasıl kullanacağınıza dair guzel ornekler var)

#!/bin/sh

flake8=$(which flake8)

if [ -z "$flake8" ]; then
echo "Flake8 yuklu degil.Lutfen once kurunuz."
    exit 1
fi

FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -e .py$)
if [ -n "$FILES" ]; then
flake8 --ignore=E501 $FILES
fi

Şimdi de bu yazdığımız kodun olduğu dizinde sırayla aşağıdaki komutları girelim. Eğer ilk başta aldığımız hatayı alırsanız başarıyla çalışıyor demektir.

git init
git add sacma.py
git commit -m "sacma commit"

Peki bunun size nasıl bir faydası olur? Öncelikle Python'un bir guzel ve temiz kod yazma sanatı olduğunu hatırlatayım. Bu sanatın da PEP adında çok guzel kuralları var. Uyup uymamak sizin elinizde. Ama pitonik kod yazmak için bu kurallara uymak zorunda olduğunuzu unutmayın. Ayrıcana ne zararı olabilir ki? Yaptığınız hataları gosteriyor, gereksiz değişkenleri, kullanılmamış modulleri belirtiyor. Bana gore başucu uygulamanız olsun.

Pyflakes yerine Pylint'i de deneyebilirsiniz.Pylint biraz daha derin sonuçlar çıkarıyor. Pyflakes ise direk sonuç odaklı oluyor.

comments powered by Disqus