15 January 2011

【さくらインターネット】 ユーザ権限でSubversionのWebインターフェースを運用

さくらインターネットの共用サーバでSubversionをWeb上から操作する(ブラウズする)Webアプリケーションをインストールする。

■ Subversion本体のインストールは、前回の記事

【さくらインターネット】 ユーザ権限でApache Subversionをインストール

■ WebSVNでSubversionをブラウズ(見るだけ)

WebSVN - Online subversion repository browser の公式ページより、最新版のパッケージをダウンロードしてきて、~/www/[web名]/ 以下に解凍する

# cd ~/www/myweb/
# wget http://websvn.tigris.org/files/documents/1380/48737/websvn-2.3.2.tar.gz
# tar xvf websvn-2.3.2.tar.gz
# mv websvn-2.3.2 websvn

websvn/doc/install.html にセットアップ方法が書かれているので、それを読んでから…。 設定ファイルを編集して、Subversionリポジトリのあるディレクトリを指定する

websvn/include/distconfig.php を websvn/include/config.phpにファイル名を変更してから

websvn/include/config.php
// {{{ PLATFORM CONFIGURATION ---
// Configure these lines if your commands aren't on your path.
//
// $config->setSVNCommandPath('Path/to/svn/command/'); //  e.g. c:\\program files\\subversion\\bin
  
$config->setSVNCommandPath('/home/user/local/bin/');
 
// {{{ REPOSITORY SETUP ---
// To use the parent path method (without and with optional group), uncomment the next line
// $config->parentPath('Path/to/parent (e.g. c:\\svn)');
// $config->parentPath('Path/to/parent (e.g. c:\\svn)', 'group');
 
$config->parentPath('/home/user/var/svn', 'local');

/home/user … の userや、var/svnなどは、実際のユーザ名や、Subversion のリポジトリを置いているディレクトリ名にする必要がある

20110115-websvn.png
実行画面の例 (リビジョン間の差分表示)

■ リポジトリの管理(新規追加や削除など)

WebSVNはリポジトリをブラウズする(見る)だけなので、新規のリポジトリを作成したり、リポジトリを削除したりする場合は、別のWebアプリケーションが必要になる。

Trac

のインストールに挑戦してみたが、tracが依存している Swigのインストールに必要なPHPモジュールが、現在のPHP5.2から削除されているらしく断念。

仕方なく、自作でリポジトリ作成だけを行うWebアプリを書く

20110115-svnadmin-create.png
ブラウザで表示した リポジトリ作成画面の例

svnadmin-create.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="Content-Language" content="ja" />
	<title> </title>
</head>
<body>
 
<?php
 
// このスクリプトのファイル名
$strFilenameThis = htmlspecialchars(basename($_SERVER['PHP_SELF']));
 
// リポジトリのベースディレクトリ
$strBaseDir = '/home/user/var/svn/';
 
// ユーザ認証を行う(ココにコードを追記)
// 自分自身のユーザ認証を、行なったほうがいいですよ…
 
 
print("<p>Subversion 新リポジトリ作成 (svnadmin create ~/var/svn/[repo])</p>\n");
 
if($_POST['newrepo']){
	$strNewRepo = $_POST['newrepo'];
	print("<p>新規作成 : ".$strNewRepo."</p>\n");
	if(preg_match("/^[A-Za-z0-9\-]+$/", $strNewRepo) && $strNewRepo[0] != '-' && $strNewRepo[strlen($strNewRepo)-1] != '-'){
		if(file_exists($strBaseDir.$strNewRepo) || is_dir($strBaseDir.$strNewRepo)){
			print("<p>指定されたリポジトリ名はすでに存在するディレクトリかファイル名です</p>");
		}
		else{
			print("<p>リポジトリ作成コマンド実行中 (svnamin create ".$strNewRepo.") ...</p>");
			$strResult = system("/home/tmg1136-inue/local/bin/svnadmin create ".$strBaseDir.$strNewRepo." 2>&1", $nResult);
			if($nResult == 0){ print("<p>コマンドが正しく実行されました</p>\n"); }
			else{ print("<p>実行エラー</p>\n"); }
			print("<p>コマンドの戻り値 : ".$nResult."</p><p>出力文字列 : ".$strResult."</p>\n");
		}
	}
	else{
		print("<p>指定されたリポジトリ名に、許容されない文字が入っていました</p>");
	}
 
}
else{
	print("<form method=\"post\" action=\"./".$strFilenameThis."\" name=\"form1\">\n");
	print("\t<p>作成するリポジトリ名 : \n");
	print("<input name=\"newrepo\" type=\"text\" />\n<input type=\"submit\" value=\"新規作成\" /></p>\n");
	print("</form>\n");
	print("<p></p>\n");
	print("<p>許容される文字 : A - Z , a - z , 0 - 9 , - (ただし、先頭末尾は - でないこと)</p>\n");
 
	print("<p>既存リポジトリ(ディレクトリ)の一覧</p>\n<pre>\n");
	if ($dir = opendir($strBaseDir)) {
		while (($file = readdir($dir)) !== false) {
			if ($file != "." && $file != ".." && is_dir($strBaseDir.$file)) {
				print "   ".htmlspecialchars($file)."\n";
			}
		} 
		closedir($dir);
	}
	print("</pre>\n");
 
}
 
?>
 
<p>&nbsp;</p>
<p><a href="<?php echo $strFilenameThis;?>">入力画面を再表示</a></p>
<p><a href="logoff.php">ログアウト</a></p>
 
</body>
</html>