目次

OpenGrok

OpenGrok at OpenSolaris.org (Project Homepage)

OpenGrokは現在 OSSとして公開されている OpenSolarisを公開することに併せて、 実装・OSS公開された Cross-Refernece source browserです。
0.9系のLXRに比べて現時点(0.3.1)では C, Java, Borne shell, XMLと対象とする 言語は少ないですが、これに加えてELF、Javaのクラスと言ったオブジェクトファイルや、 JAR,TAR,ZIP,BZIP2と言ったアーカイブ、Troff(man用)が Index付けする対象となっています。

source browserとしてはLXRより機能的に使いやすい/セットアップが簡単なので、 C/Javaをメインで使っている開発ではこちらの方が有効でしょう。

いいとこ・わるいとこ

同じように使える LXRと比した利点・欠点は以下の通りです。
good/badwhat's?
very good単体で単語検索の他にphase検索も可能
good使えるまでの下準備があまりいらないので、すぐ使えるようにできる
bad対応言語が少ない。PHP、Perlなどにも対応して欲しい
too badファイルに含まれる日本語が適切に処理をされない

OpenGrok 0.7.0 was released on 2008/10/17

annouce
うわー、0.6.1のやつ書いたばっかりの頃じゃーん。orz

ま、それはそれとして、どうも path.csvの扱いが変わったっぽいので、下記のscriptはちょっと直す予定。0.7の新機能や変更で興味深いのは

  • JMX対応。状態監視とか管理が簡単になったらしい。
  • JUnitのtestcaseが同梱され始めた。0.7で 61%の block coverage、0.8で70%を目指しているらしい。
  • 0.7とこれ以前ではindexに互換性が無いので、upgrade時には0からindexingしなおす必要がある
  • 0.7以前に作成したconfigファイルは使えないかもしれないので、-W Optionで作り直すことが推奨。
  • Java 6必須

OpenGrok 0.6.1 was released on 2008/04/11

announce
暫く見て無い間に、0.6(2008/03/12)と0.6.1がreleaseされました。追加対応されたParserは Tcl/TKとSQLです。0.5 releaseの時にProjectは結局使うのをやめたのですが、これはこれを機会に改めて0.6.1で使ってみようと思います。

Projectを使った場合のsetup手順は後日記載予定です。改めてDocumentとか見てみると半年ぐらい前と比べて内容が変わってます。こちらもcatch upしておく予定です。

0.6.1 1st impression

  • 1. 2008/06/12時点で svn repositryにのってないのに 0.6.1のtarballに入っているEXAMPLE.txtは0.5の時にrepositryにあってtarballに入ってなかった奴とファイル名は一緒。とは言え中身はガラっと変わって(る気がするw)、最終的に無くなるのもなんとも。。。
  • 2. MainFrame?.javaを見ると rev234では当該のaction(Index database...)がOptionメニューからなくなりました。GUIをあげてIndexingするのが結構楽で好きだったから、Forumからクレームwなげるか?・・・目指す方向性が自分が求めるところと、0.6系から違ってきたのを感じます。
  • 3. 恐らく0.6になった時点で build.xmlのtaskが変更されてます。webapp taskが無くなったのが ;;
    • NetBeans? Projectになったことに伴う build.xmlの修正で、諸々 antから直呼びするのは、dist以外ない雰囲気です。stableのsrc tarballを展開してそのまま NetBeans?(6.0調べ)に取りこめましたが、そのままでは buildもままならない辺りから見ると、色んな意味で0.5以降は過渡期のように感じます。

0.6.1動作ちょこっと調べメモ

  • 1. Main-Classは org.opensolaris.opengrok.index.Indexer。引数が無くてGUI環境なら MainFrame?.main()が処理を引き継ぐ。そうでない場合は Indexerクラスがそのまま継続処理。org.opensolaris.opengrok.util.Getoptで引数処理をしている。-?がHelpになってないのは、Indexerの105行目以降の引数処理switch-case部分に ? が無いから、爽やかにdefaultに行ってる。

