Sfoglia il codice sorgente

* basic work for checksum on packages to detect if recompile
is needed. Checksum is currently based on the system time

git-svn-id: trunk@10394 -

peter 17 anni fa
parent
commit
f9b80919e1
4 ha cambiato i file con 369 aggiunte e 285 eliminazioni
  1. 48 11
      packages/fpmkunit/src/fpmkunit.pp
  2. 273 267
      utils/fppkg/fpmkunitsrc.inc
  3. 9 2
      utils/fppkg/fprepos.pp
  4. 39 5
      utils/fppkg/pkgrepos.pp

+ 48 - 11
packages/fpmkunit/src/fpmkunit.pp

@@ -308,6 +308,7 @@ Type
     // Package, Unit
     FTarget : TObject;
     FVersion : TFPVersion;
+    FRequireChecksum : Cardinal;
     // Filenames, Includes
     FTargetFileName : String;
     Function GetVersion : string;
@@ -319,6 +320,7 @@ Type
     Property DependencyType : TDependencyType Read FDependencyType;
     Property TargetFileName : String Read FTargetFileName Write FTargetFileName;
     Property Version : String Read GetVersion Write SetVersion;
+    Property RequireChecksum : Cardinal Read FRequireChecksum Write FRequireChecksum;
   end;
 
   TDependencies = Class(TConditionalStrings)
@@ -524,6 +526,7 @@ Type
     FCommands : TCommands;
     FDescriptionFile : String;
     FDescription : String;
+    FInstalledChecksum : Cardinal;
     // Cached directory of installed packages
     FUnitDir : String;
     Function GetDescription : string;
@@ -552,6 +555,7 @@ Type
     Property Directory : String Read FDirectory Write FDirectory;
     Property Description : String Read GetDescription Write FDescription;
     Property DescriptionFile : String Read FDescriptionFile Write FDescriptionFile;
+    Property InstalledChecksum : Cardinal Read FInstalledChecksum Write FInstalledChecksum;
     // Compiler options.
     Property OSes : TOSes Read FOSes Write FOSes;
     Property CPUs : TCPUs Read FCPUs Write FCPUs;
@@ -1006,6 +1010,7 @@ ResourceString
   SDbgArchivingFile         = 'Archiving "%s"';
   SDbgSearchPath            = 'Using %s path "%s"';
   SDbgEnterDir              = 'Entering directory "%s"';
+  SDbgPackageChecksumChanged = 'Dependent package %s is modified';
 
   // Help messages for usage
   SValue              = 'Value';
@@ -1058,6 +1063,7 @@ Const
   // Keys for unit config
   KeyName     = 'Name';
   KeyVersion  = 'Version';
+  KeyChecksum = 'Checksum';
   KeyNeedLibC = 'NeedLibC';
   KeyDepends  = 'Depends';
 
@@ -1854,6 +1860,7 @@ begin
   FCommands:=TCommands.Create(TCommand);
   FCPUs:=AllCPUs;
   FOSes:=AllOSes;
+  FInstalledChecksum:=$ffffffff;
   // Implicit dependency on RTL
   FDependencies.Add('rtl');
 end;
@@ -2064,7 +2071,10 @@ var
   L,L2 : TStrings;
   VOS : TOS;
   VCPU : TCPU;
-  i : Integer;
+  i,k : Integer;
+  DepChecksum : Cardinal;
+  DepName : String;
+  D : TDependency;
 begin
   L:=TStringList.Create;
   Try
@@ -2072,6 +2082,7 @@ begin
     With L do
       begin
         Version:=Values[KeyVersion];
+        InstalledChecksum:=Cardinal(StrToInt64Def(Values[KeyChecksum],$ffffffff));
         VCPU:=StringToCPU(Values[KeyCPU]);
         VOS:=StringToOS(Values[KeyOS]);
         OSes:=[VOS];
@@ -2079,7 +2090,19 @@ begin
         L2:=TStringList.Create;
         L2.CommaText:=Values[KeyDepends];
         for i:=0 to L2.Count-1 do
