バージョン管理の最近のブログ記事



今のところ/trac以降すべて同じ.htpasswdで認証しているので、プロジェクトごとにアクセスを制御することができない。


trac.confでは、



<locationMatch "/trac/[[:alnum:]]+/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/www/trac/.htpasswd
Require valid-user
</locationMatch>

となっていて、:alnum:?がプロジェクト名になることが想定されてる。


タグつき正規表現が使えたら



<locationMatch "/trac/([[:alnum:]]+)/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/www/trac/$1/.htpasswd
Require valid-user
</locationMatch>

って感じでいいと思ったんだけど、どうやら使えないっぽい。


どーしようかなー。


2009/2/11 14:40 追記


とりあえずプロジェクト名決め打ちで対処。そのうちどうにかしたいなー。



<locationMatch "/trac/portal/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/www/trac/portal/.htpasswd
Require valid-user
</locationMatch>



昨日の時点でも気づいてたんだけど、MODx管理ページへのログインのため http://example.com/modx/managerにアクセス、ログインしようとすると、その直後にBasic認証させられた。Tracへログインしてくださいとのこと。


最初はmodxが../trac/*なファイルにアクセスしようとしてるのかと思ったんだけど、冷静に考えたら少しおかしいので調べてみる。


原因は昨日書いたtrac.confにあった。



<locationMatch "/[[:alnum:]]+/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/www/.htpasswd
Require valid-user
</locationMatch>

:alnum:?は正規表現で英数字を意味するので、/英数字/loginなURLへのアクセスにはすべてこの認証を通ることが要求される。たぶん/modx/loginみたいなファイルがあったのかなー。


というわけで次のように書き換え。



<locationMatch "/trac/[[:alnum:]]+/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/www/trac/.htpasswd
Require valid-user
</locationMatch>

で、.htpasswdの場所もあわせてあげる。



# cd /var/www
# mv .htpasswd trac/

解決。




以前学校のサーバの自分のホームに作ったリポジトリを他のメンバーと共有しようとして、かなり強引な手を使った覚えがあるので、今回は行儀よくいこうとapache経由で利用できるようにする。


yumを使ってみたりapacheを再起動したりするため、rootになれる環境でないと以下の手順は使えないです。


Apacheの設定


Apacheは既に入っているので、Subversion向けWebDAVモジュール(mod_dav_svn)だけインストールする。


それからリポジトリの作成、apacheを所有者に設定、と作業。



$ su
# yum install subversion mod_dav_svn
# mkdir /var/www/svn
# svnadmin create /var/www/svn/funnybunny
# htpasswd -c /var/www/.htpasswd tnzk
# chown -R apache.apache /var/www/svn

それから/etc/httpd/conf.d/subversion.confを編集。以下のようなセクションがコメントアウトされているので、コメントを外して、Location, SVNParentPath, AuthUserFileを書き換える。



<Location /svn>
DAV svn
SVNParentPath /var/www/svn

# Limit write permission to list of valid users.
<LimitExcept GET PROPFIND OPTIONS REPORT>
# Require SSL connection for password protection.
# SSLRequireSSL

AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /var/www/.htpasswd
Require valid-user
</LimitExcept>
</Location>

で、Apacheを再起動。



# /etc/rc.d/init.d/httpd restart

http://example.com/svn/funnybunnyにアクセスできれば成功。Powerd by SubversionとかRevisionとかなんとか表示されるはず。


Tracのインストール


こちらはソースからインストール。まずはtracのインストールと動作に使われるpythonがらみのモジュールをyumからインストール。



# yum -y install python python-setuptools mod_python

次にwget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.1.ja1.zipしようと思ったら404 NOT FOUND。


インタアクト株式会社--ニーズに対応した柔軟なシステム開発を目指してにアクセスして確認してみると、今のURLはhttp://www.i-act.co.jp/project/products/downloads/Trac-0.11.2.1.ja1.zipになってるらしい。バージョンごとに削除されてるようなので、このエントリを参考にする人はご注意くださいな。


気をとりなおして、wgetして展開→インストールを行う。



# wget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.2.1.ja1.zip
# unzip Trac-0.11.2.ja1.zip
# cd Trac-0.11.2.ja1
# python setup.py install

インストールスクリプトの動作中、やけにhttp://cheeseshop.python.org/pypi/Genshi/へのアクセスに時間がかかっているようだったのでイヤな予感がしたものの、無事インストール終了。


次に、apacheからアクセスするディレクトリと設定ファイルの作成。



# mkdir /var/www/trac
# chown -R apache.apache /var/www/trac
# vi /etc/httpd/conf.d/trac.conf

僕の場合trac.confは新規作成になった。以下のような感じで書く。



<Location /trac>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/www/trac/
#PythonOption TracUriRoot /trac

SetEnv PYTHON_EGG_CACHE /var/www/.egg-cache
</Location>

<locationMatch "/[[:alnum:]]+/login">
AuthType Basic
AuthName "trac"
AuthUserFile /var/www/.htpasswd
Require valid-user
</locationMatch>

で、apacheをもう一度再起動したあと、http://example.com/tracにアクセスできれば成功。プロジェクト一覧とでかでかと表示された。


というわけであっさり完了。


参考




昨日に引き続きサーバの設定。sshのポートを標準(22)から変更したのを忘れてsvn+sshでcheckoutできなかった。


設定ファイルである~/.subversion/configを開き、[tunnels]セクションを探してその直後に利用したい「トンネル名=ssh -p 利用したいポート」と記述。以下のようになる。



[tunnels]
mytunnel=ssh -p 123456

実際に利用するときは、



$ svn co svn+mytunnel://username@example.com/path/to/your/repos

といった感じで。


参考: Subversionを使い任意のポート番号でsvn+sshする方法 - mahata_dev




毎週、開発の中間報告を書いてたんだけど、しばらく放置状態だったので、それくらいなら自動化してしまおうかなーと思い立つ。svnのコマンドラインクライアントをRubyから呼び、cronで週一で実行すればいいので、すぐ書けるはず。


と思ったら微妙なところでコケる。


svn logのログメッセージが、



weekly commit mail?\227?\130?\146?\227?\129?\168?\227?\130?\138?\227?\129?\130?\227?\129?\136?\227?\129?\154?\228?\189?\156?\230?\136?\144.



といった感じで化けている。



setenv LC_ALL ja_JP.eucJP

してみてもシェルのメッセージ(command not foundとか。何ていうのあれ?)は日本語化されるものの、svn logの内容は変わらず。シェルではなくsvnの問題っぽい。


~/.subversion/configを見てみる。



### Set log-encoding to the default encoding for log messages


# log-encoding = latin1



log-encodingをlatain1からeucJPに書き換えてみるものの変化なし。


Web上にもあんまり情報がないし、Unixあんま詳しくないので、これ以上設定変えて解決を図ってもうまくいかなさそう。ごり押しでいく!



  1. ?\を%に置換

  2. /\%[0-9]{3}/にマッチさせて、各3桁の10進数を2桁の16進数に変換。これでURLエンコード。

  3. URI.decodeでデコード


したらうまくいった。まあかなり無理矢理なので、設定から解決できるようになったら修正するつもり。


シンプルにRubyからsvnのログを扱うSvnクラスを作る。simplesvn.rb。



class Svn
def initialize( path)
# リポジトリへのパスを与えて初期化.
@path = path
end
def head_rev
# HEADのリビジョンナンバーを返す.
`svn log --quiet --limit 1 #{@path}|grep r`[/r[0-9]*\ /][1..-2].to_i
end
def log_hash( rev)
# 指定されたリビジョンのログを,
# body, rev, user, dateのキーを持つハッシュとして返す.
require "date"
arr = `svn log --limit 1 #{@path}@#{rev.to_s}`.split("\n")[1..-2]
h = Hash.new
arr[2].gsub!( "?\\", "%")
keys = arr[2].scan( /\%[0-9]{3}/).uniq
vals = keys.map{|s| "%#{s[1..-1].to_i.to_s(16)}"}
keys.length.times do |i|
arr[2].gsub!( keys[i], vals[i])
end
h['body'] = arr[2]
header = arr[0].split(" | ")
h['rev'] = header[0][1..-1].to_i
h['user'] = header[1]
h['date'] = Date.strptime( header[2], "%Y-%m-%d")
h
end
def rev_since( date)
# 指定した日付の一番古いリビジョンナンバーを返す.
require "date"
stop = date - 1
rev = head_rev
h = Hash.new
h['date'] = Date.today
while stop <= h['date']
rev = rev - 1
h = log_hash( rev)
end
rev + 1
end
end

#require "date"
#svn = Svn.new( "file:///path/to/repositry")
#puts head = svn.head_rev
#h = svn.log_hash( head)
#puts h['body']
#puts h['rev'].to_s
#puts h['user'].to_s
#puts h['date'].to_s
#week = Date.today - 7
#puts week.to_s
#puts oldest = svn.rev_since( week)

で、こいつを使ってメールを送るweeklycommit.rb。メールの送信にはid:i123さんのSimpleMailクラスを利用。



require "cgi"
require "uri"
require "kconv"
require "date"
require "net/pop"
require "simplesvn"
require "simplemail"

svn = Svn.new("file:///path/to/repositry")
subject = "今週のコミット"
t = Time.new
pt = t - 604800
message << "今週もお疲れさまです。\n#{pt.month}#{pt.day}日から#{t.month}#{t.day}日の間に、\n社内のsvnによせられたコミットは次のとおりです。\n(時系列順)".toutf8

head = svn.head_rev
oldest = svn.rev_since( Date.today - 7)

(oldest..head).each do |i|
h = svn.log_hash( i)
s = "\n\n"
s << "==== #{h['user']}: #{h['date'].to_s.gsub("-","/")} ===============\n"
s << URI.decode( h['body'])
message << s
end

# さくらなのでPOP Before SMTP
pop = Net::POP3.new( "popserver")
pop.auth_only( "from@mail.addre.ss", "password")

smail = SimpleMail.new( "from@mail.addre.ss", "mailserver")
smail.send( "to@mail.addre.ss", subject.kconv( Kconv::JIS, Kconv::UTF8), message.tojis)

こいつをcronで週一で呼び出す。crontabに以下の設定を追加。環境変数の設定を忘れずに。



*/5 * * * * ruby /path/to/weeklycommit.rb



