26 Aralık 2012 Çarşamba

svn info ile proje detaylarını öğrenme


Bir dizine svn projenizi checkout yaptınız. Aradan zaman geçti veya bu projenin farklı branch'lerini farklı yerlere checkout yaptınız. Sonrasında bu dizinde projenin hangi sürümü var vs öğrenmek için svn info komutunu kullanabilirsiniz.

$ cd surgatemta
$ svn infoPath: .
URL: https://192.168.1.10/svn/surgatemta/trunk
Repository Root: https://192.168.1.10/svn/surgatemta
Repository UUID: dac1741e-dd39-4fb9-a7c4-02cd681c2378
Revision: 86
Node Kind: directory
Schedule: normal
Last Changed Author: ismail.yenigul
Last Changed Rev: 86
Last Changed Date: 2012-12-25 10:45:14 +0200 (Tue, 25 Dec 2012)



Projeyi dizinlerine proje sürüm/branch adına göre dizin vererek hangi projenin hangi branch'i checkout yaptınızı daha kolay anlayabilirsiniz.

$ svn --username ismail.yenigul co https://192.168.1.10/svn/linuxaudit/trunk linuxaudit-trunk

Sadece tek bir dosya hakkında bilgi almak için ise aşağıdaki gibi komut verilir.

$ cd surgatemta $ svn info Makefile
Path: Makefile
Name: Makefile
URL: https://192.168.1.10/svn/surgatemta/trunk/Makefile
Repository Root: https://192.168.1.10/svn/surgatemta
Repository UUID: dac1741e-dd39-4fb9-a7c4-02cd681c2378
Revision: 86
Node Kind: file
Schedule: normal
Last Changed Author: ismail.yenigul
Last Changed Rev: 71
Last Changed Date: 2012-10-03 00:47:44 +0300 (Wed, 03 Oct 2012)
Text Last Updated: 2012-10-03 00:47:45 +0300 (Wed, 03 Oct 2012)





6 Aralık 2012 Perşembe

svadmin dump ile yedek alma

SVN sunucuda bulunan proje depolarının(repository) yedeğini almak için svnadmin komutu dump parametresi ile kullanılabilir.

Bu komut svn sunucusunun kurulu olduğu makinada root kullanıcısı ile verilmelidir.


# svnadmin dump /var/svn/surgatedev > surgatedev.svndump
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
* Dumped revision 6..


Bu işlem sonunda projeye ait tüm svn yedeği surgatedev.svndump dosyasında bulunacaktır. Dosya dah az yer kaplasın diye gzip ile sıkıştırabilirsiniz.

 # ls -al surgatedev.svndump
-rw-r--r-- 1 root root 25554628 Dec  6 10:39 surgatedev.svndump
# gzip  surgatedev.svndump

Linux'de | kullanarak da dump esnasında sıkıştırma yapabilirsiniz.

 # svnadmin dump /var/svn/surgatedev | gzip >  surgatedev.svndump.gz
# ls -alh surgatedev.svndump*
-rw-r--r-- 1 root root 25M Dec  6 10:39 surgatedev.svndump
-rw-r--r-- 1 root root 14M Dec  6 10:44 surgatedev.svndump.gz

Eğer birden fazla proje deponuz varsa bu işlemi tek tek tüm projeler için vermek zorundasınız.
Bu işlemi kolaylaştırmak için basit bir kabuk programı yazılabilir.


----script başlangıcı
#!/bin/sh

SVNDIR=/var/svn
BACKUPDIR=/backup/svnbackup

mkdir -p $BACKUPDIR  #create backup directory if not exit
for i in `ls $SVNDIR`
 do
    if [ -d $SVNDIR/$i ] ; then  #repo must be a directory, ingore svnpass, svnauth etc files
    echo "svn repo backup for $i"
    svnadmin dump $SVNDIR/$i | gzip > $BACKUPDIR/$i.backup.gz
    fi;
       
done


--script sonu-----

Bu scripti crontab'a ekleyerek düzenli aralıklarla yedek alabilirsiniz.
svnadmin dump parametresine ek olarak svnadmin hotcopy parametresi vardır. hotcopy repo dizinini hızlı bir şekilde kopyalamak için kullanılır. Yedeğin geri dönüleceği sunucuda tüm svn ayarlarının aynı olması gerekir. Bu yüzden hotcopy yerine dump kullanılmasını tavsiye ederim.