OpenGrok 0.5 was released on 2007/08/20

announce
仕事で使ってるので心待ちにしていた 0.5のrelease announceが出ました。ParserのenhanceはLispと謎ぃw感じですが、既にOpenSolaris.orgサイトのブラウザでは使われている Project対応と検索のwildcard対応が今回の目玉だと思います。

早速社内のソースコードブラウザを0.4から0.5にupgradeしてみて、下記に記載していないことがあれば追記します。

  • 1. srcからjavadocを作るのに JFlexが必要
    • projectのタグ付けの手順がドキュメント化されてないので、中身を読むハメにw
    • 添付されているbuild.xmlを使うには、JFlexが必要です。著作権の問題でOpenGrokにはbundleされていません。JFlex絡みの箇所(=jflexタグと、jflexをtaskdefしてるとこ)をbuild.xmlから外せば webappタスクが実行できます。従って、compile/buildタスクも出来るので JFlex.jarをdonwloadして CLASSPATHに入れるなり libにいれるなりしないでも問題ないです。
  • 2. いろいろ見てみた結果、手順は以下の tar.gz archiveに無いファイルに記載があると発覚。

setup手順

MainFrame?からIndexingする機能が排除されたので、更新してみました。

0.6以降版

Project機能を使ってみます。また折角なので src buildから始めました。

動作確認をする上で、以下の条件で行ないました。

  • 1. BASEDIR配下に src、data、展開した 0.6.1-srcを置いて 0.6.1-src展開ディレクトリがworiking directry(= BASEDIR/opengrok-0.6.1-srcがworiking directory)
  • 2. indexing対象は OpenGrokの 0.4、0.5と 0.6.1-srcを展開したもの。src配下に全て配置(*1)
  • 3. webappの context rootは /opengrokにする。Web Containerは tomcat 5.5.20(あったからw)

例によって作業はUNIXで行うと仮定していますが、Windowsの場合もほぼ同等でしょう。(MS932のsrc treeをindexing後のhyper textが文字化けさせないために・・・と言う話なら Windowsでやりましょう)

  • (*1) Projectの src treeが symlinkになっている場合、OpenGrokがうまく動作しないようなことをフォーラムで見かけました。hard linkで頑張るか、copyを用意しましょう。

  • -1. src build
    • 特に手順はありません。src tarballを展開して build.xmlのdefault targetを実行すればいいです。注意事項は下記 4点です。
      • JFlexは拾ってきて、JFlex.jarをCLASSPATHに通してください
      • hg(=Mercurial)が無い場合、build途中でエラーが出ますが、使わないなら気にしなくていいです。
      • build後のbinaryは distディレクトリにあります
      • 最新版srcは公式のfilesに書いてあります。hgを使って checkoutできます。
  • 0. 必要なツールの用意
  • 1. index付け
    • run.shを実行するだけでよいですが、srcに含まれる run.shは wildcard機能無効、config未生成、project未使用なので Indexerに渡すオプションはきっちり書き変えです。最終的な run.shはこんな感じになりました。
    • path descを設定すると OpenGrok/WebApp?が表示するtopの表示が設定できます。同梱のpaths.tsvを適当に編集します。下記のscriptではpaths.og.tsvにしてあります。.tsvとある通り、key-valueのseparatorは \t です。
      • paths.tsvのkey-valueのkeyは OpenGrokで見た場合の path、つまり absolute path - src root pathです。下記の例では opengrok-0.4の場合、/opengrok-0.4 が対応します。
