Update Site のURL

Update Siteのsite.xmlを別名(site-terminal.xml)にしていたのだが,ある日突然,ハマった.

現象確認

アップデートサイトにあるsite-terminal.xmlを使って更新をかけようとすると,
サイトにフィーチャーが無いかのような挙動を示す.
ログはこんな感じ.

!ENTRY org.eclipse.update.core 4 0 2007-04-28 17:47:41.021
!MESSAGE Error retrieving "feature.xml". [error in opening zip file]
!STACK 0
java.util.zip.ZipException: error in opening zip file
	at java.util.zip.ZipFile.open(Native Method)
	at java.util.zip.ZipFile.<init>(ZipFile.java:203)

無論,feature.xmlの存在は確認済み.

とりあえず,org.eclipse.update.core のトレースを有効にして出力を眺めてみる.
これじゃあ解らん.

デバッガと仲良し.

例外が出た辺りから遡って,変数を眺めてみる.URLを見てみる.

http://pizza-ipa-oss.sourceforge.jp/update31/site-terminal.xml/site.xml

なんじゃこりゃ.不要なsite.xmlが付いとるぞ.

コード解析

解析ってほどでもないか.スタックトレースを遡って怪しいところを発見.

//org.eclipse.update.internal.core.InternalSiteManager#createSite

// see if we need to (and can) fix url by adding site.xml to it
try {
	if ( (url.getRef() != null) || (url.getFile().endsWith(Site.SITE_XML) || (url.getProtocol().equalsIgnoreCase("file")))) { //$NON-NLS-1$
	 	fixedUrl = url;
	} else if (url.getFile().endsWith("/")) { //$NON-NLS-1$
		fixedUrl = new URL(url, Site.SITE_XML);
	} else {
		fixedUrl = new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile() + "/" + Site.SITE_XML);	//$NON-NLS-1$
	}
} catch (MalformedURLException mue) {
	fixedUrl = url;
}

関数の頭にコメントもついている.
要するに,fileプロトコルにするか,リファレンスを置くか,いずれかの対策をしないと,site.xmlを強制的につける仕様*1らしい.
ここまで解れば,

http://pizza-ipa-oss.sourceforge.jp/update31/site-terminal.xml#

とすればよいことも解る.もしくは,site.xmlを大人しく使うようディレクトリを整理すればよい.

ちょっと謎なのは

Platform3.2.1で大丈夫だったのに,3.2.2でダメになった理由.これが良く判らない.
確かに,CVSのログを見てみると,件の処理は何回か変更になっている.
けれど,3.2.1の頃にはもう現状のものになっている様子.
執拗にやるなら,jarファイル解いて差分取りゃいいのですが…いいや,気にせず先に進もう.

*1:細かいことをいうと,最初からsite.xmlが末尾に付いている場合も,つけない.