Comando Mercurial per identificare i file che corrispondono a FileSpec e sono cambiati dall'ultimo aggiornamento

StackOverflow https://stackoverflow.com/questions/5980602

  •  12-11-2019
  •  | 
  •  

Domanda

Idealmente, sto cercando un modo apolide per farlo da quando sto usando un file batch.

Lo scenario è che ho un repository su un server che riceve spinge dagli utenti. Il repo è anche una copia di lavoro che è la fonte per le pagine Wiki (Dokuwiki), che sono semplicemente i file di testo che sono nel repository, uno per ogni pagina nel wiki.

Poiché questo è su un server Web, la copia di lavoro non viene utilizzata da nessuno in modo interattivo. Piuttosto, un file batch viene eseguito periodicamente e emette periodicamente i comandi appropriati per mantenere la copia di lavoro aggiornata con le ultime modifiche che sono state spinte al repo. Come nota laterale per l'implementazione, accetta anche modifiche alla copia di lavoro dal wiki e tenta di unire e impegnarle allo stessotto.

Il file batch è simile a questo:

@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
.

Funziona bene per i file di testo, ma Dokuwiki richiede che i supporti come la grafica siano memorizzati in un'altra directory, che è ciò che l'ultima dichiarazione for è per.

Nota che non sono interessato ai miglioramenti allo script fino a quel punto. È stato vettattato come il nostro modo desiderato per eseguire l'aggiornamento in questo ambiente.

Il problema con la copia alla fine è che copia tutte le grafiche indipendentemente dal fatto che siano cambiati o meno. Ovviamente, sarebbe meglio copiare solo la grafica che è cambiata. Poiché potrebbe esserci stato più di una spinta in questo repository dall'ultimo aggiornamento, voglio identificare e copiare solo quelle grafiche che sono cambiate dall'ultima volta che questa copia di lavoro è stata aggiornata, vale a dire l'ultima volta che questo script ha eseguito hg update. .

Non riesco a pensare a un modo intuitivo per farlo fuori mano. Sarebbe meglio se le informazioni non avessero bisogno di essere persistesse manualmente tra le esecuzioni di script, ma non è fuori questione.

È stato utile?

Soluzione

Potresti essere in grado di scappare con l'utilizzo di xcopy e il suo interruttore /D, che copia solo i file di origine che sono più recenti dei file nella destinazione.

Altri suggerimenti

Non ho idea della sintassi dei file batch di Windows, ma il hg status --rev REV di Mercurial è probabilmente quello che stai cercando:

@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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top