Bläddra i källkod

* Added -l/--showlocation option for the list command to show which packages are installed locally and globally

git-svn-id: trunk@15250 -
joost 15 år sedan
förälder
incheckning
6be872bb13
5 ändrade filer med 54 tillägg och 14 borttagningar
  1. 3 0
      utils/fppkg/fppkg.pp
  2. 16 0
      utils/fppkg/fprepos.pp
  3. 1 1
      utils/fppkg/pkgcommands.pp
  4. 2 0
      utils/fppkg/pkgoptions.pp
  5. 32 13
      utils/fppkg/pkgrepos.pp

+ 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;

+ 16 - 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;

+ 1 - 1
utils/fppkg/pkgcommands.pp

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

+ 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;