Comando Mercurial para identificar arquivos que correspondem às especificações do arquivo e que foram alterados desde a última atualização

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

  •  12-11-2019
  •  | 
  •  

Pergunta

Idealmente, estou procurando uma maneira sem estado de fazer isso, já que estou usando um arquivo em lote.

O cenário é que tenho um repositório em um servidor que recebe pushes de usuários.O repositório também é uma cópia de trabalho que é a fonte das páginas wiki (dokuwiki), que são simplesmente os arquivos de texto que estão no repositório, um para cada página do wiki.

Como está em um servidor web, a cópia de trabalho não é usada por ninguém de forma interativa.Em vez disso, um arquivo em lote é executado periodicamente e emite os comandos apropriados para manter a cópia de trabalho atualizada com as alterações mais recentes que foram enviadas para o repositório.Como observação adicional à implementação, ele também aceita alterações na cópia de trabalho do wiki e tenta mesclá-las e enviá-las ao mesmo tempo.

O arquivo em lote fica assim:

@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

Isso funciona bem para arquivos de texto, mas o dokuwiki exige que mídias como gráficos sejam armazenadas em outro diretório, que é o último for declaração é para.

Observe que não estou preocupado com melhorias no script até esse ponto.Foi avaliado como a forma desejada de fazer a atualização neste ambiente.

O problema com a cópia no final é que ela copia todos os gráficos, independentemente de terem sido alterados ou não.Obviamente, seria melhor copiar apenas os gráficos que foram alterados.Como pode ter havido mais de um push neste repositório desde a última atualização, quero identificar e copiar apenas os gráficos que foram alterados desde a última vez que esta cópia de trabalho foi atualizada, ou seja,a última vez que esse script foi executado hg update.

Não consigo pensar em uma maneira intuitiva de fazer isso imediatamente.Seria melhor se as informações não precisassem ser persistidas manualmente entre as execuções do script, mas isso não está fora de questão.

Foi útil?

Solução

Você pode conseguir usar xcopy e os seus /D switch, que copia apenas os arquivos de origem que são mais recentes que os arquivos no destino.

Outras dicas

Não tenho ideia da sintaxe dos arquivos em lote do Windows, mas o Mercurial hg status --rev REV é provavelmente o que você está procurando:

@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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top