これで5分ごとにメールがくるはず。


しばらく放置していると、ちょっと放置しすぎて40分の間に8通のメールが。うまくいってる。


今度は毎週月曜日のPM8:00にメールを送るようにする。



0 20 * * 1 ruby /path/to/weeklycommit.rb



テストではうまくいったけど、この設定でうまく動くかは不安。あと5時間のはずだけど...リアルタイムの絡むデバッグってやりにくいよね。




LinuxでのSvnクライアント


Windowsには、GUIシェル拡張型のsvnクライアントとしてTortoiseSVNというのがあります。フォルダを右クリックしてコンテキストメニューからチェックアウトやコミットなどsvnでできるほとんどのことがカバーできてとても便利です。そんなわけでぼくもWindowsでは常にこれを使ってます。


Linuxでも同様のものがあればいいなーと思ってたんですが、見つかりませんでした。でQSvnRapidSVNを使おうとしてみたものの、なんとなく好きにならなかったので、最終的には標準のコマンドラインクライアントを使ってました。


で、今日Windowsで普段お世話になってるTortoiseのLinuxへの移植があるらしいことを知り、試してみることにしました。


nautilussvnのインストール


nautilssvnは次のサイト上で公開されてます。去年の(というにはまだ早い感じがするけど、断じて去年の)12月半ばからはじまったプロジェクトらしいです。動くまでが早いなー。こちらで11月のインストール記録があるので明らかに間違いです)


