Wednesday, July 7, 2010

SVN_APACHE Repository Configuration

1.)Setting Up A Subversion Repository Using Apache, With Auto Updatable Working Copy:

What is Subversion?
Subversion is a free/open-source version control system. That is, Subversion manages files and directories over time. A tree of files is placed into a central repository. The repository is much like an ordinary file server, except that it remembers every change ever made to your files and directories. This allows you to recover older versions of your data, or examine the history of how your data changed. In this regard, many people think of a version control system as a sort of “time machine”.

SVN has few methods to serve its users. Below are some examples:
2, SVN+Apache
3, SVNServe
In this case we are using the Apache method.
Apache should be running as an normal user, not nobody.
I won't guide people how to install apache in this how to.

Install subversion using yum
#yum install subversion

Apache Configuration:

Edit the default configuration file, or whatever configuration file apache uses to run as.
I am going to assume the configuration file is /etc/httpd/conf/httpd.conf.

[root@test ~]# vi /etc/httpd/conf/httpd.conf

Locate the line where it states something like.
                         User nobody
                         Group #-1
and vhange it to
                         User apache
                         Group apache

Creating a repository:

Suppose I want to create a Repository at /usr/local/subversion/repository using fsfs database so execute the command:

mkdir -v /usr/local/subversion/

svnadmin create --fs-type fsfs /usr/local/subversion/repository

That should create a subversion repository under /usr/local/subversion/repository.

ls /usr/local/subversion/repository
conf/  dav/  db/  format  hooks/  locks/  README.txt 

Setting up httpd.conf to serve the created repository:

Add the following lines to the end of the httpd.conf or the appropriate apache configuration file.


  Dav svn
  SVNPath /usr/local/subversion/repository/
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /usr/local/subversion/repository/conf/svn-auth-file
  Require valid-user

Adding SVN users:

Since we are using svn with an apache server, and an apache basic authentication method.
We need to create a password file with the htpasswd binary provided with a standard apache installation.

htpasswd -cmd /usr/local/subversion/repository/conf/svn-auth-file {user-name}

-c option creates a new htpasswd file.
-m encrypts the password with an MD5 algorithm.
-d encrypts the password with a CRYPT algorithm.
Where {user-name} stands for an actual user name that will be used for authentication.

Warning: We should not use the -c option once we have added the first user. Using so will create and replace all existing user within the file.

htpasswd -md /usr/local/subversion/repository/conf/svn-auth-file {user-name}

Setting up the initial repository layout:

A repository mostly contains 3 standard folders.
For creating those standard folders in a repository, create a temporary folder anywhere you want, /tmp would be a good idea, with the following subdirectories.

mkdir -pv /tmp/subversion-layout/{branches,tags}

After we have made all the layout folders, move all the contents of your project to the trunk folder.

mv -v /usr/local/apache2/htdocs /tmp/subversion-layout/trunk

Then make an initial import of the temporary created directory.

svn import /tmp/subversion-layout/

This will setup you up with a default repository layout, and make a first revision.

Setting up a working copy:

Now what we need to do is to make a working copy of all the files in the repository under /usr/local/apache2/htdocs. So that whenever a developer updates the php codes, they can see the code changes taking effect in a working environment. But setting up a working copy would not accomplish this task, we would need to make the hook scripts to work with a working copy.
Thus, whenever a developer commits to the repository, the hook script will run itself, and update the working copy. Make sure that htdocs folder under /usr/local/apache2/doesn’t already exist. If you want you can rename it to htdocs_old.

To setup a working copy, do the following.

cd /usr/local/apache2/

 svn checkout htdocs

Setting up the hook scripts:

A hook is a program triggered by some repository event, such as the creation of a new revision or the modification of an unversioned property. Each hook is handed enough information to tell what that event is, what target(s) it's perating on, and the username of the person who triggered the event. Depending on the hook's output or return status, the hook program may continue the action, stop it, or suspend it in some way. The hooks subdirectory is, by default, filled with templates for various repository hooks. 

post-commit.tmpl          post-unlock.tmpl          pre-revprop-change.tmpl
post-lock.tmpl            pre-commit.tmpl           pre-unlock.tmpl
post-revprop-change.tmpl  pre-lock.tmpl             start-commit.tmpl

For now, I will be discussing about the post-commit hook script, since that is what we need in our case. Copy the post-commit.tmpl file into post-commit in the same hooks directory, and give post-commit execution rights.

cp -v /usr/local/subversion/repository/hooks/post-commit.tmpl /usr/local/subversion/repository/hooks/post-commit

 chmod +x /usr/local/subversion/repository/hooks/post-commit

 Now edit the post-commit script and comment the follow two lines at the bottom, and add the following line to it.

/usr/bin/svn update /usr/local/apache2/htdocs/ >> /usr/local/subversion/repository/logs/post-commit.log
After doing that, make a new folder logs, under /usr/local/subversion/ so that we can enable logging, and create a blank the post-commit.log file.

mkdir -v /usr/local/subversion/repository/logs/
touch /usr/local/subversion/repository/logs/post-commit.log

Once again, we need to make sure the repository folder has the proper user ownership, it is advised to set ownership on /usr/local/subversion/repository/ for user apache.

chown -Rv apache.apache /usr/local/subversion/repository/

if all goes well, that's should be it.
You now have a working subversion repository server up which is ready for further imports, as soon as you start the apache server.

Adding and Deleting Files in SVN Repositories
1.) For Adding:
     > Simply copy file to working directory