Mercurial-Befehl zum Identifizieren von Dateien, die der Dateispezifikation entsprechen und seit dem letzten Update geändert wurden
Frage
Idealerweise suche ich nach einer zustandslosen Möglichkeit, dies zu tun, da ich eine Batchdatei verwende.
Das Szenario ist, dass ich ein Repository auf einem Server habe, das Pushs von Benutzern empfängt.Das Repo ist auch eine Arbeitskopie, die als Quelle für Wiki-Seiten (Dokuwiki) dient, bei denen es sich einfach um die Textdateien handelt, die sich im Repository befinden, eine für jede Seite im Wiki.
Da es sich um einen Webserver handelt, wird die Arbeitskopie von niemandem interaktiv genutzt.Stattdessen wird eine Batchdatei regelmäßig ausgeführt und gibt die entsprechenden Befehle aus, um die Arbeitskopie mit den neuesten Änderungen, die an das Repo übertragen wurden, auf dem neuesten Stand zu halten.Als Randbemerkung zur Implementierung: Sie akzeptiert auch Änderungen an der Arbeitskopie aus dem Wiki und versucht, diese gleichzeitig zusammenzuführen und zu übernehmen.
Die Batchdatei sieht so aus:
@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
Dies funktioniert gut für Textdateien, aber Dokuwiki erfordert, dass Medien wie Grafiken in einem anderen Verzeichnis gespeichert werden, und zwar im letzten Verzeichnis for
Aussage ist für.
Beachten Sie, dass ich mich bis zu diesem Zeitpunkt nicht mit Verbesserungen am Skript beschäftigt habe.Dies wurde als unsere gewünschte Methode zur Durchführung des Updates in dieser Umgebung überprüft.
Das Problem mit der Kopie am Ende besteht darin, dass alle Grafiken kopiert werden, unabhängig davon, ob sie geändert wurden oder nicht.Natürlich wäre es besser, nur die Grafiken zu kopieren, die sich geändert haben.Da seit dem letzten Update möglicherweise mehr als ein Push in dieses Repository stattgefunden hat, möchte ich nur die Grafiken identifizieren und kopieren, die sich seit dem letzten Update dieser Arbeitskopie geändert haben, d. h.das letzte Mal, als dieses Skript ausgeführt wurde hg update
.
Ich kann mir keinen intuitiven Weg vorstellen, dies ohne weiteres zu tun.Am besten wäre es, wenn die Informationen zwischen den Skriptausführungen nicht manuell gespeichert werden müssten, aber das ist nicht ausgeschlossen.
Lösung
Sie können mit der Verwendung von xcopy
und seinem /D
-Schalter entkommen, der nur Quelldateien kopiert, die neuer als Dateien im Ziel sind.
Andere Tipps
Ich habe keine Ahnung von der Syntax von Windows-Batchdateien, aber von der von Mercurial hg status --rev REV
ist wahrscheinlich das, wonach Sie suchen:
@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