Browse Source

* Propagate the reason why a package is broken

git-svn-id: trunk@36495 -
joost 8 years ago
parent
commit
d2f769c93e

+ 3 - 1
packages/fppkg/src/fprepos.pp

@@ -819,8 +819,10 @@ begin
 end;
 end;
 
 
 function TFPRepository.PackageIsBroken(APackage: TFPPackage): Boolean;
 function TFPRepository.PackageIsBroken(APackage: TFPPackage): Boolean;
+var
+  s: string;
 begin
 begin
-  Result := GFPpkg.PackageIsBroken(APackage, Self);
+  Result := GFPpkg.PackageIsBroken(APackage, s, Self);
 end;
 end;
 
 
 constructor TFPRepository.Create(AOwner: TComponent);
 constructor TFPRepository.Create(AOwner: TComponent);

+ 5 - 3
packages/fppkg/src/pkgcommands.pp

@@ -543,6 +543,7 @@ var
   ManifestPackages : TFPPackages;
   ManifestPackages : TFPPackages;
   X : TFPXMLRepositoryHandler;
   X : TFPXMLRepositoryHandler;
   L : TStringList;
   L : TStringList;
+  s : string;
   status : string;
   status : string;
 begin
 begin
   Result := False;
   Result := False;
@@ -610,7 +611,7 @@ begin
                 end
                 end
               else
               else
                 begin
                 begin
-                  if PackageManager.PackageIsBroken(InstalledP, nil) then
+                  if PackageManager.PackageIsBroken(InstalledP, s, nil) then
                     begin
                     begin
                       status:='Broken, recompiling';
                       status:='Broken, recompiling';
                       L.Add(D.PackageName);
                       L.Add(D.PackageName);
@@ -661,6 +662,7 @@ var
   i : integer;
   i : integer;
   SL : TStringList;
   SL : TStringList;
   BreakLoop : Boolean;
   BreakLoop : Boolean;
+  Reason: string;
 begin
 begin
   Result := False;
   Result := False;
   SL:=TStringList.Create;
   SL:=TStringList.Create;
@@ -676,10 +678,10 @@ begin
           Exit;
           Exit;
         if not ExecuteAction(SL[i],'install-req') then
         if not ExecuteAction(SL[i],'install-req') then
           Exit;
           Exit;
-        if PackageManager.PackageIsBroken(PackageManager.PackageByName(SL[i], pkgpkInstalled), nil) then
+        if PackageManager.PackageIsBroken(PackageManager.PackageByName(SL[i], pkgpkInstalled), Reason, nil) then
           begin
           begin
             BreakLoop := true;
             BreakLoop := true;
-            pkgglobals.Log(llWarning, SWarnBrokenAfterReinstall, [SL[i]]);
+            pkgglobals.Log(llWarning, SWarnBrokenAfterReinstall, [SL[i], Reason]);
           end;
           end;
       end;
       end;
   until BreakLoop;
   until BreakLoop;

+ 2 - 1
packages/fppkg/src/pkgfpmake.pp

@@ -213,6 +213,7 @@ Var
   P : TFPPackage;
   P : TFPPackage;
   DepPackage: TFPPackage;
   DepPackage: TFPPackage;
   DepDirList: TStringList;
   DepDirList: TStringList;
+  Reason: string;
 begin
 begin
   Result := True;
   Result := True;
   P:=DeterminePackage;
   P:=DeterminePackage;
@@ -256,7 +257,7 @@ begin
                 FPMKUnitDepPackage := PackageManager.FindPackage(FPMKUnitDeps[i].package, pkgpkInstalled);
                 FPMKUnitDepPackage := PackageManager.FindPackage(FPMKUnitDeps[i].package, pkgpkInstalled);
                 if Assigned(FPMKUnitDepPackage) then
                 if Assigned(FPMKUnitDepPackage) then
                   begin
                   begin
-                    if PackageManager.PackageIsBroken(FPMKUnitDepPackage, nil) then
+                    if PackageManager.PackageIsBroken(FPMKUnitDepPackage, Reason, nil) then
                       FPMKUnitDepAvailable := False;
                       FPMKUnitDepAvailable := False;
                   end;
                   end;
               end;
               end;