-          Dependencies.Add(L2[i],CPUs,OSes);
+          begin
+            DepName:=L2[i];
+            k:=Pos('|',DepName);
+            if k>0 then
+              begin
+                DepChecksum:=StrToInt(Copy(DepName,k+1,Length(DepName)-k));
+                DepName:=Copy(DepName,1,k-1);
+              end
+            else
+              DepChecksum:=$ffffffff;
+            D:=Dependencies.Add(DepName,CPUs,OSes);
+            D.RequireChecksum:=DepChecksum;
+          end;
         FreeAndNil(L2);
         NeedLibC:=Upcase(Values[KeyNeedLibC])='Y';
       end;
@@ -2096,6 +2119,7 @@ Var
   Deps : String;
   i : integer;
   D : TDependency;
+  p : TPackage;
 begin
   F:=TFileStream.Create(AFileName,fmCreate);
   L:=TStringList.Create;
@@ -2104,6 +2128,8 @@ begin
       begin
         Values[KeyName]:=Name;
         Values[KeyVersion]:=Version;
+        // TODO Generate checksum based on PPUs
+        Values[KeyChecksum]:=IntToStr(DateTimeToFileDate(Now));
         Values[KeyCPU]:=CPUToString(ACPU);
         Values[KeyOS]:=OSToString(AOS);
         Deps:='';
@@ -2112,10 +2138,12 @@ begin
             D:=Dependencies[i];
             if (ACPU in D.CPUs) and (AOS in D.OSes) then
               begin
-                if Deps='' then
-                  Deps:=D.Value
-                else
-                  Deps:=Deps+','+D.Value;
+                if Deps<>'' then
+                  Deps:=Deps+',';
+                Deps:=Deps+D.Value;
+                P:=TPackage(D.Target);
+                if assigned(P) and (P.InstalledChecksum<>$ffffffff) then
+                  Deps:=Deps+'|'+IntToStr(P.InstalledChecksum);
               end;
           end;
         Values[KeyDepends]:=Deps;
@@ -3982,11 +4010,20 @@ begin
          (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) then
         begin
           P:=TPackage(D.Target);
-          // If it already was compiled, then State<>tsNeutral, and it won't be compiled again.
-          If Assigned(P) and (P<>APackage) then
-            MaybeCompile(P)
+          If Assigned(P) then
+            begin
+              if (P<>APackage) then
+                MaybeCompile(P);
+            end
           else
-            D.Target:=CheckExternalPackage(D.Value);
+            begin
+              D.Target:=CheckExternalPackage(D.Value);
+              P:=TPackage(D.Target);
+            end;
+          if (D.RequireChecksum<>$ffffffff) and
+             (P.InstalledChecksum<>$ffffffff) and
+             (P.InstalledChecksum<>D.RequireChecksum) then
+            Log(vlDebug,SDbgPackageChecksumChanged,[P.Name]);
         end;
     end;
 end;
@@ -4033,7 +4070,7 @@ Var
   B : Boolean;
 begin
   If (Apackage.State<>tsCompiled) then
-    Compile(APackage);
+    MaybeCompile(APackage);
   try
     Log(vlInfo,SInfoInstallingPackage,[APackage.Name]);
     If (APackage.Directory<>'') then

File diff suppressed because it is too large
+ 273 - 267
utils/fppkg/fpmkunitsrc.inc


+ 9 - 2
utils/fppkg/fprepos.pp

@@ -79,6 +79,7 @@ type
     FCPUs : TCPUS;
     FMinVersion: TFPVersion;
     FPackageName: String;
+    FRequireChecksum : cardinal;
     procedure SetMinVersion(const AValue: TFPVersion);
   Public
     Constructor Create(ACollection : TCollection); override;
@@ -91,6 +92,7 @@ type
     Property MinVersion : TFPVersion Read FMinVersion Write SetMinVersion;
     Property OSes : TOSes Read FOSes Write FOses;
     Property CPUs : TCPUs Read FCPUs Write FCPUs;
+    Property RequireChecksum : Cardinal Read FRequireChecksum Write FRequireChecksum;
   end;
 
   { TFPDepencencies }
@@ -116,10 +118,12 @@ type
     FExternalURL: String;
     FFileName: String;
     FVersion: TFPVersion;
-    FInstalledVersion: TFPVersion;
     FDependencies : TFPDependencies;
     FOSes : TOSES;
     FCPUs : TCPUS;
