Browse Source

--- Merging r15250 into '.':
U utils/fppkg/pkgcommands.pp
U utils/fppkg/fppkg.pp
U utils/fppkg/fprepos.pp
U utils/fppkg/pkgrepos.pp
U utils/fppkg/pkgoptions.pp
--- Merging r15258 into '.':
U utils/fppkg/pkgfpmake.pp
G utils/fppkg/fprepos.pp
--- Merging r15260 into '.':
U packages/fpmkunit/src/fpmkunit.pp
--- Merging r15266 into '.':
G utils/fppkg/pkgfpmake.pp
--- Merging r15267 into '.':
G utils/fppkg/pkgfpmake.pp

git-svn-id: branches/fixes_2_4@15286 -

joost 15 years ago
parent
commit
b8c79943ab

+ 28 - 8
packages/fpmkunit/src/fpmkunit.pp

@@ -951,7 +951,13 @@ Procedure SplitCommand(Const Cmd : String; Var Exe,Options : String);
 
 Implementation
 
-uses typinfo;
+uses typinfo, rtlconsts;
+
+type
+  TUnsortedDuplicatesStringList = class(TStringList)
+  public
+    function Add(const S: string): Integer; override;
+  end;
 
 ResourceString
   SErrInvalidCPU        = 'Invalid CPU name "%s"';
@@ -1552,6 +1558,22 @@ end;
 {$endif HAS_UNIT_PROCESS}
 
 
+{****************************************************************************
+                           TUnsortedDuplicatesStringList
+****************************************************************************}
+
+function TUnsortedDuplicatesStringList.Add(const S: string): Integer;
+
+begin
+  result := IndexOf(S);
+  If result > -1 then
+    Case DUplicates of
+      DupIgnore : Exit;
+      DupError : Error(SDuplicateString,0)
+    end;
+  inherited Add(S);
+end;
+
 {****************************************************************************
                                 TNamedItem
 ****************************************************************************}
@@ -3610,7 +3632,8 @@ end;
 
 Function TBuildEngine.GetCompilerCommand(APackage : TPackage; ATarget : TTarget) : String;
 Var
-  L,Args : TStringList;
+  L : TUnsortedDuplicatesStringList;
+  Args : TStringList;
   i : Integer;
 begin
   if ATarget.TargetSourceFileName = '' then
@@ -3638,8 +3661,7 @@ begin
     Args.Add('-FE'+APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS));
   Args.Add('-FU'+APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS));
   // Object Path
-  L:=TStringList.Create;
-  L.Sorted:=true;
+  L:=TUnsortedDuplicatesStringList.Create;
   L.Duplicates:=dupIgnore;
   AddConditionalStrings(L,APackage.ObjectPath,Defaults.CPU,Defaults.OS);
   AddConditionalStrings(L,ATarget.ObjectPath,Defaults.CPU,Defaults.OS);
@@ -3647,8 +3669,7 @@ begin
     Args.Add('-Fo'+L[i]);
   FreeAndNil(L);
   // Unit Dirs
-  L:=TStringList.Create;
-  L.Sorted:=true;
+  L:=TUnsortedDuplicatesStringList.Create;
   L.Duplicates:=dupIgnore;
   AddDependencyUnitPaths(L,APackage);
   AddConditionalStrings(L,APackage.UnitPath,Defaults.CPU,Defaults.OS);
@@ -3657,8 +3678,7 @@ begin
     Args.Add('-Fu'+L[i]);
   FreeAndNil(L);
   // Include Path
-  L:=TStringList.Create;
-  L.Sorted:=true;
+  L:=TUnsortedDuplicatesStringList.Create;
   L.Duplicates:=dupIgnore;
   AddDependencyIncludePaths(L,ATarget);
   AddConditionalStrings(L,APackage.IncludePath,Defaults.CPU,Defaults.OS);

+ 3 - 0
utils/fppkg/fppkg.pp

@@ -176,6 +176,7 @@ begin
   Writeln('  -f --force        Force installation also if the package is already installed');
   Writeln('  -r --recovery     Recovery mode, use always internal fpmkunit');
   Writeln('  -b --broken       Do not stop on broken packages');
