Diyelimki geliştiricisiniz, bir projeniz var ve bu projeyi diğer girişimcilerin katkıda bulunması amacıyla bir SCM’e taşımak istiyorsunuz. (SCM nedir bilmiyorsanız, geliştirici değilsiniz zaten :P)

Benim bildiğim (daha öncesinde ne vardır tabi, bilinmez) CVS ile başlayıp onu obsolete (hihehehe) etmek amacıyla ortaya çıkan SVN ve çeşitli özellikleriyle SVN’den daha çok özelliğe sahip GIT (Linus abimiz bilir doğrusunu) ile devam eden SCM macerasında, Mercurial’ın yeri ayrıdır. Mercurial hem GIT hem de SVN, dolayısıyla CVS’in çoğu özelliğine sahip bir SCM’dir. Python ile yazılmış kalbimizde taht kurmasına yeter de artar. (Çakma diyoruz, ama python ile daha iyisi yazılmadı sanırım)

Bu kadar önbilgiden sonra, hemen kuruluma girelim. Öncelikle elimizde lighttpd’nin 1.4.14 ve üstü sürümü ile python 2.4 veya üstü bir sürümü gerekiyor, aksi halde ne yazık ki çalışmıyor.
Bu yazı yazıldığı sırada lighttpd’nin kararlı sürümü 1.4.19 iken, pythonun en son sürümü 2.5.2 idi.

Mercurial(hg!!!!) ‘in en son sürümü 1.0.6′yı indirdikten sonra, setup.py install diyerek mercuriali kurmanız yeterlidir.

Önce web ayarlarını yapıp, ardından repository nasıl oluşturulur onu görmek en doğrusu sanırım.

Web işini gören hgweb.cgi dosyasını, public_html’yi sunduğunuz dizine koymanız gerekmektedir. hgweb.cgi dosyası hem mercurial’ın içinden çıkar (çıkmazsa, içeriğini veriyorum)

#!/usr/bin/env python
#
# An example CGI script to export multiple hgweb repos, edit as necessary

# adjust python path if not a system-wide install:
#import sys
#sys.path.insert(0, "/path/to/python/lib")

# enable importing on demand to reduce startup time
from mercurial import demandimport; demandimport.enable()

# Uncomment to send python tracebacks to the browser if an error occurs:
#import cgitb
#cgitb.enable()

# If you'd like to serve pages with UTF-8 instead of your default
# locale charset, you can do so by uncommenting the following lines.
# Note that this will cause your .hgrc files to be interpreted in
# UTF-8 and all your repo files to be displayed using UTF-8.
#
#import os
#os.environ["HGENCODING"] = “UTF-8″

from mercurial.hgweb.hgwebdir_mod import hgwebdir
import mercurial.hgweb.wsgicgi as wsgicgi

# The config file looks like this. You can have paths to individual
# repos, collections of repos in a directory tree, or both.
#
# [paths]
# virtual/path = /real/path
# virtual/path = /real/path
#
# [collections]
# /prefix/to/strip/off = /root/of/tree/full/of/repos
#
# collections example: say directory tree /foo contains repos /foo/bar,
# /foo/quux/baz. Give this config section:
# [collections]
# /foo = /foo
# Then repos will list as bar and quux/baz.
#
# Alternatively you can pass a list of (’virtual/path’, ‘/real/path’) tuples
# or use a dictionary with entries like ‘virtual/path’: ‘/real/path’

application = hgwebdir(’hgweb.config’)
wsgicgi.launch(application)

Bu dosyası hgweb.cgi şeklinde koyduktan sonra,
lighttpd.conf’unuza (hg sunucusunu nerede yayınlıyorsanız, o conf’a koyun. Ben her vhost için farklı bir conf dosyası kullanıyorum o yüzden tek bir conf dosyasına bağlı değilim, siz tek bir conf dosyası kullanıyorsanız oraya koyun.) şu satırları ekleyin:


url.rewrite-once = (
"^/hg([/?].*)?$” => “/hgwebdir.cgi$1″,
“^/mercurial([/?].*)?$” => “/hgwebdir.cgi$1″
)

Buradaki rewrite’ın anlamı şu: domain/hg veya domain/mercurial şeklindeki çağrıları, hgwebdir.cgi’a yönlendir.

Tabiiki, cgi için bir handler belirlemek lazım, o handlerı da,
cgi.assign = ( “.cgi” => “/usr/bin/python”)
şeklinde handle ediyorsunuz. Yani cgi uzantılı dosyaların yönetimini python’a bırakıyoruz. İzin sorunları yaşarsanız, kendi UID ve GID’inizi kullanacak bir betik çalışmasını sağlayabilirsiniz python yerine. (pythonu kendi kullanıcınız olarak çalıştıracak yani)

Bunu da belirledikten sonra, geldik kullanıcı yönetimine.. Evet, nasıl kullanıcı oluşturup, onun dosya yazmasını sağlayacağız? Bunun cevabı basit. Lighttpd htpasswd altyapısını kullanıyor. Oluşturacağınız basit bir htpasswd dosyası ile kullanıcı oluşturabilirsiniz :). Apache ile birlikte geliyor aslında; ama lighttpd ile gelen yok. O yüzden webde yapacağınız bir “htpasswd generator” araması ile htpasswd oluşturmanız kolay. Oluşturduktan sonra, lighttpd ye eklemeniz gereken satırlar ise şunlar


$HTTP["querystring"] =~ “cmd=unbundle” {
auth.backend = “htpasswd”
auth.backend.htpasswd.userfile = “/path/to/htpasswd”
auth.require = ( “” => (
“method” => “basic”,
“realm” => “Hooooyt sen kimsin oolm?”,
“require” => “valid-user”
)
)
}

Tabii, sağlığınız açısından, htpasswd dosyasını (adı htpasswd olmak zorunda değil), public_html dışında tutmanızı tavsiye ederim.

Kurulum bundan ibaretti, şimdide ufak bir ayar çekelim, bir repository oluşturalım. Herhangi bir dizin oluşturup, o dizine girip “hg init” yazmanız, o dizini repository yapacaktır. Komutu verdikten sonra, komutu verdiğiniz dizinde, .hg isimli gizli bir klasör oluşacaktır, o dizine girip, hgrc dosyasını düzenleyeceksiniz, eğer yoksa korkmayın kendiniz oluşturun. Örnek bir hgrc dosyası şöyledir:


[web]
style = gitweb
allow_push = *
push_ssl = false
encoding = “UTF-8″
description = Eventualis
contact = nospam@nospam.org

allow_push o repository’e yazma hakkı olanları ifade eder. * ile htpasswd’deki herkese yazma izni verirsiniz. Eğer herkese izin vermek istemiyorsanız, kullanıcı,kullanıcı2,kullanıcı3 şeklinde ayarlayabilirsiniz. push_ssl ise https kullanımına ilişkindir, ben https kullanmıyorum, siz kullanmak istiyorsanız, true yazabilirsiniz o kısma.

Kurulum bundan ibaretti, kullanım ise şu şekilde (yerel)
hg clone http://site/hg/depo depo
/hg’yi yukardaki hgweb.cgi için kullanmıştık, değiştirdiyseniz burada da değiştirin.
Bunu yaptıktan sonra, deponun bir kopyasını yerele almış oluyorsunuz. Değişiklikleri yaptıktan sonra hg push ile gönderebilirsiniz. (commit vs anlatmıyorum, onları biliyorsunuz varsayıyorum, ne de olsa sunucu kuruyoruz ;))