サマリ | ローカルファイルとCVSファイルとのバージョンの差分表示 |
---|---|
リビジョン | 0.17 |
対応バージョン | 1.4.4 |
投稿者 | sha |
投稿日 | 2003-09-13 (SAT) 13:28:08 |
#cvscheck([local][,<interval>]) local: ローカルにだけ存在するファイルの表示 <interval>:= <数字>[mhd] m:分, h:時間, d:日
./?plugin=cvscheck&refer=<page>¶m=<options> [./?plugin=cvscheck&refer=<page>¶m=[cvs|local] cvscheck] <page>: 戻り先ページ名 <options>:= [local|cvs][,<interval>]
#cvscheck(1h)
file name | local versions | cvs versions |
en.lng | 1.22 | 1.23 |
file.php | 1.30 | 1.32 |
plugin/attach.inc.php | 1.31 | 1.32 |
#cvscheck(local)
file name | local versions |
plugin/gotaku.inc.php | 0.4 |
plugin/printenv.inc.php | 0.1 |
plugin/fversion.inc.php | 0.1 |
plugin/turing.inc.php | 0.2 |
plugin/chartable.inc.php | 0.2 |
plugin/cvscheck.inc.php | 0.6 |
ここに添付しました。御利用下さい。
リビジョン | 作成日 | 内容 |
![]() | 2004/08/24 | pukiwiki1.4.4rc1対応版。みこさんの要望に対応。jjyunさんのパッチを適用。 |
![]() | 2004/08/24 | pukiwiki1.4.3以前に対応版。みこさんの要望(バージョン違い)に対応。 |
![]() | 2003/10/12 | 自作プラグインへのアクセスも指定時間だけキャッシュ |
v0.14 | 2003/10/11 | CVSを指定時間だけキャッシュ |
v0.13 | 2003/10/11 | ブロック型でcvs versionsをページ内キャッシュ |
v0.12 | 2003/10/07 | debug/local指定時に一部のプラットフォームでpreg_match_allが異常(無限ループor突如終了) |
v0.11 | 2003/10/04 | Ratbetaさんの提案。local指定時に自作プラグインへのリンク |
v0.10 | 2003/09/24 | Ratbetaさんの提案。not found表記とCVSファイルへの直接アクセス |
v0.9 | 2003/09/23 | debug/ローカルに画像ファイルが無い場合フルパスが出る |
v0.8 | 2003/09/19 | debug/一部のプラットフォームでpreg_match_allが異常(無限ループor突如終了) |
v0.7 | 2003/09/15 | debug/localモードの時にファイルがソートされてない |
v0.6 | 2003/09/15 | ローカルのみ存在するファイルの表示 |
v0.5 | 2003/09/14 | 更新対象が無い場合の表示、referに対応 |
v0.4 | 2003/09/13 | ローカルファイルが存在してバージョンが取得できない場合は除外 |
v0.3 | 2003/09/13 | ブロック型に対応 |
v0.2 | 2003/09/13 | Ratbetaさんの修正に対応 |
v0.1 | 2003/09/13 | versionlist.inc.phpとmsearch.inc.phpから新規作成 |
選択肢 | 投票 |
はい | 13 |
いいえ | 8 |
面白そうなんでちょっと書き換えてみました。修正箇所は以下。
83行目 : 修正前 $outs[] = '|'. $s . $file .'|'. $lver .'|'. $cver ."|\n"; 83行目 : 修正後 $outs[] = '|[['. $s . $file .':' . $_cvscheck_messages['URL'] . '/' . $s . $file . ']]|'. $lver .'|'. $cver ."|\n";
す、すばやいっ!というわけで、早速cvscheck.inc.php.2で対応です。
0.4入れてみました。ローカル(Apache1.3.28+php4.3.3)で動かないです。proxy.phpの86行目、タイムオーバーというエラーが出ています。
エラー文自体は、『Fatal error: Maximum execution time of 30 seconds exceeded in x:\x\proxy.php on line 86』との事。解釈間違ってそう(汗)。
うーむ。なぜなんでしょう?私のところではちゃんと動いていて症状が再現できません。http_request()をとても素直に使ってるんですが。。。「dev:PukiWiki/1.4/Proxy」を参照。
あ、今やって見たら動きました。どうやら127.0.0.1と127.0.0.0/8が被っていたのが原因みたいです(^^;)。
解決して良かったです。
話は変わりますが、http_request()はすばらしいです。自作プラグイン/msearch.inc.phpでも使っていますが、これが使えるようになってネットワーク経由で何かするプラグインが、proxyとか気にすることなく、とても簡単に書けるようになりました。ほんとすばらしい。
すばらしい。。。とか思って、cvscheckを社内PukiWikiに設置してみたのですが、動きませんでした。proxy自体がユーザ認証を必要としたため社外へアクセスできなかったようです&sad;。proxy.phpはこういう場合に対応できるんでしょうか?
SOCKS5に対応できていないと記述してるんですけど、もっと詳しく説明をして欲しいということですか?まぁ、あのページは、開発者を想定したものなので、逆にあのレベルとしてRFCなどへのリンクをはっているんですけどね。
社内でSOCKは運用してないので、その点は問題になっておりません。HTTP/1.1(rfc2616)のProxy-Authorization:に対応していれば社内でも大丈夫なのですが、ここまで勉強してからproxy.phpを見てみたのですが、どうやら対応してなさそうです。
内容は了解しました。今は手出しできないので、調べて理解した仕様を書いておきますけど、Proxy-Authorization 対応するには、userid:pass の文字列を MIME の base64 でエンコードして、これを、このヘッダーの内容にすれば良いはずです。なので対応そのものは、sha さんならできると思いますよ。改修して OK なら、パッチでも提供してもらえれば、喜ぶ人も多いのではと思います。
よくみたら、ヘッダー名が違うものの、同じ対処してるので、そのコードがずばりですね。
$query .= 'Authorization: Basic '.
base64_encode($arr['user'].':'.$arr['pass'])."\r\n";
な部分があるので、それに合わせると、こんな感じで
$query .= 'Proxy-Authorization: '.
base64_encode($arr['user'].':'.$arr['pass'])."\r\n";
てな感じですかね。
Proxy鯖用のIDとパスワードのパラメータが足りないと思うので、pukiwiki.ini.php に足して取得することになりますかね?
upkさん、ありがとうございます。上記のproxy認証に対応したパッチを紹介しておきました。興味ある方はご参照下さい。→ここ「dev:PukiWiki/1.4/ちょっと便利に/ユーザ認証付きproxyへの対応」
ちょっと便利にというレベルじゃないと思うので、dev 復活後に備忘録程度に、BugTrack にでも計上しておいて下さいよ。一応、別件もあってぱんださんにはお願いしておきましたけども。
ところで、この串って、どういうものなのでしょうか?Authorization:だって、フォームに自動的に入力を補う機能に過ぎないし、Proxy-Authorization:も同じく串にしかしない。というものなんですよね。私のところでは、NTLM で認証してないと、串が使えないので、PukiWiki の串対応では、そもそも無理なので、どうしたものぞ。と思っていました。そのヒントになればなぁ。なんですが。
社内の串はSquidとかいうものでした。社外アクセスしようとするとダイヤログが出てID,PWの入力を促します。
下記は気が向いたら勉強してみようかなと思っているページです。ご参考まで。
「NTLM認証の仕組み」
「NTLM認証の実装」
「md4のソース」
「RFC1320」
現在Proxy-Autorization: Basic XXXX....Xとかでプロキシ認証を経て社外へアクセスできることを確認しました。ところが、Windows XP Pro, Apache2.0.46, PHP4.3.3RC1, PukiWiki1.4rc3環境でpreg_match_allが無限ループに陥っているかのような症状(まだ未確認)に悩まされています。プラットフォームで動作が違うのでPHPのバグっぽい動作です。現在仕事で大急ぎの締め切りを抱えているので、この調査を来週まで先送りします。申し訳なし。
なんか、PHP4.3.3, PukiWiki1.4rc4でも同じでした。まいった。
来週へ先送りとか言ってる割に現実逃避(笑)。大丈夫な正規表現を発見。どうやらマッチングに時間がかかってタイムアウトスタックオーバーフロー?していたのかもしれません。そこで「一回だけ使用するサブパターン→(?>)」という技を使って高速化を図りました。これでうまく行きました。
ダメだった例
preg_match_all('/<tr[^>]*>((?:.(?!<\/tr>))+.)<\/tr>/is',$html,$matches)
今回の対処の例。効果的だったのは2つ目の(?>)。
preg_match_all('/<tr(?>[^>])*>((?>.(?!<\/tr>))+.)<\/tr>/is',$html,$matches)
ううむ local 側でなんかversion取得失敗してるみたい。 merlin:Plugin/Demo/cvscheck.inc.php
もしかして、newpage2.inc.phpのバージョン表記の部分のファイル名がnewpage.inc.phpになっていたりしませんか?誤記の場合もあるとすると今の仕様じゃ危険かな。versionlist.inc.phpのまねをしたんだけど。。。実際のファイル名を使うべきかな。
おおあたりでした。 m(_._)m こちらの fversion だと ファイル名でやっているのでそこで違いが出たみたいです。
そういえば、pukiwiki.phpをindex.phpにrenameして使っていたりするので、実際のファイル名よりはバージョン記述のファイル名で比較した方がありがたかったりするのです。他のファイルでそういう状況は無さそうですが。
ローカルに画像が存在しない場合、altが表示される訳ですが、これが直パスなのですが、ファイル名のみに変えられませんでしょうか?phpで出力してる部分が見つからなかったので差分はなしです(^^;
あ、ほんとだ。どうしよう。表示部分は、一番最初のRatbetaさんの修正とほとんど同じなのですが、これって画像かどうかで動作を変えないといけないのかな?
いやぁ、姑息な技で対応してしまいましたぁ。cvscheck.inc.php.9を御利用下さい。
元々画像を表示したかったわけではないので、ファイル名の見かけは変わらなくとも拡張子で画像だと判断されないようにしてみました。要するに、各ファイル名の最後に をくっつけました&huh;
リンクの方の仕様だったんですね。てっきりcvscheck.inc.phpの方で設定しているものと思い込んでしまって…。失礼致しました。
いろいろ修正してみました。個人の好みがあるので使用するのは適当にしてください。
24行目 : 修正前 'title_name' => 'plugin', 24行目 : 修正後 'title_name' => 'name', 117行目 : 修正前 $outs[] = "|[[$s :$url/$s]]|$lver|$cver|\n"; 117行目 : 修正後 if(eregi('\.[gp][in][fg]$',$s)){ $curl = "$url/$s?rev=$cver&content-type=text/vnd.viewcvs-markup"; }else{ $curl = "http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/ pukiwiki/pukiwiki/$s?rev=$cver&content-type=text/plain"; } if(eregi('\.[gp][in][fg]$',$s)){ if(!$lver){ $lver = "not found"; $lurl = "$url/$s?"; }else{ $lurl = "$url/$s?rev=$lver&content-type=text/vnd.viewcvs-markup"; } }else{ $lurl = "http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/ pukiwiki/pukiwiki/$s?rev=$lver&content-type=text/plain"; } $outs[] = "|[[$s :$url/$s]]|[[$lver:$lurl]]|[[$cver:$curl]]|\n"; 150(165)行目 : 修正前 $outs[] = '|'. $s . $file .'|'. $lver ."|\n"; 150(165)行目 : 修正後 $outs[] = '|[['. $s . $file .':http://pukiwiki.sourceforge.jp/ ?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2F' . $file .']]|'. $lver ."|\n";
上の差分を見た感想です。多機能になっていて、すばらしいです。ただ、いくつか難点があります。例えば、ローカルバージョンは設置者が修正して独自に振っている場合があることや、自作プラグインがpukiwiki.orgにあるとは限らない点です(現に私も独自の修正をしたり公開してないプラグインを設置したりしてますし、そもそも旧バージョンは設置済みなのだから取得する必要はないのでは?)。あと、できれば画像の判定はバージョン比較の本質じゃないのでなるべくしたくないものです。でも、'not found'表示と、$curlはいいアイデアなので是非取り込みたいです。cvscheck.inc.php.10にて対応。
画像の判定はバージョンの比較に使用するものではありません。画像だけCVSの表示パスが変わるので…。ちなみにこの判定をしない場合、プレーンテキストとして表示してしまいます。PukiWiki.orgへのリンクを設定したのは、最新版がそこにある(可能性が高い)からです。正規表現でPukiWikiにページが存在するかどうかを見るのも良いかもしれません。CVSの独自修正版も同じく(正規表現とか私は得意じゃないので…)。
画像の判定がバージョン比較と関係ないので遠慮したかったのですよ。その点では、cvscheck.inc.php.10は画像判定してませんが、そこそこうまくいってるんじゃないかなと思います。それから、pukiwiki.orgへのリンクが存在する可能性が高いのは私も納得します。その機能が実装できれば便利ですしね。でも実際に存在しなかった場合に宛先のないリンクが出てしまうのが、公開プラグインとしてはとってもまずいです。クリックすると新規ページが作られてしまいます。それを避けるために事前に確認するとなると、該当ファイルごとにネットワークアクセスが発生して表示が著しく遅いものになってしまいます(本当に遅いです)。それもまた避けたいところです。そのあたりも考えてみますと、上のRatbetaさんの提案の中ではcvscheck.inc.php.10で取り込んだ部分までが現実的だと思います。
独自修正版は、CVSとバージョンを比較して、CVSのバージョンより高ければ表示しない、というのはどうでしょうか?
なるほど、独自修正版についてはそういう手もありますね。でも、そもそも旧バージョンを取得しやすくするのは間違いのもとだと思いませんか?「入手したら同じものだった」というケアレスミスを誘発しやすくなります。そもそも押してはいけないボタンは付けないのがGUIとして親切だと言われています。旧バージョンが欲しい場合にはファイル名をクリックすれば行くことは出来ますので手段は用意されてますし。。。
表示してリンクだけ外してしまう、というのはどうでしょうか?これなら旧バージョンを入れる可能性も少なくて済むと思うのですが…。
うーむ。それはリンクされていないURLの表示を行うという意味でしょうか?もしそうだとすると、表示が長すぎますし(画像のURL表示でRatbetaさんも指摘してましたよね)。。。旧バージョンを手にいれる手段はあるのだから、これはこれでよしとしませんか?
同じく独自修正版ですが、SourceForge側で用意されている差分のURLを追加する、というのも効果的かもしれません。pukiwiki.ini.phpなどの設定ファイルなんかでも差分を使うと修正しやすいですし。
これについてもう少し説明してください。独自修正版について差分が公開されていることを想定しているということでしょうか?
説明不足でしたね。独自修正版の差分ではなくて、CVS版の旧バージョンと新バージョンの間の差分です。毎度毎度DLして修正して…では面倒だと思いますので。勿論、独自修正版でなくても有る方がいいかも知れません。
CVSへ行けば 旧バージョンとの差分が取れるので CVSへのURLだけでいいと思います。そこからどうするかは ユーザーの部分になるのでは? 私の場合、独自部分はパッチにしてあるので新バージョンに対してそれを当てるって感じで運営しています。ただ 修正が大きくて当たらない場合も結構あるし、たいてい独自部分は、修正される部分とぶつかることが多いので どっちからやってもうまく当たらない可能性が高いかなぁなんて思ってます。
pukiwiki.orgの自作プラグインにページが存在するかどうかを、表示時間への影響を少なくチェックできる方法を思いつきました。Ratbetaさんの提案機能がうまく実装できるかも!今時間がないので後日。
遅くなりましたが、cvscheck.inc.php.11でRatbetaさんの提案の一部に対応してみました。localオプション指定時に自作プラグインにページがあればリンクを張ります。いかがでしょうか。
Windows XP Pro, Apache2.0.46, PHP4.3.3にて、cvscheck.inc.php.11のlocalオプションでpreg_match_allの正規表現に関して再び以前と同じ症状(ページが表示されない)が現れました。しかし、同じ対策をしても改善できません。たぶんPHPのバグなんだろうなぁ。。。困った。
cvscheck.inc.php.12で多分対応できたかも。どうやら、preg_match('/a(?:.)+z/',$str)のとき、aとzの間が約1KB程度あると無限ループになったり、エラー無しの異常終了をしたりするようです。/a(.)+z/や/a.+z/では、このような症状が起こりません。(?>.)+, (?:.)+などの使用で起こりました。
いい感じですね~。早速使わせていただきました。URLのwwwは無い方が良いかなと思いますが、どうでしょうか?この辺は好き好きかもしれませんが…。正規表現か何かでリビジョンをチェックでき…は言わなかった事に(^^;
cvscheck.inc.php.13でブロック型で使ったときにcvs versionsをキャッシュしました。これで、#cvscheckと#cvscheck(local)を同一ページに並べている場合に、2番目以降でCVSへのアクセスを省略するので少し早くなります。
The dufault CVS Repository is http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/pukiwiki/pukiwiki . Recently I setup a CVS Repository for PukiWiki.tw. So I modified some code to use my CVS Repository. See here for detail. And you can download the code which I modified on My CVS Repository
OK! I am glad to know it. You can freely modify the plugin. In fact, before I read the comment, I have already checked it on your site.
PHP4.3.5に更新したところWindows2000、Apache2.0.49でApacheがお亡くなりになります。
ご報告ありがとうございます。Apacheが落ちるとは困ったものです。PHP4.3.5RC2-devでもWindows XPとの組み合わせのときに、preg_matchなどでまだ問題が残っていたのは把握しておりまして、PHPにバグレポートを出していたのですが、PCRE(正規表現ライブラリ)の制限だと言って、つまりPHPのバグではないと責任逃れ状態です。困ったものです。
ちなみに、Apache-1ではうまく動作しているという報告もありまし、Linux等では問題なさそうです。バグ対応を待っていても直りそうもないので、バグを回避するアルゴリズムに変更するしかないのかもしれませんね。現在の記述がシンプルなだけに悔やまれますが。。。
PHPのバグレポートで見つけることができませんでした(^^;。PHP4のバージョンもいくつか上がりましたが、回避アルゴリズムにするしかないかもしれませんね。
vote.inc.php(1.15) と vote2.inc.php(0.12) を一緒に置いたら、vote.inc.php のバージョンが1.14 と表示されてしまうんですけど・・・ほかにも、attach.inc.php(1.41) と attach.inc.php.40(1.40) と置いていたら attach.inc.php.40 のほうのバージョンが表示されてしまいます。
PukiWiki-1.4.4rc1上でcvscheck.inc.php を試しています。PLUGIN_DIRやLIB_DIRなどを指定して、CVSサイトとローカルサイトでディレクトリの名前や位置を異なるように設定しているのですが、このような状態でも、それぞれのディレクトリを対応づけて比較できるようにしていただけないでしょうか?
私の方でとりあえず動くようにしたコードがありますので、v0.15との差分をここ(cvscheck.mod.patch2)に添付しておきます。(修正箇所をちょっとだけ追加したので差分を、patch2に差し替えました2004-08-15)
名無しさんへ。PHPバグレポートはこちらです→http://bugs.php.net/bug.php?id=25798
みこさんへ。現在の仕様です。バージョン違いのファイルを同じフォルダに置いてはいけません。ファイルの拡張子はチェックせずに、ファイル内の$Id:行のファイル名とバージョンを読みとって比較しますので。voteとvote2の症状の原因はvote.inc.phpの1.14が同じディレクトリに置かれているからではないでしょうか?voteのバージョン比較にvote2.inc.phpは影響しません。
仕様としては、まぁ、改善の余地がありますね。現在は複数ファイルがあれば、バージョン情報を上書きしていますが、数値的に最も大きいバージョンを採用するようにしてみましょうか?すると、同じフォルダにバージョン違いを置けるようにはなりますが。。。
232c232,236 < $outs[] = "|[[$s :$url/$s]]|$lver|[[$cver:$curl/$s?rev=$cver]]|\n"; --- > if ($lver > $cver) { > $outs[] = "|[[$s :$url/$s]]|COLOR(green)\{$lver}|[[$cver:$curl/$s?rev=$cver]]|\n"; > } else { > $outs[] = "|[[$s :$url/$s]]|COLOR(red)\{$lver}|[[$cver:$curl/$s?rev=$cver]]|\n"; > }