* recovery mode added to always use internal fpmkunit

* fix dependency versioning

git-svn-id: trunk@10280 -
This commit is contained in:
peter 2008-02-10 19:06:20 +00:00
parent 3e63d3f1dd
commit 36316bea75
9 changed files with 794 additions and 750 deletions

File diff suppressed because it is too large Load Diff

View File

@ -154,6 +154,7 @@ begin
Writeln(' -d --debug Show debugging information'); Writeln(' -d --debug Show debugging information');
Writeln(' -g --global Force installation to global (system-wide) directory'); Writeln(' -g --global Force installation to global (system-wide) directory');
Writeln(' -f --force Force installation also if the package is already installed'); Writeln(' -f --force Force installation also if the package is already installed');
Writeln(' -r --recovery Recovery mode, use always internal fpmkunit');
Writeln('Actions:'); Writeln('Actions:');
Writeln(' update Update packages list'); Writeln(' update Update packages list');
Writeln(' showavail List available packages'); Writeln(' showavail List available packages');
@ -242,6 +243,8 @@ begin
LogLevels:=AllLogLevels+[vlDebug] LogLevels:=AllLogLevels+[vlDebug]
else if CheckOption(I,'g','global') then else if CheckOption(I,'g','global') then
GlobalOptions.InstallGlobal:=true GlobalOptions.InstallGlobal:=true
else if CheckOption(I,'r','recovery') then
GlobalOptions.RecoveryMode:=true
else if CheckOption(I,'h','help') then else if CheckOption(I,'h','help') then
begin begin
ShowUsage; ShowUsage;
@ -313,16 +316,18 @@ begin
begin begin
if FileExists(ParaPackages[i]) then if FileExists(ParaPackages[i]) then
begin begin
ActionPackage:=CurrentRepository.AddPackage(ChangeFileExt(ExtractFileName(ParaPackages[i]),'')); ActionPackage:=LoadOrCreatePackage(ChangeFileExt(ExtractFileName(ParaPackages[i]),''));
ActionPackage.FileName:=ExpandFileName(ParaPackages[i]); ActionPackage.FileName:=ExpandFileName(ParaPackages[i]);
ActionPackage.IsLocalPackage:=true; ActionPackage.IsLocalPackage:=true;
res:=pkghandler.ExecuteAction(ActionPackage,ParaAction);
FreeAndNil(ActionPackage);
end end
else else
begin
ActionPackage:=CurrentRepository.PackageByName(ParaPackages[i]); ActionPackage:=CurrentRepository.PackageByName(ParaPackages[i]);
Log(vlDebug,SLogCommandLineAction,['['+ActionPackage.Name+']',ParaAction]); Log(vlDebug,SLogCommandLineAction,['['+ActionPackage.Name+']',ParaAction]);
res:=pkghandler.ExecuteAction(ActionPackage,ParaAction); res:=pkghandler.ExecuteAction(ActionPackage,ParaAction);
if ActionPackage.IsLocalPackage then; end;
FreeAndNil(ActionPackage);
if not res then if not res then
break; break;
end; end;

View File

