Diferenciar diferentes versiones del mismo paquete Debian

11

¿Hay alguna forma de obtener diferencias de origen entre un paquete instalado localmente y su paquete actualizado? Esto será útil para verificar exactamente qué partes se han reparado, cambiado o agregado.

Por ejemplo, supongamos que tiene instalado el paquete linux-libc-dev en su sistema y

sudo apt-get update && sudo apt-get upgrade

muestra

The following packages will be upgraded:
  linux-libc-dev 

pero desea verificar, antes de actualizarlo, los cambios exactos que se han realizado en comparación con su versión local del mismo paquete.

¿Como podemos hacerlo?

Gödel
fuente

Respuestas:

5

Aquí hay otra solución que pirateé juntos: lo que cambió .

Toma el nombre del paquete binario que le interesa como único argumento. Para usar una SRU reciente como ejemplo:

./whatchanged python_papyon

Esto es lo que hace:

  1. Compruebe si hay un candidato de actualización; salir si no hay ninguno
  2. Si existe un candidato, cree directorios temporales y obtenga los paquetes fuente tanto para la versión instalada como para el candidato.
  3. Compare los dos con debdiffy salida a stdout (probablemente desee redirigir para una lectura más fácil)
  4. Limpia los directorios temporales.

Probablemente necesite manejar mejor ciertas cosas que pueden salir mal durante la recuperación de la fuente, el control de flujo probablemente esté un poco apagado y debe haber formas más elegantes para verificar la versión, pero funcionó bien en mis pruebas limitadas hasta ahora. Por ahora, considérelo un truco rápido que funciona, y las mejoras son bienvenidas. Lo enviaré a un repositorio bzr y / o crearé un proyecto de Launchpad si es útil para algunas personas.

Editar : en lugar de dejar que se pudra en pastebin, comencé un proyecto de Launchpad para ello; puede obtener la última revisión de troncal con bzr branch lp:whatchanged. Siéntase libre de reportar errores, bifurcarlo, reescribirlo en Perl, etc.

revs mgunes
fuente
¡Que agradable! Desarrollando herramientas como respuestas;) Me gusta tu estilo de codificación, pero lo habría codificado correctamente en perl ..
LassePoulsen
Gracias; Espero que sea de utilidad. La forma en que los tecnicismos de empaquetado y lanzamiento a veces hacen que el código abierto parezca opaco es algo que he estado pensando, y no he encontrado ninguna herramienta simple para superar eso, por lo que alguien que expresó la necesidad de exactamente lo mismo fue una buena motivación para finalmente hacer uno primitivo yo mismo.
mgunes
7

Afaik, la única forma de hacerlo es obtener la fuente y hacer que las diferencias sean tuyas. Puede obtener la fuente real utilizada para compilar los paquetes con apt-get. fx:

apt-get source gwibber=2.30.2-0ubuntu3 gwibber=2.30.0.1-0ubuntu1
diff -rupN gwibber-2.30.0.1/ gwibber-2.30.2/

Esto imprimirá todas las diferencias entre todos los archivos en un formato de parche estándar.

LassePoulsen
fuente
1
Esto es bastante bueno Lo único que cambiaría en el ejemplo es utilizar "debdiff gwibber_2.30.0.1-0ubuntu1.dsc gwibber_2.30.2-0ubuntu3.dsc" en lugar de raw diff.
RAOF
1
Bueno, hace prácticamente lo mismo, pero puedes usar diff en cada paquete / tarball que hay. Tal vez alguien quiera ver la diferencia entre un svn-trunk y el paquete actual.
LassePoulsen
Mi segunda respuesta (lo que cambió) esencialmente automatiza esto.
mgunes
2

Aquí hay una forma UDD (probablemente no óptima) de hacerlo:

Tire de la rama de actualizaciones para su lanzamiento (suponiendo que Lucid) que (se supone a continuación) debe contener la última SRU:

bzr branch lp:ubuntu/lucid-updates/package_name

Obtenga los cambios introducidos por la última revisión, que (se supone) debe corresponder a la última SRU:

bzr diff -c`bzr revno`
mgunes
fuente
2
Hmm Es una toma interesante, aunque probablemente sea menos completa que la de Source Lab, en el sentido de que los nombres de los paquetes pueden no coincidir o existir en el árbol fuente de bzr.
Gödel
Siempre que conozca el nombre del paquete fuente, coincidirá. Puede encontrar con qué paquete fuente se produce un paquete binario apt-cache show package_name | grep Source:.
mgunes
@Murat Bueno, <package_name>así obtenido no funciona en algunos paquetes: bzr branch lp:ubuntu/lucid-updates/$(apt-cache show linux-libc-dev | grep -m 1 Source: | awk "{print \$2}")=> bzr: ERROR: URL no válida suministrada para el transporte: "bzr + ssh: //bazaar.launchpad.net/+branch/ubuntu/lucid-updates/linux" : no hay esquemas compatibles
Gödel
Eso es porque no hay ramas de Ubuntu para el núcleo, me temo. Podría ser una excepción específica debido al hecho de que el núcleo se mantiene en git (kernel.ubuntu.com), pero no estoy seguro sobre el alcance exacto de las ramas del paquete bzr en este momento. Es posible que desee preguntar en # ubuntu-devel.
mgunes
@Mural lo sé. Es por eso que el método es menos completo que el de Source Lab. Pero de nuevo, es una toma interesante.
Gödel
0

Si desea ver las diferencias de archivos en los archivos del paquete, extraiga sus archivos md5sums, ordénelos y difúndalos, y luego puede reducir la lista de archivos reales para compararlos dramáticamente.

Phil Miller
fuente
-1

Puede que no sean los cambios "exactos", pero apt-listchangesenumera las entradas del registro de cambios para los cambios que se han realizado desde la versión instalada.

Funciona agregando un paso después de que termine de descargar los nuevos paquetes, pero antes de que comience la instalación, donde le muestra la entrada del registro de cambios para cada paquete que se va a actualizar. Luego puede continuar o cancelar. Puedes instalarlo con

sudo apt-get install apt-listchanges

luego configúrelo con

sudo dpkg-reconfigure apt-listchanges
Ken Simon
fuente
Nuevamente, la pregunta no es sobre mostrar los cambios de ChangeLog.
Gödel
Oh, se perdió la primera línea donde dijiste "diferencias de fuente".
Ken Simon