fpc/utils/fppkg/pkgcommands.pp
peter 12931808dc * find installed versions in local and global install dir
* support Package.fpc for backwards compatibility

git-svn-id: trunk@10214 -
2008-02-04 21:14:25 +00:00

299 lines
7.3 KiB
ObjectPascal

unit pkgcommands;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,pkghandler;
implementation
uses
zipper,
pkgmessages,
pkgglobals,
pkgoptions,
pkgdownload,
pkgrepos,
fprepos;
type
{ TCommandAddConfig }
TCommandAddConfig = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandUpdate }
TCommandUpdate = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandShowAll }
TCommandShowAll = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandShowAvail }
TCommandShowAvail = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandScanPackages }
TCommandScanPackages = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandDownload }
TCommandDownload = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandUnzip }
TCommandUnzip = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandCompile }
TCommandCompile = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandBuild }
TCommandBuild = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandInstall }
TCommandInstall = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandArchive }
TCommandArchive = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
{ TCommandInstallDependencies }
TCommandInstallDependencies = Class(TPackagehandler)
Public
Function Execute(const Args:TActionArgs):boolean;override;
end;
function TCommandAddConfig.Execute(const Args:TActionArgs):boolean;
begin
{
Log(vlInfo,SLogGeneratingCompilerConfig,[S]);
Options.InitCompilerDefaults(Args[2]);
Options.SaveCompilerToFile(S);
}
Result:=true;
end;
function TCommandUpdate.Execute(const Args:TActionArgs):boolean;
var
PackagesURL : String;
begin
// Download mirrors.xml
Log(vlCommands,SLogDownloading,[GlobalOptions.RemoteMirrorsURL,GlobalOptions.LocalMirrorsFile]);
DownloadFile(GlobalOptions.RemoteMirrorsURL,GlobalOptions.LocalMirrorsFile);
LoadLocalMirrors;
// Download packages.xml
PackagesURL:=GetRemoteRepositoryURL(PackagesFileName);
Log(vlCommands,SLogDownloading,[PackagesURL,GlobalOptions.LocalPackagesFile]);
DownloadFile(PackagesURL,GlobalOptions.LocalPackagesFile);
// Read the repository again
LoadLocalRepository;
FindInstalledPackages(CompilerOptions);
Result:=true;
end;
function TCommandShowAll.Execute(const Args:TActionArgs):boolean;
begin
ListLocalRepository(true);
Result:=true;
end;
function TCommandShowAvail.Execute(const Args:TActionArgs):boolean;
begin
ListLocalRepository(false);
Result:=true;
end;
function TCommandScanPackages.Execute(const Args:TActionArgs):boolean;
begin
RebuildRemoteRepository;
ListRemoteRepository;
SaveRemoteRepository;
Result:=true;
end;
function TCommandDownload.Execute(const Args:TActionArgs):boolean;
begin
if not assigned(CurrentPackage) then
Error(SErrNoPackageSpecified);
if not FileExists(PackageLocalArchive) then
ExecuteAction(CurrentPackage,'downloadpackage',Args);
Result:=true;
end;
function TCommandUnzip.Execute(const Args:TActionArgs):boolean;
Var
BuildDir : string;
ArchiveFile : String;
begin
BuildDir:=PackageBuildPath;
ArchiveFile:=PackageLocalArchive;
if not assigned(CurrentPackage) then
Error(SErrNoPackageSpecified);
if not FileExists(ArchiveFile) then
ExecuteAction(CurrentPackage,'downloadpackage');
{ Create builddir, remove it first if needed }
if DirectoryExists(BuildDir) then
DeleteDir(BuildDir);
ForceDirectories(BuildDir);
SetCurrentDir(BuildDir);
{ Unzip Archive }
With TUnZipper.Create do
try
Log(vlCommands,SLogUnzippping,[ArchiveFile]);
OutputPath:=PackageBuildPath;
UnZipAllFiles(ArchiveFile);
Finally
Free;
end;
Result:=true;
end;
function TCommandCompile.Execute(const Args:TActionArgs):boolean;
begin
if assigned(CurrentPackage) then
begin
ExecuteAction(CurrentPackage,'installdependencies',Args);
ExecuteAction(CurrentPackage,'unzip',Args);
end;
ExecuteAction(CurrentPackage,'fpmakecompile',Args);
Result:=true;
end;
function TCommandBuild.Execute(const Args:TActionArgs):boolean;
begin
if assigned(CurrentPackage) then
begin
ExecuteAction(CurrentPackage,'installdependencies',Args);
ExecuteAction(CurrentPackage,'unzip',Args);
end;
ExecuteAction(CurrentPackage,'fpmakebuild',Args);
Result:=true;
end;
function TCommandInstall.Execute(const Args:TActionArgs):boolean;
begin
if assigned(CurrentPackage) then
ExecuteAction(CurrentPackage,'build',Args);
ExecuteAction(CurrentPackage,'fpmakeinstall',Args);
// Update local status file
if assigned(CurrentPackage) then
CurrentPackage.InstalledVersion.Assign(CurrentPackage.Version);
Result:=true;
end;
function TCommandArchive.Execute(const Args:TActionArgs):boolean;
begin
ExecuteAction(CurrentPackage,'fpmakearchive',Args);
Result:=true;
end;
function TCommandInstallDependencies.Execute(const Args:TActionArgs):boolean;
var
i : Integer;
D : TFPDependency;
DepPackage : TFPPackage;
L : TStringList;
status : string;
begin
if not assigned(CurrentPackage) then
Error(SErrNoPackageSpecified);
// List dependencies
L:=TStringList.Create;
for i:=0 to CurrentPackage.Dependencies.Count-1 do
begin
D:=CurrentPackage.Dependencies[i];
DepPackage:=CurrentRepository.PackageByName(D.PackageName);
// Need installation?
if (DepPackage.InstalledVersion.Empty) or
(DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then
begin
if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
status:='Not Available!'
else
status:='Updating';
L.Add(DepPackage.Name);
end
else
status:='OK';
Log(vlDebug,SDbgPackageDependency,
[D.PackageName,D.MinVersion.AsString,DepPackage.InstalledVersion.AsString,DepPackage.Version.AsString,status]);
end;
// Install needed updates
for i:=0 to L.Count-1 do
begin
DepPackage:=CurrentRepository.PackageByName(L[i]);
if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
Error(SErrNoPackageAvailable,[D.PackageName,D.MinVersion.AsString]);
ExecuteAction(DepPackage,'install');
end;
FreeAndNil(L);
Result:=true;
end;
initialization
RegisterPkgHandler('update',TCommandUpdate);
RegisterPkgHandler('showall',TCommandShowAll);
RegisterPkgHandler('showavail',TCommandShowAvail);
RegisterPkgHandler('scan',TCommandScanPackages);
RegisterPkgHandler('download',TCommandDownload);
RegisterPkgHandler('unzip',TCommandUnzip);
RegisterPkgHandler('compile',TCommandCompile);
RegisterPkgHandler('build',TCommandBuild);
RegisterPkgHandler('install',TCommandInstall);
RegisterPkgHandler('archive',TCommandArchive);
RegisterPkgHandler('installdependencies',TCommandInstallDependencies);
end.