+    // Installation info
+    FInstalledVersion  : TFPVersion;
+    FInstalledChecksum : cardinal;
     FIsLocalPackage : Boolean;
     function GetFileName: String;
     procedure SetName(const AValue: String);
@@ -136,7 +140,6 @@ type
     Property Name : String Read FName Write SetName;
     Property Author : String Read FAuthor Write FAuthor;
     Property Version : TFPVersion Read FVersion Write SetVersion;
-    Property InstalledVersion : TFPVersion Read FInstalledVersion Write FInstalledVersion;
     Property License : String Read FLicense Write FLicense;
     Property Description : String Read FDescription Write FDescription;
     Property ExternalURL : String Read FExternalURL Write FExternalURL;
@@ -144,6 +147,8 @@ type
     Property Email : String Read FEmail Write FEmail;
     Property OSes : TOSes Read FOSes Write FOses;
     Property CPUs : TCPUs Read FCPUs Write FCPUs;
+    Property InstalledVersion : TFPVersion Read FInstalledVersion Write FInstalledVersion;
+    Property InstalledChecksum : Cardinal Read FInstalledChecksum Write FInstalledChecksum;
     // Manual package from commandline not in official repository
     Property IsLocalPackage : Boolean Read FIsLocalPackage Write FIsLocalPackage;
   end;
@@ -480,6 +485,7 @@ begin
   inherited Create(ACollection);
   FVersion:=TFPVersion.Create;
   FInstalledVersion:=TFPVersion.Create;
+  FInstalledChecksum:=$ffffffff;
   FOSes:=AllOSes;
   FCPUs:=AllCPUs;
   FDependencies:=TFPDependencies.Create(TFPDependency);
@@ -987,6 +993,7 @@ begin
   FMinVersion:=TFPVersion.Create;
   FOSes:=AllOSes;
   FCPUs:=AllCPUs;
+  FRequireChecksum:=$ffffffff;
 end;
 
 

+ 39 - 5
utils/fppkg/pkgrepos.pp

@@ -248,22 +248,56 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
 
   procedure LoadUnitConfigFromFile(APackage:TFPPackage;const AFileName: String);
   Var
-    L : TStrings;
+    L,DepSL : TStrings;
+    DepName,
     V : String;
+    DepChecksum : Cardinal;
+    i,j,k : integer;
+    D : TFPDependency;
   begin
     L:=TStringList.Create;
     Try
       ReadIniFile(AFileName,L);
-{$warning TODO Maybe check also CPU-OS}
-{$warning TODO Add date to check recompile}
-      V:=L.Values['version'];
-      APackage.InstalledVersion.AsString:=V;
       // Log packages found in multiple locations (local and global) ?
       if not APackage.InstalledVersion.Empty then
         begin
           if showdups then
             Log(vlDebug,SDbgPackageMultipleLocations,[APackage.Name,ExtractFilePath(AFileName)]);
         end;
+{$warning TODO Maybe check also CPU-OS}
+      // Read fpunits.conf
+      V:=L.Values['version'];
+      APackage.InstalledVersion.AsString:=V;
+      V:=L.Values['checksum'];
+      APackage.InstalledChecksum:=StrToInt(V);
+      // Load dependencies
+      V:=L.Values['depends'];
+      DepSL:=TStringList.Create;
+      DepSL.CommaText:=V;
+      for i:=0 to DepSL.Count-1 do
+        begin
+          DepName:=DepSL[i];
+          k:=Pos('|',DepName);
+          if k>0 then
+            begin
+              DepChecksum:=StrToInt(Copy(DepName,k+1,Length(DepName)-k));
+              DepName:=Copy(DepName,1,k-1);
+            end
+          else
+            DepChecksum:=$ffffffff;
+          D:=nil;
+          for j:=0 to APackage.Dependencies.Count-1 do
+            begin
+              D:=APackage.Dependencies[j];
+              if D.PackageName=DepName then
+                break;
+              D:=nil;
+            end;
+          if not assigned(D) then
+            D:=APackage.AddDependency(DepName,'');
+          D.RequireChecksum:=DepChecksum;
+        end;
+      DepSL.Free;
     Finally
       L.Free;
     end;

Some files were not shown because too many files changed in this diff