読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

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

Eclipse

ウチは色々事情がありまして未だ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で修正されたようです。