command line - guia - ¿Cómo identifico qué ramas existen en CVS?
qgis manual (5)
Tengo un repositorio de CVS heredado que se migrará a Perforce.
Para cada módulo, necesito identificar qué ramas existen en ese módulo.
Solo quiero una lista de nombres de sucursales, sin etiquetas. Debe ser una herramienta de línea de comandos, por razones de secuencias de comandos.
Por ejemplo (suponiendo que exista una secuencia de comandos cvs-list-branches.sh):
$ ./cvs-list-branches.sh module1
HEAD
dev_foobar
Release_1_2
Release_1_3
$
Esto también mostrará las etiquetas, pero las etiquetas y las ramas son básicamente las mismas en CVS.
$cvs.exe rlog -h -l -b module1
con Wincvs (cliente Gui para Windows) esto es trivial, un clic derecho le dará todas las ramas y etiquetas que tienen los archivos.
A través de un shell puede usar el módulo cvs log -h -l.
Simplemente podría analizar la salida de cvs log -h
de cvs log -h
. Para cada archivo habrá una sección llamada Symbolic names :
Todas las etiquetas enumeradas allí que tienen un número de revisión que contiene un cero como el último pero un dígito son ramas. P.ej:
$ cvs log -h
Rcs file : ''/cvsroot/Module/File.pas,v''
Working file : ''File.pas''
Head revision : 1.1
Branch revision :
Locks : strict
Access :
Symbolic names :
1.1 : ''Release-1-0''
1.1.2.4 : ''Release-1-1''
1.1.0.2 : ''Maintenance-BRANCH''
Keyword substitution : ''kv''
Total revisions : 5
Selected revisions : 0
Description :
===============================================
En este ejemplo, Maintenance-BRANCH
es claramente una rama porque su número de revisión figura como 1.1. 0 .2. Esto también se llama a veces un número de revisión de rama mágica .
Tengo una pequeña colección de funciones de shell korn "prácticas", una de las cuales busca etiquetas para un archivo determinado. Hice un rápido intento de adaptarlo para hacer lo que quieras. Simplemente hace algo de seding / greping de la salida de registro (r) y enumera las versiones que tienen ".0". en ellos (lo que indica que es una etiqueta de rama):
get_branch_tags()
{
typeset FILE_PATH=$1
TEMP_TAGS_INFO=/tmp/cvsinfo$$
/usr/local/bin/cvs rlog $FILE_PATH 1>${TEMP_TAGS_INFO} 2>/dev/null
TEMPTAGS=`sed -n ''/symbolic names:/,/keyword substitution:/p'' ${TEMP_TAGS_INFO} | grep "/.0/." | cut -d: -f1 | awk ''{print $1}''`
TAGS=`echo $TEMPTAGS | tr '' '' ''/''`
echo ${TAGS:-NONE}
rm -Rf $TEMP_TAGS_INFO 2>/dev/null 1>&2
}
Como un truco rápido :) Lo mismo se aplica a rlog.
cvs log -h | awk -F"[.:]" ''/^/t/&&$(NF-1)==0{print $1}'' | sort -u
Versión mejorada según bdevay , ocultando resultados irrelevantes y alineando a la izquierda el resultado:
cvs log -h 2>&1 | awk -F"[.:]" ''/^/t/&&$(NF-1)==0{print $1}'' | awk ''{print $1}'' | sort -u