Browse Source

Add base git support

Serj Kalichev 10 years ago
parent
commit
8e8060045d
1 changed files with 132 additions and 60 deletions
  1. 132 60
      scripts/rfa

+ 132 - 60
scripts/rfa

@@ -26,92 +26,149 @@ EOF
 
 group_add()
 {
-	groupadd -K GID_MIN=${group_gid_min} ${group_r_prefix}$1
-	groupadd -K GID_MIN=${group_gid_min} ${group_w_prefix}$1
+	groupadd -K GID_MIN=${group_gid_min} "${group_r_prefix}$1"
+	groupadd -K GID_MIN=${group_gid_min} "${group_w_prefix}$1"
 }
 
 group_del()
 {
-	groupdel ${group_r_prefix}$1
-	groupdel ${group_w_prefix}$1
+	groupdel "${group_r_prefix}$1"
+	groupdel "${group_w_prefix}$1"
 }
 
-svn_add()
+create_repo_svn()
 {
-	repository_name=$1
-	repo_r=${repository_root}/${repository_name}
-	repo_w=${repository_root}/${repository_name}/${repository_name}
+	svnadmin --fs-type=fsfs create "$1"
+}
+
+create_repo_git()
+{
+	local saved_dir=""
+	saved_dir=`pwd`
+	mkdir "$1"
+	cd "$1"
+	git init --bare >/dev/null
+	cd "$saved_dir"
+}
+
+data_add()
+{
+	local r_name="$1"
+	local r_root="$2"
+	local r_link="$3"
+	local repo_r="${r_root}/${r_name}"
+	local repo_w="${r_root}/${r_name}/${r_name}"
 
-	mkdir ${repo_r}
-	saved_umask=`umask`
+	mkdir -p "${repo_r}"
+	local saved_umask=`umask`
 	umask 002
-	svnadmin --fs-type=fsfs create ${repo_w}
+	local create_vcs_func="create_repo_$opts_vcs"
+	$create_vcs_func "$repo_w"
 	umask ${saved_umask}
 }
 
-svn_fixmod()
+data_fixmod()
 {
-	repository_name=$1
-	repo_r=${repository_root}/${repository_name}
-	repo_w=${repository_root}/${repository_name}/${repository_name}
-
-	chmod 750 ${repo_r}
-	chgrp ${group_r_prefix}${repository_name} ${repo_r}
-	chgrp -R ${group_w_prefix}${repository_name} ${repo_w}
-	dirs=`find ${repo_w} -type d`
+	local r_name="$1"
+	local r_root="$2"
+	local r_link="$3"
+	local repo_r="${r_root}/${r_name}"
+	local repo_w="${r_root}/${r_name}/${r_name}"
+
+	chmod 750 "${repo_r}"
+	chgrp "${group_r_prefix}${r_name}" "${repo_r}"
+	chgrp -R "${group_w_prefix}${r_name}" "${repo_w}"
+	local dirs=""
+	dirs=`find "$repo_w" -type d`
+	local dir=""
 	for dir in $dirs; do
-		chmod g+s $dir
+		chmod g+s "$dir"
 	done
-	chmod -R g+w ${repo_w}
+	chmod -R g+w "${repo_w}"
 }
 
-svn_del()
+data_del()
 {
-	rm -Rf ${repository_root}/$1
+	local r_name="$1"
+	local r_root="$2"
+	rm -Rf "$r_root/$r_name"
 }
 
 link_add()
 {
-	ln -s ${repository_root}/$1/$1 ${repository_link}/$1
+	local r_name="$1"
+	local r_root="$2"
+	local r_link="$3"
+	ln -sf "$r_root/$r_name/$r_name" "$r_link/$r_name"
 }
 
 link_del()
 {
-	rm -f ${repository_link}/$1
+	local r_name="$1"
+	local r_link="$2"
+	rm -f "$r_link/$r_name"
 }
 
 repository_add()
 {
+	local rep_name=""
+
 	for rep_name in "$@"; do
-		group_add $rep_name
-		svn_add $rep_name
-		svn_fixmod $rep_name
-		link_add $rep_name
+		find_repo "$rep_name"
+		test "x$repo_root" = "x" || { echo "Error: The repository \"$rep_name\" already exists." 1>&2; exit 1; }
+		eval repo_root="\$repository_${opts_vcs}_root"
+		eval repo_link="\$repository_${opts_vcs}_link"
+		test "x$repo_root" = "x" && { echo "Error: Illegal repository root \"\"" 1>&2; exit 1; }
+		test "x$repo_link" = "x" && { echo "Error: Illegal repository link \"\"" 1>&2; exit 1; }
+		test -d "$repo_root" || { echo "Error: Illegal repository root \"$repo_root\"" 1>&2; exit 1; }
+		test -d "$repo_link" || { echo "Error: Illegal repository link \"$repo_link\"" 1>&2; exit 1; }
+		group_add "$rep_name"
+		data_add "$rep_name" "$repo_root" "$repo_link"
+		data_fixmod "$rep_name" "$repo_root" "$repo_link"
+		link_add "$rep_name" "$repo_root" "$repo_link"
+		echo "The repository \"$rep_name\" was succesfully created."
 	done
 }
 
