1

理想的には、バッチファイルを使用しているので、これを行うためのステートレスな方法を探しています。

シナリオは、ユーザーからのプッシュを受信するサーバー上にリポジトリがあるというものです。リポジトリは、wikiページ(dokuwiki)のソースである作業コピーでもあります。これは、リポジトリにあるテキストファイルであり、wikiの各ページに1つずつあります。

これはWebサーバー上にあるため、作業コピーは誰もインタラクティブに使用しません。むしろ、バッチファイルは定期的に実行され、適切なコマンドを発行して、リポジトリにプッシュされた最新の変更で作業コピーを最新の状態に保ちます。実装の補足として、wikiからの作業コピーへの変更も受け入れ、それらを同じストロークでマージしてコミットしようとします。

バッチファイルは次のようになります。

@echo off
cd \dokuwiki\data\directory
start /wait cmd.exe /c hg update
start /wait cmd.exe /c hg resolve -m -a
start /wait cmd.exe /c hg resolve -a
start /wait cmd.exe /c hg commit -A -m "Automated commit"
for /r %%x in (*.jpg *.png *.gif) do copy /y "%%x" ..\..\media\directory

これはテキストファイルでは問題なく機能しますが、dokuwikiでは、グラフィックなどのメディアを別のディレクトリに保存する必要があります。これが最後のforステートメントの目的です。

それまでは、スクリプトの改善には関心がないことに注意してください。これは、この環境で更新を行うための望ましい方法として精査されています。

最後のコピーの問題は、変更されたかどうかに関係なく、すべてのグラフィックをコピーすることです。明らかに、変更されたグラフィックのみをコピーする方がよいでしょう。前回の更新以降、このリポジトリに複数のプッシュがあった可能性があるため、この作業コピーが最後に更新されたとき、つまりこのスクリプトが最後に実行されたとき以降に変更されたグラフィックのみを識別してコピーしたいと思いますhg update

これを手に負えない直感的な方法は考えられません。スクリプトの実行間で情報を手動で保持する必要がない場合は最善ですが、それは問題外ではありません。

4

2 に答える 2

4

Windowsバッチファイルの構文についてはわかりませんが、Mercurialのhg status --rev REVものがおそらくあなたが探しているものです:

@echo off
cd \dokuwiki\data\directory

ORIG_REV = hg log --rev . --template="{node}"

start /wait cmd.exe /c hg update
start /wait cmd.exe /c hg resolve -m -a
start /wait cmd.exe /c hg resolve -a
start /wait cmd.exe /c hg commit -A -m "Automated commit"

CHANGED_FILES = hg status --no-status --added --modified --rev ORIG_REV -I '*.jpg' -I '*.png' -I '*.gif'

for /r %%x in (CHANGED_FILES) do copy /y "%%x" ..\..\media\directory
于 2011-05-12T15:58:26.863 に答える
0

宛先のファイルよりも新しいソースファイルのみをコピーxcopyするスイッチを使用することで、問題を回避できる場合があります。/D

于 2011-05-12T16:38:43.000 に答える