+  Writeln('  -l --showlocation Show if the packages are installed globally or locally');
   Writeln('Actions:');
   Writeln('  update            Update packages list');
   Writeln('  list              List available and installed packages');
@@ -266,6 +267,8 @@ begin
         GlobalOptions.RecoveryMode:=true
       else if CheckOption(I,'b','broken') then
         GlobalOptions.AllowBroken:=true
+      else if CheckOption(I,'l','showlocation') then
+        GlobalOptions.ShowLocation:=true
       else if CheckOption(I,'h','help') then
         begin
           ShowUsage;

+ 18 - 0
utils/fppkg/fprepos.pp

@@ -113,11 +113,13 @@ type
     FAuthor: String;
     FDescription: String;
     FEmail: String;
+    FInstalledLocally: boolean;
     FLicense: String;
     FName: String;
     FHomepageURL: String;
     FDownloadURL: String;
     FFileName: String;
+    FUnusedVersion: TFPVersion;
     FVersion: TFPVersion;
     FDependencies : TFPDependencies;
     FOSes : TOSES;
@@ -127,6 +129,7 @@ type
     FLocalFileName : String;
     function GetFileName: String;
     procedure SetName(const AValue: String);
+    procedure SetUnusedVersion(const AValue: TFPVersion);
     procedure SetVersion(const AValue: TFPVersion);
   Public
     Constructor Create(ACollection : TCollection); override;
@@ -136,6 +139,9 @@ type
     Procedure Assign(Source : TPersistent); override;
     Function AddDependency(Const APackageName : String; const AMinVersion : String = '') : TFPDependency;
     Property Dependencies : TFPDependencies Read FDependencies;
+    // Only for installed packages: (is false for packages which are installed globally)
+    Property InstalledLocally : boolean read FInstalledLocally write FInstalledLocally;
+    Property UnusedVersion : TFPVersion Read FUnusedVersion Write SetUnusedVersion;
   Published
     Property Name : String Read FName Write SetName;
     Property Author : String Read FAuthor Write FAuthor;
@@ -506,6 +512,7 @@ constructor TFPPackage.Create(ACollection: TCollection);
 begin
   inherited Create(ACollection);
   FVersion:=TFPVersion.Create;
+  FUnusedVersion:=TFPVersion.Create;
   FChecksum:=$ffffffff;
   FOSes:=AllOSes;
   FCPUs:=AllCPUs;
@@ -517,6 +524,7 @@ destructor TFPPackage.Destroy;
 begin
   FreeAndNil(FDependencies);
   FreeAndNil(FVersion);
+  FreeAndNil(FUnusedVersion);
   inherited Destroy;
 end;
 
@@ -533,6 +541,14 @@ begin
 end;
 
 
+procedure TFPPackage.SetUnusedVersion(const AValue: TFPVersion);
+begin
+  if FUnusedVersion=AValue then
+    exit;
+  FUnusedVersion.Assign(AValue);
+end;
+
+
 function TFPPackage.GetFileName: String;
 var
   URI : TURI;
@@ -643,6 +659,8 @@ begin
       Description:=P.Description;
       HomepageURL:=P.HomepageURL;
       DownloadURL:=P.DownloadURL;
+      OSes:=P.OSes;
+      CPUs:=P.CPUs;
       FileName:=P.FileName;
       Checksum:=P.Checksum;
       Dependencies.Clear;

+ 1 - 1
utils/fppkg/pkgcommands.pp

@@ -147,7 +147,7 @@ end;
 
 procedure TCommandListPackages.Execute;
 begin
-  ListPackages;
+  ListPackages(GlobalOptions.ShowLocation);
 end;
 
 

+ 17 - 4
utils/fppkg/pkgfpmake.pp

@@ -244,6 +244,7 @@ end;
 
 Function TFPMakeRunner.RunFPMake(const Command:string) : Integer;
 Var
+  ManifestPackage,
   P : TFPPackage;
   FPMakeBin,
   OOptions : string;
@@ -259,20 +260,32 @@ begin
   OOptions:='';
   // Does the current package support this CPU-OS?
   if PackageName<>'' then