20 Kasım 2012 Salı

svn copy ile branch oluşturma

Projelerde genel olarak en güncel, unstable kodlar trunk altında bulunur. Bunlar belli bir olgunluğa geldiğinde alt dallara(branch) ayrılarak elimizde belli bir sürüme ait çalışan kodların olması sağlanır.
Bu brach üzerinde gerekirse bug fix vs gibi işlemler yapılabilir.

Diğer bir branch kullanım alanı da birden fazla yazılımcı projede çalışıyorsa ve bir yazılımcı kodlarda major bir değişiklik yapacaksa bu değişiklik diğer ekip çalışanlarının paralel geliştirmesini engelliyorsa, bu geliştirici için ayrı bir branch açılır.
Geliştirici bu branch'de yaptığı geliştirmeleri bitirdiğinde kodları tekrar trunk(en güncel,unstable kodlar)'a birleştirir(merge).

Branch işlemleri için svn copy komutu kullanılır. Bu komutun yaptıgı şekil klasik bir dizin kopyalama gibi düşünülebilir. Fakat arka planda yapılan işler dosya kopyalamadan daha ileri bir seviyede operasyondur. Detaylara http://svnbook.red-bean.com/en/1.7/svn.branchmerge.using.html adresinden ulaşabilirsiniz.

Örneğin projem isimli projenin trunk'ından projem_4_0_RELEASE isimli branch açmak için aşağıdaki gibi bir komut verilir.

$ svn copy https://192.168.0.100/svn/projem/trunk https://192.168.0.100/svn/projem/branches/projem4_0_RELEASE -m "4.0 RELEASE branch"


Branch adı tamamen size özeldir. İstediğiniz ismi verebilirsiniz.

Bundan sonra bu branch'de çalışmak için ayrı bir dizine branch'in checkout yapılması gerekir.

$ svn co https://192.168.0.100/svn/projem/branches/projem4_0_RELEASE projem40

Artık bu branch'deki kodları projem40 dizininde geliştirebilirim.


19 Kasım 2012 Pazartesi

svn switch ile repo sunucusunu değiştirme

SVN sunucunuz başka bir makinaya taşında ise kodları tekrar yeni IP adresinden checkout etmeden aşağıdaki komutla yeni sunucuya erişebilirsiniz.


Kullanım şekli: svn switch --relocate eskiurl yeniurl

$ svn switch --relocate https://10.0.10.100/svn/surgate/trunk https://192.168.0.100/svn/surgate/trunk


svnmailer ile her commit sonrası mail gönderme işlemi

 svnmailer programı her bir svn commit sonrasında belirlenen e-postalara otomatik olarak mail gönderen bir yazılımdır.

Web sitesi: http://opensource.perlig.de/svnmailer/
RPM paketleri URL: http://pkgs.repoforge.org/svnmailer 

Çalışma mantığı: Her bir svn projesinde(burada svnprojem1) conf  ve hook dizinleri bulunmaktadır.
hooks dizininde post-commit dosyası sayesinde her bir commit işleminden sonra istenilen komutlar çalıştırılır. post-commit dosyasınının içerisine svn-mailer komutu tanımlanır.
svn-mailer için conf dizininde svn-mailer.conf isimli bir dosya oluşturulur. svn-mailer bu dosyadaki değerlere göre (from,to,subject vs) ilgili yerlere e-posta gönderir.

Kurulum: CentOS 5 üzerine kurulum için aşağıdaki dosya çekilir.

# wget http://pkgs.repoforge.org/svnmailer/svnmailer-1.0.8-2.el5.rf.noarch.rpm
# rpm -ivh svnmailer-1.0.8-2.el5.rf.noarch.rpm

[root@hq svnprojem1]# ls
conf  dav  db  format  hooks  locks  README.txt


hooks dizininde post-commit dosyası yoksa oluşturulur ve izinleri 755 yapılır. Bu dosyanın içeriği aşağıdaki gibidir.

# cat hooks/post-commit
#!/bin/bash

REPOS="$1"
REV="$2"

/usr/bin/svn-mailer --commit \
    --config ${REPOS}/conf/svn-mailer.conf \
    --repository "${REPOS}" \
    --revision "${REV}" &

#


# cat conf/svn-mailer.conf
[general]
#config_charset = iso-8859-1 

sendmail_command = /usr/sbin/sendmail


