(注:このブログはもう更新していません)この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

[クラウド帳票エンジンDocurain]

Subversive-3.0.0.I20150317でNullPointerExceptionが出まくるのでパッチを当てた

ウチは色々事情がありまして未だSubversionがメインです。なんかスンマセン。


…というわけで最新開発版のSubversiveを試しにインストールしてみたところ、コミットログビューを開こうとすると以下のエラーが出るようになりました。
ちなみにEclipseのバージョンは4.5M6です。

java.lang.NullPointerException
  at org.eclipse.team.svn.ui.history.AffectedPathsLabelProvider.getImage(AffectedPathsLabelProvider.java:74)
  at org.eclipse.jface.viewers.WrappedViewerLabelProvider.getImage(WrappedViewerLabelProvider.java:101)
  at org.eclipse.jface.viewers.WrappedViewerLabelProvider.update(WrappedViewerLabelProvider.java:146)
  at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:154)
  at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:949)
  at org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:114)
  at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
  at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:50)
  at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173)
  at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1029)
  at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:473)
  ...

まあこのままでもコミットログを見ることはかろうじて出来るのですが、何かする度にエラーダイアログが出て非常にウザい。

オープンソース利用者としての義務

というわけでSubversiveにパッチを当てることにしました。ソースはここにあります。


エラーが出ているメソッドのソースは以下の通り。

public Image getImage(Object element) {
    if (((AffectedPathsNode)element).getParent() == null) {
        return this.currentRevision == 0 ? AffectedPathsLabelProvider.rootAdditionIcon : AffectedPathsLabelProvider.overlayedRootIcon;
    }
    switch (((AffectedPathsNode)element).getStatus()) {
        case SVNLogPath.ChangeType.ADDED: {
            return AffectedPathsLabelProvider.addedFolderIcon;
        }
        case SVNLogPath.ChangeType.MODIFIED: {
            return AffectedPathsLabelProvider.modifiedFolderIcon;
        }
        case SVNLogPath.ChangeType.DELETED: {
            return AffectedPathsLabelProvider.deletedFolderIcon;
        }
        case SVNLogPath.ChangeType.REPLACED: {
            return AffectedPathsLabelProvider.replacedFolderIcon;
        }
    }
    return AffectedPathsLabelProvider.overlayedFolderIcon;
}

これを次のように書き換えます。
ネストがより深くなってダメコードなんですが、応急パッチなので気にしない。

public Image getImage(Object element) {
    if (element != null) {
        if (((AffectedPathsNode)element).getParent() == null) {
            return this.currentRevision == 0 ? AffectedPathsLabelProvider.rootAdditionIcon : AffectedPathsLabelProvider.overlayedRootIcon;
        }
        SVNLogPath.ChangeType status = ((AffectedPathsNode)element).getStatus();
        if (status != null) {
            switch (status) {
                case ADDED: {
                    return AffectedPathsLabelProvider.addedFolderIcon;
                }
                case MODIFIED: {
                    return AffectedPathsLabelProvider.modifiedFolderIcon;
                }
                case DELETED: {
                    return AffectedPathsLabelProvider.deletedFolderIcon;
                }
                case REPLACED: {
                    return AffectedPathsLabelProvider.replacedFolderIcon;
                }
            }
        }
    }
    return AffectedPathsLabelProvider.overlayedFolderIcon;
}

で、当該クラスであるAffectedPathsLabelProviderは
org.eclipse.team.svn.ui_3.0.0.I20150317-1700.jar
に含まれているので再パッケージして置き換えます。


ビルドするスクリプトは次の通り。Cygwin専用です。
細かいところの説明が抜けてますが、そこは気合いで突破してください。
こんなニッチな記事をここまで読む人ならできるはず。

eclipse_home=/cygdrive/c/your_eclipse_installation_path/

classpath=.

for jar in `ls $eclipse_home/plugins/org.eclipse.{osgi,core,e4.core.command,ui,e4.ui,jface,swt,team,compare}*.jar`; do
    echo $jar
    classpath="${classpath};`cygpath -aw $jar`"
done

echo $classpath

javac \
    -sourcepath src \
    -d dist \
    -nowarn \
    -source 7 \
    -target 7 \
    -cp $classpath \
    `find src -name '*.java'`

# 他のファイルは最初からdistに展開済の想定
jar cfM org.eclipse.team.svn.ui_3.0.0.I20150317-1700.jar -C dist .


これでエラーは出ないようになりました。

2015-05-31追記

3.0.0.I20150529で修正されたようです。