nautilussvn - Project Hosting on Google Code


ご存知の方が多いと思いますが、nautilusというのはGnome標準のファイルマネージャです。KDEでnautilusが動くかどうかはわからないので、もしかしたらKDEでは使えないかもしれません。


nautilussvnが動作するために必要なものが次のとおり:



  • python-nautilus

  • python-wxgtk2.6

  • python-svn

  • meld (オプション)


……と、プロジェクトページには書かれていますが、大前提としてpythonが必要です。まあイマドキのLinuxでpython入ってないことはほとんどないでしょうけど……。


まずはこの子たちをインストール。Ubuntuな僕はaptで一発でした。プロジェクトのインストール手順の紹介ページでは、Ubuntuに加えFedora, Gentooでのインストール手順が紹介されてます。



% sudo apt-get install python-nautilus python-wxgtk2.6 python-svn meld

こちらは何の問題もなく終わり。


次にnautilussvn本体のインストールです。こちらはパッケージ化はされていませんが、インストール手順ページでシェルスクリプトが公開されています。



#!/usr/bin/env bash

# Nautilus extensions live in ~/.nautilus/python-extensions - make sure that this directory exists.
mkdir -p ~/.nautilus/python-extensions/

# Next checkout NautilusSvn into ~/.nautilus/python-extensions/NautilusSvn
cd ~/.nautilus/python-extensions/
svn checkout http://nautilussvn.googlecode.com/svn/branches/stable NautilusSvn

