obteniendo la revisión de subversión más alta en mi nombre de file `R CMD build`

una pregunta que sigue a making-the-subversion-revision-number-visible-in-my-r-scripts

R CMD build PKG crea un file llamado Package_Version.tar.gz de acuerdo con los campos en DESCRIPTION .

no solo la numeración estrictamente secuencial procedente de svn es muy práctica aquí, sino que su formatting $REV: number $ no respeta la estructura number.number-number esperada después de Version:

Creo que me gustaría utilizar el número de revisión de subversión como la tercera "coorderada" de la versión del package. la primera y la segunda coorderadas se levantarían a mano en los cambios principales.

pero, ¿cómo "normalmente" haces?


Uno podría escribir una secuencia de commands bash / grep / awk que saque la mayor cantidad de Rev de las fonts, eso no sería un problema. Pero, ¿se ejecuta configure antes de la R CMD build ? En este caso, se podría build el file DESCRIPTION (mantenido fuera del control de fuente) desde un file de plantilla y este número Rev más alto.

Mi pregunta es sobre la práctica común.


la respuesta "óptima" me permitiría colocar un package en r-forge y hacer que los scripts automatizados se ejecuten allí actualicen la tercera coorderada del campo Version: de los últimos files confirmados en el subdirectory R

una respuesta "suficientemente buena" funcionaría localmente y ya la tengo, pero ya no la utilizo porque de otra manera me acostumbraré a cosas que generalmente no están disponibles.

ya que se trata de prácticas, agregaré mi práctica actual como posible respuesta. no es automático, pero me parece claro y (casi) aceptable.

También uso svnversion para automatizar esto. Por ejemplo, para littler, que por supuesto está comstackdo, hago esto:

 #!/bin/sh -e svnversion() { svnrevision=`LC_ALL=C svn info | awk '/^Revision:/ {print $2}'` svndate=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'` now=`date` cat <<EOF > svnversion.h // Do not edit! This file was autogenerated // by $0 // on $now // // svnrevision and svndate are as reported by svn at that point in time, // compiledate and compiletime are being filled gcc at comstacktion #include <stdlib.h> static const char* svnrevision = "$svnrevision"; static const char* svndate = "$svndate"; static const char* compiletime = __TIME__; static const char* compiledate = __DATE__; EOF } if [ "$#" -ge 0 ]; then if [ "$1" = "--svnversion" ]; then svnversion exit fi fi test -f svnversion.h || svnversion 

desde el Makefile y luego usar eso como en

 void showVersionAndExit() { printf("%s ('%s') version %s\n\tsvn revision %s as of %s\n\t" "built at %s on %s\n", binaryName, programName, VERSION, svnrevision, svndate, compiletime, compiledate); /* more code below ... */ 

Lo mismo podría hacerse para R, más fácil accediendo al file DESCRIPCIÓN como le sugerí a Mario al responder su pregunta anterior .

Luego, y para finalmente responder a su pregunta :), podría dar masajes a ese número que obtiene de svnversion para el repository en sí (o su input de nivel superior) en cualquier caso, le gustaría modificar el file DESCRIPTION. Pero luego modificas el file y no estás sincronizado, por lo que vuelves a enviar, recibes una nueva revisión, … por lo que necesitas acordarte a ti mismo de alguna manera para romper este ciclo.

Llamar a 'svnversion <working-copy>' debería darle la información que necesita.

