|
|
@@ -273,7 +273,7 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
|
|
|
we allow it anyhow because dpkg does. Technically it is a packaging
|
|
|
bug. Conflicts may never self match */
|
|
|
if (Dep.TargetPkg() != Dep.ParentPkg() ||
|
|
|
- (Dep->Type != Dep::Conflicts && Dep->Type != Dep::Obsoletes))
|
|
|
+ (Dep->Type != Dep::Conflicts && Dep->Type != Dep::DpkgBreaks && Dep->Type != Dep::Obsoletes))
|
|
|
{
|
|
|
PkgIterator Pkg = Dep.TargetPkg();
|
|
|
// Check the base package
|
|
|
@@ -303,7 +303,8 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
|
|
|
{
|
|
|
/* Provides may never be applied against the same package if it is
|
|
|
a conflicts. See the comment above. */
|
|
|
- if (P.OwnerPkg() == Pkg && Dep->Type == Dep::Conflicts)
|
|
|
+ if (P.OwnerPkg() == Pkg &&
|
|
|
+ (Dep->Type == Dep::Conflicts || Dep->Type == Dep::DpkgBreaks))
|
|
|
continue;
|
|
|
|
|
|
// Check if the provides is a hit
|
|
|
@@ -457,7 +458,9 @@ void pkgDepCache::BuildGroupOrs(VerIterator const &V)
|
|
|
|
|
|
/* Invert for Conflicts. We have to do this twice to get the
|
|
|
right sense for a conflicts group */
|
|
|
- if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes)
|
|
|
+ if (D->Type == Dep::Conflicts ||
|
|
|
+ D->Type == Dep::DpkgBreaks ||
|
|
|
+ D->Type == Dep::Obsoletes)
|
|
|
State = ~State;
|
|
|
|
|
|
// Add to the group if we are within an or..
|
|
|
@@ -468,7 +471,9 @@ void pkgDepCache::BuildGroupOrs(VerIterator const &V)
|
|
|
Group = 0;
|
|
|
|
|
|
// Invert for Conflicts
|
|
|
- if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes)
|
|
|
+ if (D->Type == Dep::Conflicts ||
|
|
|
+ D->Type == Dep::DpkgBreaks ||
|
|
|
+ D->Type == Dep::Obsoletes)
|
|
|
State = ~State;
|
|
|
}
|
|
|
}
|
|
|
@@ -601,7 +606,9 @@ void pkgDepCache::Update(OpProgress *Prog)
|
|
|
Group = 0;
|
|
|
|
|
|
// Invert for Conflicts
|
|
|
- if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes)
|
|
|
+ if (D->Type == Dep::Conflicts ||
|
|
|
+ D->Type == Dep::DpkgBreaks ||
|
|
|
+ D->Type == Dep::Obsoletes)
|
|
|
State = ~State;
|
|
|
}
|
|
|
}
|
|
|
@@ -631,7 +638,9 @@ void pkgDepCache::Update(DepIterator D)
|
|
|
State = DependencyState(D);
|
|
|
|
|
|
// Invert for Conflicts
|
|
|
- if (D->Type == Dep::Conflicts || D->Type == Dep::Obsoletes)
|
|
|
+ if (D->Type == Dep::Conflicts ||
|
|
|
+ D->Type == Dep::DpkgBreaks ||
|
|
|
+ D->Type == Dep::Obsoletes)
|
|
|
State = ~State;
|
|
|
|
|
|
RemoveStates(D.ParentPkg());
|
|
|
@@ -894,7 +903,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
|
|
|
/* This bit is for processing the possibilty of an install/upgrade
|
|
|
fixing the problem */
|
|
|
SPtrArray<Version *> List = Start.AllTargets();
|
|
|
- if ((DepState[Start->ID] & DepCVer) == DepCVer)
|
|
|
+ if (Start->Type != Dep::DpkgBreaks &&
|
|
|
+ (DepState[Start->ID] & DepCVer) == DepCVer)
|
|
|
{
|
|
|
// Right, find the best version to install..
|
|
|
Version **Cur = List;
|
|
|
@@ -939,17 +949,23 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* For conflicts we just de-install the package and mark as auto,
|
|
|
- Conflicts may not have or groups */
|
|
|
- if (Start->Type == Dep::Conflicts || Start->Type == Dep::Obsoletes)
|
|
|
+ Conflicts may not have or groups. For dpkg's Breaks we try to
|
|
|
+ upgrade the package. */
|
|
|
+ if (Start->Type == Dep::Conflicts || Start->Type == Dep::Obsoletes ||
|
|
|
+ Start->Type == Dep::DpkgBreaks)
|
|
|
{
|
|
|
for (Version **I = List; *I != 0; I++)
|
|
|
{
|
|
|
VerIterator Ver(*this,*I);
|
|
|
PkgIterator Pkg = Ver.ParentPkg();
|
|
|
-
|
|
|
- MarkDelete(Pkg);
|
|
|
+
|
|
|
+ if (Start->Type != Dep::DpkgBreaks)
|
|
|
+ MarkDelete(Pkg);
|
|
|
+ else
|
|
|
+ if (PkgState[Pkg->ID].CandidateVer != *I)
|
|
|
+ MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps);
|
|
|
}
|
|
|
continue;
|
|
|
}
|