# Setup the emblems
mkdir -p ~/.icons/hicolor/scalable
ln -s ~/.nautilus/python-extensions/NautilusSvn/icons ~/.icons/hicolor/scalable/emblems # The current emblems folder
ln -s ~/.nautilus/python-extensions/NautilusSvn/icons ~/.icons/hicolor/scalable/icons # The old emblems folder

# Finally we need to set up a symlink so that Nautilus finds the correct startup script.
ln -s NautilusSvn/NautilusSvn.py NautilusSvn.py

# Now just restart Nautilus, and you should see the new Subversion menu items.
# 1) nautilus -q && nautilus
# 2) killall nautilus
# 3) log out and back in again

nautilus -q && nautilus

(コメントまでまとめて拝借)上のスクリプトを~/nautilussvn-install.shに保存し、



% chmod 755 nautilussvn-install.sh
% ./nautilussvn-install.sh

これで終了、最近のLinuxはマニュアルインストールも簡単でゆとりな僕は非常にうれしいです。


と思ったらコケた('A`


エラー内容は/var/lib/samba/usersharesが存在しないといったもの。SambaってあのSamba?インストールせねばならんのかなー。


と思ってエラーに含まれてた



Please ask your system administrator to enable user sharing.



という文言でググったら、こんな記述が。




I can verify that this bug still exists in the final release. The directory didn't exist. I have solved it by doing this


mkdir /var/lib/samba/usershares


chmod 777 /var/lib/samba/usershares


Bug #211966 in samba (Ubuntu): 窶從autilus-share report a warning about missing /var/lib/samba/usershares窶?

いや今回とは別ケースなんだろうけど、いきおいでやってみた。ついでにさっきは一般ユーザ権限でインストールスクリプトを実行してたので、これも改めた。



% sudo su
# mkdir /var/lib/samba/usershares
# chmod 777 /var/lib/samba/usershares
# ./nautilussvn-install.sh

しばらく時間がかかったものの、インストール完了。ひとつだけ警告があった:



** (nautilus:8119): WARNING **: Unable to add monitor: サポートしていない操作です



あったものの、とりあえず動くようなので放置しておく。


使ってみる


適当なディレクトリを作り、コンテキストメニューからCheckoutを選択。


f:id:Tnzk:20090105002106p:image


あれ、これどっかでみたような……と思ったらまんまTortoiseじゃないですかwまあプロジェクトページにもCopyである旨明記されてるし、僕もそれを求めてたのでうれしいですが。


ちゃんとログも閲覧できる。すばらしい。ていうかアイコンも完全にTortoise。ぼくは幸せです。


f:id:Tnzk:20090105002107p:image


Tortoise同様、ログの各行をクリックすることで当該リビジョンと手元の差分も閲覧できる。


f:id:Tnzk:20090105002829p:image


差分の処理・表示にはmeldを使ってるようなので、利用する場合はrequirementsにオプションとして表示されていたmeldをインストールしておく必要があるっぽい。


Tortoiseと比べて


まあまだまったく使ってないのでアレですが、Tortoiseより安定してるような印象はある(明らかに実状はその逆だと思うけど)。あと前述のとおりLinuxでの開発だとコマンドラインクライアントを使うのが習慣化しちゃってるので、今からあえてnautilussvnに乗り換えるかといえば微妙かも。svnコマンドはこれはこれで楽だし。


とはいえはじめてLinuxでSvn使おうと思ったときに、WinでTortoise使ってた人が非常に楽な思いができると思うので、開発者の人には感謝です。


このアーカイブについて

このページには、過去に書かれたブログ記事のうちバージョン管理カテゴリに属しているものが含まれています。

前のカテゴリはチームです。

次のカテゴリはプログラミングです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja