もんりぃ is undefined.

育児ネタとか、技術ネタとか。

zsh の subversion コマンド補完がエラーを吐くようになってしまった件について。

前置

zsh と言えば、強力な補完を備えているシェルであることはお馴染みだと思います。

id:monry84 的にも、もはや zsh が無いと開発出来ない身体になってしまいました。

特に zsh は、git とか svn とかのサブコマンドの引数に応じて適切な保管を行ってくれる *1 のが素敵ポイントだったりもします。

んで、普段ボクは業務で git 使ってるんですが、一部の開発機では未だに svn が現役で稼働しています。

そんな中、同僚から「なんか動かないんだけど。」って言われたのでその調査と解決の道のりを記してみる次第。

前提

ディストリビューションCentOS 5.7

各種バージョンは以下の通り

zsh
4.3.10
svn
1.7.4

現象

$ svn status
M       hoge
A       fuga
?       piyo

みたいな状態だったとして、「よーし、パパ、hoge をコミットしちゃうぞー」と思い立ち、いつものように <TAB> でファイル名の補完をしようとすると…、

$ svn commit ho<TAB>
_arguments:comparguments:312: invalid argument: [--cl]:ARG:

と、盛大に怒られる。

どうやら、svn commit (当然 svn ci なショートハンドも。) に於けるファイル名補完が巧く動かないっぽい。

仮説

「ちょっと前に subversion のバージョンを 1.7 系にアップデートしたので、その辺が悪さしてるのかな?」と考える。

「んで、この手のエラーは大抵 zsh の functions が追従できてないコトによって引き起こされるコトが多かったなぁ…。」と考える。

「よし、Google 先生に聞いてみよう」と考える。

調査

実際にエラーメッセージそのものでググってみる。

と、それっぽい記事は何件か見付かる。

で、「このURLのパッチ当てれば直るよ!」って書いてある。

が、そのページに飛んでみると、某 github な猫さん?が朗らかに「404」って教えてくれる。

何でかは知らんが、該当するコミットが消えてるっぽい。

少なくとも、その修正をコミットした人の github アカウントは生きているので、commit history から頑張って漁ってみる。

解決

漁ってみたところ、以下の commit を見付けた。

https://github.com/simono/zsh/commit/0082320b79b49a12a497e730bb18807cc2d69bbd

で、これを /usr/share/zsh/4.3.10/functions/_subversion に当ててみると、見事に動きましたとさ!

万が一上記の URL がまた消えないとも限らないので、diff だけ抜粋して以下に貼っておく。

       ! _retrieve_cache svn-${cmd}-args;
   then
     args=(
-      ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
+      ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)(-##)([[:alpha:]]##) \[--([a-z-]##)\](:arg:)#/(--$match[3])$match[1]$match[2]$match[4] ($match[1]$match[2])--$match[3]$match[4]}
     )
     _store_cache svn-${cmd}-args args
   fi

*1: 例えば svn add なら、まだバージョン管理されてないファイルだけを対象に補完リストを出してくれる。