¿Cómo puedo obligar a MacPorts a actualizar todos los puertos actualizables que pueda?

Supongamos que tengo los puertos A, B, C, D, E, F y G obsoletos. Supongamos, por simplicidad, que todos ellos están "solicitados".

  • A no tiene dependencias.
  • B depende directamente de C y D y E.
  • C depende directamente de E y F.
  • D no tiene dependencias.
  • E no tiene dependencias.
  • F no tiene dependencias.
  • G no tiene dependencias.

Según tengo entendido, cuando MacPorts se ejecuta ( sudo port upgrade outdated), instala los puertos en un árbol de dependencia ordenado por orden alfabético. Entonces, instalaría los puertos en este orden: A, D, E, F, C, B.

Supongamos que el puerto A está roto. MacPorts deja de instalar.

Veo esto como un inconveniente, porque los otros puertos obsoletos podrían estar funcionando bien. El hecho de que A no se instale no tiene ningún efecto en ninguno de los otros puertos. Ahora, debido a que un solo puerto no se instalará, el resto de mis puertos están desactualizados hasta que se solucione este puerto.

Mi pregunta:

¿Cómo puedo decirle a MacPorts que continúe instalando todos los puertos instalables que puede instalar sin error?

Este es probablemente el mismo que este en espíritu : MacPorts: Continúe instalando otras actualizaciones después del error . Sin embargo, no compro las respuestas en esa página:

  • El desarrollador de MacPorts (@ClemensLang) dice que hay una razón por la cual MacPorts no continúa. (Los enlaces que incluye respaldan esto, pero se vuelve demasiado técnico para mí. ¡Lo siento!) En mi caso anterior, instalar el Puerto G después de que falla el Puerto A no parece ser problemático. (... ¿o no?) ¿Hay alguna forma de hacerlo de forma segura?
  • La -pbandera es evidentemente problemática. Hubiera pensado que esa sería la respuesta a esta solución, pero varios desarrolladores advierten a los usuarios que no la usen a menos que realmente entiendan lo que hace. Prefiero ir a lo seguro.
  • Podría intentar _sudo port upgrade outdated and not A _ Esto funciona si solo falla un puerto independiente, pero ¿qué pasa si tengo dos o tres puertos (de docenas) que fallan? ¿Podría hacer algo como, sudo port upgrade outdated and not A and not C and not E(etc.)?

Supongamos que hay demasiados puertos que no los excluyen individualmente. Suponga también que hay demasiados puertos para actualizarlos individualmente.

Hay una manera, pero nadie ha hecho el trabajo para hacerlo. A Macpoirts le encantaría tener arreglos para hacer esto. Como dijo Clemens, se puede hacer manualmente, solo tiene que automatizar esto, pero nadie que conozca los detalles de Macports cree que vale la pena. pasar tiempo en esto ya que tienen otras cosas que hacer,
La forma de instalar el puerto G es instalar el puerto G o actualizar el puerto G
@Mark: Gracias. Sin embargo, consulte las dos últimas líneas: "Suponga que hay demasiados puertos que no pueden excluirlos individualmente. Suponga también que hay demasiados puertos para actualizarlos individualmente".
Bueno, eso es -p debería funcionar, pero es posible que no funcione. Si puede depurar Macports, verá si funcionó bien. Nadie en el desarrollo de Macports ha realizado suficientes pruebas para decir que funcionará, podría o no.

Respuestas (1)

Esto es lo que uso... puede que no sea bonito, pero funciona:

sudo bash -c 'for port in `port outdated  2>/dev/null |  tail -n +2 | awk '\''{print $1}'\''` ; do echo -n "$port:" ;  port -N upgrade $port 2>> /tmp/upgrade-ports.err >> /tmp/upgrade-ports.out && echo "✓" || echo "✕" ; done'

Déjame desglosarlo por ti:

  • primero, no desea sudo en un bucle, de lo contrario, debe seguir poniendo su contraseña. Para evitar sudo, obtuve todo el bucle y lo cité (Alt+' en zsh es muy útil para escapar correctamente de las comillas existentes) y luego lo ejecuté con sudo bash -c. Alternativamente, puede ponerlo en un archivo y ejecutarlo como un script consudo script

  • eso nos deja con este bucle:

for port in `port outdated  2>/dev/null | tail -n +2 | awk '{print $1}'` ; do echo -n "$port:" ;  port -N upgrade $port 2>> /tmp/upgrade-ports.err >> /tmp/upgrade-ports.out && echo "✓" || echo "✕" ; done```
  • Construyo la lista de puertos con: port outdated 2>/dev/null | tail -n +2 | awk '{print $1}'(la cola elimina la línea "Los siguientes puertos instalados están desactualizados:")
  • para cada puerto imprimo el nombre del puerto y un punto y coma (sin nueva línea)
  • luego trato de actualizarlo de forma no interactiva y guardo la salida y los errores
  • si la actualización fue exitosa, imprimo un "✓" y una nueva línea, de lo contrario, una "✕" y una nueva línea
  • tenga en cuenta que esto no mostrará las dependencias que se están instalando, pero puede seguir el registro para ver qué está sucediendo *
  • así es como se ve la salida:
adwaita-icon-theme:✓
apr:✕
aquaterm:✓

HTH

*Editado para aclarar. Esto significa que en su ejemplo, la salida se vería así:

A:✕
B:✓
C:✓
D:✓
E:✓
F:✓
G:✓

Pero B tardará MUCHO tiempo, y C, D, E y F serán muy rápidos porque ya se han actualizado durante B.