[defaults]
from_addr = svncommit@mydomain.com
to_addr = arge@mydomain.com
browser_base_url = websvn http://192.168.0.100/websvn/listing.php?repname=svnprojem1
mail_type = multipart type=text/x-diff
commit_subject_prefix = SVN PROJEM1 ::
generate_diffs =  add copy modify propchange



sendmail_command: Sistemde mail göndermek için kullanılan sendmail komutunun yolunu belirtir.
from_addr: mailin kimden geliyormuş gibi gönderileceğini belirtir.
to_addr: mailin  alıcısını belirtir.
browser_base_url: Eğer websvn(http://websvn.tigris.org/)  kurulu ise kullanıcıya atılan mailin gövdesine link ekler.
commit_subject_prefix: Mailin subject kısmına eklenecek prefix değerini belirtir.
generate_diffs: Hangi operasyonlar sonrasında yapılan değişikliğin diff olarak gönderileceğini belirtir. Buradaki yapılandırmaya göre ekleme,kopyalama,değişiklik ve dosya tanımlardında bir değişiklik(izin,sahiplik vs) durumunda maile bu farklar eklenti olarak iliştiririlir. Çok büyük değişiklik durumunda e-posta boyutu artacağı için bu değerin none yapılması tavsiye edilir.


Örnek mail aşağıdaki gibidir:

From: svncommit@surgate.com
To: arge@surgate.com
Subject: SVN SVNPROJEM1:: r2566 - /trunk/ChangeLog
 
Author: ismail.yenigul
Date: Mon Nov  5 15:38:03 2012
New Revision: 2566

URL: http://192.168.0.100/websvn/listing.php?sc=1&rev=2566&repname=svnprojem1
Log:
New version

Modified:
    trunk/ChangeLog
 

Modified: trunk/ChangeLog
URL: http://192.168.0.100/websvn/diff.php?path=/trunk/ChangeLog&rev=2566&repname=svnprojem1
==============================================================================
--- trunk/ChangeLog (original)
+++ trunk/ChangeLog Mon Nov 19 17:06:31 2012
@@ -1,5 +1,5 @@
 2012-19-11 16:59
- * New version of software
+ * Version 1.2

SVN keywords ile kodlara otomatik başlık bilgileri ekleme


SVN keywords değerleri ile kodlarınıza otomatik olarak Yazar adı, dosyanın son güncellenme tarihi, revizyon numarası gibi değerler ekleyebilirsiniz.

En yaygın SVN keywords değerleri:

$Revision ($LastChangedRevision veya $Rev) SVN commit numarasını belirtir.
Örnek: $Revision: 2520

$LastChangedDate, veya $Date: Dosyanın en son commit tarihini gösterir.
$LastChangedBy, veya $Author -Commit'i yapan yazılımcı bilgisini verir.
$Id Dosya hakkında  Yukarıda belirtilen tüm anahtar kelimeleri gösterir. 

Örneğin aşağıdaki deneme.sh dosyasını SVN'e atalım ve sonrasında svn propset komutu ile anahtar kelimeleri etkinleştirelim:

Dosyanın içeriği aşağıdaki gibidir. Anahtar kelimelerin $$ arasına alındığına dikkat edin.

 cat deneme.sh
#!/bin/sh

#$Revision$
#$Id$

#$Date$
#$Author$


echo deneme dosyasi


Dosyayı svn'e ekleyelim:
$ svn add deneme.sh
A         deneme.sh

$ svn propset svn:keywords 'Id Revision Date Author'  deneme.sh
property 'svn:keywords' set on 'deneme.sh'

$ svn commit

deneme dosyasi
--This line, and those below, will be ignored--

AM   deneme.sh


Dosyayı vi editöründe açılacaktır.
:wq ile kaydettikten sonra aşağıdaki gibi bir mesaj ekrana yazılacaktır.

Adding         deneme.sh
Transmitting file data .
Committed revision 2563.


Dosyanın yeni içeriği aşağıdaki gibi olacaktır.

$ cat deneme.sh
#!/bin/sh

#$Revision: 2564 $
#$Id: deneme.sh 2564 2012-11-19 10:28:03Z ismail.yenigul $
#$Date: 2012-11-19 12:28:03 +0200 (Mon, 19 Nov 2012) $
#$Author: ismail.yenigul $

echo deneme dosyasi


Bundan sonraki her commit işleminde bu değerler otomatik olarak güncellenecektir.