CVS ve Kaynak Kodu Yönetimi – II

CVS Nedir?
CVS, sürüm kontrol sistemidir. Metin tabanlı dosyaların değişikliklerini tutarak, tarihçe hizmeti sağlar. Bu sayede hiç bir değişiklik kaybolmaz, hatayla yapılan düzeltmeler geri alınabilir, birbirine paralel geliştirmeler tek merkezde tutulabilir.

Kavramlar
depo: CVS ayar dosyalarının, takibi yapılan dosyaların tarihçeleriyle birlikte tutulduğu yer. Uzak bir sunucu olabileceği gibi, yerel diskiniz üzerinde farklı bir dizin de olabilir. Uzak bir sunucuda olduğunda genellikle, birden fazla geliştiricinin müdahalesi mümkündür.
modül: Depo üzerinde tutulan her bir proje. Her bir proje bir modül içinde tutulur.
check-in: Yapılan değişikliklerin depoya girilmesi.
check-out: Dosyanın veya modülün depodan çekilmesi işlemi.
merge: (birleştirmek) Değişikliklerin, yamalar vasıtasıyla birleştirilmesi. Bu işlem basitçe bir dosyanın güncellemesi olabileceği gibi, farklı dallarda giden bir projede dallar arası birleştirmeleri de kapsar. İlerde detaylandıracağım.
çakışma: (collision)Aynı noktada, habersizce yapılan değişiklikler sonucu oluşan güncelleme sorunu.

Hızlıca
Gündelik bir CVS çalışması yapalım. Modül oluşturma kısımlarını ilerde anlatmak üzere atlayarak, bir geliştiricinin çalışmasını görelim.

cvs checkout modul
modul isimli modülü depodan çektik. Çalıştığımız dizinde modul isimli bir dizin oluşturdu.

cvs update
Daha önceden çekmiş olduğumuz bir modülde ilk defa işlem yapmadan önce, her zaman ilk işiniz güncelleme yapmak olsun. Böylece diğer geliştiricilerin yapmış oldukları değişiklikler yerel kopyanıza işlenir.

cvs commit
Tüm yaptığımız değişiklikleri depoya gönderir. Öncesinde bu sürüme yorum yazmanız için editörü açacaktır. Yapılan değişiklikleri açıklayan bir yorum ilerde çok işinize yarayabilir.

cvs add hede.c
hede.c dosyası ilk defa oluşturulmuş ve CVS kaydı tutulmuyor olabilir. Bu durumda ekleme işlemi yapar. Ekleme işleminden sonra commit yapmayı unutmayın.

Sourceforge’tan bir proje çekelim!
Bu kısım Sourceforge.net’te zaten anlatılıyor. Ama biz bir deneme yapmış olmak için burada da tekrar edelim.


cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/scummvm login
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/scummvm co scummvm

Sunucuya login olduk. Bu komutu anlatmamıştım. pserver metodu ile ilgili olduğu için ileride anlatılacak. :) Ama siz giriş yaptığınızı bir daha da ihtiyacınız olmayacağını bilin yeter. Şifre sorduğunda ENTER’a basın, geçin. İkinci satırda, scummvm’i çektik. Böylece çalıştığımız dizinde scummvm adında bir dizin oluştu. (içinde projeyle birlikte) Projenin yerel kopyasında her dizinde CVS dizinleri göreceksiniz. Bunlar CVS’in çalışması için gerekli ve kesinlikle silinmemesi gereken dizinlerdir.

Yerel kopya üzerinde yapılan değişiklikler commit edilmediği müddetçe yerel kalırlar. Şimdilik çektiğimiz kopya anonim bir sunucudan çekildiği için yaptığımız değişiklikleri commit edemeyeceğiz ama farkını görebiliriz. scumm/util.cpp dosyasında bir değişiklik yapalım ve farkı görelim.


serkan@feyvi:/tmp/scummvm/scumm$ cvs diff -u util.cpp
Index: util.cpp
==============================================
RCS file: /cvsroot/scummvm/scummvm/scumm/util.cpp,v
retrieving revision 2.8
diff -u -r2.8 util.cpp
--- util.cpp 10 Apr 2005 12:59:16 -0000 2.8
+++ util.cpp 25 Apr 2005 13:21:27 -0000
@@ -1263,7 +1263,7 @@

res = atoi(resNum);

- if (res == 0) {
+ if (res != 0) {
return generateIndex();
} else {
return generateResource(res);

Bu kadarı şimdilik yeterli. Biraz da şu fark alma dediğimiz nedir, onu inceleyelim.

Nasıl Çalışır?
CVS’in temelinde, metin dosyalarında (kaynak kodları, un*x konfigurasyon dosyaları, vb.) değişikliklerin farklarının alınabilmesi yatar. Bu konuyu derinlemesine anlamak önemli, o nedenle biraz uzun bir açıklamayı görelim.

hello1.c
#include <stdio.h>

void main()
{
printf(“Hello world!”);
}

Kodu eğer ben inceliyorsam, ilk söyleceğim şey “main(), int döner, void değil!” olurdu. Buna bağlı olarak ilk değişikliğimizi yapalım o zaman.

hello2.c
#include <stdio.h>

int main()
{
printf(“Hello world!”);
return 0;
}

İlk değişikliğimizi yaptık. void’i int’e çevirdik ve fonksiyonun sonuna return satırı ekledik. Dosya isimlerini eski usul, 1-2 diye değiştirdik. Şimdi iki dosya arasındaki farkları bulmamıza yarayan diff programı görelim. diff ve patch programlarının, CVS mantığını anlamamıza çok faydası olacak.

$ diff -u hello1.c hello2.c

— hello1.c 2005-04-24 21:19:07.640625000 +0300
+++ hello2.c 2005-04-24 21:19:30.968750000 +0300
@@ -1,6 +1,7 @@
#include

-void main()
+int main()
{
printf(“Hello world!”);
+ return 0;
}

Bu çıktıyı okuyalım. Başında – olan satırlar bir önceki sürümde olup da yeni sürümde olmayan demek, + olanlar da tam tersi yeni eklenmiş anlamında. Diff komutu dosyanın farkını bulurken satır satır analiz eder. CVS’te de aynı algoritma geçerlidir.

Bu diff çıktısına “patch” yani yama denir. Yamaların bir kullanımı böyle farkları görebilmemizi sağlamak olduğu gibi, aynı zamanda hello1.c dosyasına ne yaparsak hello2.c’yi elde edebileceğimizin bilgisini de barındırır. Bu bilgiyi okuyabilen bir program, örneğin patch, hello1.c bulduğunda bunu işleyerek hello2.c’ye çevirebilir. Diff çıktısını, hello.patch olarak kaydettiğimizi düşünelim:

patch < hello.patch

Bu satırı çalıştırdığımızda, patch hello1.c dosyasını bulur ve gerekli değişiklikleri yapar. hello1.c bundan böyle hello2.c ile aynı dosya olacaktır. İsterseniz diff ile farklarına bakın. :)

Bugünlük bu kadar..

Bu kategori altındaki diğer yazılar: Yazılım

2 Comments on “CVS ve Kaynak Kodu Yönetimi – II”

  1. onur:

    cok yararli.

  2. goktan:

    eline saglik ta birde cvs repository kurma yollarini anlatsan ne guzel olacak :)

Yorumlayın: