2009-04-03 11 views
10

por la Debian Policy Manual, mi script postinst está recibiendo llamadas en la actualización y configurar el tiempo, como "configurar postinst la vieja versión", donde la vieja versión es la versión previamente instalada (posiblemente nula). Deseo determinar nueva-versión, es decir, la versión que se está configurando (actualizando).¿Cómo obtener la versión recién instalada dentro de un script de Debtin postinst?

La variable de entorno $DPKG_MAINTSCRIPT_PACKAGE contiene el nombre del paquete; no parece haber un campo equivalente _VERSION. /var/lib/dpkg/status se actualiza DESPUÉS de carreras posteriores, por lo que parece que tampoco puedo analizarlo.

¿Alguna idea?

Respuesta

1

¿Por qué no se puede codificar la versión en el script postinst en el momento del empaquetado?

+0

+1: Suena sensato para mí. – Powerlord

+5

La codificación de este en un script necesita cambiarlo cada vez ... No es tan bueno como una idea en mi opinión. –

3

utilizo el siguiente comando algo sucia en el script postinst:

NewVersion=$(zcat /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog.gz | \ 
    head -1 | perl -ne '$_=~ /.*\((.*)\).*/; print $1;') 
+0

feo, pero funciona para mí. Seguro que no hacen que sea fácil hacer algo que debería ser sencillo, ¿verdad? –

+0

Esto solo funciona si el registro de cambios está realmente comprimido:/ – Flimzy

+0

Esto también falla para las ~ versiones que no están reflejadas en el registro de cambios. – Flimzy

5

Este es el mejor método que he encontrado para resolver este problema es utilizar una variable lugar titular en su .postinst (u otro control archivos):

case "$1" in 
    configure) 
     new_version="__NEW_VERSION__" 
     # Do something interesting interesting with $new_version... 
     ;; 
    abort-upgrade|abort-remove|abort-deconfigure) 
     # Do nothing 
     ;; 
    *) 
     echo "Unrecognized postinst argument '$1'" 
     ;; 
esac 

Luego, en debian/rules, reemplace la variable marcador de posición con el número de versión adecuada al tiempo de construcción:

# Must not depend on anything. This is to be called by 
# binary-arch/binary-indep in another 'make' thread. 
binary-common: 
    dh_testdir 
    dh_testroot 
    dh_lintian 
    < ... snip ... > 

    # Replace __NEW_VERSION__ with the actual new version in any control files 
    for pkg in $$(dh_listpackages -i); do \ 
     sed -i -e 's/__NEW_VERSION__/$(shell $(SHELL) debian/gen_deb_version)/' debian/$$pkg/DEBIAN/*; \ 
    done 

    # Note dh_builddeb *must* come after the above code 
    dh_builddeb 

El .postinst fragmento resultante, que se encuentra en debian/<package-name>/DEBIAN/postinst, se verá así:

case "$1" in 
    configure) 
     new_version="1.2.3" 
     # Do something interesting interesting with $new_version... 
     ;; 
    abort-upgrade|abort-remove|abort-deconfigure) 
     # Do nothing 
     ;; 
    *) 
     echo "Unrecognized postinst argument '$1'" 
     ;; 
esac 
+0

Para un paquete de distutils de Python, necesitaba agregar la versión al postinst. Agregué un gancho en setup.py para buscar y reemplazar a través del archivo postinst durante la fase de compilación. –

2
VERSION=$(zless /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog* \ 
    | dpkg-parsechangelog -l- -SVersion') 

Las ventajas sobre otras soluciones aquí:

  • funciona con independencia de que cambios se comprime o no
  • Utiliza el analizador de registro de cambios de dpkg en lugar de expresiones regulares, awk, etc.
+0

Agradable, pero eso requiere una dependencia adicional a 'dpkg-dev' en su paquete.(y usted tiene un '} '' demasiado en su ejemplo, creo) – Tonin

+0

Gracias, actualizado. –

2

Añadir lo siguiente a la debian/rules:

override_dh_installdeb: 
    dh_installdeb 
    for pkg in $$(dh_listpackages -i); do \ 
     sed -i -e 's/__DEB_VERSION__/$(DEB_VERSION)/' debian/$$pkg/DEBIAN/*; \ 
    done 

que reemplazará cualquier ocurrencia de __DEB_VERSION__ en los scripts Debian con el número de versión.

0

Prueba esto:

VERSION=`dpkg -s $DPKG_MAINTSCRIPT_PACKAGE | sed -n 's/^Version: //p'` 
Cuestiones relacionadas