\documentclass[a4paper,12pt,spanish,draft]{article}

% To handle acceents in output and input
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{eurosym}

% Basicos
\usepackage{tabularx}

% Programming
\usepackage{ifthen}

% Fonts
\usepackage{pslatex}
\usepackage[bookmarks=true]{hyperref}


\usepackage[a4paper, dvips]{geometry}

% To have HTML links
\usepackage{html}

% Useful things
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
\setlength{\parindent}{0ex}

% Shome shortcuts
\newcommand{\linkfootl}[3]{ \htmladdnormallinkfoot[#1]{#2}{#3} }
\newcommand{\linkfoot}[2]{ \htmladdnormallinkfoot{#1}{#2} }
\newcommand{\linkl}[3]{ \htmladdnormallink[#1]{#2}{#3} }
\newcommand{\link}[2]{ \htmladdnormallink{#1}{#2} }

% Page format
\geometry{
  a4paper, top=0.5in, bottom=1.5in, left=0.75in, right=0.75in,
  includemp = false}
\pagestyle{plain}

% Interparagraph distance
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
\setlength{\parindent}{0pt}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\title{Arreglando paquetes rotos de Sid}
%\author{Miguel Telleria}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\maketitle

\abstract{Ayer me pasé el día entero haciendo un upgrade de Sid que no
  había tocado desde los tiempos en que Sid y Sarge iban de la par.

  Me han salido los problemas de dependencias habituales que impiden
  la instalación normal de algunos paquetes.  Pero esta vez me he
  comportado como un buen Debianita y he dado con una solución que no
  es tan complicada como parece.  Os propongo que modifiquéis paquetes
  binarios.}


Como siempre podéis bajaros el fichero original \LaTeX{} de
\linkfoot{aquí}{http://www.mtelleria.com/articles/arreglando\_paquetes\_rotos\_en\_sid.tex}.

\subsection*{El problema}

Los que utilizamos Sid nos encontramos con que muchas veces hay
problemas de dependencias entre paquetes que bloquean la instalación
de toda una gran parte de la distribución por ``vías normales''.

A menudo estos problemas vienen porque los mantenedores de los
paquetes han decidido cambiar temporalmente su nombre, ya sea
añadiéndole un sufijo temporal o quitándoselo.

Por ejemplo, si alguien hace ahora un paso de Sarge a Sid e intenta
instalar KDE se encontrará con que las siguientes librerías han sido
renombradas. 

\begin{verbatim}
    libqt3c102-mt --> libqt3-mt
	kdelibs4c2    --> kdelibs4c2a
	libarts1c2    --> libarts1c2a
	libopenexr2c2 --> libopenexr2c2a
\end{verbatim}

  y lo mismo pasa con la librería de WordPerfect de KOffice y con algunas
librerías gtkmm...

Para que los cambios se hagan automáticamente, en la metainformación
del paquete (fichero \texttt{control}) se suele poner en los nuevos paquetes
una línea de conflicto y otra de reemplazo respecto al nombre
anterior.

Por ejemplo haciendo un \texttt{apt-cache show kdelibs4c2a} nos
encontramos:

\begin{verbatim}
   Conflicts: kdelibs4, kdelibs4c2
   Replaces: kdelibs4, kdelibs4c2, kdeartwork-style (<< 4:3.4.0)
\end{verbatim}

Hasta aquí todo perfecto.  El problema viene de que \textbf{algunos
  paquetes que utilizan estas librerías tienen el nombre antiguo en
  sus dependencias}.  Así por ejemplo haciendo un \texttt{apt-cache
  show kdebase-bin} nos encontramos:

\begin{verbatim}
Depends: kdelibs4c2 (>= 4:3.4.2-1), libart-2.0-2 (>= 2.3.16)...
\end{verbatim}

mientras que otro paquete base como \texttt{kdelibs-bin} tiene en sus
dependencias:

\begin{verbatim}
Depends: kdelibs4c2a (>= 4:3.4.3-1), libart-2.0-2 (>= 2.3.16)...
\end{verbatim}

¿Veis el problema no?.  Un paquete que dependa tanto de \texttt{kdelibs4c2(a)}
como de \texttt{kdelibs}, por ejemplo \texttt{k3b}, está bloqueado
para instalarse.

\subsection*{La solución}

Ante esta situación podemos hacer 3 cosas:

\begin{description}
\item[Esperar] En principio los mantenedores de los paquetes saben lo
  que hacen y tarde o temprano estos problemas desaparecen en una
  semana (pero luego aparecen otros nuevos).

\item[Cambiar los paquetes binarios] Es una solución quizás algo
  chapucera pero más rápida que el recompilar los paquetes afectados.

\item[Recompilar los paquetes a partir de los paquetes fuente] Es la
  mejor solución ya que nos asegura que si lo hacemos bien no habrá
  ninguna librería no enlazada.  Sin embargo no siempre está al
  alcance de todos por tiempo y necesidad de CPU.

\end{description}

De las 3 soluciones voy a comentar la segunda: como hacer cambios a
nivel del paquete \texttt{.deb}.

Lo que vamos a hacer es generar 2 paquetes:

\begin{itemize}
\item Uno que es igual al de nuevo nombre sólo que le quitamos la
  mención de \texttt{conflicts} y \texttt{replaces} del nombre
  antiguo y ponemos una dependencia al paquete vacío siguiente.

\item Otro que será un paquete vacío con el nombre del paquete
  antiguo.  Este paquete sirva para dos cosas:

  a) Desinstalar el paquete antiguo del sistema.

  b) Satisfacer las dependencias no actualizadas de los paquetes de
  arriba. 

\end{itemize}

Para ilustrar el proceso tomemos como ejemplo el caso de
\texttt{kdelibs4c2a} y \texttt{kdelibs4c2}. 

\begin{enumerate}
\item Trabajamos como un usuario normal en nuestro directorio
  temporal.

\item Bajamos el fichero \texttt{.deb} por ejemplo a partir de
  \linkfoot{http://packages.debian.org}{http://packages.debian.org}

\item Creamos un directorio temporal donde alojaremos los contenidos
  del paquete.
\begin{verbatim}
    mkdir temp
\end{verbatim}

\item Extraemos el contenido de datos del paquete en el directorio
  temporal.
\begin{verbatim}
    dpkg --extract kdelibs4c2a_3.4.3-2_i386.deb temp
\end{verbatim}

\item Extraemos la metainformación del paquete que se pondrá
  automáticamente en un directorio llamado \texttt{DEBIAN}.
\begin{verbatim}
    dpkg --control kdelibs4c2a_3.4.3-2_i386.deb
\end{verbatim}

\item Movemos este directorio \texttt{DEBIAN} dentro del directorio
  temporal.
\begin{verbatim}
    mv DEBIAN temp
\end{verbatim}

\textbf{A partir de este momento el directorio temp contiene el
  paquete listo para volver a ser creado}.  Evidentemente tendremos
que hacer las modificaciones oportunas y no hay que olvidar
\textbf{aumentar su número de versión}.

\item En nuestro caso tendremos que realizar los siguientes cambios
  todos en el fichero \texttt{temp/DEBIAN/control}:

  \begin{itemize}
  \item Eliminar \texttt{kdelibs4c2} de las líneas \texttt{Conflicts}
    y \texttt{Replaces}.

  \item Añadirle al \texttt{Depends} de forma que el paquete vacío que
    crearemos después se instale antes que la nueva versión con lo que
    evitamos conflictos de ficheros.
 

  \item Subir el número de versión para que nuestro paquete tenga
    preferencia sobre el paquete del sistema.  Por motivos prácticos
    le añadimos una pequeña cadena terminada en el número 1
    \footnote{De esta forma no interferimos con el sistema de
      actualización de Debian inestable}.  
 \end{itemize}

 Después de las modificaciones, el fichero \texttt{control} de
 \texttt{kdelibs4c2a} queda como sigue:

\begin{verbatim}
Package: kdelibs4c2a
Version: 4:3.4.3-2binsnapy1
Conflicts: kdelibs4
Replaces: kdelibs4, kdeartwork-style (<< 4:3.4.0)
Depends: kdelibs4c2 (>=4:3.4.3-2dummysnapy1), libart-2.0-2 (>= 2.3.16), libarts1c2a...
\end{verbatim}

\item Volvemos al directorio temporal de arriba y \texttt{ensamblamos}
  el paquete, asignándole después su nombre oficial.

\begin{verbatim}
  dpkg --build temp  # Esto nos crea el fichero temp.deb
  dpkg-name temp.deb # Esto lo renombra a kdelibs4c2a_3.4.3-2binsnapy1_i386.deb
\end{verbatim}

\item Siguiendo la misma lógica creamos un paquete vacío a partir del
  fichero \texttt{control} modificado de \texttt{kdelibs4c2a}.

  \begin{enumerate}
  \item Creamos otro directorio y copiamos el fichero control.

\begin{verbatim}
    mkdir -p vacio/DEBIAN
    cp temp/DEBIAN/control vacio/DEBIAN
\end{verbatim}

  \item Editamos el fichero \texttt{vacio/DEBIAN/control} y \emph{a)}
    cambiamos el nombre del paquete a \texttt{kdelibs4c2}, \emph{b)} eliminamos la
    dependencia a sí mismo, \emph{c)} aumentamos el número de version.

    Al final obtenemos los siguientes valores en el fichero de control.
\begin{verbatim}
Package: kdelibs4c2
Version: 4:3.4.3-2dummysnapy1
Depends: libart-2.0-2 (>= 2.3.16), libarts1c2a...
Conflicts: kdelibs4
Replaces: kdelibs4, kdeartwork-style (<< 4:3.4.0)
\end{verbatim}

  \item \emph{Asamblamos} este paquete vacío y lo renombramos igual
    que el anterior.

\begin{verbatim}
    dpkg --build vacio   # Esto nos crea vacio.deb
    dpkg-name vacio.deb  # El paquete se renombra a kdelibs4c2_3.4.3-2dummysnapy1_i386.deb
\end{verbatim}
  \end{enumerate}


\item Ahora ya sólo nos queda mover los ficheros .deb a nuestro
  repositorio local, actualizar su fichero Packages y lanzar el
  apt-get install de turno.

\end{enumerate}

Como, \textbf{¿Qué aún no tenéis un repositorio local en vuestro disco
duro?}... pues ya estáis mirando estos \linkfoot{dos}{http://www.debian.org/doc/manuals/repository-howto/repository-howto.en.html}
\linkfoot{howtos}{http://familiasanchez.net/~roberto/howtos/debrepository}
para más detalles.

Si persistís en hacerlo sin repositorios, pues ya sabéis, utilizar
\texttt{dpkg -i} empezando por el paquete vacío.

\end{document}
%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