#!/bin/bash
BASEDIR="/home/mage/work/misc/opengrok.20080612"
WORKDIR="$BASEDIR/opengrok-0.6.1-src"
# java opt
HOTSPOT_OPTS="-server -Xmx1024m"
OPENGROK_JAR="$WORKDIR/dist/opengrok.jar"
OPENGROK_JAR_ARG="-jar $OPENGROK_JAR"
JVM_ARGS="$HOTSPOT_OPTS $OPENGROK_JAR_ARG"
# config for cmd behaivor
VERBOSE="-v"
OPTIMIZED="-O on"
QSCAN="-Q off"
CONFIGURATION_XML="$WORKDIR/configuration.xml"
CONFIGURATION_XML_OPT="-W $CONFIGURATION_XML"
CTAGS="-c /usr/local/bin/ctags"
CMD_ARGS="$VERBOSE $OPTIMIZED $QSCAN $CONFIGURATION_XML_OPT $CTAGS"
# config for webapp behaivor
USE_ASTER="-a on"
WORDMAX="-m 600000"
CROOT="-w opengrok"
WEBAPP_ARGS="$USE_ASTER $WORDMAX $CROOT"
# config for SRC/DATA
SRC_ROOT="$BASEDIR/src"
SRC_ROOT_OPT="-s $SRC_ROOT"
DATA_ROOT="$BASEDIR/data"
DATA_ROOT_OPT="-d $DATA_ROOT"
SD_ARGS="$SRC_ROOT_OPT $DATA_ROOT_OPT"
# config for project
DEFAULT_PROJECT="-p /opengrok-0.6.1-src"
GENERATE_PROJECT_ROOT="-P"
PROJECT_ARGS="$DEFAULT_PROJECT $GENERATE_PROJECT_ROOT"

# test flag for validate options
TEST="-n"
#TEST=

# genrate index
CMD="java $JVM_ARGS $TEST $CMD_ARGS $WEBAPP_ARGS $SD_ARGS $PROJECT_ARGS"
echo $CMD
sh -c "$CMD"

# tree desc
PATH_DESC="$WORKDIR/paths.og.tsv"
EFTAR_CLZ="org.opensolaris.opengrok.web.EftarFile?"
CMD="java $JVMARGS -classpath $OPENGROK_JAR $EFTAR_CLZ $PATH_DESC $DATA_ROOT/index/dtags.eftar"
echo $CMD
if [ -z $TEST ]; then
	sh -c "$CMD"
fi

# update configuration to webapp
UPDATE_OPT="-U localhost:2424"
CONFIG_OPT="-R $CONFIGURATION_XML"
CMD="java $OPENGROK_JAR_ARG $UPDATE_OPT $CONFIG_OPT"
echo $CMD
if [ -z $TEST ]; then
	sh -c "$CMD"
