Browse Source

* basic dependency handling is working

git-svn-id: trunk@9215 -
peter 18 years ago
parent
commit
6a0b278727

+ 7 - 0
utils/fppkg/fppkg.pp

@@ -138,6 +138,7 @@ begin
   Writeln('  -v --verbose       Set verbosity');
   Writeln('  -v --verbose       Set verbosity');
   Writeln('  -b --bootstrap     Special bootstrapping mode');
   Writeln('  -b --bootstrap     Special bootstrapping mode');
   Writeln('  -g --global        Force installation to global (system-wide) directory');
   Writeln('  -g --global        Force installation to global (system-wide) directory');
+  Writeln('  -f --force         Force installation also if the package is already installed');
   Writeln('Actions:');
   Writeln('Actions:');
   Writeln('  update             Update packages list');
   Writeln('  update             Update packages list');
   Writeln('  avail              List available packages');
   Writeln('  avail              List available packages');
@@ -260,7 +261,12 @@ begin
     ProcessCommandLine;
     ProcessCommandLine;
     MaybeCreateLocalDirs;
     MaybeCreateLocalDirs;
     LoadCompilerDefaults;
     LoadCompilerDefaults;
+
+    // Load local repository, update first if this is a new installation
+    if not FileExists(Options.LocalPackagesFile) then
+      pkghandler.ExecuteAction(nil,'update');
     LoadLocalRepository;
     LoadLocalRepository;
+    LoadLocalStatus;
 
 
     if ParaPackages.Count=0 then
     if ParaPackages.Count=0 then
       begin
       begin
@@ -269,6 +275,7 @@ begin
       end
       end
     else
     else
       begin
       begin
+        // Process packages
         for i:=0 to ParaPackages.Count-1 do
         for i:=0 to ParaPackages.Count-1 do
           begin
           begin
             ActionPackage:=CurrentRepository.PackageByName(ParaPackages[i]);
             ActionPackage:=CurrentRepository.PackageByName(ParaPackages[i]);

+ 16 - 17
utils/fppkg/fprepos.pp

@@ -165,7 +165,6 @@ Type
     FMaxDependencyLevel : Integer;
     FMaxDependencyLevel : Integer;
     FBackUpFiles: Boolean;
     FBackUpFiles: Boolean;
     FFileName: String;
     FFileName: String;
-    FPackageCount: Integer;
     FPackages : TFPPackages;
     FPackages : TFPPackages;
     function GetPackage(Index : Integer): TFPPackage;
     function GetPackage(Index : Integer): TFPPackage;
     function GetPackageCount: Integer;
     function GetPackageCount: Integer;
@@ -184,9 +183,9 @@ Type
     Procedure Save;
     Procedure Save;
     // Loading and Saving version numbers: List of Name=Value pairs.
     // Loading and Saving version numbers: List of Name=Value pairs.
     Procedure LoadStatusFromStream(Stream : TStream); virtual;
     Procedure LoadStatusFromStream(Stream : TStream); virtual;
-    Procedure SaveStatusToStream(Stream : TStream; InstalledStatus : Boolean); virtual;
+    Procedure SaveStatusToStream(Stream : TStream); virtual;
     Procedure LoadStatusFromFile(AFileName : String);
     Procedure LoadStatusFromFile(AFileName : String);
-    Procedure SaveStatusToFile(AFileName : String; InstalledStatus : Boolean);
+    Procedure SaveStatusToFile(AFileName : String);
     // Package management
     // Package management
     Function IndexOfPackage(PackageName : String) : Integer;
     Function IndexOfPackage(PackageName : String) : Integer;
     Function FindPackage(PackageName : String) : TFPPackage;
     Function FindPackage(PackageName : String) : TFPPackage;
@@ -327,9 +326,14 @@ end;
 
 
 function TFPVersion.GetAsString: String;
 function TFPVersion.GetAsString: String;
 begin
 begin
