Hatena::ブログ(Diary)

Lazy Technology

2008-01-24

[] Subversionでhttp(s)のURLスキームを認識しない問題を解決する。

RetrospectivaのtrunkをGoogle Codeからcoしようとしたらエラーが出る。

$ svn co -q http://retrospectiva.googlecode.com/svn/trunk/ retrospectiva
svn: 'http://retrospectiva.googlecode.com/svn/trunk' 用の URL スキームを認識できません

色々調べてみたものの分からなかったので、エラーメッセージググるとあっさり原因が見つかった。svnコマンドでhttp(s)系のリポジトリにアクセスする場合には、neonと言うライブラリが必要になるらしい。subversionのINSTALLファイルには以下のように書かれている。

4.  Neon library 0.25.x or 0.26.x (http://www.webdav.org/neon/)

The Neon library allows a Subversion client to interact with remote
repositories over the Internet via a WebDAV based protocol.  If you
want to use Subversion to connect to a server over ra_dav (via a
http:// or https:// url), you will require Neon.  (See also section
I.11 for information about "serf", an experimental alternative to
Neon for accessing servers over WebDAV.)

まず既存環境にNeonがあるか確認する。

$ rpm -qa | grep -i neon
neon-0.24.7-4

あった。でも要件を満たしていないようだ。と言うわけでNeonを含めてSubversionを再コンパイルする。NeonNeon公式からダウンロードするか、Subversionの依存ファイルを一括してパッケージしたtarファイルに含まれている。今回は後者を利用する。インストール方法も同様にINSTALLファイルに書かれているのでこれを参考に。

The source code is included with the Subversion dependencies package,
and it can also be obtained from:

  http://www.webdav.org/neon/neon-0.25.5.tar.gz
    -or-
  http://www.webdav.org/neon/neon-0.26.1.tar.gz

Building Neon inside the subversion build:

The Neon library source code can be placed in "./neon" if you
want Subversion to build it as part of the Subversion build process.

Unpack the archive using tar/gunzip.  Rename the resulting
directory from ./neon-0.XX.Y to just "./neon", inside the top
level of your Subversion source tree.  (This is what unpacking the
Subversion dependencies package does, too.)

手順は以下の通り。

$ wget http://subversion.tigris.org/downloads/subversion-1.4.6.tar.gz
$ tar zxf subversion-1.4.6.tar.gz
$ wget http://subversion.tigris.org/downloads/subversion-deps-1.4.6.tar.gz
$ tar zxf subversion-deps-1.4.6.tar.gz
$ cd subversion-1.4.6
$ ./configure
$ make
$ sudo make install

特に問題なく終了。configure時には以下の出力を確認した。

#
#configure: Configured to build neon 0.25.5:
#
#  Install prefix:  /usr/local
#  Compiler:        gcc
#  XML Parser:      expat
#  SSL library:     SSL support is not enabled
#  zlib support:    zlib support enabled, using -lz
#  Build libraries: Shared=no, Static=yes

再度チェックアウトし、無事チェックアウト出来る事を確認。


2008/1/29 追記

上記の手順でコンパイルした後、svkが動作しなくなったり、rubySubversionバインディングが動かなくなったりした。バインディングはバージョンが古いだけだったのだけれど、svkは原因がよく分からなかった。

以前とconfigureのオプションが違っていたりする事はあったのだが、Subvresionの依存パッケージにはNeon以外にapr,apr-util,zlibが入っていたので、それが問題になったのかもしれない。復旧した際にはNeon単体のみをソースツリーに含めるようにした。


2008/1/29 追記 その2

configureに--with-sslオプションを追加しないとhttpsでチェックアウトが出来なかったので、再度コンパイルし直し。

$ ./configure \
  PERL=/usr/local/bin/perl \
  PYTHON=/usr/local/bin/python \
  --with-swig=/usr/local/bin/swig \
  --with-ssl
$ make
$ sudo make install

コンパイル前。

$ svn --version
(snip)
以下のリポジトリアクセス (RA) モジュールが利用できます:

* ra_dav : WebDAV (DeltaV) プロトコルを使ってリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します

コンパイル後。

$ svn --version
(snip)
以下のリポジトリアクセス (RA) モジュールが利用できます:

* ra_dav : WebDAV (DeltaV) プロトコルを使ってリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します

2007-04-26

[][]update_atやcreated_atカラムの自動更新を無効にする方法

created_atやupdated_atは便利なカラムではあるが、データ移行にARを使う時にただデータを移したいだけなのに勝手にデータを更新してしまってちょいありがた迷惑な感じに。


ググってもやり方が出てこなかったのでARのソースをGrepする。

それっぽい箇所がtimestamp.rbにあった。

record_timestampsっていうクラス変数をfalseにすれば自動更新が無効になる。

base.cattr_accessor :record_timestamps, :instance_writer => false
base.record_timestamps = true

#(中略)

def create_with_timestamps #:nodoc:
  if record_timestamps
    t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
    write_attribute('created_at', t) if respond_to?(:created_at) && created_at.nil?
    write_attribute('created_on', t) if respond_to?(:created_on) && created_on.nil?

    write_attribute('updated_at', t) if respond_to?(:updated_at)
    write_attribute('updated_on', t) if respond_to?(:updated_on)
  end
  create_without_timestamps
end

def update_with_timestamps #:nodoc:
  if record_timestamps
    t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
    write_attribute('updated_at', t) if respond_to?(:updated_at)
    write_attribute('updated_on', t) if respond_to?(:updated_on)
  end
  update_without_timestamps
end

参考リンク

404 Not Found


2008/2/13 追記

クラス変数はサブクラスでも共通 - Lazy Technologyは抑えておかないと思わぬところでハマるので注意。

2008/3/25 追記

update_without_timestampsメソッドを使うと、その時だけupdated_atやcreated_atの更新を無効に出来る。