O --fix-broken
ou -f
apenas define a opção APT::Get::Fix-Broken
como true, mas essa não é a parte interessante. Sempre que APT::Get::Fix-Broken
for verdadeiro define um bollean chamado FixBroken
para true, que permite mais lógica no apt-get . Essa lógica faz duas coisas: ela chama a função pkgFixBroken
que reside no arquivo algorithm.cc, que deve retornar false e verifica se BrokenCount()
function retorna 0. O último é óbvio, se BrokenCount for diferente de 0, então temos pacotes quebrados e têm problemas, mas a parte relevante aqui é uma instância de uma classe pkgFixBroken
que é inicializada e depois chamada com a função Resolve()
.
O método pkgFixBroken
para corrigir pacotes é simples, marque todos os pacotes instalados como atualizáveis e marque os pacotes que não possuem uma versão para download disponível para correção. Uma vez feito isso, ele chama a função pkgProblemResolver
(ou o que parece ser), o que torna as coisas um pouco complicadas de seguir, mas há um comentário que explica mais ou menos o que está acontecendo:
This routines works by calculating a score for each package. The score is derived by considering the package's priority and all reverse dependents giving an integer that reflects the amount of breakage that adjusting the package will inflict.
It goes from highest score to lowest and corrects all of the breaks by keeping or removing the dependent packages. If that fails then it removes the package itself and goes on. The routine should be able to intelligently go from any broken state to a fixed state.
The BrokenFix flag enables a mode where the algorithm tries to upgrade packages to advoid problems.
Isso explica mais ou menos coisas. Ele atribui pontuações e tenta que, a partir dos pacotes de pontuação mais alta, todas tenham suas dependências resolvidas.
Isso parece bom o suficiente para consertar a maioria das coisas, exceto quando isso não acontece. A razão para isto é que o Fix Broken não tenta "consertar" os pacotes na medida em que apenas se certifica de que todos os pacotes tenham suas dependências satisfeitas. Em outras palavras, se A depende de B e C, ele garante que B e C estejam instalados antes de A e nada mais .
As razões usuais para isso falhar não são porque dependências não satisfeitas, no sentido de que todos os pacotes estão lá e podem, em teoria, ser instalados, mas porque o dpkg, que tem outros testes, falha. Nesses casos, dpkg --audit
, dpkg --configure -a
pode fornecer mais informações do que o apt.
Eu recomendo que você leia todos os comentários e, se você tiver experiência em C ++, tente ler o código caso precise de uma explicação mais cuidadosa do que ele faz.