2011-03-01 17 views
6

Stiamo provando a eseguire un processo chron che converte automaticamente i moduli CVS separati in moduli mercuriali e, infine, consolidare quei moduli mercuriali convertiti in un unico repository mercuriale.Ad ogni modo per unire o concatenare automaticamente hgtags (Mercurial)?

Ho cercato di trovare modi per unire automaticamente .hgtags (dal repository hg convertito) senza avere un prompt della finestra utente (quindi l'utilizzo in un processo chron).

C'è un modo per dirlo mercurial quando si utilizza hg unione solo per prendere il file locale e aggiungerlo al file in arrivo?

grazie per qualsiasi informazioni o suggerimenti

+1

Solo per curiosità, perché vorresti convertire i repository CVS con un cron job? –

+0

@Oben: conversione incrementale. Sto facendo lo stesso da SVN-> Hg (meno il repo che combina.) –

risposta

2

la finestra del prompt dei accadrà solo se si dispone di un conflitto nel file .hgtags, che dovrebbe essere piuttosto raro. Tuttavia, ecco forse un'idea che funzionerà.

Mercuriale consente di utilizzare uno strumento di unione diverso da quello interno, per ulteriori informazioni, vedere MergeToolConfiguration. È inoltre possibile modificare il mergetool tramite la riga di comando con l'opzione --tool (vedere hg merge --help).

Forse puoi scrivere qualche piccolo programma per fungere da speciale strumento di unione per .hgtags che fa esattamente quello che vuoi, cioè aggiungi il file locale al file in arrivo. È quindi possibile modificare hgrc per utilizzare questo nuovo strumento quando si uniscono .hgtags.

Non ho mai provato questa soluzione, è solo un'idea, ma forse ti aiuterà.

8

Sì, è possibile impostare un merge tool come descritto da Krtek. Ho appena provato fuori e questo funziona:

[merge-tools] 
merge-tags.executable = cat 
merge-tags.args = $local $other | sort -u >> $output 

[merge-patterns] 
.hgtags = merge-tags 

Metti che nel file .hg/hgrc sul server e unioni future sarà solo aggiungere i tag. Quello che succede è che hg merge eseguirà

cat /tmp/hgtags.local /tmp/hgtags.other | sort -u >> .hgtags 

dove il primo argomento di cat è la versione locale del file .hgtags, e il secondo argomento è la versione che si sta fondendo con.

Ho ordinato e reso l'output univoco al fine di evitare la duplicazione di linee comuni nei due file. Finché si aggiungono solo tag, questo funzionerà correttamente, ma se si eliminano anche i tag, l'ordine delle righe nel file .hgtags è importante e quindi non è possibile ordinarlo in questo modo. Si prega di vedere my extended answer per la gestione di questa situazione.

Questa è la mia sessione di test.Comincio facendo un repository con due teste:

$ hg init 
$ echo a > a.txt 
$ hg add a.txt 
$ hg commit -m a 
$ echo b > b.txt 
$ hg add b.txt 
$ hg commit -m b 
$ hg tag b 
$ hg update 0 
0 files updated, 0 files merged, 2 files removed, 0 files unresolved 
$ echo c > c.txt 
$ hg add c.txt 
$ hg commit -m c 
created new head   
$ hg tag c 

I rami sono visibili nel uscita dal graphlog extension:

@ changeset: 4:54c5397a23a4 
| tag:   tip 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:45:20 2011 +0100 
| summary:  Added tag c for changeset aff5fe9be7d9 
| 
o changeset: 3:aff5fe9be7d9 
| tag:   c 
| parent:  0:0db5fae8b6cc 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:45:17 2011 +0100 
| summary:  c 
| 
| o changeset: 2:a9af8514a64e 
| | user:  Martin Geisler <[email protected]> 
| | date:  Wed Mar 02 11:45:02 2011 +0100 
| | summary:  Added tag b for changeset 0518533f37f6 
| | 
| o changeset: 1:0518533f37f6 
|/ tag:   b 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:44:44 2011 +0100 
| summary:  b 
| 
o changeset: 0:0db5fae8b6cc 
    user:  Martin Geisler <[email protected]> 
    date:  Wed Mar 02 11:44:33 2011 +0100 
    summary:  a 

Esiste un conflitto nel file .hgtags:

$ hg cat -r 2 .hgtags 
0518533f37f6f37edbea5b46d9af2192f69ddecd b 
$ hg cat -r 4 .hgtags 
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c 

ma l'unione è ancora non interattiva:

$ hg merge 
merging .hgtags 
1 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

Si può vedere come i file sono stati aggiunti:

$ cat .hgtags 
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c 
0518533f37f6f37edbea5b46d9af2192f69ddecd b 
+0

Grazie, sembra che questa sia probabilmente la soluzione – DavidW

+2

Come può essere fatto in Windows? –

+0

@NickHodges Ho scritto un C# exe di base che può essere usato come alternativa per cat su windows: https://bitbucket.org/janverley/hgtagsmerger/ – jan

1

Ecco un semplice strumento di unione in python. Cerca anche di mantenere l'ordine esistente di righe nel file .hgtags.

Gli stessi avvertimenti si applicano come nella risposta di Martin.

import sys 
from heapq import merge 

local = sys.argv[1] 
other = sys.argv[2] 
output = sys.argv[3] 

merged_tags = merge(file(local).readlines(), file(other).readlines()) 

unique_tags = [] 
for tag in merged_tags: 
    if tag not in unique_tags: 
     unique_tags.append(tag) 

file(output, 'w').writelines(unique_tags) 
3

sort -mu mi ha dato quello che voglio. Questo comando non ordina, ma rimuove i duplicati.

sort -u ordine di chiusura.

0

Il suggerimento in https://stackoverflow.com/a/9783478/1183010:

hgtags.merge.template: changeset = "{} tag" tag = "{node} {tag} \ n"

[fondere-tools] hgtags .executable = hg hgtags.args = log -r "tag()" --Stile hgtags.merge.template> $ uscita hgtags.premerge = false

[fondere-patterns] = .hgtags hgtags

funziona per noi.

Problemi correlati