自宅のmercurialサーバをアップデートしたら、ssh経由でのアクセスができなくなりました。KaoriYa版のVimのソースコードはこのmercurialサーバで管理しているのでかなり困ります。なのでとりあえず回復措置をとることに。その時のエラーはこんな感じ。
remote: Traceback (most recent call last):
remote: File "/usr/local/bin/hg-ssh", line 76, in
remote: dispatch.dispatch(['-R', repo, 'serve', '--stdio'])
remote: File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 31, in dispatch
remote: if req.ferr:
remote: AttributeError: 'list' object has no attribute 'ferr'
abort: no suitable response from remote hg!
エラーメッセージからアタリを付けて、以下のファイルを見比べます。
- /usr/local/lib/python2.7/site-packages/mercurial/dispatch.py
- /usr/local/bin/hg-ssh
- /usr/local/bin/hg (hg-sshからの類推)
どうやらdispatch.dispatchの呼び出し方が引数リスト直渡しからdispatch.requestをDTOとする方式に変更になったにも関わらず、hg-sshの修正を忘れたと推測できます。そこで次のようなパッチの修正をすると…
--- /usr/local/bin/hg-ssh.orig 2011-07-16 08:18:40.000000000 +0900
+++ /usr/local/bin/hg-ssh 2011-07-16 08:18:41.000000000 +0900
@@ -73,7 +73,7 @@
repo = getrepo("read", cmd[6:-14])
if not os.path.isdir(repo + "/.hg"):
fail("no such repository %s" % repo)
- dispatch.dispatch(['-R', repo, 'serve', '--stdio'])
+ dispatch.dispatch(dispatch.request(['-R', repo, 'serve', '--stdio']))
elif cmd.startswith('hg init '):
repo = getrepo("init", cmd[8:])
if os.path.exists(repo):
@@ -81,7 +81,7 @@
d = os.path.dirname(repo)
if d != "" and not os.path.isdir(d):
os.makedirs(d)
- dispatch.dispatch(['init', repo])
+ dispatch.dispatch(dispatch.request(['init', repo]))
else:
fail("illegal command %r" % cmd)
バッチリ動きました。
なんでこんなバグがリリースされるかなぁ…