-    P:=AvailableRepository.PackageByName(PackageName)
+    begin
+      P:=AvailableRepository.PackageByName(PackageName);
+      if (PackageName=CurrentDirPackageName) and (FileExists(ManifestFileName)) then
+        begin
+          ManifestPackage:=LoadManifestFromFile(ManifestFileName);
+          P.OSes:=ManifestPackage.OSes;
+          P.CPUs:=ManifestPackage.CPUs;
+          ManifestPackage.Free;
+        end;
+    end
   else
     P:=nil;
   if assigned(P) then
     begin
-      if not(CompilerOptions.CompilerOS in P.OSes) or
-         not(CompilerOptions.CompilerCPU in P.CPUs) then
+      if (command<>'archive') and (command<>'manifest') and
+         (not(CompilerOptions.CompilerOS in P.OSes) or
+          not(CompilerOptions.CompilerCPU in P.CPUs)) then
         Error(SErrPackageDoesNotSupportTarget,[P.Name,MakeTargetString(CompilerOptions.CompilerCPU,CompilerOptions.CompilerOS)]);
     end;
   { Maybe compile fpmake executable? }
   ExecuteAction(PackageName,'compilefpmake');
   { Create options }
   AddOption('--nofpccfg');
-  if vlInfo in LogLevels then
+  if vlDebug in LogLevels then
+    AddOption('--debug')
+  else if vlInfo in LogLevels then
     AddOption('--verbose');
   AddOption('--compiler='+CompilerOptions.Compiler);
   AddOption('--cpu='+CPUToString(CompilerOptions.CompilerCPU));

+ 2 - 0
utils/fppkg/pkgoptions.pp

@@ -49,6 +49,7 @@ Type
     FInstallGlobal,
     FRecoveryMode   : Boolean;
     FOptionParser: TTemplateParser;
+    FShowLocation: Boolean;
     function  GetOptString(Index: integer): String;
     procedure SetOptString(Index: integer; const AValue: String);
     procedure UpdateLocalRepositoryOption;
@@ -80,6 +81,7 @@ Type
     Property InstallGlobal : Boolean Read FInstallGlobal Write FInstallGlobal;
     Property RecoveryMode : Boolean Read FRecoveryMode Write FRecoveryMode;
     Property AllowBroken : Boolean Read FAllowBroken Write FAllowBroken;
+    Property ShowLocation : Boolean Read FShowLocation Write FShowLocation;
   end;
 
 

+ 32 - 13
utils/fppkg/pkgrepos.pp

@@ -18,11 +18,11 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
 function  PackageIsBroken(APackage:TFPPackage):boolean;
 function  FindBrokenPackages(SL:TStrings):Boolean;
 procedure CheckFPMakeDependencies;
-function  PackageInstalledVersionStr(const AName:String):string;
+function  PackageInstalledVersionStr(const AName:String;const ShowUsed: boolean = false;const Local: boolean = false):string;
 function  PackageInstalledStateStr(const AName:String):string;
 function  PackageAvailableVersionStr(const AName:String):string;
 procedure ListAvailablePackages;
-procedure ListPackages;
+procedure ListPackages(const ShowGlobalAndLocal: boolean);
 
 procedure ListRemoteRepository;
 procedure RebuildRemoteRepository;
@@ -256,17 +256,19 @@ end;
 
 procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boolean=true);
 
-  function AddInstalledPackage(const AName,AFileName: String):TFPPackage;
+  function AddInstalledPackage(const AName,AFileName: String; const Local: boolean):TFPPackage;
   begin
     result:=InstalledRepository.FindPackage(AName);
     if not assigned(result) then
       result:=InstalledRepository.AddPackage(AName)
     else
       begin
+        result.UnusedVersion:=result.Version;
         // Log packages found in multiple locations (local and global) ?
         if showdups then
           Log(vlDebug,SDbgPackageMultipleLocations,[result.Name,ExtractFilePath(AFileName)]);
       end;
+    result.InstalledLocally:=Local;
   end;
 
   procedure LoadPackagefpcFromFile(APackage:TFPPackage;const AFileName: String);
@@ -284,7 +286,7 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
     end;
   end;
 