-repository_fixmod()
+repository_del()
 {
+	local rep_name=""
+	local sure=""
+
 	for rep_name in "$@"; do
-		svn_fixmod $rep_name
+		find_repo "$rep_name"
+		test "x$repo_root" = "x" -o "x$repo_link" = "x" && { echo "Error: Can't find repository \"$rep_name\"" 1>&2; exit 1; }
+		if test "x$opts_force" = "x"; then
+			read -r -p "Deleting repository \"$rep_name\". Are you sure (y/n)? " sure
+			test "x$sure" = "xy" -o "x$sure" = "xY" || { echo "The repository \"$rep_name\" will be not deleted."; continue; }
+		fi
+		link_del "$rep_name" "$repo_link"
+		data_del "$rep_name" "$repo_root"
+		group_del "$rep_name"
+		echo "The repository \"$rep_name\" was succesfully deleted."
 	done
 }
 
-repository_del()
+repository_fixmod()
 {
+	local rep_name=""
+
 	for rep_name in "$@"; do
-		link_del $rep_name
-		svn_del $rep_name
-		group_del $rep_name
+		find_repo "$rep_name"
+		test "x$repo_root" = "x" -o "x$repo_link" = "x" && { echo "Error: Can't find repository \"$rep_name\"" 1>&2; exit 1; }
+		data_fixmod "$rep_name" "$repo_root" "$repo_link"
+		link_add "$rep_name" "$repo_root" "$repo_link"
+		echo "The repository \"$rep_name\" was succesfully fixed."
 	done
 }
 
 user_add()
 {
-	w=0
-	r=0
-	
-	repository_name=$1
+	local w=0
+	local r=0
+	local repository_name="$1"
+	local user_name=""
+
 	shift
 	case "$1" in
 	r)
@@ -125,27 +182,28 @@ user_add()
 		w=1
 		;;
 	*)
-		echo "Illegal parameter $1"
-		exit -1
+		echo "Error: Illegal parameter \"$1\"" 1>&2
+		exit 1
 		;;
 	esac
 	shift
 	for user_name in "$@"; do
 		if [ $r -ne 0 ]; then
-			adduser ${user_name} ${group_r_prefix}${repository_name}
+			adduser "${user_name}" "${group_r_prefix}${repository_name}"
 		fi
 		if [ $w -ne 0 ]; then
-			adduser ${user_name} ${group_w_prefix}${repository_name}
+			adduser "${user_name}" "${group_w_prefix}${repository_name}"
 		fi
 	done
 }
 
 user_del()
 {
-	w=0
-	r=0
+	local w=0
+	local r=0
+	local repository_name=$1
+	local user_name=""
 
-	repository_name=$1
 	shift
 	case "$1" in
 	r)
@@ -159,35 +217,54 @@ user_del()
 		w=1
 		;;
 	*)
-		echo "Illegal parameter $1"
-		exit -1
+		echo "Error: Illegal parameter \"$1\"" 1>&2
+		exit 1
 		;;
 	esac
 	shift
 	for user_name in "$@"; do
 		if [ $r -ne 0 ]; then
-			deluser ${user_name} ${group_r_prefix}${repository_name}
+			deluser "${user_name}" "${group_r_prefix}${repository_name}"
 		fi
 		if [ $w -ne 0 ]; then
-			deluser ${user_name} ${group_w_prefix}${repository_name}
+			deluser "${user_name}" "${group_w_prefix}${repository_name}"
 		fi
 	done
 }
 
+find_repo()
+{
+	local r=""
+	local r_root=""
+
+	repo_root=""
+	repo_link=""
+	for r in $possible_vcs; do
+		eval r_root="\$repository_${r}_root"
+		test "x$r_root" = "x" && continue
+		test -d "$r_root/$1" || continue
+		repo_root="$r_root"
+		eval repo_link="\$repository_${r}_link"
+		break
+	done
+
+	return 0
+}
+
 #------------------ MAIN -----------------------------------------
 
 possible_vcs="svn git"
 
 # Defaults for rfa.conf
 group_gid_min="3000"
-group_w_prefix="vcs_w-"
-group_r_prefix="vcs_r-"
+group_w_prefix="vcs-w-"
+group_r_prefix="vcs-r-"
 repository_root=
 repository_link=
 
 # Parse command line options
 action="help"
-opts_force=0
+opts_force=""
 opts_conf="/etc/repoforge/rfa.conf"
 opts_vcs="svn"
 
@@ -227,6 +304,7 @@ while test "x$1" != "x"; do
 	shift
 done
 
+# Early help message
 test "x$action" = "xhelp" && { usage; exit 0; }
 
 # Check options
@@ -241,12 +319,6 @@ test -r "$opts_conf" && . $opts_conf
 # Compatibility (suppose SVN)
 test "x$repository_svn_root" = "x" && repository_svn_root="$repository_root"
 test "x$repository_svn_link" = "x" && repository_svn_link="$repository_link"
-eval repository_root="\$repository_${opts_vcs}_root"
-eval repository_link="\$repository_${opts_vcs}_link"
-test "x$repository_root" = "x" && { echo "Error: Illegal repository root \"\"" 1>&2; exit 1; }
-test "x$repository_link" = "x" && { echo "Error: Illegal repository link \"\"" 1>&2; exit 1; }
-test -d "$repository_root" || { echo "Error: Illegal repository root \"$repository_root\"" 1>&2; exit 1; }
-test -d "$repository_link" || { echo "Error: Illegal repository link \"$repository_link\"" 1>&2; exit 1; }
 
 # Action
 case "$action" in