+ 9 - 6
packages/fppkg/src/pkgfppkg.pp

@@ -52,7 +52,7 @@ type
     procedure ScanAvailablePackages;
     procedure ScanAvailablePackages;
     procedure ScanPackages;
     procedure ScanPackages;
 
 
-    function PackageIsBroken(APackage: TFPPackage; ARepository: TFPRepository): Boolean;
+    function PackageIsBroken(APackage: TFPPackage; out Reason: string; ARepository: TFPRepository): Boolean;
 
 
     function FPMakeRepoFindPackage(APackageName: string; APackageKind: TpkgPackageKind): TFPPackage;
     function FPMakeRepoFindPackage(APackageName: string; APackageKind: TpkgPackageKind): TFPPackage;
     function FindPackage(APackageName: string; APackageKind: TpkgPackageKind): TFPPackage;
     function FindPackage(APackageName: string; APackageKind: TpkgPackageKind): TFPPackage;
@@ -320,7 +320,7 @@ begin
   ScanAvailablePackages;
   ScanAvailablePackages;
 end;
 end;
 
 
-function TpkgFPpkg.PackageIsBroken(APackage: TFPPackage; ARepository: TFPRepository): Boolean;
+function TpkgFPpkg.PackageIsBroken(APackage: TFPPackage; out Reason: string; ARepository: TFPRepository): Boolean;
 var
 var
   j, i, ThisRepositoryIndex: Integer;
   j, i, ThisRepositoryIndex: Integer;
   Dependency: TFPDependency;
   Dependency: TFPDependency;
@@ -329,10 +329,9 @@ var
   HashPtr: PtrInt;
   HashPtr: PtrInt;
 begin
 begin
   result:=false;
   result:=false;
-
+  Reason := '';
   if Assigned(APackage.Repository) and (APackage.Repository.RepositoryType <> fprtInstalled) then
   if Assigned(APackage.Repository) and (APackage.Repository.RepositoryType <> fprtInstalled) then
     begin
     begin
-    Result := False;
     Exit;
     Exit;
     end;
     end;
 
 
@@ -390,10 +389,11 @@ begin
 
 
             if assigned(DepPackage) then
             if assigned(DepPackage) then
               begin
               begin
-                if PackageIsBroken(DepPackage, ARepository) then
+                if PackageIsBroken(DepPackage, Reason, ARepository) then
                   begin
                   begin
                     log(llInfo,SLogPackageDepBroken,[APackage.Name,APackage.Repository.RepositoryName,Dependency.PackageName,Repository.RepositoryName]);
                     log(llInfo,SLogPackageDepBroken,[APackage.Name,APackage.Repository.RepositoryName,Dependency.PackageName,Repository.RepositoryName]);
                     result:=true;
                     result:=true;
+                    Reason := Format(SInfoPackageDepBroken, [Dependency.PackageName, Repository.RepositoryName]);
                     FBrokenPackagesDictionary.Add(APackage.Name, Pointer(1));
                     FBrokenPackagesDictionary.Add(APackage.Name, Pointer(1));
                     exit;
                     exit;
                   end;
                   end;
@@ -401,6 +401,7 @@ begin
                   begin
                   begin
                     log(llInfo,SLogPackageChecksumChanged,[APackage.Name,APackage.Repository.RepositoryName,Dependency.PackageName,Repository.RepositoryName]);
                     log(llInfo,SLogPackageChecksumChanged,[APackage.Name,APackage.Repository.RepositoryName,Dependency.PackageName,Repository.RepositoryName]);
                     result:=true;
                     result:=true;
+                    Reason := Format(SInfoPackageChecksumChanged, [Dependency.PackageName, Repository.RepositoryName]);
                     FBrokenPackagesDictionary.Add(APackage.Name, Pointer(1));
                     FBrokenPackagesDictionary.Add(APackage.Name, Pointer(1));
                     exit;
                     exit;
                   end;
                   end;
@@ -409,6 +410,7 @@ begin
               begin
               begin
                 log(llInfo,SDbgObsoleteDependency,[APackage.Name,Dependency.PackageName]);
                 log(llInfo,SDbgObsoleteDependency,[APackage.Name,Dependency.PackageName]);
                 result:=true;
                 result:=true;
