2009-06-25 14 views
8

Per uno script su cui sto lavorando per implementare la bisection usando CVS, voglio capire cosa sia il 'timestamp' del checkout corrente. In altre parole, se sono su un ramo/tag, voglio sapere l'ultimo timestamp che qualcosa è stato assegnato a quel ramo/tag. Se sono di testa, voglio sapere l'ultimo timestamp in testa.Come ottenere programmaticamente la data di commit più recente su un checkout CVS

So che questo non è garantito al 100%, dal momento che cvs checkout può avere file diversi con timestamp/revisioni/..., ma una soluzione corretta nella maggior parte dei casi va bene per me.

Ingenuamente, ho pensato che

cvs log -N | grep ^date: | sort | tail -n 1 | cut -d\; -f1 

stava per farlo, ma si scopre che passa attraverso l'intero commit storia, per tutti i rami/tag.

risposta

2

File CVS su un ramo con data e ora differenti, la precisione di scegliere un singolo file per ottenere le ultime informazioni temporali per il ramo non vale la pena.

Ma, può migliorare se vi è qualche file che verrà modificato spesso. Ad esempio, in una delle mie basi, c'è un file version.h che viene aggiornato ad ogni cambio di versione (minore o maggiore). Questo può essere usato per informazioni temporali sulla versione corrente (di nuovo non accurato per tutti i file nel ramo, ma dà una linea di fondo).

Quindi, se si conosce un file che può dare un valore linea di fondo,

cvs log path/to/version.h -r branch/tag | grep ^date | sort | tail -1 

vi darà l'ultimo timestamp per quel file.


Se è possibile enumerare l'intero set di file della base come questo,

find /base/dir -type f | grep -v CVS > files.txt 

allora, si può avvolgere il cvs comando precedente per ogni file,

rm -f allFiles.txt 
for f in $(<files.txt); do cvs log $f ...etc... tail -1 >> allFiles.txt 
sort allFiles.txt | tail -1 

ultima riga del tipo ti darà la data esatta per il commit più recente.
Ahimè, non sarà possibile ottenere il nome del file (che può anche essere fatto con un po 'di più fu)

+0

Questa era l'unica cosa che avrei potuto inventare, grosso modo. Alla fine, ho fatto un log cvs e l'ho analizzato per tutti i file. Farlo su ogni file sarebbe stato molto lento. –

+0

Penso che questo non supporti le date appiccicose, cioè darà comunque la data più recente al posto di quella scelta. – Penz

0

Un modo più veloce per ottenere l'ultima volta che un file è stato modificato (che si basa sulla risposta data da nik) è:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date 

Se si desidera ottenere solo la data, l'uso:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date | sed 's/date: \([^ ]*\).*/\1/' 

Questo utilizza il flag -b che utilizza il ramo di default e -d, che consente di dire CVS vi interessa soltanto il ultima versione fino a un dato momento. L'espressione `` passa quindi la data corrente al limite, dandoti il ​​commit più recente.

Nel repository CVS gnuplot, utilizzando il flag -d diminuisce il tempo di esecuzione da ~ 4s a ~ 1.5s.

Problemi correlati