记录下通过cgi方式将Mercurial服务器挂载到apache2上的过程。
1.hg clone http://selenic.com/repo/hg 将hg文件夹中的hgweb.cgi放到/var/www并编辑config ="/var/www/hgweb.config"这个路径一会用到
2.修改apache2配置文件/etc/apache2/site-available/default加入一行:
ScriptAlias /hg "/var/www/hgweb.cgi"
3.在/var/www创建文件hgweb.config并加入hg代码库路径
4.重启apache2(只要修改apache2配置文件就需要重启)
sudo /etc/init.d/apache2 restart
到此为止既可以通过web访问代码库了 地址是:主机IP/hg
Location标签后面是网络路径,就是你用web访问的路径,下面的例子当你访问http://host/hg/repo的时候就会提示你输入用户名和密码:
在 /etc/apache2/site-available/default中加入
hgusers:htpasswd -c /var/www/hgusers user1 (首次要加-c)生成一个用户文件hgusers
teamA: user1 user2 user3
teamB: user2 user4
给相应文件赋权限
hg代码库默认的用户策略是所有人可以读,但是所有人都不能写,以上步骤搞定后你的用户只能浏览和抓代码,但是不能提交(push)。要在相应的hg库中编辑hgrc文件,在[web]标签下加上一行:
allow_push = user1
这样user1就可以push了,大功告成!
==========================================
下面是基于上面操作的几个shell
创建库:
#!/bin/bash
PROJECTNAME=$1
if [ -n "$1" ];then
if [ -e "/var/lib/hg/$1" ];then
echo "repository name has exist!"
exit
else
echo "init hg repository ${PROJECTNAME}"
fi
else
echo "Usage: $0 <project_name>"
exit
fi
#create repo
sudo hg init /var/lib/hg/$PROJECTNAME
#set repo permission
sudo chmod -R a+w /var/lib/hg/$PROJECTNAME
#set repo hgrc
sudo echo "[ui]">>/var/lib/hg/$PROJECTNAME/.hg/hgrc
sudo echo "username=$PROJECTNAME <temp@temp.com>">>/var/lib/hg/$PROJECTNAME/.hg/hgrc
sudo echo "[web]">>/var/lib/hg/$PROJECTNAME/.hg/hgrc
sudo echo "push_ssl=false">>/var/lib/hg/$PROJECTNAME/.hg/hgrc
sudo echo "allow_push = ">>/var/lib/hg/$PROJECTNAME/.hg/hgrc
#add repo to hgweb.config
sudo echo "$PROJECTNAME=/var/lib/hg/$PROJECTNAME">>/var/www/hgweb.config
#add project to group file
sudo echo "$PROJECTNAME:">>/var/www/hggroups
#write apache config file to authentic,need to restart apache2
sudo sed -i "$ i\<Location /hg/var/lib/hg/$PROJECTNAME>" /etc/apache2/sites-available/default
sudo sed -i "$ i\AuthType Basic" /etc/apache2/sites-available/default
sudo sed -i "$ i\AuthName \"$PROJECTNAME repo\"" /etc/apache2/sites-available/default
sudo sed -i "$ i\AuthUserFile /var/www/hgusers" /etc/apache2/sites-available/default
sudo sed -i "$ i\AuthGroupFile /var/www/hggroups" /etc/apache2/sites-available/default
sudo sed -i "$ i\Require group $PROJECTNAME" /etc/apache2/sites-available/default
sudo sed -i '$ i\</Location>' /etc/apache2/sites-available/default
sudo /etc/init.d/apache2 restart
echo "done"
exit
#!/bin/bash
#add user to hgusers
USER=$1
GROUP=$2
if [ -z "$1" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if [ -z "$2" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if ! grep -q "^$USER" /var/www/hgusers
then
#create new user
echo "create user $USER"
sudo htpasswd -m /var/www/hgusers $USER
fi
#add user to group
#echo "add $USER to $GROUP"
#sudo sed -i "/\<${GROUP}\>/s/$/ ${USER}/g" /var/www/hggroups
#exit
if grep -q "^$GROUP\>" /var/www/hggroups
then
if grep "^$GROUP" /var/www/hggroups | grep -q "\<$USER\>"
then
echo "$USER has in the list!"
exit
else
sudo sed -i "/^${GROUP}\>/s/$/ ${USER}/g" /var/www/hggroups
fi
else
echo "no such group! please check valid group in /var/www/hggroups or create new project"
exit
fi
echo "done"
exit
#!/bin/bash
#set user authentic
USER=$1
GROUP=$2
if [ -z "$1" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if [ -z "$2" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if [ -e "/var/lib/hg/$GROUP" ]
then
if grep "^allow_push" /var/lib/hg/$GROUP/.hg/hgrc | grep -q "\<$USER\>"
then
echo "$USER has in the push list!"
exit
else
sed -i "/^allow_push/s/$/ ${USER},/g" /var/lib/hg/$GROUP/.hg/hgrc
fi
else
echo "$GROUP not exist! please check /var/www/hggroups or create new project"
exit
fi
echo "done"
exit
取消用户push:
#!/bin/bash
USER=$1
GROUP=$2
if [ -z "$1" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if [ -z "$2" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if [ -e "/var/lib/hg/$GROUP" ]
then
if grep "^allow_push" /var/lib/hg/$GROUP/.hg/hgrc | grep -q "\<$USER\>"
then
sed -i "/^allow_push/s/ ${USER}\,//g" /var/lib/hg/$GROUP/.hg/hgrc
echo "done"
fi
else
echo "$GROUP not exist! please check /var/www/hggroups or create new project"
exit
fi
exit
删除用户:
#!/bin/bash
#add user to hgusers
USER=$1
GROUP=$2
if [ -z "$1" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if [ -z "$2" ];then
echo "Usage: $0 <username> <groupname>"
exit
fi
if ! grep -q "^$USER" /var/www/hgusers
then
echo "no such user"
exit
fi
if grep -q "^$GROUP\>" /var/www/hggroups
then
if grep "^$GROUP" /var/www/hggroups | grep -q "\<$USER\>"
then
sudo sed -i "/^${GROUP}\>/s/ ${USER}//g" /var/www/hggroups
fi
else
echo "no such group! please check valid group in /var/www/hggroups or create new project"
exit
fi
echo "done"
exit
删除代码库:
#!/bin/bash
PROJECTNAME=$1
if [ -n "$1" ];then
if [ -e "/var/lib/hg/$1" ];then
echo "deleting ${PROJECTNAME}"
sudo sed -i "/\/hg\/var\/lib\/hg\/${PROJECTNAME}/,+6d" /etc/apache2/sites-available/default
sudo sed -i "/^${PROJECTNAME}/,0d" /var/www/hggroups
sudo sed -i "/^${PROJECTNAME}/,0d" /var/www/hgweb.config
sudo rm -r -f /var/lib/hg/${PROJECTNAME}
sudo /etc/init.d/apache2 restart
echo "done"
exit
else
echo "${PROJECTNAME} no found"
exit
fi
else
echo "Usage: $0 <project_name>"
exit
fi