-  function CheckUnitDir(const AUnitDir:string):boolean;
+  function CheckUnitDir(const AUnitDir:string; const Local: boolean):boolean;
   var
     SR : TSearchRec;
     P  : TFPPackage;
@@ -302,7 +304,7 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
               UF:=UD+UnitConfigFileName;
               if FileExistsLog(UF) then
                 begin
-                  P:=AddInstalledPackage(SR.Name,UF);
+                  P:=AddInstalledPackage(SR.Name,UF,Local);
                   LoadUnitConfigFromFile(P,UF)
                 end
               else
@@ -311,7 +313,7 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
                   UF:=UD+'Package.fpc';
                   if FileExistsLog(UF) then
                     begin
-                      P:=AddInstalledPackage(SR.Name,UF);
+                      P:=AddInstalledPackage(SR.Name,UF,Local);
                       LoadPackagefpcFromFile(P,UF);
                     end;
                 end;
@@ -327,9 +329,9 @@ begin
   // First scan the global directory
   // The local directory will overwrite the versions
   if ACompilerOptions.GlobalUnitDir<>'' then
-    CheckUnitDir(ACompilerOptions.GlobalUnitDir);
+    CheckUnitDir(ACompilerOptions.GlobalUnitDir, False);
   if ACompilerOptions.LocalUnitDir<>'' then
-    CheckUnitDir(ACompilerOptions.LocalUnitDir);
+    CheckUnitDir(ACompilerOptions.LocalUnitDir, True);
 end;
 
 
@@ -466,13 +468,22 @@ begin
 end;
 
 
-function PackageInstalledVersionStr(const AName:String):string;
+function PackageInstalledVersionStr(const AName:String;const ShowUsed: boolean = false;const Local: boolean = false):string;
 var
   P : TFPPackage;
 begin
   P:=InstalledRepository.FindPackage(AName);
   if P<>nil then
-    result:=P.Version.AsString
+    begin
+      if not ShowUsed then
+        result:=P.Version.AsString
+      else if Local=p.InstalledLocally then
+        result:=P.Version.AsString
+      else if not P.UnusedVersion.Empty then
+        result:=P.UnusedVersion.AsString
+      else
+        result:='-';
+    end
   else
     result:='-';
 end;
@@ -513,7 +524,7 @@ begin
 end;
 
 
-procedure ListPackages;
+procedure ListPackages(const ShowGlobalAndLocal: boolean);
 var
   i : integer;
   SL : TStringList;
@@ -526,12 +537,20 @@ begin
     SL.Add(AvailableRepository.Packages[i].Name);
   for i:=0 to InstalledRepository.PackageCount-1 do
     SL.Add(InstalledRepository.Packages[i].Name);
-  Writeln(Format('%-20s %-12s %-3s %-12s',['Name','Installed','','Available']));
+  if ShowGlobalAndLocal then
+    Writeln(Format('%-20s %-14s %-14s %-3s %-12s',['Name','Installed (G)','Installed (L)','','Available']))
+  else
+    Writeln(Format('%-20s %-12s %-3s %-12s',['Name','Installed','','Available']));
   for i:=0 to SL.Count-1 do
     begin
       PackageName:=SL[i];
       if (PackageName<>CmdLinePackageName) and (PackageName<>CurrentDirPackageName) then
-        Writeln(Format('%-20s %-12s %-3s %-12s',[PackageName,PackageInstalledVersionStr(PackageName),PackageInstalledStateStr(PackageName),PackageAvailableVersionStr(PackageName)]));
+        begin
+          if ShowGlobalAndLocal then
+            Writeln(Format('%-20s %-14s %-14s %-3s %-12s',[PackageName,PackageInstalledVersionStr(PackageName,True,False),PackageInstalledVersionStr(PackageName,True,True),PackageInstalledStateStr(PackageName),PackageAvailableVersionStr(PackageName)]))
+          else
+            Writeln(Format('%-20s %-12s %-3s %-12s',[PackageName,PackageInstalledVersionStr(PackageName),PackageInstalledStateStr(PackageName),PackageAvailableVersionStr(PackageName)]));
+        end;
     end;
   FreeAndNil(SL);
 end;