svn: attempt to write a readonly database

subversion1.4くらいの古いバージョンを使ってたのだけど、1.6にあがってから上記のようなエラーメッセージが出ることが稀によくある。 このほど理由が分かったのでメモ。

エラーは出るが実はコミットされる

↓こんな感じ

$ svn ci
送信しています              path/to/working/dir/changed/file
ファイルのデータを送信しています ..svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: attempt to write a readonly database
svn: attempt to write a readonly database
svn: コミットメッセージが一時ファイルに残っていました:
svn:    '/path/to/working/dir/svn-commit.tmp'

このようなエラーは出るものの

  • リポジトリにはちゃんと変更が反映されている
  • でも作業ディレクトリではcommitできてないことになってる
  • なので"svn up"するとリポジトリの内容がマージされる("G"マークがつく)
  • 結果的には一応問題なし

でも気持ち悪いよね・・・

原因は書き込み権限

"attempt to write a readonly database"はSQLite3が吐いてるメッセージで、svnが使ってるSQLite3のデータベースファイルに書き込み権限がないという状態。
じゃぁどのファイルかというと・・・

$ ls -l /path/to/repository/db/rep-cache.db
-rw-r--r-- 1 hoge svn 4096  3月  8 10:44 rep-cache.db

最初にリポジトリ作成したhogeユーザー以外書き込みできなくなってる。

解決

$ chmod g+w rep-cache.db
-rw-rw-r-- 1 hoge svn 4096  3月  8 10:44 rep-cache.db

これまでほとんど最初から一人で作業してたため「稀によくある」状態になってた。

エラーメッセージにファイル名でも入れといてくれればいろいろ楽だったのに。 sqlite General error: 1 SQL logic error or missing database の件といいSQLiteのメッセージはそっけなさすぎる。