« 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で、またかのような現象が起こってしまった。マシン...
トラックバック時刻: 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