株式会社クリアコード > ククログ

ククログ


Sphinx 1.3で使えるgettextとバージョン管理の相性の悪さを改善する仕組み

ドキュメントを作りたくなってしまう魔法のツールとしてSphinxがあります。 全文検索エンジンGroongaでは、Sphinxを英語と日本語のドキュメントの生成に利用しています。

しかし、バージョン管理する上でいくつか課題がありました。そのあたりの事情に触れた、gettextとバージョン管理システムの相性の悪さを解消する案という記事があります。*1

今回はそのときの案を引用しつつ、実際どのように解決したのかをGroongaの例で紹介します。*2

どう相性が悪いのか?

当時の記事では相性の悪さとして次の点をあげていました。

  • バージョン管理対象の.poファイルに出現位置情報が含まれているため、出現位置情報もバージョン管理せざるを得ない
  • 出現位置情報もバージョン管理するとノイズが大きい

上記を解決する案として以下を紹介しました。

  • バージョン管理しない作業用の.poファイルを導入する
  • 作業用の.poファイルには出現位置情報を入れるため翻訳時の利便性は維持
  • 作業用の.poファイルから出現位置情報を抜いた.poファイルを作り、それをバージョン管理対象とする

Groongaのドキュメントでpoファイルを更新するときには変更行が2000行くらいで、しかもその大部分がドキュメントにおける出現位置情報だったので、このやりかたで一見すべてうまくいくように思えました。

しかし、それでもまだノイズが残っていることに気づきました。

1
2
3
# 161fad58cef448c698df3d188d57135d
msgid "13.10 Saucy Salamander"
msgstr ""

上記の 161fad58cef448c698df3d188d57135d ですが、これはSphinxが生成する uuid です。

メッセージの出現位置情報については、GNU gettextでは --no-location オプションがあるので除去できます。しかし uuid についてはSphinxが独自に生成しているためどうすることもできません。

どう解決したのか?

生成されたpoから uuid を除去する仕組みをGroongaのドキュメント生成に組みこむことも考えましたが、やはりSphinx本体で uuid を生成しないという選択肢が選べるならそれにこしたことはありません。Groonga特有の問題ではなく、広く一般に使えるものだからです。

そこで Sphinx自体を修正し uuid の出力を制御可能にするオプションを追加しました。この変更はすでに Sphinx本体にとりこんで もらいました。

Sphinx 1.3b1以降で使えるようになります。

uuidを無効にするには

Sphinx 本体にとりこんでもらった時点では、従来との互換性から uuid の生成をデフォルトでは有効なままにしていました。

しかし、その後 デフォルトで出力しないように既定値がFalseへと変更されたようです。そのため、何もしなくても以下のように config.py に書いたのと同じことになります。

1
gettext_uuid=False

まとめ

今回はGNU gettextとバージョン管理の相性の悪さを、Sphinx本体を修正することで解決した事例を紹介しました。 使っているフリーソフトウェアの「こうだったらもっといいのに」があれば、開発元にフィードバックして、なおしてもらえるといいですよね。

*1 実は一年以上前の記事。

*2 解決してから結構経過しているが、そういえばククログに書いていなかったのを思いだしたので今年のうちに記事にした。

2014-12-16

«前の記事: schooでリーダブルコードのWeb授業を開催 最新記事 次の記事: Clangの静的解析を使ってコードの潜在的な問題点を探すには»
タグ:
年・日ごとに見る
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|