« 03.25 Python2.5 on さくら は too slow (2) | ココ | 03.27 東京で訊かれたその内容は »

2009年3月26日

Redmine x subversion(https) でレポジトリが更新されなくなった   このエントリーを含むはてなブックマーク 

会社で試用中のRedmineで、あるプロジェクトのレポジトリに外部ホストのsubversionレポジトリを指定してるんやけども、なぜかリビジョンが全然更新されない…。なぜなんだと、ログを見たら、こんなの(↓)が。


Processing RepositoriesController#show (for 192.168.1.6 at 2009-03-26 10:51:53) [GET]
Parameters: {"action"=>"show", "id"=>"project1", "controller"=>"repositories"}
Error parsing svn output: #<REXML::ParseException: No close tag for ["lists", "list"]>
/usr/lib/ruby/1.8/rexml/parsers/treeparser.rb:26:in `parse'
/usr/lib/ruby/1.8/rexml/document.rb:212:in `build'
/usr/lib/ruby/1.8/rexml/document.rb:46:in `initialize'
/home/redmine/lib/redmine/scm/adapters/subversion_adapter.rb:85:in `new'
/home/redmine/lib/redmine/scm/adapters/subversion_adapter.rb:85:in `entries'
/home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:181:in `call'
/home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:181:in `shellout'
...
No close tag for ["lists", "list"]
Line:
Position:
Last 80 unconsumed characters:
Output was:
<?xml version="1.0"?>
<lists>
<list
path="https://nantoka.ne.jp/svn/project1">
Rendering template within layouts/base
Rendering repositories/show

んん…? XMLが途中で切れてる? そんなはずはないんだが。コマンドラインで直に試してみても、XMLは途中で切れることなく全部出てきた。けど、なんか<list>が出た後で一旦停まったような感じが。

ソースコードはどういう処理をしてるんだと見てみると、

$ vi lib/redmine/scm/adapters/subversion_adapter.rb

74     # Returns an Entries collection
75     # or nil if the given path doesn't exist in the repository
76     def entries(path=nil, identifier=nil)
77       path ||= ''
78       identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
79       entries = Entries.new
80       cmd = "#{SVN_BIN} list --xml #{target(URI.escape(path))}@#{identifier}"
81       cmd << credentials_string
82       shellout(cmd) do |io|
83         output = io.read
84         begin
85           doc = REXML::Document.new(output)
86           doc.elements.each("lists/list/entry") do |entry|
87             commit = entry.elements['commit']
88             commit_date = commit.elements['date']

うむ…io.readで読んでるだけ。shelloutが何かやってるのか? とそっちも見る。

$ vi lib/redmine/scm/adapters/abstract_adapter.rb

172     def self.shellout(cmd, &block)
173       logger.debug "Shelling out: #{cmd}" if logger && logger.debug?
174       if Rails.env == 'development'
175         # Capture stderr when running in dev environment
176         cmd = "#{cmd} 2>>#{RAILS_ROOT}/log/scm.stderr.log"
177       end
178       begin
179         IO.popen(cmd, "r+") do |io|
180           io.close_write
181           block.call(io) if block_given?
182         end
183       rescue Errno::ENOENT => e

はたして、何が悪さをしているのだろう。RubyのIO.readが何か根本的な原因を持ってるのか? 何も特別なことをやってるようには見えないんやけどな…。

By ただ at 22:19 カテゴリー ; プログラミングとか

« 03.25 Python2.5 on さくら は too slow (2) | 03月の記事 | 03.27 東京で訊かれたその内容は »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1389

このリストは、次のエントリーを参照しています: Redmine x subversion(https) でレポジトリが更新されなくなった:

» Redmine x subversion(https) でレポジトリが更新されなくなった2 from PinMarch
会社で動かしているRedmineで、またかのような現象が起こってしまった。マシン...

トラックバック時刻: 2009年12月 5日 01:29

コメント

同じ事象で悩んでしまい、こちらにたどりつきました。

おそらく権限の問題ですね。

プラットフォームが書かれていないので例えばになりますが、redmine(Apache)を動かしているプロセスを管理者権限(Administrator, root, etc..)で動かすと、うまくいくはずです。(乱暴なやり方ですが、起こっている事象はそういうことです、ということで。。)

>コマンドラインで直に試してみても、
は、コマンドラインを実行しているユーザが相当の権限を持っているからだと思います。ぜひ一度お試しを。って遅い・・?

投稿者 通りすがりさん : 2009年6月 2日 11:36

情報ありがとうございます。
動かしているのはCentOS上なのですが、Redmineを動かしているのはリバースプロキシですので、Apacheユーザーではなく、mongrel_clusterで指定したユーザーになります。そしてコマンドラインで試したのも、同じユーザーですので、権限の問題とはちょっと違います。
なお当時、検索したところ一度コマンドラインで実行すると更新されるという情報がありましたので、コマンドラインで実行した後はレポジトリの内容がちゃんと同期しました。

このエントリでは、単純にコマンドライン上でxmlの取得をしたときに何らかの理由で一旦出力が停まっているように見えるのが、IO.readに影響を与えてるのか…? ということでして。

投稿者 たださん : 2009年6月 2日 21:53