+                Reason :=Format(SInfoObsoleteDependency, [Dependency.PackageName]);
                 FBrokenPackagesDictionary.Add(APackage.Name, Pointer(1));
                 FBrokenPackagesDictionary.Add(APackage.Name, Pointer(1));
                 exit;
                 exit;
               end;
               end;
@@ -699,6 +701,7 @@ function TpkgFPpkg.FindBrokenPackages(SL: TStrings): Boolean;
 var
 var
   i,j,k : integer;
   i,j,k : integer;
   P : TFPPackage;
   P : TFPPackage;
+  s : string;
   Repo: TFPRepository;
   Repo: TFPRepository;
 begin
 begin
   SL.Clear;
   SL.Clear;
@@ -712,7 +715,7 @@ begin
             for j := 0 to Repo.PackageCount-1 do
             for j := 0 to Repo.PackageCount-1 do
               begin
               begin
                 P := Repo.Packages[j];
                 P := Repo.Packages[j];
-                if (P = FindPackage(P.Name, pkgpkInstalled)) and PackageIsBroken(P, nil) then
+                if (P = FindPackage(P.Name, pkgpkInstalled)) and PackageIsBroken(P, s, nil) then
                   begin
                   begin
                     if P.IsFPMakeAddIn then
                     if P.IsFPMakeAddIn then
                       // Make sure that FPMakeAddIn's are fixed first, so
                       // Make sure that FPMakeAddIn's are fixed first, so

+ 5 - 1
packages/fppkg/src/pkgmessages.pp

@@ -162,13 +162,17 @@ Resourcestring
   SDbgForcePackageInstall    = 'Installation of package "%s" forced';
   SDbgForcePackageInstall    = 'Installation of package "%s" forced';
   SDbgPackageInstallRequired = 'Installation of package "%s" required for repository "%s"';
   SDbgPackageInstallRequired = 'Installation of package "%s" required for repository "%s"';
 
 
-  SWarnBrokenAfterReinstall  = 'Package %s is still broken, even after re-installation.';
+  SWarnBrokenAfterReinstall  = 'Package %s is still broken, even after re-installation. (%s)';
 
 
   SProgrReinstallDependent   = 'Re-install packages which are dependent on just installed packages';
   SProgrReinstallDependent   = 'Re-install packages which are dependent on just installed packages';
   SProgrInstallDependencies  = 'Install dependencies';
   SProgrInstallDependencies  = 'Install dependencies';
   SProgrDependenciesInstalled= 'Dependencies installed';
   SProgrDependenciesInstalled= 'Dependencies installed';
   SProgrDownloadPackage      = 'Downloading package %s version %s';
   SProgrDownloadPackage      = 'Downloading package %s version %s';
 
 
+  SInfoPackageDepBroken      = 'dependency %s in the %s repository is broken';
+  SInfoPackageChecksumChanged= 'dependency %s in the %s repository is modified';
+  SInfoObsoleteDependency    = 'depends on package %s which is not installed anymore';
+
 implementation
 implementation
 
 
 end.
 end.

+ 2 - 1
packages/fppkg/src/pkgrepos.pp

@@ -194,11 +194,12 @@ procedure ListPackages(const ShowGlobalAndLocal: boolean);
   procedure AddPackageToLine(APackage: TFPPackage; CheckIsBroken: Boolean; var Line: string);
   procedure AddPackageToLine(APackage: TFPPackage; CheckIsBroken: Boolean; var Line: string);
   var
   var
     PackageVersion: string;
     PackageVersion: string;
+    s: string;
   begin
   begin
     if Assigned(APackage) then
     if Assigned(APackage) then
       begin
       begin
         PackageVersion := APackage.Version.AsString;
         PackageVersion := APackage.Version.AsString;
-        if CheckIsBroken and GFPpkg.PackageIsBroken(APackage, nil) then
+        if CheckIsBroken and GFPpkg.PackageIsBroken(APackage, s, nil) then
           PackageVersion := PackageVersion + ' (B)';
           PackageVersion := PackageVersion + ' (B)';
       end
       end
     else
     else