From d547195c8f8963ac23f14b99215a57d6427983ef Mon Sep 17 00:00:00 2001 From: mattias Date: Fri, 4 Apr 2008 17:55:27 +0000 Subject: [PATCH] IDE: implemented check if package uses Owner of property git-svn-id: trunk@14754 - --- packager/packagesystem.pas | 37 +++++++++++++++++++++++++++++++++++-- packager/pkgmanager.pas | 6 ++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packager/packagesystem.pas b/packager/packagesystem.pas index 7399451ba2..4a62d01727 100644 --- a/packager/packagesystem.pas +++ b/packager/packagesystem.pas @@ -219,6 +219,8 @@ type const Name: string): TLazPackage; function FindDependencyRecursively(FirstDependency: TPkgDependency; PkgID: TLazPackageID): TPkgDependency; + function FindDependencyRecursively(FirstDependency: TPkgDependency; + const PkgName: string): TPkgDependency; function FindConflictRecursively(FirstDependency: TPkgDependency; PkgID: TLazPackageID): TPkgDependency; function FindUnit(StartPackage: TLazPackage; const TheUnitName: string; @@ -871,6 +873,37 @@ begin Result:=Find(FirstDependency); end; +function TLazPackageGraph.FindDependencyRecursively( + FirstDependency: TPkgDependency; const PkgName: string): TPkgDependency; +// returns one compatible dependency for PkgName + + function Find(CurDependency: TPkgDependency): TPkgDependency; + var + RequiredPackage: TLazPackage; + begin + while CurDependency<>nil do begin + if SysUtils.CompareText(CurDependency.PackageName,PkgName)=0 then begin + Result:=CurDependency; + exit; + end; + if CurDependency.LoadPackageResult=lprSuccess then begin + RequiredPackage:=CurDependency.RequiredPackage; + if (not (lpfVisited in RequiredPackage.Flags)) then begin + RequiredPackage.Flags:=RequiredPackage.Flags+[lpfVisited]; + Result:=Find(RequiredPackage.FirstRequiredDependency); + if Result<>nil then exit; + end; + end; + CurDependency:=CurDependency.NextRequiresDependency; + end; + Result:=nil; + end; + +begin + MarkAllPackagesAsNotVisited; + Result:=Find(FirstDependency); +end; + function TLazPackageGraph.FindConflictRecursively( FirstDependency: TPkgDependency; PkgID: TLazPackageID): TPkgDependency; // returns one conflicting dependency for PkgID @@ -1729,8 +1762,8 @@ end; function TLazPackageGraph.FindBrokenDependencyPath(APackage: TLazPackage; FirstDependency: TPkgDependency): TFPList; -// returns the first broken dependency -// the first irems are TLazPackage, the last item is a TPkgDependency +// returns the first broken dependency (broken = not loaded) +// the first items are TLazPackage, the last item is a TPkgDependency procedure FindBroken(Dependency: TPkgDependency; var PathList: TFPList); var diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index 11937cdc08..e1d6132a86 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -3954,6 +3954,12 @@ var ConflictDependency:=PackageGraph.FindConflictRecursively( FirstDependency,APackage); if ConflictDependency<>nil then exit; + if MainOwner is TLazPackage then begin + // check if package already uses MainOwner + ConflictDependency:=PackageGraph.FindDependencyRecursively( + APackage.FirstRequiredDependency,TLazPackage(MainOwner).Name); + if ConflictDependency<>nil then exit; + end; end else begin // AnUnitInfo does not belong to a Package => can not be used exit;