@ -121,13 +121,9 @@ type
FOSes : TOSES; FOSes : TOSES;
FCPUs : TCPUS; FCPUs : TCPUS;
FIsLocalPackage : Boolean; FIsLocalPackage : Boolean;
function GetDependencies: TFPDependencies;
function GetHasDependencies: Boolean;
function GetFileName: String; function GetFileName: String;
procedure SetName(const AValue: String); procedure SetName(const AValue: String);
procedure SetVersion(const AValue: TFPVersion); procedure SetVersion(const AValue: TFPVersion);
Protected
Function CreateDependencies : TFPDependencies; virtual;
Public Public
Constructor Create(ACollection : TCollection); override; Constructor Create(ACollection : TCollection); override;
Destructor Destroy; override; Destructor Destroy; override;
@ -135,8 +131,7 @@ type
Procedure SaveToStream(Stream : TStream); override; Procedure SaveToStream(Stream : TStream); override;
Procedure Assign(Source : TPersistent); override; Procedure Assign(Source : TPersistent); override;
Function AddDependency(Const APackageName : String; AMinVersion : String = '') : TFPDependency; Function AddDependency(Const APackageName : String; AMinVersion : String = '') : TFPDependency;
Property HasDependencies : Boolean Read GetHasDependencies; Property Dependencies : TFPDependencies Read FDependencies;
Property Dependencies : TFPDependencies Read GetDependencies;
Published Published
Property Name : String Read FName Write SetName; Property Name : String Read FName Write SetName;
Property Author : String Read FAuthor Write FAuthor; Property Author : String Read FAuthor Write FAuthor;
@ -196,10 +191,12 @@ type
Procedure Save; Procedure Save;
// Loading and Saving version numbers: List of Name=Value pairs. // Loading and Saving version numbers: List of Name=Value pairs.
procedure ClearStatus; procedure ClearStatus;
{$ifdef STATUSFILE}
Procedure LoadStatusFromStream(Stream : TStream); virtual; Procedure LoadStatusFromStream(Stream : TStream); virtual;
Procedure SaveStatusToStream(Stream : TStream); virtual; Procedure SaveStatusToStream(Stream : TStream); virtual;
Procedure LoadStatusFromFile(const AFileName : String); Procedure LoadStatusFromFile(const AFileName : String);
Procedure SaveStatusToFile(const AFileName : String); Procedure SaveStatusToFile(const AFileName : String);
{$endif STATUSFILE}
// Package management // Package management
Function IndexOfPackage(const APackageName : String) : Integer; Function IndexOfPackage(const APackageName : String) : Integer;
Function FindPackage(const APackageName : String) : TFPPackage; Function FindPackage(const APackageName : String) : TFPPackage;
@ -298,34 +295,32 @@ ResourceString
Function OSToString(OS: TOS) : String; Function OSToString(OS: TOS) : String;
begin begin
Result:=LowerCase(GetenumName(TypeInfo(TOS),Ord(OS))); Result:=LowerCase(GetenumName(TypeInfo(TOS),Ord(OS)));
end; end;
Function OSesToString(OSes: TOSes) : String;
Function OSesToString(OSes: TOSes) : String;
begin begin
Result:=LowerCase(SetToString(PtypeInfo(TypeInfo(TOSes)),Integer(OSes),False)); Result:=LowerCase(SetToString(PtypeInfo(TypeInfo(TOSes)),Integer(OSes),False));
end; end;
Function CPUToString(CPU: TCPU) : String;
Function CPUToString(CPU: TCPU) : String;
begin begin
Result:=LowerCase(GetenumName(TypeInfo(TCPU),Ord(CPU))); Result:=LowerCase(GetenumName(TypeInfo(TCPU),Ord(CPU)));
end; end;
Function CPUSToString(CPUS: TCPUS) : String;
Function CPUSToString(CPUS: TCPUS) : String;
begin begin
Result:=LowerCase(SetToString(PTypeInfo(TypeInfo(TCPUS)),Integer(CPUS),False)); Result:=LowerCase(SetToString(PTypeInfo(TypeInfo(TCPUS)),Integer(CPUS),False));
end; end;
Function StringToOS(S : String) : TOS;
Function StringToOS(S : String) : TOS;
Var Var
I : Integer; I : Integer;
begin begin
I:=GetEnumValue(TypeInfo(TOS),S); I:=GetEnumValue(TypeInfo(TOS),S);
if (I=-1) then if (I=-1) then
@ -335,16 +330,14 @@ end;
Function OSesToString(S : String) : TOSes; Function OSesToString(S : String) : TOSes;
begin begin
Result:=TOSes(StringToSet(PTypeInfo(TypeInfo(TOSes)),S)); Result:=TOSes(StringToSet(PTypeInfo(TypeInfo(TOSes)),S));
end; end;
Function StringToCPU(S : String) : TCPU;
Function StringToCPU(S : String) : TCPU;
Var Var
I : Integer; I : Integer;
begin begin
I:=GetEnumValue(TypeInfo(TCPU),S); I:=GetEnumValue(TypeInfo(TCPU),S);
if (I=-1) then if (I=-1) then
@ -352,23 +345,22 @@ begin
Result:=TCPU(I); Result:=TCPU(I);
end; end;
Function StringToCPUS(S : String) : TCPUS;
Function StringToCPUS(S : String) : TCPUS;
begin begin
Result:=TCPUS(StringToSet(PTypeInfo(TypeInfo(TCPUS)),S)); Result:=TCPUS(StringToSet(PTypeInfo(TypeInfo(TCPUS)),S));
end; end;
Function MakeTargetString(CPU : TCPU;OS: TOS) : String;
Function MakeTargetString(CPU : TCPU;OS: TOS) : String;
begin begin
Result:=CPUToString(CPU)+'-'+OSToString(OS); Result:=CPUToString(CPU)+'-'+OSToString(OS);
end; end;
Procedure StringToCPUOS(S : String; Var CPU : TCPU; Var OS: TOS);
Procedure StringToCPUOS(S : String; Var CPU : TCPU; Var OS: TOS);
Var Var
P : integer; P : integer;
begin begin
P:=Pos('-',S); P:=Pos('-',S);
If (P=0) then If (P=0) then
@ -388,18 +380,18 @@ begin
Result:=Format('%d.%d.%d-%d',[Major,Minor,Micro,Build]); Result:=Format('%d.%d.%d-%d',[Major,Minor,Micro,Build]);
end; end;
function TFPVersion.GetEmpty: Boolean; function TFPVersion.GetEmpty: Boolean;
begin begin
Result:=(Major=0) and (Minor=0) and (Micro=0) and (Build=0); Result:=(Major=0) and (Minor=0) and (Micro=0) and (Build=0);
end; end;
procedure TFPVersion.SetAsString(const AValue: String); procedure TFPVersion.SetAsString(const AValue: String);
Function NextDigit(sep : Char; var V : string) : integer; Function NextDigit(sep : Char; var V : string) : integer;
Var Var
P : Integer; P : Integer;
begin begin
P:=Pos(Sep,V); P:=Pos(Sep,V);
If (P=0) then If (P=0) then
@ -425,6 +417,7 @@ begin
Build:=NextDigit(#0,V); Build:=NextDigit(#0,V);
end; end;
procedure TFPVersion.Clear; procedure TFPVersion.Clear;
begin begin
Micro:=0; Micro:=0;
@ -433,11 +426,10 @@ begin
Build:=0; Build:=0;
end; end;
procedure TFPVersion.Assign(Source: TPersistent);
procedure TFPVersion.Assign(Source: TPersistent);
Var Var
V : TFPVersion; V : TFPVersion;
begin begin
if Source is TFPVersion then if Source is TFPVersion then
begin begin
@ -451,6 +443,7 @@ begin
inherited Assign(Source); inherited Assign(Source);
end; end;
function TFPVersion.CompareVersion(AVersion: TFPVersion): Integer; function TFPVersion.CompareVersion(AVersion: TFPVersion): Integer;
begin begin
Result:=Major-AVersion.Major; Result:=Major-AVersion.Major;
@ -466,6 +459,7 @@ begin
end; end;
end; end;
function TFPVersion.SameVersion(AVersion: TFPVersion): Boolean; function TFPVersion.SameVersion(AVersion: TFPVersion): Boolean;
begin begin
Result:=CompareVersion(AVersion)=0; Result:=CompareVersion(AVersion)=0;
@ -480,10 +474,6 @@ begin
FVersion.Assign(AValue); FVersion.Assign(AValue);
end; end;
Function TFPPackage.CreateDependencies : TFPDependencies;
begin
Result:=TFPDependencies.Create(TFPDependency);
end;
constructor TFPPackage.Create(ACollection: TCollection); constructor TFPPackage.Create(ACollection: TCollection);
begin begin
@ -492,6 +482,7 @@ begin
FInstalledVersion:=TFPVersion.Create; FInstalledVersion:=TFPVersion.Create;
FOSes:=AllOSes; FOSes:=AllOSes;
FCPUs:=AllCPUs; FCPUs:=AllCPUs;
FDependencies:=TFPDependencies.Create(TFPDependency);
end; end;
@ -503,8 +494,8 @@ begin
inherited Destroy; inherited Destroy;
end; end;
procedure TFPPackage.SetName(const AValue: String);
procedure TFPPackage.SetName(const AValue: String);
begin begin
If (AValue<>FName) and (AValue<>'') then If (AValue<>FName) and (AValue<>'') then
If (Collection<>Nil) and (Collection is TFPPackages) then If (Collection<>Nil) and (Collection is TFPPackages) then
@ -515,17 +506,6 @@ begin
FName:=AValue; FName:=AValue;
end; end;
function TFPPackage.GetDependencies: TFPDependencies;
begin
If Not Assigned(FDependencies) then
FDependencies:=CreateDependencies;
Result:=FDependencies;
end;
function TFPPackage.GetHasDependencies: Boolean;
begin
Result:=(Dependencies<>nil) and (FDependencies.Count>0);
end;
function TFPPackage.GetFileName: String; function TFPPackage.GetFileName: String;
var var
@ -540,14 +520,13 @@ begin
Result:=FFileName; Result:=FFileName;
end; end;
procedure TFPPackage.LoadFromStream(Stream: TStream; Streamversion : Integer);
procedure TFPPackage.LoadFromStream(Stream: TStream; Streamversion : Integer);
Var Var
B : Boolean; B : Boolean;
O : TOSes; O : TOSes;
C : TCPUs; C : TCPUs;
I,J,Count : Integer; I,J,Count : Integer;
begin begin
Version.AsString:=ReadString(Stream); Version.AsString:=ReadString(Stream);
Name:=ReadString(Stream); Name:=ReadString(Stream);
@ -575,22 +554,18 @@ begin
Include(C,TCPU(J)); Include(C,TCPU(J));
end; end;
CPUS:=C; CPUS:=C;
FreeAndNil(FDependencies); FDependencies.Clear;
B:=ReadBoolean(Stream); B:=ReadBoolean(Stream);
If B then If B then
begin
FDependencies:=CreateDependencies;
FDependencies.LoadFromStream(Stream); FDependencies.LoadFromStream(Stream);
end
end; end;
procedure TFPPackage.SaveToStream(Stream: TStream);
procedure TFPPackage.SaveToStream(Stream: TStream);
Var Var
Count : Integer; Count : Integer;
O : TOS; O : TOS;
C : TCPU; C : TCPU;
begin begin
WriteString(Stream,Version.AsString); WriteString(Stream,Version.AsString);
WriteString(Stream,Name); WriteString(Stream,Name);
@ -619,16 +594,15 @@ begin
For C:=Low(TCPU) to High(TCPU) do For C:=Low(TCPU) to High(TCPU) do
If C in CPUS then If C in CPUS then
WriteString(Stream,GetEnumName(TypeInfo(TCPU),Ord(C))); WriteString(Stream,GetEnumName(TypeInfo(TCPU),Ord(C)));
WriteBoolean(Stream,HasDependencies); WriteBoolean(Stream,FDependencies.Count>0);
If HasDependencies then If FDependencies.Count>0 then
FDependencies.SaveToStream(Stream); FDependencies.SaveToStream(Stream);
end; end;
procedure TFPPackage.Assign(Source: TPersistent);
procedure TFPPackage.Assign(Source: TPersistent);
Var Var
P : TFPPackage; P : TFPPackage;
begin begin
if Source is TFPPackage then if Source is TFPPackage then
begin begin
@ -641,22 +615,21 @@ begin
Description:=P.Description; Description:=P.Description;
ExternalURL:=P.ExternalURL; ExternalURL:=P.ExternalURL;
FileName:=P.FileName; FileName:=P.FileName;
InstalledVersion:=P.Installedversion; InstalledVersion.Assign(P.Installedversion);
If P.HasDependencies then Dependencies.Clear;
Dependencies.Assign(P.Dependencies) Dependencies.Assign(P.Dependencies);
else
FreeAndNil(FDependencies);
end end
else else
inherited Assign(Source); inherited Assign(Source);
end; end;
function TFPPackage.AddDependency(const APackageName: String;
AMinVersion: String): TFPDependency; function TFPPackage.AddDependency(const APackageName: String;AMinVersion: String): TFPDependency;
begin begin
Result:=Dependencies.AddDependency(APackageName,AMinVersion); Result:=Dependencies.AddDependency(APackageName,AMinVersion);
end; end;
{ TFPPackages } { TFPPackages }
function TFPPackages.GetPackage(Index : Integer): TFPPackage; function TFPPackages.GetPackage(Index : Integer): TFPPackage;
@ -839,13 +812,12 @@ begin
end; end;
{$ifdef STATUSFILE}
procedure TFPRepository.LoadStatusFromStream(Stream: TStream); procedure TFPRepository.LoadStatusFromStream(Stream: TStream);
Var Var
L : TStrings; L : TStrings;
I : Integer; I : Integer;
N,V : String; N,V : String;
begin begin
L:=TStringList.Create; L:=TStringList.Create;
Try Try
@ -861,12 +833,11 @@ begin
end; end;
end; end;
procedure TFPRepository.SaveStatusToStream(Stream: TStream);
procedure TFPRepository.SaveStatusToStream(Stream: TStream);
Var Var
L : TStrings; L : TStrings;
I : Integer; I : Integer;
begin begin
L:=TStringList.Create; L:=TStringList.Create;
Try Try
@ -880,11 +851,10 @@ begin
end; end;
end; end;
procedure TFPRepository.LoadStatusFromFile(const AFileName: String);
procedure TFPRepository.LoadStatusFromFile(const AFileName: String);
Var Var
F : TFileStream; F : TFileStream;
begin begin
F:=TFileStream.Create(AFileName,fmOpenRead); F:=TFileStream.Create(AFileName,fmOpenRead);
Try Try
@ -894,11 +864,10 @@ begin
end; end;
end; end;
procedure TFPRepository.SaveStatusToFile(const AFileName: String);
procedure TFPRepository.SaveStatusToFile(const AFileName: String);
Var Var
F : TFileStream; F : TFileStream;
begin begin
If FileExists(AFileName) and BackupFiles then If FileExists(AFileName) and BackupFiles then
BackupFile(AFileName); BackupFile(AFileName);
@ -909,52 +878,58 @@ begin
F.Free; F.Free;
end; end;
end; end;
{$endif STATUSFILE}
function TFPRepository.IndexOfPackage(const APackageName: String): Integer; function TFPRepository.IndexOfPackage(const APackageName: String): Integer;
begin begin
Result:=FPackages.IndexOfPackage(APackageName); Result:=FPackages.IndexOfPackage(APackageName);
end; end;
function TFPRepository.FindPackage(const APackageName: String): TFPPackage; function TFPRepository.FindPackage(const APackageName: String): TFPPackage;
begin begin
Result:=FPackages.FindPackage(APackageName); Result:=FPackages.FindPackage(APackageName);
end; end;
function TFPRepository.PackageByName(const APackageName: String): TFPPackage; function TFPRepository.PackageByName(const APackageName: String): TFPPackage;
begin begin
Result:=FPackages.PackageByName(APackageName); Result:=FPackages.PackageByName(APackageName);
end; end;
procedure TFPRepository.RemovePackage(const APackageName: string); procedure TFPRepository.RemovePackage(const APackageName: string);
begin begin
PackageByName(APackageName).Free; PackageByName(APackageName).Free;
end; end;
procedure TFPRepository.DeletePackage(Index : Integer); procedure TFPRepository.DeletePackage(Index : Integer);
begin begin
GetPackage(Index).Free; GetPackage(Index).Free;
end; end;
function TFPRepository.AddPackage(const APackageName: string): TFPPackage;
function TFPRepository.AddPackage(const APackageName: string): TFPPackage;
begin begin
Result:=FPackages.AddPackage(APackageName); Result:=FPackages.AddPackage(APackageName);
end; end;
procedure TFPRepository.DoGetPackageDependencies(const APackageName: String;
List: TStringList; Level: Integer); procedure TFPRepository.DoGetPackageDependencies(const APackageName: String; List: TStringList; Level: Integer);
Var Var
P : TFPPackage; P : TFPPackage;
D2,D1 : TFPDependency; D2,D1 : TFPDependency;
i,J : Integer; i,J : Integer;
begin begin
// If too many levels, bail out // If too many levels, bail out
If (Level>FMaxDependencyLevel) then If (Level>FMaxDependencyLevel) then
Raise EPackage.CreateFmt(SErrMaxLevelExceeded,[Level,APackageName]); Raise EPackage.CreateFmt(SErrMaxLevelExceeded,[Level,APackageName]);
// Check if it is a known package. // Check if it is a known package.
P:=FindPackage(APackageName); P:=FindPackage(APackageName);
If Assigned(P) and P.HasDependencies then If not Assigned(P) then
exit;
For I:=0 to P.Dependencies.Count-1 do For I:=0 to P.Dependencies.Count-1 do
begin begin
D1:=P.Dependencies[i]; D1:=P.Dependencies[i];
@ -979,13 +954,11 @@ begin
end; end;
end; end;
procedure TFPRepository.GetPackageDependencies(const APackageName: String;
List: TObjectList; Recurse: Boolean);
procedure TFPRepository.GetPackageDependencies(const APackageName: String; List: TObjectList; Recurse: Boolean);
Var Var
L : TStringList; L : TStringList;
I : Integer; I : Integer;
begin begin
L:=TStringList.Create; L:=TStringList.Create;
Try Try
@ -1007,6 +980,7 @@ begin
FMinVersion.Assign(AValue); FMinVersion.Assign(AValue);
end; end;
constructor TFPDependency.Create(ACollection: TCollection); constructor TFPDependency.Create(ACollection: TCollection);
begin begin
inherited Create(ACollection); inherited Create(ACollection);
@ -1015,37 +989,45 @@ begin
FCPUs:=AllCPUs; FCPUs:=AllCPUs;
end; end;
destructor TFPDependency.Destroy; destructor TFPDependency.Destroy;
begin begin
FreeAndNil(FMinVersion); FreeAndNil(FMinVersion);
inherited Destroy; inherited Destroy;
end; end;
procedure TFPDependency.LoadFromStream(Stream: TStream; Streamversion: Integer
); procedure TFPDependency.LoadFromStream(Stream: TStream; Streamversion: Integer);
begin begin
PackageName:=ReadString(Stream); PackageName:=ReadString(Stream);
MinVersion.AsString:=ReadString(Stream) MinVersion.AsString:=ReadString(Stream)
end; end;
procedure TFPDependency.SaveToStream(Stream: TStream); procedure TFPDependency.SaveToStream(Stream: TStream);
begin begin
WriteString(Stream,PackageName); WriteString(Stream,PackageName);
WriteString(Stream,MinVersion.AsString); WriteString(Stream,MinVersion.AsString);
end; end;
procedure TFPDependency.Assign(Source: TPersistent); procedure TFPDependency.Assign(Source: TPersistent);
var
S : TFPDependency;
begin begin
If Source is TFPDependency then If Source is TFPDependency then
With Source as TFPDependency do
begin begin
Self.PackageName:=PackageName; S:=Source as TFPDependency;
Self.MinVersion:=MinVersion; FPackageName:=S.PackageName;
FMinVersion.Assign(S.MinVersion);
FOSes:=S.OSes;
FCPUs:=S.CPUs;
end end
else else
inherited Assign(Source); inherited Assign(Source);
end; end;
{ TFPDependencies } { TFPDependencies }
function TFPDependencies.GetDependency(Index : Integer): TFPDependency; function TFPDependencies.GetDependency(Index : Integer): TFPDependency;
@ -1053,12 +1035,13 @@ begin
Result:=TFPDependency(Items[Index]); Result:=TFPDependency(Items[Index]);
end; end;
procedure TFPDependencies.SetDependency(Index : Integer;
const AValue: TFPDependency); procedure TFPDependencies.SetDependency(Index : Integer; const AValue: TFPDependency);
begin begin
Items[Index]:=AValue; Items[Index]:=AValue;
end; end;
function TFPDependencies.AddDependency(const APackageName: String; const AMinVersion: String): TFPDependency; function TFPDependencies.AddDependency(const APackageName: String; const AMinVersion: String): TFPDependency;
begin begin
Result:=Add as TFPDependency; Result:=Add as TFPDependency;
@ -1067,6 +1050,7 @@ begin
Result.MinVersion.AsString:=AMinVersion; Result.MinVersion.AsString:=AMinVersion;
end; end;
{ TFPMirror } { TFPMirror }
constructor TFPMirror.Create(ACollection: TCollection); constructor TFPMirror.Create(ACollection: TCollection);

View File

@ -327,7 +327,7 @@ begin
OSesToXML(P.OSes,XML,Result); OSesToXML(P.OSes,XML,Result);
if P.CPUs<>AllCPUs then if P.CPUs<>AllCPUs then
CPUsToXML(P.CPUs,XML,Result); CPUsToXML(P.CPUs,XML,Result);
If P.HasDependencies then If P.Dependencies.Count>0 then
DependenciesToXML(P.Dependencies,XML,Result); DependenciesToXML(P.Dependencies,XML,Result);
Except Except
Parent.RemoveChild(Result); Parent.RemoveChild(Result);

View File

@ -207,10 +207,20 @@ end;
function TCommandCompile.Execute(const Args:TActionArgs):boolean; function TCommandCompile.Execute(const Args:TActionArgs):boolean;
begin begin
if assigned(CurrentPackage) then if assigned(CurrentPackage) then
begin
// For local files we need the information inside the zip to get the
// dependencies
if CurrentPackage.IsLocalPackage then
begin
ExecuteAction(CurrentPackage,'unzip',Args);
ExecuteAction(CurrentPackage,'installdependencies',Args);
end
else
begin begin
ExecuteAction(CurrentPackage,'installdependencies',Args); ExecuteAction(CurrentPackage,'installdependencies',Args);
ExecuteAction(CurrentPackage,'unzip',Args); ExecuteAction(CurrentPackage,'unzip',Args);
end; end;
end;
ExecuteAction(CurrentPackage,'fpmakecompile',Args); ExecuteAction(CurrentPackage,'fpmakecompile',Args);
Result:=true; Result:=true;
end; end;
@ -219,10 +229,20 @@ end;
function TCommandBuild.Execute(const Args:TActionArgs):boolean; function TCommandBuild.Execute(const Args:TActionArgs):boolean;
begin begin
if assigned(CurrentPackage) then if assigned(CurrentPackage) then
begin
// For local files we need the information inside the zip to get the
// dependencies
if CurrentPackage.IsLocalPackage then
begin
ExecuteAction(CurrentPackage,'unzip',Args);
ExecuteAction(CurrentPackage,'installdependencies',Args);
end
else
begin begin
ExecuteAction(CurrentPackage,'installdependencies',Args); ExecuteAction(CurrentPackage,'installdependencies',Args);
ExecuteAction(CurrentPackage,'unzip',Args); ExecuteAction(CurrentPackage,'unzip',Args);
end; end;
end;
ExecuteAction(CurrentPackage,'fpmakebuild',Args); ExecuteAction(CurrentPackage,'fpmakebuild',Args);
Result:=true; Result:=true;
end; end;
@ -257,14 +277,26 @@ end;
function TCommandInstallDependencies.Execute(const Args:TActionArgs):boolean; function TCommandInstallDependencies.Execute(const Args:TActionArgs):boolean;
var var
i : Integer; i : Integer;
MissingDependency,
D : TFPDependency; D : TFPDependency;
P,
DepPackage : TFPPackage; DepPackage : TFPPackage;
L : TStringList; L : TStringList;
status : string; status : string;
begin begin
if not assigned(CurrentPackage) then if not assigned(CurrentPackage) then
Error(SErrNoPackageSpecified); Error(SErrNoPackageSpecified);
// List dependencies // Load dependencies for local packages
if CurrentPackage.IsLocalPackage then
begin
ExecuteAction(CurrentPackage,'fpmakemanifest',Args);
P:=LoadPackageManifest(ManifestFileName);
// Update CurrentPackage
CurrentPackage.Assign(P);
CurrentPackage.IsLocalPackage:=true;
end;
// Find and List dependencies
MissingDependency:=nil;
L:=TStringList.Create; L:=TStringList.Create;
for i:=0 to CurrentPackage.Dependencies.Count-1 do for i:=0 to CurrentPackage.Dependencies.Count-1 do
begin begin
@ -278,23 +310,31 @@ begin
(DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then (DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then
begin begin
if DepPackage.Version.CompareVersion(D.MinVersion)<0 then if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
status:='Not Available!' begin
status:='Not Available!';
MissingDependency:=D;
end
else else
begin
status:='Updating'; status:='Updating';
L.Add(DepPackage.Name); L.Add(DepPackage.Name);
end;
end end
else else
status:='OK'; status:='OK';
Log(vlDebug,SDbgPackageDependency, Log(vlInfo,SLogPackageDependency,
[D.PackageName,D.MinVersion.AsString,DepPackage.InstalledVersion.AsString,DepPackage.Version.AsString,status]); [D.PackageName,D.MinVersion.AsString,DepPackage.InstalledVersion.AsString,DepPackage.Version.AsString,status]);
end
else
Log(vlDebug,SDbgPackageDependencyOtherTarget,[D.PackageName,MakeTargetString(CompilerOptions.CompilerCPU,CompilerOptions.CompilerOS)]);
end; end;
end; // Give error on first missing dependency
if assigned(MissingDependency) then
Error(SErrNoPackageAvailable,[MissingDependency.PackageName,MissingDependency.MinVersion.AsString]);
// Install needed updates // Install needed updates
for i:=0 to L.Count-1 do for i:=0 to L.Count-1 do
begin begin
DepPackage:=CurrentRepository.PackageByName(L[i]); DepPackage:=CurrentRepository.PackageByName(L[i]);
// if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
// Error(SErrNoPackageAvailable,[D.PackageName,D.MinVersion.AsString]);
ExecuteAction(DepPackage,'install'); ExecuteAction(DepPackage,'install');
end; end;
FreeAndNil(L); FreeAndNil(L);

View File

@ -72,14 +72,15 @@ Resourcestring
SLogFPMKUnitDepTooOld = 'Minimum version of %s is not installed, using internal fpmkunit with limited functionality'; SLogFPMKUnitDepTooOld = 'Minimum version of %s is not installed, using internal fpmkunit with limited functionality';
SLogSelectedMirror = 'Selected mirror "%s"'; SLogSelectedMirror = 'Selected mirror "%s"';
SLogUpgradingConfig = 'Configuration file "%s" is updated with new configuration settings'; SLogUpgradingConfig = 'Configuration file "%s" is updated with new configuration settings';
SLogPackageMultipleLocations = 'Multiple installations found for package %s, using installation "%s"'; SLogPackageDependency = 'Dependency on package %s %s, installed %s, available %s (%s)';
SDbgFound = 'Found'; SDbgFound = 'Found';
SDbgNotFound = 'Not Found'; SDbgNotFound = 'Not Found';
SDbgDirectoryExists = 'Directory "%s" %s'; SDbgDirectoryExists = 'Directory "%s" %s';
SDbgFileExists = 'File "%s" %s'; SDbgFileExists = 'File "%s" %s';
SDbgBackupFile = 'Creating Backup File "%s"'; SDbgBackupFile = 'Creating Backup File "%s"';
SDbgPackageDependency = 'Dependency on package %s %s, installed %s, available %s (%s)'; SDbgPackageMultipleLocations = 'Multiple installations found for package %s, using installation "%s"';
SDbgPackageDependencyOtherTarget = 'Dependency on package %s is not for %s';
implementation implementation

View File

@ -502,7 +502,7 @@ begin
Res:=R.IndexOfName(N)<>-1; Res:=R.IndexOfName(N)<>-1;
GetOSCPU(V,OS,CPU); GetOSCPU(V,OS,CPU);
Pre[1]:=Upcase(Pre[1]); Pre[1]:=Upcase(Pre[1]);
Src.Add(' T:=P.Targets.Add'+Pre+'('''+Prefix+N+''');'); Src.Add(' T:=P.Targets.Add'+Pre+'('''+Prefix+N+'.pp'');');
If (CPU<>'') then If (CPU<>'') then
Src.Add(' T.CPU:=['+CPU+'];'); Src.Add(' T.CPU:=['+CPU+'];');
If (OS<>'') then If (OS<>'') then

View File

@ -45,7 +45,8 @@ Type
FFPMakeCompilerConfig : String; FFPMakeCompilerConfig : String;
// Parameter options // Parameter options
FCompilerConfig : String; FCompilerConfig : String;
FInstallGlobal : Boolean; FInstallGlobal,
FRecoveryMode : Boolean;
function GetOptString(Index: integer): String; function GetOptString(Index: integer): String;
procedure SetOptString(Index: integer; const AValue: String); procedure SetOptString(Index: integer; const AValue: String);
Public Public
@ -72,6 +73,7 @@ Type
// Parameters // Parameters
Property CompilerConfig : String Read FCompilerConfig Write FCompilerConfig; Property CompilerConfig : String Read FCompilerConfig Write FCompilerConfig;
Property InstallGlobal : Boolean Read FInstallGlobal Write FInstallGlobal; Property InstallGlobal : Boolean Read FInstallGlobal Write FInstallGlobal;
Property RecoveryMode : Boolean Read FRecoveryMode Write FRecoveryMode;
end; end;
@ -258,6 +260,7 @@ begin
// Parameter defaults // Parameter defaults
FCompilerConfig:=FDefaultCompilerConfig; FCompilerConfig:=FDefaultCompilerConfig;
FInstallGlobal:=False; FInstallGlobal:=False;
FRecoveryMode:=False;
end; end;

View File

@ -12,6 +12,8 @@ function GetRemoteRepositoryURL(const AFileName:string):string;
procedure LoadLocalMirrors; procedure LoadLocalMirrors;
procedure LoadLocalRepository; procedure LoadLocalRepository;
function LoadOrCreatePackage(const AName:string):TFPPackage;
function LoadPackageManifest(const AManifestFN:string):TFPPackage;
procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boolean=true); procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boolean=true);
procedure CheckFPMakeDependencies; procedure CheckFPMakeDependencies;
procedure ListLocalRepository(all:boolean=false); procedure ListLocalRepository(all:boolean=false);
@ -189,8 +191,6 @@ begin
end; end;
procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boolean=true);
function LoadOrCreatePackage(const AName:string):TFPPackage; function LoadOrCreatePackage(const AName:string):TFPPackage;
begin begin
result:=CurrentRepository.FindPackage(AName); result:=CurrentRepository.FindPackage(AName);
@ -201,6 +201,51 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
end; end;
end; end;
function LoadPackageManifest(const AManifestFN:string):TFPPackage;
var
X : TFPXMLRepositoryHandler;
i : integer;
DoAdd : Boolean;
NewP : TFPPackage;
NewPackages : TFPPackages;
begin
result:=nil;
NewPackages:=TFPPackages.Create(TFPPackage);
X:=TFPXMLRepositoryHandler.Create;
try
X.LoadFromXml(NewPackages,AManifestFN);
// Update or Add packages to repository
for i:=0 to NewPackages.Count-1 do
begin
NewP:=NewPackages[i];
DoAdd:=True;
result:=CurrentRepository.FindPackage(NewP.Name);
if assigned(result) then
begin
if NewP.Version.CompareVersion(result.Version)<0 then
begin
Writeln(Format('Ignoring package %s-%s (old %s)',[NewP.Name,NewP.Version.AsString,result.Version.AsString]));
DoAdd:=False;
end
else
Writeln(Format('Updating package %s-%s (old %s)',[NewP.Name,NewP.Version.AsString,result.Version.AsString]));
end
else
result:=CurrentRepository.PackageCollection.AddPackage(NewP.Name);
// Copy contents
if DoAdd then
result.Assign(NewP);
end;
finally
X.Free;
NewPackages.Free;
end;
end;
procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boolean=true);
procedure LoadUnitConfigFromFile(APackage:TFPPackage;const AFileName: String); procedure LoadUnitConfigFromFile(APackage:TFPPackage;const AFileName: String);
Var Var
L : TStrings; L : TStrings;
@ -217,7 +262,7 @@ procedure FindInstalledPackages(ACompilerOptions:TCompilerOptions;showdups:boole
if not APackage.InstalledVersion.Empty then if not APackage.InstalledVersion.Empty then
begin begin
if showdups then if showdups then
Log(vlInfo,SLogPackageMultipleLocations,[APackage.Name,ExtractFilePath(AFileName)]); Log(vlDebug,SDbgPackageMultipleLocations,[APackage.Name,ExtractFilePath(AFileName)]);
end; end;
Finally Finally
L.Free; L.Free;
@ -292,10 +337,16 @@ var
P : TFPPackage; P : TFPPackage;
ReqVer : TFPVersion; ReqVer : TFPVersion;
begin begin
// Reset availability
for i:=1 to FPMKUnitDepCount do
FPMKUnitDepAvailable[i]:=false;
// Not version check needed in Recovery mode, we always need to use
// the internal bootstrap procedure
if GlobalOptions.RecoveryMode then
exit;
// Check for fpmkunit dependencies // Check for fpmkunit dependencies
for i:=1 to FPMKUnitDepCount do for i:=1 to FPMKUnitDepCount do
begin begin
FPMKUnitDepAvailable[i]:=false;
P:=CurrentRepository.FindPackage(FPMKUnitDeps[i].package); P:=CurrentRepository.FindPackage(FPMKUnitDeps[i].package);
if P<>nil then if P<>nil then
begin begin
@ -350,47 +401,6 @@ end;
procedure RebuildRemoteRepository; procedure RebuildRemoteRepository;
procedure AddPackage(const AManifestFN:string);
var
X : TFPXMLRepositoryHandler;
i : integer;
DoAdd : Boolean;
P,NewP : TFPPackage;
NewPackages : TFPPackages;
begin
NewPackages:=TFPPackages.Create(TFPPackage);
X:=TFPXMLRepositoryHandler.Create;
try
X.LoadFromXml(NewPackages,AManifestFN);
DeleteFile(ManifestFileName);
// Update or Add packages to repository
for i:=0 to NewPackages.Count-1 do
begin
NewP:=NewPackages[i];
DoAdd:=True;
P:=CurrentRepository.FindPackage(NewP.Name);
if assigned(P) then
begin
if NewP.Version.CompareVersion(P.Version)<0 then
begin
Writeln(Format('Ignoring package %s-%s (old %s)',[NewP.Name,NewP.Version.AsString,P.Version.AsString]));
DoAdd:=False;
end
else
Writeln(Format('Updating package %s-%s (old %s)',[NewP.Name,NewP.Version.AsString,P.Version.AsString]));
end
else
P:=CurrentRepository.PackageCollection.AddPackage(NewP.Name);
// Copy contents
if DoAdd then
P.Assign(NewP);
end;
finally
X.Free;
NewPackages.Free;
end;
end;
var var
i : integer; i : integer;
ArchiveSL : TStringList; ArchiveSL : TStringList;
@ -422,7 +432,10 @@ begin
end; end;
{ Load manifest.xml } { Load manifest.xml }
if FileExists(ManifestFileName) then if FileExists(ManifestFileName) then
AddPackage(ManifestFileName) begin
LoadPackageManifest(ManifestFileName);
DeleteFile(ManifestFileName);
end
else else
Writeln('No manifest found in archive ',ArchiveSL[i]); Writeln('No manifest found in archive ',ArchiveSL[i]);