mercurial via sshが動かなくなった

mercurialをアップデートしたら動かなくなりました。 それを回復する方法の話。

自宅の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)

バッチリ動きました。

なんでこんなバグがリリースされるかなぁ…