* Added ability to add a repository with available packages which does not

need to be installed. (Instead another repository with installed 
   packages is added to the same location.
 * Added the ability to couple a repository with available packages
   to a repository in which the packages should be installed

git-svn-id: trunk@34865 -
This commit is contained in:
joost 2016-11-10 20:59:34 +00:00
parent 3919ffccf2
commit 89b471a8d6
6 changed files with 247 additions and 18 deletions

View File

@ -29,19 +29,27 @@ Const
type
TFPRepositoryType = (fprtUnknown, fprtInstalled, fprtAvailable);
TFPInstallationNeeded = (fpinInstallationNeeded, fpinNoInstallationNeeded, fpinInstallationImpossible);
TFPRepository = class;
TFPPackage = class;
{ TFPCustomPackagesStructure }
TFPCustomPackagesStructure = Class(TComponent)
private
FInstallRepositoryName: string;
function GetInstallRepositoryName: string;
procedure SetInstallRepositoryName(AValue: string);
public
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; virtual; abstract;
function GetUnitDirectory(APackage: TFPPackage): string; virtual;
function GetBuildPathDirectory(APackage: TFPPackage): string; virtual;
function GetPrefix: string; virtual;
function GetBaseInstallDir: string; virtual;
function GetConfigFileForPackage(APackageName: string): string; virtual;
function UnzipBeforeUse: Boolean; virtual;
function IsInstallationNeeded(APackage: TFPPackage): TFPInstallationNeeded; virtual;
property InstallRepositoryName: string read GetInstallRepositoryName write SetInstallRepositoryName;
end;
{ TFPDependency }
@ -353,11 +361,32 @@ begin
raise Exception.Create('It is not possible to install into this repository.');
end;
function TFPCustomPackagesStructure.GetConfigFileForPackage(APackageName: string): string;
begin
Result := IncludeTrailingPathDelimiter(GetBaseInstallDir)+
'fpmkinst'+PathDelim+GFPpkg.CompilerOptions.CompilerTarget+PathDelim+APackageName+FpmkExt;
end;
function TFPCustomPackagesStructure.UnzipBeforeUse: Boolean;
begin
Result := False;
end;
function TFPCustomPackagesStructure.IsInstallationNeeded(APackage: TFPPackage): TFPInstallationNeeded;
begin
result := fpinInstallationNeeded;
end;
function TFPCustomPackagesStructure.GetInstallRepositoryName: string;
begin
Result := FInstallRepositoryName;
end;
procedure TFPCustomPackagesStructure.SetInstallRepositoryName(AValue: string);
begin
FInstallRepositoryName := AValue;
end;
{ TFPPackage }
procedure TFPPackage.SetVersion(const AValue: TFPVersion);
@ -525,6 +554,7 @@ var
begin
With AStringList do
begin
Name:=Values[KeyName];
Version.AsString:=Values[KeyVersion];
SourcePath:=Values[KeySourcePath];
FPMakeOptionsString:=Values[KeyFPMakeOptions];

View File

@ -80,10 +80,20 @@ type
{ TCommandInstall }
TCommandInstall = Class(TPackagehandler)
protected
function ForceInstall: Boolean; virtual;
Public
Procedure Execute;override;
end;
{ TCommandInstallForced }
TCommandInstallForced = Class(TCommandInstall)
protected
function ForceInstall: Boolean; override;
end;
{ TCommandUnInstall }
TCommandUnInstall = Class(TPackagehandler)
@ -136,6 +146,13 @@ type
var
DependenciesDepth: integer;
{ TCommandInstallForced }
function TCommandInstallForced.ForceInstall: Boolean;
begin
Result := True;
end;
{ TCommandInfo }
procedure TCommandInfo.Execute;
@ -360,6 +377,10 @@ begin
ExecuteAction(PackageName,'fpmakebuild');
end;
function TCommandInstall.ForceInstall: Boolean;
begin
Result := False;
end;
procedure TCommandInstall.Execute;
@ -375,8 +396,7 @@ var
Result := '';
if Assigned(InstallRepo.DefaultPackagesStructure) then
begin
Result := InstallRepo.DefaultPackagesStructure.GetBaseInstallDir;
ConfFile := IncludeTrailingPathDelimiter(Result)+'fpmkinst'+PathDelim+GFPpkg.CompilerOptions.CompilerTarget+PathDelim+s+FpmkExt;
ConfFile := InstallRepo.DefaultPackagesStructure.GetConfigFileForPackage(s);
if not FileExistsLog(ConfFile) then
begin
// If there is no fpm-file, search for an (obsolete, pre-2.7.x)
@ -392,11 +412,23 @@ var
var
UFN : String;
AvailPackage: TFPPackage;
begin
if PackageName<>'' then
begin
ExecuteAction(PackageName,'build');
ExecuteAction(PackageName,'fpmakeinstall');
AvailPackage := GFPpkg.FindPackage(PackageName, pkgpkAvailable);
InstallRepo := GFPpkg.GetInstallRepository(AvailPackage);
case InstallRepo.DefaultPackagesStructure.IsInstallationNeeded(AvailPackage) of
fpinInstallationNeeded:
ExecuteAction(PackageName,'fpmakeinstall');
fpinInstallationImpossible:
Error(SErrInstallationImpossible,[PackageName, InstallRepo.RepositoryName]);
else if ForceInstall then
ExecuteAction(PackageName,'fpmakeinstall');
end;
if (PackageName=CmdLinePackageName) or (PackageName=CurrentDirPackageName) or
(PackageName=URLPackageName) then
begin
@ -410,7 +442,6 @@ begin
else
S:=PackageName;
InstallRepo := GFPpkg.RepositoryByName(GFPpkg.Options.CommandLineSection.InstallRepository);
if Assigned(InstallRepo) then
begin
P := InstallRepo.FindPackage(S);
@ -563,7 +594,7 @@ begin
inc(DependenciesDepth);
for i:=0 to L.Count-1 do
ExecuteAction(L[i],'install');
ExecuteAction(L[i],'install-req');
dec(DependenciesDepth);
if DependenciesDepth=0 then
@ -589,7 +620,7 @@ begin
for i:=0 to SL.Count-1 do
begin
ExecuteAction(SL[i],'build');
ExecuteAction(SL[i],'install');
ExecuteAction(SL[i],'install-req');
end;
until false;
FreeAndNil(SL);
@ -605,7 +636,8 @@ initialization
RegisterPkgHandler('unzip',TCommandUnzip);
RegisterPkgHandler('compile',TCommandCompile);
RegisterPkgHandler('build',TCommandBuild);
RegisterPkgHandler('install',TCommandInstall);
RegisterPkgHandler('install',TCommandInstallForced);
RegisterPkgHandler('install-req',TCommandInstall);
RegisterPkgHandler('uninstall',TCommandUnInstall);
RegisterPkgHandler('clean',TCommandClean);
RegisterPkgHandler('archive',TCommandArchive);

View File

@ -46,6 +46,8 @@ type
function FindRepository(ARepositoryName: string): TFPRepository;
function RepositoryByName(ARepositoryName: string): TFPRepository;
function GetInstallRepository(APackage: TFPPackage): TFPRepository;
procedure ScanInstalledPackagesForAvailablePackages;
property Options: TFppkgOptions read FOptions;
@ -327,6 +329,24 @@ begin
Raise EPackage.CreateFmt(SErrMissingInstallRepo,[ARepositoryName]);
end;
function TpkgFPpkg.GetInstallRepository(APackage: TFPPackage): TFPRepository;
var
InstRepositoryName: string;
Repo: TFPRepository;
begin
Result := GFPpkg.RepositoryByName(GFPpkg.Options.CommandLineSection.InstallRepository);
if Assigned(APackage) and Assigned(APackage.Repository) and Assigned(APackage.Repository.DefaultPackagesStructure) then
begin
InstRepositoryName := APackage.Repository.DefaultPackagesStructure.InstallRepositoryName;
if (InstRepositoryName<>'') then
begin
Repo := FindRepository(InstRepositoryName);
if Assigned(Repo) then
Result := Repo;
end;
end;
end;
procedure TpkgFPpkg.ScanInstalledPackagesForAvailablePackages;
var
i: Integer;

View File

@ -56,6 +56,7 @@ Resourcestring
SErrManifestNoSinglePackage = 'Manifest file "%s" does not contain exactly one package';
SErrCannotModifyRepository = 'The repository of an TFPPackages-instance can not be changed.';
SErrRepositoryNotAssigned = 'Repository not assigned';
SErrInstallationImpossible = 'It is not possible to install the package "%s" in repository "%s".';
SLogGeneratingFPMake = 'Generating fpmake.pp';
SLogNotCompilingFPMake = 'Skipping compiling of fpmake.pp, fpmake executable already exists';
@ -76,7 +77,7 @@ Resourcestring
SLogGeneratingCompilerConfig = 'Generating default compiler configuration in "%s"';
SLogLoadingPackagesFile = 'Loading available packages from "%s"';
SLogLoadingMirrorsFile = 'Loading available mirrors from "%s"';
SLogFindInstalledPackages = 'Finding installed packages in "%s"';
SLogFindInstalledPackages = 'Searching for installed packages in "%s"';
SLogFoundFPMakeAddin = 'Found FPMake-AddIn "%s"';
SLogSavingStatusFile = 'Saving local status to "%s"';
SLogFPMKUnitDepVersion = 'Checking for %s %s, installed %s, available %s';
@ -115,6 +116,7 @@ Resourcestring
SLogRepositoryDescription = ' Description: "%s"';
SLogRepositoryPath = ' Dir: "%s" -> "%s"';
SLogRepositoryPrefix = ' Prefix: "%s" -> "%s"';
SLogInstallRepository = ' InstallRepository:"%s"';
SLogIncludeFile = ' IncludeFile: "%s" -> "\%s"';
SLogIncludeFileMask = ' IncludeFileMask: "%s" -> "\%s"';

View File

@ -115,6 +115,7 @@ Type
TFppkgRepositoryOptionSection = class(TFppkgOptionSection)
private
FDescription: string;
FInstallRepositoryName: string;
FPath: string;
FPrefix: string;
FRepositoryName: string;
@ -136,6 +137,7 @@ Type
property Description: string read FDescription write SetDescription;
property Path: string read GetPath write SetPath;
property Prefix: string read GetPrefix write SetPrefix;
property InstallRepositoryName: string read FInstallRepositoryName write FInstallRepositoryName;
end;
{ TFppkgIncludeFilesOptionSection }
@ -280,6 +282,7 @@ Const
KeyGlobalSection = 'Global';
KeyRepositorySection = 'Repository';
KeySrcRepositorySection = 'UninstalledSourceRepository';
KeyUninstalledRepository = 'UninstalledRepository';
KeyIncludeFilesSection = 'IncludeFiles';
KeyRemoteMirrorsURL = 'RemoteMirrors';
KeyRemoteRepository = 'RemoteRepository';
@ -297,6 +300,7 @@ Const
KeyRepositoryDescription = 'Description';
KeyRepositoryPath = 'Path';
KeyRepositoryPrefix = 'Prefix';
KeyInstallRepositoryName = 'InstallRepository';
KeyIncludeFile = 'File';
KeyIncludeFileMask = 'FileMask';
@ -442,6 +446,8 @@ begin
Path := AValue
else if SameText(AKey,KeyRepositoryPrefix) then
Prefix := AValue
else if SameText(AKey,KeyInstallRepositoryName) then
InstallRepositoryName := AValue
end;
procedure TFppkgRepositoryOptionSection.LogValues(ALogLevel: TLogLevel);
@ -451,6 +457,7 @@ begin
log(ALogLevel,SLogRepositoryDescription,[FDescription]);
log(ALogLevel,SLogRepositoryPath,[FPath,Path]);
log(ALogLevel,SLogRepositoryPrefix,[FPrefix,Prefix]);
log(ALogLevel,SLogInstallRepository,[FInstallRepositoryName]);
end;
function TFppkgRepositoryOptionSection.AllowDuplicate: Boolean;
@ -475,6 +482,7 @@ begin
Result.RepositoryName := RepositoryName;
Result.Description := Description;
InstPackages := TFPInstalledPackagesStructure.Create(AParent, Path, ACompilerOptions);
InstPackages.InstallRepositoryName := InstallRepositoryName;
Result.DefaultPackagesStructure := InstPackages;
InstPackages.Prefix:=Prefix;
end;
@ -808,6 +816,8 @@ begin
CurrentSection := TFppkgUninstalledSourceRepositoryOptionSection.Create(FOptionParser)
else if SameText(s, KeyIncludeFilesSection) then
CurrentSection := TFppkgIncludeFilesOptionSection.Create(FOptionParser, Self, ExtractFileDir(AFileName))
else if SameText(s, KeyUninstalledRepository) then
CurrentSection := TFppkgUninstalledRepositoryOptionSection.Create(FOptionParser)
else
CurrentSection := TFppkgCustomOptionSection.Create(FOptionParser);
FSectionList.Add(CurrentSection);

View File

@ -22,10 +22,8 @@ type
{ TFppkgUninstalledSourceRepositoryOptionSection }
TFppkgUninstalledSourceRepositoryOptionSection = class(TFppkgRepositoryOptionSection)
private
public
constructor Create(AnOptionParser: TTemplateParser); override;
procedure AddKeyValue(const AKey, AValue: string); override;
function InitRepository(AParent: TComponent; ACompilerOptions: TCompilerOptions): TFPRepository; override;
function GetRepositoryType: TFPRepositoryType; override;
@ -39,11 +37,153 @@ type
function GetBuildPathDirectory(APackage: TFPPackage): string; override;
end;
{ TFppkgUninstalledRepositoryOptionSection }
TFppkgUninstalledRepositoryOptionSection = class(TFppkgRepositoryOptionSection)
private
FSourceRepositoryName: string;
public
function InitRepository(AParent: TComponent; ACompilerOptions: TCompilerOptions): TFPRepository; override;
procedure AddKeyValue(const AKey, AValue: string); override;
procedure LogValues(ALogLevel: TLogLevel); override;
function GetRepositoryType: TFPRepositoryType; override;
property SourceRepositoryName: string read FSourceRepositoryName write FSourceRepositoryName;
end;
{ TFPUninstalledSourcesPackagesStructure }
TFPUninstalledSourcesPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
private
FSourceRepositoryName: string;
public
function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
function IsInstallationNeeded(APackage: TFPPackage): TFPInstallationNeeded; override;
function GetBaseInstallDir: string; override;
function GetConfigFileForPackage(APackageName: string): string; override;
property SourceRepositoryName: string read FSourceRepositoryName write FSourceRepositoryName;
end;
implementation
const
KeyScanForUnits = 'ScanForUnits';
KeyUnitPath = 'UnitPath';
KeyScanForUnits = 'ScanForUnits';
KeyUnitPath = 'UnitPath';
KeySourceRepository = 'SourceRepository';
SLogSourceRepository = ' SourceRepository:%s';
{ TFPUninstalledSourcesPackagesStructure }
function TFPUninstalledSourcesPackagesStructure.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
SRD : TSearchRec;
SRF : TSearchRec;
P : TFPPackage;
UF,UD : String;
begin
Result:=false;
log(llDebug,SLogFindInstalledPackages,[FPath]);
if FindFirst(FPath+AllFiles,faDirectory,SRD)=0 then
begin
repeat
// Try new .fpm-file
UD:=FPath+SRD.Name+PathDelim;
if FindFirst(UD+'*'+FpmkExt,faAnyFile,SRF)=0 then
begin
repeat
UF := UD+SRF.Name;
P:=ARepository.AddPackage(ChangeFileExt(SRF.Name,''));
P.LoadUnitConfigFromFile(UF);
P.PackagesStructure:=Self;
if P.IsFPMakeAddIn then
AddFPMakeAddIn(P);
until FindNext(SRF)<>0;
end;
FindClose(SRF);
until FindNext(SRD)<>0;
end;
FindClose(SRF);
Result:=true;
end;
function TFPUninstalledSourcesPackagesStructure.IsInstallationNeeded(APackage: TFPPackage): TFPInstallationNeeded;
begin
if APackage.Repository.RepositoryName=SourceRepositoryName then
Result := fpinNoInstallationNeeded
else
Result := fpinInstallationImpossible;
end;
function TFPUninstalledSourcesPackagesStructure.GetBaseInstallDir: string;
begin
Result := FPath;
end;
function TFPUninstalledSourcesPackagesStructure.GetConfigFileForPackage(APackageName: string): string;
begin
Result := IncludeTrailingPathDelimiter(GetBaseInstallDir)+
APackageName+PathDelim+APackageName+'-'+GFPpkg.CompilerOptions.CompilerTarget+FpmkExt;
end;
{ TFppkgUninstalledRepositoryOptionSection }
function TFppkgUninstalledRepositoryOptionSection.InitRepository(AParent: TComponent;
ACompilerOptions: TCompilerOptions): TFPRepository;
var
InstPackages: TFPUninstalledSourcesPackagesStructure;
begin
if Path <> '' then
begin
Result := TFPRepository.Create(AParent);
Result.RepositoryType := GetRepositoryType;
Result.RepositoryName := RepositoryName;
Result.Description := Description;
InstPackages := TFPUninstalledSourcesPackagesStructure.Create(AParent, Path, ACompilerOptions);
InstPackages.InstallRepositoryName := InstallRepositoryName;
InstPackages.SourceRepositoryName := SourceRepositoryName;
Result.DefaultPackagesStructure := InstPackages;
end;
end;
procedure TFppkgUninstalledRepositoryOptionSection.AddKeyValue(const AKey, AValue: string);
begin
if SameText(AKey,KeySourceRepository) then
SourceRepositoryName := AValue
else
inherited AddKeyValue(AKey, AValue);
end;
procedure TFppkgUninstalledRepositoryOptionSection.LogValues(ALogLevel: TLogLevel);
begin
inherited LogValues(ALogLevel);
log(ALogLevel,SLogSourceRepository,[FSourceRepositoryName]);
end;
function TFppkgUninstalledRepositoryOptionSection.GetRepositoryType: TFPRepositoryType;
begin
Result := fprtInstalled;
end;
{ TFppkgUninstalledSourceRepositoryOptionSection }
@ -52,11 +192,6 @@ begin
inherited Create(AnOptionParser);
end;
procedure TFppkgUninstalledSourceRepositoryOptionSection.AddKeyValue(const AKey, AValue: string);
begin
inherited AddKeyValue(AKey, AValue);
end;
function TFppkgUninstalledSourceRepositoryOptionSection.InitRepository(AParent: TComponent;
ACompilerOptions: TCompilerOptions): TFPRepository;
var
@ -69,6 +204,7 @@ begin
Result.RepositoryName := RepositoryName;
Result.Description := Description;
InstPackages := TFPUninstalledSourcesAvailablePackagesStructure.Create(AParent, Path, ACompilerOptions);
InstPackages.InstallRepositoryName := InstallRepositoryName;
Result.DefaultPackagesStructure := InstPackages;
end;
end;
@ -156,6 +292,5 @@ begin
Result := FPath+APackage.Name
end;
end.