Si su copy de trabajo se modifica o tiene files de más de una versión, obtendrá más que un número de versión. Ya sea un range (revisiones múltiples) o letras con sufijos (copys de trabajo modificadas, conmutadas o dispersas).

 $ svnversion --help usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]] Produce a compact 'version number' for the working copy path WC_PATH. TRAIL_URL is the trailing portion of the URL used to determine if WC_PATH itself is switched (detection of switches within WC_PATH does not rely on TRAIL_URL). The version number is written to standard output. For example: $ svnversion . /repos/svn/trunk 4168 The version number will be a single number if the working copy is single revision, unmodified, not switched and with an URL that matches the TRAIL_URL argument. If the working copy is unusual the version number will be more complex: 4123:4168 mixed revision working copy 4168M modified working copy 4123S switched working copy 4123P partial working copy, from a sparse checkout 4123:4168MS mixed revision, modified, switched working copy If invoked on a directory that is not a working copy, an exported directory say, the program will output 'exported'. If invoked without arguments WC_PATH will be the current directory. Valid options: -n [--no-newline] : do not output the trailing newline -c [--committed] : last changed rather than current revisions -h [--help] : display this help --version : show program version information 

¿Sería más fácil utilizar la timestamp 11 de diciembre de 2009 12:01:03 se convierte en 20091211120103. Entonces podría poner una label en subversión para la construcción también y saber qué fuente corresponde a qué compilation.

Utilizo un script de compilation que verifica una cierta revisión desde svn, actualiza la DESCRIPCIÓN con el número de versión y la construye en un tar.gz.

Administro el process un poco más utilizando la function de hoja de ruta en Jira para agrupar los problemas / commits svn como versiones (la base Apache utiliza el mismo enfoque básico que en este ejemplo ).

Veo que se llama ./cleanup durante el command R CMD build ...

Creo que voy a …

  • mantener DESCRIPTION.template en el repository.
  • instruir a la subversión para que ignore DESCRIPTION .
  • usa el script de cleanup .
  • aceptar Debo ejecutar R CMD build dos veces (la metainformación en DESCRIPTION está marcada por R CMD build antes de que se compute por cleanup ).

cleanup

 #!/bin/bash FLAGS=$(svnversion . | tr -cd AZ) VERSIONS=$(svnversion . | tr -d AZ) VERSIONS=$(echo $VERSIONS:$VERSIONS | cut -d: -f1,2) LOW=${VERSIONS%:*} HIGH=${VERSIONS#*:} [ $LOW -ne $HIGH ] && echo "- mixed revisions in local copy ($LOW:$HIGH)" [ "$FLAGS" != "" ] && echo "- local copy has flags: $FLAGS" echo "- highest revision in local copy: $HIGH" sed -re "s/(^Version:[^-]*).+$/\1-$HIGH/" DESCRIPTION.template > DESCRIPTION DATE=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'` now=$(date) cat <<EOF > R/version.R # Do not edit! This file was autogenerated # by $0 # on $now # # DO NOT put this file under version control! # # SVNVERSION as the highest revision reported by svnversion. # DATE as the Last Changed Date reported by svn info. SVNVERSION <- "$HIGH" SVNDATE <- "$DATE" EOF 

obviamente tengo que copyr DESCRIPTION.template> DESCRIPTION para iniciar el process.


gracias a todos por los comentarios útiles y estoy interesado en leer si crees que podría lograr el mismo resultado de una manera más limpia.

 mario@lt41:~/Local/.../Trunk/Rnens$ R CMD build src * checking for file 'src/DESCRIPTION' ... OK * preparing 'src': * checking DESCRIPTION meta-information ... OK * running cleanup - highest revision in local copy: 8762 * removing junk files * checking for LF line-endings in source and make files * checking for empty or unneeded directories * building 'NenS_0.1-8762.tar.gz' 

pero también debo decir que estoy satisfecho con la solución actual y espero que sea útil para otros.

mi práctica actual no está automatizada en absoluto: le doy a las tres coorderadas del campo Version: el significado de la pregunta, pero la tercera coorderada (el número de revisión svn), la actualizo a mano (incrementándola en uno) antes de cada cometer.

trabajando desde Emacs (utilizando psvn ), no veo esto como una limitación importante, pero es más trabajo de lo que me gustaría realizar a mano y definitivamente no es satisfactorio en repositorys más grandes donde el número de revisión se incrementa por compromisos no relacionados. .