Repository URL to install this package:
|
Version:
3.2.0 ▾
|
unit pkgPackagesStructure;
{$mode objfpc}{$H+}
interface
uses
Classes,
SysUtils,
fprepos,
fpxmlrep,
pkgoptions;
type
{ TFPRemotePackagesStructure }
TFPRemotePackagesStructure = class(TFPCustomPackagesStructure)
public
class function GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass; override;
function UnzipBeforeUse: Boolean; override;
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
end;
{ TFPCustomFileSystemPackagesStructure }
TFPCustomFileSystemPackagesStructure = class(TFPCustomPackagesStructure)
private
FPath: string;
protected
function GetPath: string; virtual;
procedure SetPath(AValue: string); virtual;
procedure AddPackageToRepository(ARepository: TFPRepository; APackageName: string; APackageFilename: string);
public
property Path: string read GetPath write SetPath;
end;
{ TFPInstalledPackagesStructure }
TFPInstalledPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
private
FPrefix: string;
public
class function GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass; override;
procedure InitializeWithOptions(ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions; ACompilerOptions: TCompilerOptions); override;
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
function GetUnitDirectory(APackage: TFPPackage): string; override;
function GetPrefix: string; override;
function GetBaseInstallDir: string; override;
// The prefix is used on installing packages
property Prefix: string read FPrefix write FPrefix;
end;
{ TFPCurrentDirectoryPackagesStructure }
TFPCurrentDirectoryPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
protected
procedure SetPath(AValue: string); override;
public
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
function GetBuildPathDirectory(APackage: TFPPackage): string; override;
end;
{ TFPArchiveFilenamePackagesStructure }
TFPArchiveFilenamePackagesStructure = class(TFPCustomPackagesStructure)
private
FArchiveFileName: string;
public
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
function UnzipBeforeUse: Boolean; override;
property ArchiveFileName: string read FArchiveFileName write FArchiveFileName;
end;
{ TFPOriginalSourcePackagesStructure }
TFPOriginalSourcePackagesStructure = class(TFPCustomPackagesStructure)
private
FOriginalRepository: TFPRepository;
public
constructor Create(AOwner: TComponent; OriginalRepository: TFPRepository);
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
function GetBuildPathDirectory(APackage: TFPPackage): string; override;
end;
{ TFPTemporaryDirectoryPackagesStructure }
TFPTemporaryDirectoryPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
private
FPackage: TFPPackage;
function GetTempPackageName: string;
procedure SetTempPackageName(AValue: string);
public
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
function GetBuildPathDirectory(APackage: TFPPackage): string; override;
procedure SetTempPath(APath: string);
property TempPackageName: string read GetTempPackageName write SetTempPackageName;
end;
implementation
uses
fpmkunit,
pkgmessages,
pkgrepos,
pkgglobals;
{ TFPArchiveFilenamePackagesStructure }
function TFPArchiveFilenamePackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
var
Package: TFPPackage;
begin
Result := True;
Package := ARepository.AddPackage(CmdLinePackageName);
Package.LocalFileName := FArchiveFileName;
Package.PackagesStructure := Self;
end;
function TFPArchiveFilenamePackagesStructure.UnzipBeforeUse: Boolean;
begin
Result := True;
end;
{ TFPCustomFileSystemPackagesStructure }
function TFPCustomFileSystemPackagesStructure.GetPath: string;
begin
Result := FPath;
end;
procedure TFPCustomFileSystemPackagesStructure.SetPath(AValue: string);
begin
FPath := AValue;
end;
procedure TFPCustomFileSystemPackagesStructure.AddPackageToRepository(ARepository: TFPRepository; APackageName: string; APackageFilename: string);
var
P: TFPPackage;
begin
P:=ARepository.AddPackage(APackageName);
try
P.LoadUnitConfigFromFile(APackageFilename);
P.PackagesStructure:=Self;
log(llDebug,SLogFoundPackageInFile,[P.Name, APackageFilename]);
if P.IsFPMakeAddIn then
AddFPMakeAddIn(P);
except
on E: Exception do
begin
log(llWarning,SLogFailedLoadingPackage,[APackageName, APackageFilename, E.Message]);
P.Free;
end;
end;
end;
{ TFPTemporaryDirectoryPackagesStructure }
function TFPTemporaryDirectoryPackagesStructure.GetTempPackageName: string;
begin
Result := FPackage.Name;
end;
procedure TFPTemporaryDirectoryPackagesStructure.SetTempPackageName(AValue: string);
begin
FPackage.Name := AValue;
end;
function TFPTemporaryDirectoryPackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
begin
Result := True;
FPackage := ARepository.AddPackage('');
FPackage.PackagesStructure := Self;
end;
function TFPTemporaryDirectoryPackagesStructure.GetBuildPathDirectory(APackage: TFPPackage): string;
begin
Result := FPath;
end;
procedure TFPTemporaryDirectoryPackagesStructure.SetTempPath(APath: string);
begin
FPath := APath;
end;
{ TFPOriginalSourcePackagesStructure }
constructor TFPOriginalSourcePackagesStructure.Create(AOwner: TComponent;
OriginalRepository: TFPRepository);
begin
inherited Create(Owner);
FOriginalRepository := OriginalRepository;
end;
function TFPOriginalSourcePackagesStructure.AddPackagesToRepository(
ARepository: TFPRepository): Boolean;
var
i: Integer;
OrgPackage: TFPPackage;
P: TFPPackage;
begin
Result := True;
for i := 0 to FOriginalRepository.PackageCount -1 do
begin
OrgPackage := FOriginalRepository.Packages[i];
if (OrgPackage.SourcePath<>'') and DirectoryExists(OrgPackage.SourcePath) then
begin
P:=ARepository.AddPackage(OrgPackage.Name);
P.PackagesStructure:=Self;
P.Assign(OrgPackage);
end;
end;
end;
function TFPOriginalSourcePackagesStructure.GetBuildPathDirectory(
APackage: TFPPackage): string;
begin
Result:=APackage.SourcePath;
end;
{ TFPCurrentDirectoryPackagesStructure }
procedure TFPCurrentDirectoryPackagesStructure.SetPath(AValue: string);
begin
if AValue = '' then
AValue := GetCurrentDir;
inherited SetPath(AValue);
end;
function TFPCurrentDirectoryPackagesStructure.AddPackagesToRepository(
ARepository: TFPRepository): Boolean;
var
Package: TFPPackage;
begin
Result := True;
Package := ARepository.AddPackage(CurrentDirPackageName);
Package.PackagesStructure := Self;
end;
function TFPCurrentDirectoryPackagesStructure.GetBuildPathDirectory(APackage: TFPPackage): string;
begin
Result := FPath;
end;
{ TFPRemotePackagesStructure }
class function TFPRemotePackagesStructure.GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass;
begin
Result := nil;
end;
function TFPRemotePackagesStructure.UnzipBeforeUse: Boolean;
begin
Result := True;
end;
function TFPRemotePackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
var
S : String;
X : TFPXMLRepositoryHandler;
i: Integer;
begin
Result := True;
// Repository
S:=FOptions.GlobalSection.LocalPackagesFile;
log(llDebug,SLogLoadingPackagesFile,[S]);
if not FileExists(S) then
exit;
try
X:=TFPXMLRepositoryHandler.Create;
With X do
try
LoadFromXml(ARepository,S);
finally
Free;
end;
for i := 0 to ARepository.PackageCount -1 do
ARepository.Packages[i].PackagesStructure := Self;
except
on E : Exception do
begin
Log(llError,E.Message);
Error(SErrCorruptPackagesFile,[S]);
end;
end;
end;
{ TFPInstalledPackagesStructure }
class function TFPInstalledPackagesStructure.GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass;
begin
Result := TFppkgRepositoryOptionSection;
end;
procedure TFPInstalledPackagesStructure.InitializeWithOptions(
ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions;
ACompilerOptions: TCompilerOptions);
var
RepoOptSection: TFppkgRepositoryOptionSection;
begin
inherited InitializeWithOptions(ARepoOptionSection, AnOptions, ACompilerOptions);
RepoOptSection := ARepoOptionSection as TFppkgRepositoryOptionSection;
Prefix := RepoOptSection.Prefix;
InstallRepositoryName := RepoOptSection.InstallRepositoryName;
Path := RepoOptSection.Path;
end;
function TFPInstalledPackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
procedure LoadPackagefpcFromFile(APackage:TFPPackage;const AFileName: String);
Var
L : TStrings;
V : String;
begin
L:=TStringList.Create;
Try
ReadIniFile(AFileName,L);
V:=L.Values['version'];
APackage.Version.AsString:=V;
Finally
L.Free;
end;
end;
var
SR : TSearchRec;
P : TFPPackage;
UF,UD : String;
FpmkDir : String;
UnitDir: String;
begin
Result:=false;
FpmkDir:=IncludeTrailingPathDelimiter(FPath)+'fpmkinst'+PathDelim+FCompilerOptions.CompilerTarget+PathDelim;
DirectoryExistsLog(FpmkDir);
if FindFirst(IncludeTrailingPathDelimiter(FpmkDir)+'*'+FpmkExt,faDirectory,SR)=0 then
begin
log(llDebug,SLogFindInstalledPackages,[FpmkDir]);
repeat
if ((SR.Attr and faDirectory)=0) then
begin
// Try new .fpm-file
AddPackageToRepository(ARepository, ChangeFileExt(SR.Name,''), FpmkDir+SR.Name);
end;
until FindNext(SR)<>0;
end;
FindClose(SR);
// Search for non-fpmkunit packages
UnitDir:=IncludeTrailingPathDelimiter(FPath)+'units'+PathDelim+FCompilerOptions.CompilerTarget+PathDelim;
DirectoryExistsLog(UnitDir);
if FindFirst(IncludeTrailingPathDelimiter(UnitDir)+AllFiles,faDirectory,SR)=0 then
begin
log(llDebug,SLogFindInstalledPackages,[UnitDir]);
repeat
if ((SR.Attr and faDirectory)=faDirectory) and (SR.Name<>'.') and (SR.Name<>'..') then
begin
UD:=IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(UnitDir)+SR.Name);
// Try new fpunits.cfg
UF:=UD+UnitConfigFileName;
if FileExists(UF) then
begin
if not Assigned(ARepository.FindPackage(SR.Name)) then
begin
AddPackageToRepository(ARepository, SR.Name, UF);
end;
end
else
begin
// Try Old style Package.fpc
UF:=UD+'Package.fpc';
if FileExists(UF) then
begin
if not Assigned(ARepository.FindPackage(SR.Name)) then
begin
P:=ARepository.AddPackage(SR.Name);
P.PackagesStructure:=Self;
LoadPackagefpcFromFile(P,UF);
log(llDebug,SLogFoundPackageInFile,[P.Name, UF]);
end;
end;
end;
end;
until FindNext(SR)<>0;
end;
FindClose(SR);
Result:=true;
end;
function TFPInstalledPackagesStructure.GetUnitDirectory(APackage: TFPPackage): string;
begin
Result:=IncludeTrailingPathDelimiter(FPath)+'units'+PathDelim+FCompilerOptions.CompilerTarget+PathDelim+APackage.Name+PathDelim;
end;
function TFPInstalledPackagesStructure.GetPrefix: string;
begin
Result:=IncludeTrailingPathDelimiter(FPrefix);
end;
function TFPInstalledPackagesStructure.GetBaseInstallDir: string;
begin
Result:=FPath;
end;
initialization
TFPCustomPackagesStructure.RegisterPackagesStructureClass(TFPRemotePackagesStructure);
TFPCustomPackagesStructure.RegisterPackagesStructureClass(TFPInstalledPackagesStructure);
end.