-  Result:=Format('%d.%d.%d',[Release,Major,Minor]);
-  If (Suffix<>'') then
-    Result:=Result+'-'+Suffix;
+  if Empty then
+    Result:='<none>'
+  else
+    begin
+      Result:=Format('%d.%d.%d',[Release,Major,Minor]);
+      If (Suffix<>'') then
+        Result:=Result+'-'+Suffix;
+    end;
 end;
 end;
 
 
 function TFPVersion.GetEmpty: Boolean;
 function TFPVersion.GetEmpty: Boolean;
@@ -789,7 +793,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFPRepository.SaveStatusToStream(Stream: TStream;InstalledStatus : Boolean);
+procedure TFPRepository.SaveStatusToStream(Stream: TStream);
 
 
 Var
 Var
   L : TStrings;
   L : TStrings;
@@ -798,14 +802,9 @@ Var
 begin
 begin
   L:=TStringList.Create;
   L:=TStringList.Create;
   Try
   Try
-    If InstalledStatus then
-      For I:=0 to PackageCount-1 do
-        With Packages[i] do
-          L.Add(Name+'='+InstalledVersion.AsString)
-    else
-      For I:=0 to PackageCount-1 do
-        With Packages[i] do
-         L.Add(Name+'='+Version.AsString);
+    For I:=0 to PackageCount-1 do
+      With Packages[i] do
+        L.Add(Name+'='+InstalledVersion.AsString);
     L.SaveToStream(Stream);
     L.SaveToStream(Stream);
   Finally
   Finally
     L.Free;
     L.Free;
@@ -826,7 +825,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFPRepository.SaveStatusToFile(AFileName: String; InstalledStatus : Boolean);
+procedure TFPRepository.SaveStatusToFile(AFileName: String);
 
 
 Var
 Var
   F : TFileStream;
   F : TFileStream;
@@ -836,7 +835,7 @@ begin
     BackupFile(AFileName);
     BackupFile(AFileName);
   F:=TFileStream.Create(AFileName,fmCreate);
   F:=TFileStream.Create(AFileName,fmCreate);
   Try
   Try
-    SaveStatusToStream(F,InstalledStatus);
+    SaveStatusToStream(F);
   Finally
   Finally
     F.Free;
     F.Free;
   end;
   end;

+ 35 - 9
utils/fppkg/pkgcommands.pp

@@ -33,6 +33,13 @@ type
     Function Execute(const Args:TActionArgs):boolean;override;
     Function Execute(const Args:TActionArgs):boolean;override;
   end;
   end;
 
 
+  { TCommandAllAvail }
+
+  TCommandAllAvail = Class(TPackagehandler)
+  Public
+    Function Execute(const Args:TActionArgs):boolean;override;
+  end;
+
   { TCommandAvail }
   { TCommandAvail }
 
 
   TCommandAvail = Class(TPackagehandler)
   TCommandAvail = Class(TPackagehandler)
@@ -110,24 +117,34 @@ end;
 
 
 function TCommandUpdate.Execute(const Args:TActionArgs):boolean;
 function TCommandUpdate.Execute(const Args:TActionArgs):boolean;
 begin
 begin
+  Log(vCommands,SLogDownloading,[Options.RemotePackagesFile,Options.LocalPackagesFile]);
   DownloadFile(Options.RemotePackagesFile,Options.LocalPackagesFile);
   DownloadFile(Options.RemotePackagesFile,Options.LocalPackagesFile);
+  // Read the repository again
   LoadLocalRepository;
   LoadLocalRepository;
+  LoadLocalStatus;
+  Result:=true;
+end;
+
+
+function TCommandAllAvail.Execute(const Args:TActionArgs):boolean;
+begin
+  ListLocalRepository(true);
   Result:=true;
   Result:=true;
 end;
 end;
 
 
 
 
 function TCommandAvail.Execute(const Args:TActionArgs):boolean;
 function TCommandAvail.Execute(const Args:TActionArgs):boolean;
 begin
 begin
