Mercurialコマンドfilespecと一致し、最後の更新以降に変更されたファイルを識別するためのコマンド
質問
理想的には、バッチファイルを使用しているので、これを行うためのステートレスな方法を探しています。
シナリオは、ユーザーからプッシュを受信するサーバーにリポジトリを持っていることです。レポはまた、Wikiページ(Dokuwiki)のソースである作業コピーで、Wikiの各ページに1つずつ、リポジトリにあるテキストファイルです。
これはWebサーバー上にあるため、作業コピーは対話的に誰でも使用されていません。むしろ、バッチファイルは定期的に実行され、適切なコマンドを発行して、ワーキングコピーをRepoにプッシュされた最新の変更で更新させ続ける。実装へのサイドノートとして、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
を実行したことを確認してコピーしたいと思います。
これをオフにする直感的な方法を考えることはできません。スクリプトの実行中に手動で持続する必要がない場合は、それは最善でしょうが、それは質問の外ではありません。
解決
xcopy
とその/D
スイッチを使用して逃げることができます。これは、宛先内のファイルより新しいソースファイルのみをコピーします。
他のヒント
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
.