fi
  • 2. webapp deploy
    • 手順-1で作成されたwebapp binaryの source.warでは SRC_ROOT/DATA_ROOTは未設定の状態で、CONFIGURATIONパラメタとConfigAddress?(localhost:2424)の2個が設定された状態となっています。
      • 一つのTomcatで複数のOpenGrokを稼働させて、web.xmlwを更新する場合、上記の設定通信用ポートはwebapp毎に用意する・・・とうまく動くが、今はどうなってるんだろう。
      • CONFIGURATIONは -Wオプションで書き出された手順 1の作業の結果を記録した構成ファイルであり、/opengrok/configuration.xmlを指してます。これが見えない場合、WebApp?再起動時に構成情報が読めないので、機能しません。再起動すると思われる場合、-Wで出力する設定ファイルを /opengrok/configuration.xmlで見えるようにするか、web.xmlの CONFIGURATIONパラメタを適正に修正しておきましょう。
      • ConfigAddress?は -Uオプションで設定する対象です。
      • 今回は手順 -1で作成された webappのbinaryをそのままdeployして -Uオプションで構成を反映する方向で行ってみました。設定では context rootを /opengrokにするので、source.warは opengrok.warに renameしてdeployします。(前述のスクリプトには最期に仕込んであります。
  • 3. スクリプト実行結果
    • 事前準備をしておけば、上記のscriptを1回動かすだけで、project対応のtreeができ上がります。これはこれで簡単だ。(*1)

  • (*1) 2回目以降のscript実行の際には、そのまま実行すれば差分だけが indexingされます。ktkr

まとめ・かんたん3手順クッキング

  • 1. web containerに cotext rootに合わせた名前に source.warを変えて deploy。動作させておく
  • 2. src treeをまとめて、indexをいれるdataの場所を用意する。
  • 3. 上記のscriptを条件に合わせて修正して実行する

0.6版向け scriptのbat版

既存環境を WinXPに移行するにあたって vbsとか csharpにしようと思いつつ、 結局 batで書いたのを載せときます。 TEST の設定に沿った動作も微妙にちがうのはスルーしてください orz

@echo off
SETLOCAL

SET BASEDIR=C:\tomcat.5.5.26
SET WORKDIR=%BASEDIR%\opengrok-0.6.1

REM java opt
REM SET HOTSPOT_OPTS=-server -Xmx1024m
SET HOTSPOT_OPTS=
SET OPENGROK_JAR=%WORKDIR%\opengrok.jar
SET OPENGROK_JAR_ARG=-jar %OPENGROK_JAR%
SET JVM_ARGS=%HOTSPOT_OPTS% %OPENGROK_JAR_ARG%

REM config for cmd behaivor
SET VERBOSE=-v
SET OPTIMIZED=-O on
SET QSCAN=-Q off
SET CONFIGURATION_XML=%WORKDIR%\configuration.xml
SET CONFIGURATION_XML_OPT=-W %CONFIGURATION_XML%
SET CTAG_ARGS=-c "C:\bin\ctags.exe"
SET CMD_ARGS=%VERBOSE% %OPTIMIZED% %QSCAN% %CONFIGURATION_XML_OPT% %CTAG_ARGS%

REM config for webapp behaivor
SET USE_ASTER=-a on
SET WORDMAX=-m 600000
SET CROOT=-w netbackup
SET WEBAPP_ARGS=%USE_ASTER% %WORDMAX% %CROOT%

REM config for SRC/DATA
SET SRC_ROOT=G:\data\src
SET SRC_ROOT_OPT=-s "%SRC_ROOT%"
SET DATA_ROOT=G:\data\src2\OpenGrok\data
SET DATA_ROOT_OPT=-d "%DATA_ROOT%"
SET SD_ARGS=%SRC_ROOT_OPT% %DATA_ROOT_OPT%

REM config for project
SET DEFAULT_PROJECT=-p /6.5.1
SET GENERATE_PROJECT_ROOT=-P
SET PROJECT_ARGS=%DEFAULT_PROJECT% %GENERATE_PROJECT_ROOT%

REM test flag for validate options
SET TEST=-n
REM SET TEST=

REM genrate index
SET CMD=java %JVM_ARGS% %TEST% %CMD_ARGS% %WEBAPP_ARGS% %SD_ARGS% %PROJECT_ARGS%
echo %CMD%
%CMD%

REM tree desc
SET PATH_DESC=%WORKDIR%\paths.og.tsv
SET EFTAR_CLZ=org.opensolaris.opengrok.web.EftarFile
SET CMD=java %JVMARGS% -classpath %OPENGROK_JAR% %EFTAR_CLZ% %PATH_DESC% %DATA_ROOT%\index\dtags.eftar
echo %CMD%

REM defined(TEST)
echo %TEST% > NUL
SET TEST_IS_DEFINED=ERRORLEVEL
if %TEST_IS_DEFINED% == 0 ( 
	%CMD%
) else ( 
	echo "do nothing" 
)

REM update configuration to webapp
SET UPDATE_OPT=-U localhost:2424
SET CONFIG_OPT=-R %CONFIGURATION_XML%
SET CMD=java %OPENGROK_JAR_ARG% %UPDATE_OPT% %CONFIG_OPT%
echo %CMD%

if %TEST_IS_DEFINED% == 0 ( 
	%CMD%
) else ( 
	echo "do nothing" 
)

0.5以前版

公式のマニュアル相当は下記にあります。
http://www.opensolaris.org/os/project/opengrok/manual

下記ではとりあえず使える用にする迄の手順を記載します。 作業はUNIXで行うと仮定していますが、Windowsの場合もほぼ同等です。

  • 0. 必要なツールの用意
    • exuberant ctagsと適当なWeb Containerが必要です。
    • tomcat5.5.xとSJS AS8.2PEでは動作を確認しましたが、基本的にWeb Containerであれば 何でも良いようです。
  • 1. index付け(/w CLI)
    • 同梱のrun.shの SRC_ROOT(index付けする対象ソースのルート)と DATA_ROOT(index付けしたデータを格納するディレクトリ)を絶対パスで記載して、実行します。これで DATA_ROOTにindex付けされた情報が格納されます。SRC_ROOTがCVS管理されている場合、DATA_ROOTにCVS repositoryからcheck outして index付けします。
  • 1. index付け(/w GUI) (0.5以前)
    • run.shを利用しないで、GUIでも実行可能です。run.shが上手くいかないときはこちらをお奨めします。
    • opengrok-[version].tar.gzを展開したディレクトリにある opengrok.jarを以下の通り実行すると、 indexを見て単体で動作する cscopeのようなswingベースのアプリケーションとして動作します。 これでもindex付けが可能です。
    • 1.1 standalone版起動
    •  % java -jar opengrok.jar -c [ctagsのパス] -s [SRC_ROOT] -d DATA_ROOT

0.5までは -d optionでDATA_ROOTを指定しなくても、末尾に書いておけばよかったのですが、必要は無かったですが、0.6.1では-d optionで明示的に指定しないとエラーになります。なんか0.6系は微妙な感じ? orz

    • 1.2 index付け
    • 画面の3個目のボタンを押して待つだけです。これが終わると、standalone版として cscopeのように使うことが出来ます。
  • 2. webapp の設定
    • 同梱されている source.warを適当なWeb Containerにdeployすれば、1で作った indexを見に行きます。
      • 同梱されているwarの WEB-INF/web.xmlに SRC_ROOTとDATA_ROOTを設定する箇所があるので、これを
      • 修正してdeployすれば [context root]/ でtop画面、[context root]/xref でソースツリーのトップが表示されます。
      • どうやるのを期待されているか分りませんが、conf/default/web.xmlを修正して、ant webappで source.warをが用意できます。
      • 残念ですが、webapp targetは0.6系で無くなりました。雰囲気、NetBeans?前堤になった・・・のかしら?
      • MLの流れを見ていると、GUIは全面的に喪失の模様です(2008/08/13付)

日本語ソース for OpenGrok-0.5

OpenGrokで見る対象のソースが日本語(SJIS)を含んでいる場合、そのまま使うと standaloneなら問題ないが、WebContainer?がTomcat(5.5系以降では確認)の場合、爽やかにISO-8859なんで、日本語が表示されなくて切ないことになる。

対応だが、Servletの出力(=srcの表示)にはFilterの実装クラスを用意して、web.xmlでServlet chan上で先にコードの処理、jsp出力に関して個々のjspを見てISO-8859っていたら、page contentType="text/html; charset=Windows-31J" な感じで対応してみる予定。実際に期待通りに稼動したら作業をログを更新するとして、もっといい方法があれば知りたいもんだ。

OpenGrokはxrefで表示する結果を parse時に DATA_ROOT/xref配下に生成していて、 jspではそのファイルをopenして出力しているだけ。なので、parseして xrefのファイルを作る時点で化けてるから、parserを修正しないとだめとわかた。。。 jspに関しては、個々に encodingを指定はしないで、ServletFilter?で文字コードを 設定する方法を取った。OpenGrokのwebappでは filterを使ってないし、 ソースの文字コードは統一されている確率が100%に近いので妥当な選択だろう。

ja patched E ctags

ctags日本語対応版を提供されてる方がいます。5.7なので現行最新(2007-11-09付)版まで提供されてます。

Lucene-JA

OpenGrokのIndexing実装はapache LuceneプロジェクトのIndexerを使っている。このため日本語のindexingが出来ないのはOpenGrokのProjectで提供されているsrc部分に依存するのではなく、 libとして使っている Luceneの問題である。で、順当に日本語で全文検索をするためのLucene日本語版が dev.java.netのprojectにある。 OpenGrokのIndexWriter?に渡すAnalyzerをJapaneseAnalyzer?()にすれば良さそうだが、 色々いじらないとだめっぽい気がしてきた。

xxxAnalyzerの確定のされ方

AnalyzerGru?.getAnalyzer(in, path)で呼び出されるfind()でなにを返すか決めている。返し方は
  • 1. パスからファイル名の拡張子(.xxx)を拾って判定
  • 2. だめぽな場合はファイルの先頭のmagic numberを拾って判定
  • 3. 対象外はシラネ

って感じである。

OpenGrok comandline options (updated 2008-06-13/0.6.1)

適当翻訳。

new at 0.6(*1)argmaybedesc
-qquiet可能な限り、出力しないで動作する
-vverbose動作中に進捗状況を表示する
-eeconomical経済的に - ディスク使用量を抑える。fileのhyper text x-refを生成しないが、必要に応じて生成するので動作がちょっとは遅くなるだろう。
-c /path/to/ctagsctagsExuberant Ctags(http://ctags.sf.net)のパス。defaultはPATH環境変数のECtagsを使う
-R /path/to/configurationRead config指定したファイルから設定を読み込む
-W /path/to/configurationWrite config指定したファイルに現在の設定を書き込む(ので、WebApp?も同じ設定を使える)
-U host:portUpdate config特定のアドレスに現在の設定を送る(ConfigAddress?で設定されたWebApp?用途が殆どの場合だろう)
-Pprojectに対して Pかなsrcルート直下のディレクトリ毎にプロジェクトを作成する
-p /path/to/default/projectprojectwebappでdefaultとするprojectのパス。src rootを外すべきである
-Q on/offQuickQuickコンテクストスキャンのon/off。デフォルトではファイルの先頭32kがscanの対象であり、これ以上の場合は '[..all..]'リンクが埋め込まれる。これをonにするとサーバが重くなるだろう(注:webappの場合のみ影響を与える設定である)
-nnoとか?全てのコマンドライン引数は処理するが、index生成はしない
-H-hに対するH全ての外部repositryのhistory cacheを生成する
n-h /path/to/repositryhistory cache指定したreposのhistory cacheを生成する(src rootからの絶対パス)
n-r on/offremote SCMremote SCMシステム対応のon/off
n-L pathLayoutとか?WebApp?が要求されるstylesheetのあるディレクトリのパス。以下の組込みが存在する:"defaults"、"offwhite"、"polished"
-O on/offOptimizeindex dbの最適化のon/off
-a on/offasteriskwildcards検索のon/off
-w webapp-contextwebappwebappのcotext rootの指定。デフォルトは /source。異なる名前にしたなら、source.warも合わせて変更するように。
-i patternignore除外対象とするfile/directory
n-A ext:analyzeranalyzer?指定された拡張子(=ext)のファイルを指定したクラス(analyzer)で解析させる
-m numbermaximumfileのindex最大値(default最大値は60000)
-SSearch外部のsrc repositryを検索し、(多分、結果に)加えた出力にする
-s /path/to/source/rootsource rootsrc treeのroot。
n-d /path/to/data/rootdata rootOpenGrokが生成するdataを配置するdirectory
n-T numberThreadindex生成をする際に使うスレッドの数。デフォルトでは有効なCPU数と同じ数のスレッド数となる。
n-??Help。(とは言え、-?なんてオプションはjdkが弾く。orz)

  • (*1) 0.5になかったら n としてある

Last-modified: 2011-12-07 00:09:56