-  ListRepository;
+  ListLocalRepository(false);
   Result:=true;
   Result:=true;
 end;
 end;
 
 
 
 
 function TCommandScanPackages.Execute(const Args:TActionArgs):boolean;
 function TCommandScanPackages.Execute(const Args:TActionArgs):boolean;
 begin
 begin
-  RebuildRepository;
-  ListRepository;
-  SaveRepository;
+  RebuildRemoteRepository;
+  ListRemoteRepository;
+  SaveRemoteRepository;
   Result:=true;
   Result:=true;
 end;
 end;
 
 
@@ -200,6 +217,12 @@ begin
   if assigned(CurrentPackage) then
   if assigned(CurrentPackage) then
     ExecuteAction(CurrentPackage,'build',Args);
     ExecuteAction(CurrentPackage,'build',Args);
   ExecuteAction(CurrentPackage,'fpmakeinstall',Args);
   ExecuteAction(CurrentPackage,'fpmakeinstall',Args);
+  // Update local status file
+  if assigned(CurrentPackage) then
+    begin
+      CurrentPackage.InstalledVersion.Assign(CurrentPackage.Version);
+      SaveLocalStatus;
+    end;
   Result:=true;
   Result:=true;
 end;
 end;
 
 
@@ -228,26 +251,28 @@ begin
       D:=CurrentPackage.Dependencies[i];
       D:=CurrentPackage.Dependencies[i];
       DepPackage:=CurrentRepository.PackageByName(D.PackageName);
       DepPackage:=CurrentRepository.PackageByName(D.PackageName);
       // Need installation?
       // Need installation?
-      if (not DepPackage.InstalledVersion.Empty) and
+      if (DepPackage.InstalledVersion.Empty) or
          (DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then
          (DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then
         begin
         begin
           if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
           if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
-            status:='Required Version Not Available!'
+            status:='Not Available!'
           else
           else
-            status:='Needs update';
+            status:='Updating';
           L.Add(DepPackage.Name);
           L.Add(DepPackage.Name);
         end
         end
       else
       else
         status:='OK';
         status:='OK';
-      Log(vDebug,'Dependency '+D.PackageName+'-'+D.MinVersion.AsString+' ('+status+')');
+      Log(vDebug,'Dependency on package %s %s, installed %s, available %s  (%s)',
+          [D.PackageName,D.MinVersion.AsString,DepPackage.InstalledVersion.AsString,DepPackage.Version.AsString,status]);
     end;
     end;
   // Install needed updates
   // Install needed updates
   for i:=0 to L.Count-1 do
   for i:=0 to L.Count-1 do
     begin
     begin
       DepPackage:=CurrentRepository.PackageByName(L[i]);
       DepPackage:=CurrentRepository.PackageByName(L[i]);
+      if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
+        Error(SErrNoPackageAvailable,[D.PackageName,D.MinVersion.AsString]);
       ExecuteAction(DepPackage,'install');
       ExecuteAction(DepPackage,'install');
     end;
     end;
-
   FreeAndNil(L);
   FreeAndNil(L);
   Result:=true;
   Result:=true;
 end;
 end;
@@ -255,6 +280,7 @@ end;
 
 
 initialization
 initialization
   RegisterPkgHandler('update',TCommandUpdate);
   RegisterPkgHandler('update',TCommandUpdate);
+  RegisterPkgHandler('allavail',TCommandAllAvail);
   RegisterPkgHandler('avail',TCommandAvail);
   RegisterPkgHandler('avail',TCommandAvail);
   RegisterPkgHandler('scan',TCommandScanPackages);
   RegisterPkgHandler('scan',TCommandScanPackages);
   RegisterPkgHandler('download',TCommandDownload);
   RegisterPkgHandler('download',TCommandDownload);

+ 5 - 1
utils/fppkg/pkgglobals.pp

@@ -99,8 +99,12 @@ begin
   case Level of
   case Level of
     vWarning :
     vWarning :
       Prefix:=SWarning;
       Prefix:=SWarning;
+{    vInfo :
+      Prefix:='I: ';
+    vCommands :
+      Prefix:='C: ';
     vDebug :
     vDebug :
-      Prefix:=SDebug;
+      Prefix:='D: '; }
   end;
   end;
   Writeln(stdErr,Prefix,Msg);
   Writeln(stdErr,Prefix,Msg);
 end;
 end;

+ 2 - 1
utils/fppkg/pkghandler.pp

@@ -199,7 +199,8 @@ begin
   if assigned(CurrentPackage) then
   if assigned(CurrentPackage) then
     Result:='['+CurrentPackage.Name+'] '
     Result:='['+CurrentPackage.Name+'] '
   else
   else
-    Result:='[<currentdir>] ';
+//    Result:='[<currentdir>] ';
+    Result:='';
 end;
 end;
 
 
 
 

+ 4 - 2
utils/fppkg/pkgmessages.pp

@@ -19,6 +19,7 @@ Resourcestring
   SErrMissingCompilerConfig  = 'Could not find compiler configuration "%s"';
   SErrMissingCompilerConfig  = 'Could not find compiler configuration "%s"';
   SErrMissingInstallPackage  = 'Could not find package "%s"';
   SErrMissingInstallPackage  = 'Could not find package "%s"';
   SErrNoPackageSpecified     = 'No package specified';
   SErrNoPackageSpecified     = 'No package specified';
+  SErrNoPackageAvailable     = 'Package %s %s is not available';
   SErrOnlyLocalDir           = 'The speficied command "%s" works only on current dir, not on a (remote) package';
   SErrOnlyLocalDir           = 'The speficied command "%s" works only on current dir, not on a (remote) package';
   SErrRunning                = 'The FPC make tool encountered the following error:';
   SErrRunning                = 'The FPC make tool encountered the following error:';
   SErrActionAlreadyRegistered= 'Action "%s" is already registered';
   SErrActionAlreadyRegistered= 'Action "%s" is already registered';
@@ -58,8 +59,9 @@ Resourcestring
   SLogDetectedCompiler       = 'Detected compiler "%s" (version %s for %s)';
   SLogDetectedCompiler       = 'Detected compiler "%s" (version %s for %s)';
   SLogDetectedFPCDIR         = 'Detected %s FPCDIR "%s"';
   SLogDetectedFPCDIR         = 'Detected %s FPCDIR "%s"';
   SLogGeneratingCompilerConfig  = 'Generating default compiler configuration in "%s"';
   SLogGeneratingCompilerConfig  = 'Generating default compiler configuration in "%s"';
-  SLogLoadingPackagesFile    = 'Loading packages information from "%s"';
-  SLogLoadingVersionsFile    = 'Loading local versions information from "%s"';
+  SLogLoadingPackagesFile    = 'Loading available packages from "%s"';
+  SLogLoadingStatusFile      = 'Loading local status from "%s"';
+  SLogSavingStatusFile       = 'Saving local status to "%s"';
 
 
   SDbgFound                  = 'Found';
   SDbgFound                  = 'Found';
   SDbgNotFound               = 'Not Found';
   SDbgNotFound               = 'Not Found';

+ 65 - 18
utils/fppkg/pkgrepos.pp

@@ -9,9 +9,13 @@ uses
   fprepos;
   fprepos;
 
 
 procedure LoadLocalRepository;
 procedure LoadLocalRepository;
-procedure SaveRepository;
-procedure ListRepository;
-procedure RebuildRepository;
+procedure LoadLocalStatus;
+procedure SaveLocalStatus;
+procedure ListLocalRepository(all:boolean=false);
+
+procedure ListRemoteRepository;
+procedure RebuildRemoteRepository;
+procedure SaveRemoteRepository;
 
 
 var
 var
   CurrentRepository : TFPRepository;
   CurrentRepository : TFPRepository;
@@ -26,6 +30,9 @@ uses
   pkgoptions,
   pkgoptions,
   pkgmessages;
   pkgmessages;
 
 
+{*****************************************************************************
+                           Local Repository
+*****************************************************************************}
 
 
 procedure LoadLocalRepository;
 procedure LoadLocalRepository;
 var
 var
@@ -47,44 +54,66 @@ begin
           Free;
           Free;
         end;
         end;
     end;
     end;
-  // Versions
+end;
+
+
+procedure LoadLocalStatus;
+var
+  S : String;
+begin
   S:=Options.LocalVersionsFile(Options.CurrentCompilerConfig);
   S:=Options.LocalVersionsFile(Options.CurrentCompilerConfig);
-  Log(vDebug,SLogLoadingVersionsFile,[S]);
+  Log(vDebug,SLogLoadingStatusFile,[S]);
   if FileExists(S) then
   if FileExists(S) then
     CurrentRepository.LoadStatusFromFile(S);
     CurrentRepository.LoadStatusFromFile(S);
 end;
 end;
 
 
 
 
-procedure SaveRepository;
+procedure SaveLocalStatus;
 var
 var
-  X : TFPXMLRepositoryHandler;
+  S : String;
 begin
 begin
-  // Repository
-  Writeln('Saving repository in packages.xml');
-  X:=TFPXMLRepositoryHandler.Create;
-  With X do
-    try
-      SaveToXml(CurrentRepository,'packages.xml');
-    finally
-      Free;
+  S:=Options.LocalVersionsFile(Options.CurrentCompilerConfig);
+  Log(vDebug,SLogSavingStatusFile,[S]);
+  CurrentRepository.SaveStatusToFile(S);
+end;
+
+
+procedure ListLocalRepository(all:boolean=false);
+var
+  P : TFPPackage;
+  i : integer;
+begin
+  Writeln(Format('%-20s %-12s %-12s',['Name','Installed','Available']));
+  for i:=0 to CurrentRepository.PackageCount-1 do
+    begin
+      P:=CurrentRepository.Packages[i];
+      if all or (P.Version.CompareVersion(P.InstalledVersion)>0) then
+        begin
+          Writeln(Format('%-20s %-12s %-12s',[P.Name,P.InstalledVersion.AsString,P.Version.AsString]));
+        end;
     end;
     end;
 end;
 end;
 
 
 
 
-procedure ListRepository;
+{*****************************************************************************
+                           Remote Repository
+*****************************************************************************}
+
+procedure ListRemoteRepository;
 var
 var
   P : TFPPackage;
   P : TFPPackage;
   i : integer;
   i : integer;
 begin
 begin
+  Writeln(Format('%-20s %-12s %-20s',['Name','Available','FileName']));
   for i:=0 to CurrentRepository.PackageCount-1 do
   for i:=0 to CurrentRepository.PackageCount-1 do
     begin
     begin
       P:=CurrentRepository.Packages[i];
       P:=CurrentRepository.Packages[i];
-      Writeln(Format('%-20s %-20s',[P.Name,P.FileName]));
+      Writeln(Format('%-20s %-12s %-20s',[P.Name,P.Version.AsString,P.FileName]));
     end;
     end;
 end;
 end;
 
 
 
 
-procedure RebuildRepository;
+procedure RebuildRemoteRepository;
 var
 var
   X : TFPXMLRepositoryHandler;
   X : TFPXMLRepositoryHandler;
   i : integer;
   i : integer;
@@ -136,5 +165,23 @@ begin
   end;
   end;
 end;
 end;
 
 
+
+procedure SaveRemoteRepository;
+var
+  X : TFPXMLRepositoryHandler;
+begin
+  // Repository
+  Writeln('Saving repository in packages.xml');
+  X:=TFPXMLRepositoryHandler.Create;
+  With X do
+    try
+      SaveToXml(CurrentRepository,'packages.xml');
+    finally
+      Free;
+    end;
+end;
+
+
+
 initialization
 initialization
 end.
 end.