IDEIntf: added GetRequiredPackages

git-svn-id: trunk@40280 -
This commit is contained in:
mattias 2013-02-12 21:49:12 +00:00
parent e473991184
commit fe54d0ba55
15 changed files with 134 additions and 68 deletions

View File

@ -454,6 +454,12 @@ begin
while AVLNode<>nil do begin
Group:=TUGGroup(AVLNode.Data);
Graph.GetNode(Group.Name,true);
if Group.Name=GroupPrefixProject then begin
// project
end else begin
end;
AVLNode:=Groups.Groups.FindSuccessor(AVLNode);
end;
GroupsLvlGraph.EndUpdate;

View File

@ -50,6 +50,7 @@ uses
ComCtrls, DividerBevel, DefineTemplates,
// IDEIntf
LazIDEIntf, IDEMsgIntf, IDEHelpIntf, IDEImagesIntf, IDEWindowIntf, IDEDialogs,
PackageIntf,
// IDE
LazarusIDEStrConsts, TransferMacros, LazConf, IDEProcs, DialogProcs, MainBar,
InputHistory, ExtToolDialog, ExtToolEditDlg, EnvironmentOpts,
@ -1094,7 +1095,8 @@ begin
InhTreeView.BeginUpdate;
LazDir:=EnvironmentOptions.GetParsedLazarusDirectory;
try
PackageGraph.GetAllRequiredPackages(PackageGraph.FirstAutoInstallDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,
PackageGraph.FirstAutoInstallDependency,PkgList,[pirSkipDesignTimeOnly]);
// add detail nodes
if PkgList<>nil then

View File

@ -2101,7 +2101,7 @@ function TBuildManager.OnGetBuildMacroValues(Options: TBaseCompilerOptions;
if FirstDependency=nil then exit;
List:=nil;
try
PackageGraph.GetAllRequiredPackages(FirstDependency,List);
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,List);
if List=nil then exit;
for i:=0 to List.Count-1 do begin
// add values of build macros of used package

View File

@ -33,7 +33,7 @@ uses
// codetools
CodeToolManager, DirectoryCacher, CodeToolsStructs,
// IDEIntf
IDEDialogs, IDEImagesIntf,
IDEDialogs, IDEImagesIntf, PackageIntf,
// IDE
PackageDefs, PackageSystem, InputHistory, LazarusIDEStrConsts, Project,
DialogProcs, IDEProcs;
@ -343,7 +343,8 @@ var
begin
List:=nil;
try
PackageGraph.GetAllRequiredPackages(FProject.FirstRequiredDependency,List);
PackageGraph.GetAllRequiredPackages(nil,FProject.FirstRequiredDependency,
List,[pirSkipDesignTimeOnly]);
if List=nil then exit;
for i:=0 to List.Count-1 do begin
Pkg:=TLazPackage(List[i]);
@ -363,7 +364,8 @@ var
begin
List:=nil;
try
PackageGraph.GetAllRequiredPackages(FProject.FirstRequiredDependency,List);
PackageGraph.GetAllRequiredPackages(nil,FProject.FirstRequiredDependency,
List);
if List=nil then exit;
for i:=0 to List.Count-1 do begin
Pkg:=TLazPackage(List[i]);

View File

@ -38,6 +38,7 @@ uses
CodeToolsStructs,
// IDEIntf
ProjectIntf, MacroIntf, IDEExternToolIntf, LazIDEIntf, IDEDialogs,
PackageIntf,
// IDE
Project, PackageSystem, ExtToolEditDlg, IDEProcs, EnvironmentOpts,
LazarusIDEStrConsts, PackageDefs, CompilerOptions, TransferMacros, LazConf;
@ -382,7 +383,7 @@ begin
if FirstDependency=nil then exit(mrOK);
try
// get used packages
PackageGraph.GetAllRequiredPackages(FirstDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,PkgList,[pirSkipDesignTimeOnly]);
if PkgList=nil then exit(mrOk);
// get search path

View File

@ -1132,7 +1132,7 @@ procedure TCodeBrowserView.WorkGatherPackages;
begin
List:=nil;
try
PackageGraph.GetAllRequiredPackages(FirstDependency,List);
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,List);
if (List=nil) then exit;
for i:=0 to List.Count-1 do begin
if TObject(List[i]) is TLazPackage then

View File

@ -751,7 +751,8 @@ begin
// search in all sub packages
PkgList:=nil;
try
PackageGraph.GetAllRequiredPackages(Pkg.FirstRequiredDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,Pkg.FirstRequiredDependency,
PkgList);
if PkgList<>nil then begin
for i:=0 to PkgList.Count-1 do begin
SubPkg:=TLazPackage(PkgList[i]);

View File

@ -344,7 +344,7 @@ function TIDEInfoNeedBuildDlg.GetTargets(Target: string): TFPList;
begin
Result:=nil;
if Main=nil then exit;
PackageGraph.GetAllRequiredPackages(FirstDependency,Result);
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,Result);
if Result<>nil then begin
// PackageGraph.GetAllRequiredPackages starts with the inner nodes
// => reverse order

View File

@ -222,7 +222,7 @@ begin
Add(AProject.CompilerOptions);
PkgList:=nil;
try
PackageGraph.GetAllRequiredPackages(AProject.FirstRequiredDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,AProject.FirstRequiredDependency,PkgList);
if PkgList<>nil then begin
for i:=0 to PkgList.Count-1 do begin
if TObject(PkgList[i]) is TLazPackage then begin

View File

@ -5793,7 +5793,7 @@ begin
AddPackage(APackage);
end;
// add all units of all used packages
PackageGraph.GetAllRequiredPackages(FirstDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,PkgList);
if PkgList<>nil then
for i:=0 to PkgList.Count-1 do
AddPackage(TLazPackage(PkgList[i]));

View File

@ -60,7 +60,7 @@ uses
LazarusIDEStrConsts, CompilerOptions,
TransferMacros, EditorOptions, IDEProcs, RunParamsOpts, ProjectDefs,
FileReferenceList, EditDefineTree, PackageDefs, PackageSystem, IDEOptionsIntf,
SrcEditorIntf, IDEDialogs, SynEdit;
SrcEditorIntf, IDEDialogs, PackageIntf, SynEdit;
type
TUnitInfo = class;
@ -994,7 +994,9 @@ type
procedure MoveRequiredDependencyUp(Dependency: TPkgDependency);
procedure MoveRequiredDependencyDown(Dependency: TPkgDependency);
function Requires(APackage: TLazPackage; SearchRecursively: boolean): boolean;
procedure GetAllRequiredPackages(var List: TFPList);
procedure GetAllRequiredPackages(var List: TFPList;
ReqFlags: TPkgIntfRequiredFlags = [];
MinPolicy: TPackageUpdatePolicy = low(TPackageUpdatePolicy));
procedure AddPackageDependency(const PackageName: string); override;
// unit dependencies
@ -4595,10 +4597,11 @@ begin
APackage)<>nil;
end;
procedure TProject.GetAllRequiredPackages(var List: TFPList);
procedure TProject.GetAllRequiredPackages(var List: TFPList;
ReqFlags: TPkgIntfRequiredFlags; MinPolicy: TPackageUpdatePolicy);
begin
if Assigned(OnGetAllRequiredPackages) then
OnGetAllRequiredPackages(FirstRequiredDependency,List);
OnGetAllRequiredPackages(nil,FirstRequiredDependency,List,ReqFlags,MinPolicy);
end;
procedure TProject.AddPackageDependency(const PackageName: string);

View File

@ -211,6 +211,12 @@ type
before the package is initialized and the dependencies are resolved }
);
TPkgIntfRequiredFlag = (
pirNotRecursive,
pirSkipDesignTimeOnly
);
TPkgIntfRequiredFlags = set of TPkgIntfRequiredFlag;
{ TPackageEditingInterface }
TPackageEditingInterface = class(TComponent)
@ -231,13 +237,6 @@ type
): TModalResult; virtual; abstract;
function DoSaveAllPackages(Flags: TPkgSaveFlags): TModalResult; virtual; abstract;
function IsOwnerDependingOnPkg(AnOwner: TObject; const PkgName: string;
out DependencyOwner: TObject): boolean; virtual; abstract;
function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage;
OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract; // mrOk or mrIgnore for already connected
function AddUnitDependenciesForComponentClasses(const UnitFilename: string;
ComponentClassnames: TStrings;
Quiet: boolean = false): TModalResult; virtual; abstract;
function GetOwnersOfUnit(const UnitFilename: string): TFPList; virtual; abstract;
procedure ExtendOwnerListWithUsedByOwners(OwnerList: TFPList); virtual; abstract;
function GetSourceFilesOfOwners(OwnerList: TFPList): TStrings; virtual; abstract;
@ -248,6 +247,17 @@ type
function GetPackageCount: integer; virtual; abstract;
function GetPackages(Index: integer): TIDEPackage; virtual; abstract;
function FindPackageWithName(const PkgName: string; IgnorePackage: TIDEPackage = nil): TIDEPackage; virtual; abstract;
// dependencies
function IsOwnerDependingOnPkg(AnOwner: TObject; const PkgName: string;
out DependencyOwner: TObject): boolean; virtual; abstract;
procedure GetRequiredPackages(AnOwner: TObject; PkgList: TFPList;
Flags: TPkgIntfRequiredFlags = []) virtual; abstract;
function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage;
OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract; // mrOk or mrIgnore for already connected
function AddUnitDependenciesForComponentClasses(const UnitFilename: string;
ComponentClassnames: TStrings;
Quiet: boolean = false): TModalResult; virtual; abstract;
function RedirectPackageDependency(APackage: TIDEPackage): TIDEPackage; virtual; abstract;
// package editors

View File

@ -59,10 +59,21 @@ type
TBasePackageEditor = class;
TPkgDependency = class;
TPackageUpdatePolicy = (
pupManually,
pupOnRebuildingAll,
pupAsNeeded
);
TPackageUpdatePolicies = set of TPackageUpdatePolicy;
TIteratePackagesEvent =
procedure(APackage: TLazPackageID) of object;
TGetAllRequiredPackagesEvent =
procedure(FirstDependency: TPkgDependency; out List: TFPList) of object;
procedure(APackage: TLazPackage; // if not nil then ignore FirstDependency and do not add APackage to Result
FirstDependency: TPkgDependency;
out List: TFPList;
Flags: TPkgIntfRequiredFlags = [];
MinPolicy: TPackageUpdatePolicy = low(TPackageUpdatePolicy)) of object;
TGetDependencyOwnerDescription =
procedure(Dependency: TPkgDependency; out Description: string) of object;
TGetDependencyOwnerDirectory =
@ -512,13 +523,6 @@ type
);
TLazPackageFlags = set of TLazPackageFlag;
TPackageUpdatePolicy = (
pupManually,
pupOnRebuildingAll,
pupAsNeeded
);
TPackageUpdatePolicies = set of TPackageUpdatePolicy;
const
pupAllAuto = [pupAsNeeded,pupOnRebuildingAll];
@ -746,7 +750,9 @@ type
function CreateDependencyWithOwner(NewOwner: TObject;
WithMinVersion: boolean = false): TPkgDependency;
function Requires(APackage: TLazPackage): boolean;
procedure GetAllRequiredPackages(var List: TFPList; WithSelf: boolean);
procedure GetAllRequiredPackages(var List: TFPList; WithSelf: boolean;
Flags: TPkgIntfRequiredFlags = [];
MinPolicy: TPackageUpdatePolicy = low(TPackageUpdatePolicy));
// components
function IndexOfPkgComponent(PkgComponent: TPkgComponent): integer;
function AddComponent(PkgFile: TPkgFile; const Page: string;
@ -3582,13 +3588,14 @@ begin
end;
procedure TLazPackage.GetAllRequiredPackages(var List: TFPList;
WithSelf: boolean);
WithSelf: boolean; Flags: TPkgIntfRequiredFlags;
MinPolicy: TPackageUpdatePolicy);
begin
if Assigned(OnGetAllRequiredPackages) then
OnGetAllRequiredPackages(FirstRequiredDependency,List);
OnGetAllRequiredPackages(Self,FirstRequiredDependency,List,Flags,MinPolicy);
if WithSelf then begin
if List=nil then List:=TFPList.Create;
if List.IndexOf(Self)<0 then;
if List.IndexOf(Self)<0 then
List.Insert(0,Self);
end else if List<>nil then begin
List.Remove(Self);
@ -4549,9 +4556,9 @@ begin
ANode:=Root;
while (ANode<>nil) do begin
Result:=TPkgPair(ANode.Data);
Comp:=-Result.ComparePair(Pkg1,Pkg2);
Comp:=Result.ComparePair(Pkg1,Pkg2);
if Comp=0 then exit;
if Comp<0 then begin
if Comp>0 then begin
ANode:=ANode.Left
end else begin
ANode:=ANode.Right

View File

@ -240,17 +240,23 @@ type
function PackageIsNeeded(APackage: TLazPackage): boolean;
function PackageNameExists(const PkgName: string;
IgnorePackage: TLazPackage): boolean;
procedure GetAllRequiredPackages(FirstDependency: TPkgDependency;
out List: TFPList); // for single search use FindDependencyRecursively
procedure GetConnectionsTree(FirstDependency: TPkgDependency;
var PkgList: TFPList; var Tree: TPkgPairTree);
function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion): TFPList;
procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList); // returns list of new filename and TLazPackage
procedure GetAllRequiredPackages(APackage: TLazPackage; // if not nil then ignore FirstDependency and do not add APackage to Result
FirstDependency: TPkgDependency;
out List: TFPList;
Flags: TPkgIntfRequiredFlags = [];
MinPolicy: TPackageUpdatePolicy = low(TPackageUpdatePolicy)
); // for single search use FindDependencyRecursively
function GetAutoCompilationOrder(APackage: TLazPackage;
FirstDependency: TPkgDependency;
SkipDesignTimePackages: boolean;
Policy: TPackageUpdatePolicy): TFPList;
function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion): TFPList;
procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList); // returns list of new filename and TLazPackage
procedure CalculateTopologicalLevels;
procedure SortDependencyListTopologically(
var FirstDependency: TPkgDependency; TopLevelFirst: boolean);
@ -1749,7 +1755,7 @@ begin
Result:='';
// get all required packages
PkgList:=nil;
GetAllRequiredPackages(FirstDependency,PkgList);
GetAllRequiredPackages(nil,FirstDependency,PkgList);
if PkgList=nil then exit;
// get all usage options
AddOptionsList:=GetUsageOptionsList(PkgList);
@ -1785,7 +1791,7 @@ begin
// create auto install package list for the Lazarus uses section
PkgList:=nil;
try
GetAllRequiredPackages(FirstAutoInstallDependency,PkgList);
GetAllRequiredPackages(nil,FirstAutoInstallDependency,PkgList);
StaticPackagesInc:='';
if PkgList<>nil then begin
for i:=0 to PkgList.Count-1 do begin
@ -5265,28 +5271,36 @@ begin
end;
end;
procedure TLazPackageGraph.GetAllRequiredPackages(
FirstDependency: TPkgDependency; out List: TFPList);
procedure TLazPackageGraph.GetAllRequiredPackages(APackage: TLazPackage;
FirstDependency: TPkgDependency; out List: TFPList;
Flags: TPkgIntfRequiredFlags; MinPolicy: TPackageUpdatePolicy);
// returns packages in topological order, beginning with the top level package
procedure GetTopologicalOrder(CurDependency: TPkgDependency);
var
RequiredPackage: TLazPackage;
Dependency: TPkgDependency;
begin
while CurDependency<>nil do begin
//debugln('TLazPackageGraph.GetAllRequiredPackages A ',CurDependency.AsString,' ',dbgs(ord(CurDependency.LoadPackageResult)),' ',dbgs(ord(lprSuccess)));
if CurDependency.LoadPackageResult=lprSuccess then begin
//debugln('TLazPackageGraph.GetAllRequiredPackages B ',CurDependency.AsString);
RequiredPackage:=CurDependency.RequiredPackage;
if (not (lpfVisited in RequiredPackage.Flags)) then begin
RequiredPackage.Flags:=RequiredPackage.Flags+[lpfVisited];
GetTopologicalOrder(RequiredPackage.FirstRequiredDependency);
// add package to list
if List=nil then List:=TFPList.Create;
List.Add(RequiredPackage);
end;
end;
Dependency:=CurDependency;
CurDependency:=CurDependency.NextRequiresDependency;
//debugln('TLazPackageGraph.GetAllRequiredPackages A ',Dependency.AsString,' ',dbgs(ord(Dependency.LoadPackageResult)),' ',dbgs(ord(lprSuccess)));
if Dependency.LoadPackageResult<>lprSuccess then continue;
//debugln('TLazPackageGraph.GetAllRequiredPackages B ',Dependency.AsString);
RequiredPackage:=Dependency.RequiredPackage;
if (lpfVisited in RequiredPackage.Flags) then
continue; // already visited
RequiredPackage.Flags:=RequiredPackage.Flags+[lpfVisited];
if ord(RequiredPackage.AutoUpdate)<ord(MinPolicy) then
continue; // skip manually updated packages
if (pirSkipDesignTimeOnly in Flags)
and (RequiredPackage.PackageType=lptDesignTime) then
continue; // skip designtime (only) packages
if not (pirNotRecursive in Flags) then
GetTopologicalOrder(RequiredPackage.FirstRequiredDependency);
// add package to list
if List=nil then List:=TFPList.Create;
List.Add(RequiredPackage);
end;
end;
@ -5361,7 +5375,7 @@ var
Pkg: TLazPackage;
begin
if Tree<>nil then Tree.FreeAndClear;
GetAllRequiredPackages(FirstDependency,PkgList);
GetAllRequiredPackages(nil,FirstDependency,PkgList);
if PkgList=nil then exit;
AddConnections(FirstDependency);
for i:=0 to PkgList.Count-1 do begin

View File

@ -219,10 +219,6 @@ type
Flags: TPkgIntfOwnerSearchFlags): TFPList; override;
function GetPackageOfCurrentSourceEditor(out APackage: TIDEPackage): TPkgFile;
function GetPackageOfSourceEditor(out APackage: TIDEPackage; ASrcEdit: TObject): TLazPackageFile; override;
function IsOwnerDependingOnPkg(AnOwner: TObject; const PkgName: string;
out DependencyOwner: TObject): boolean; override;
function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage;
OnlyTestIfPossible: boolean = false): TModalResult; override;
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
function FindVirtualUnitSource(PkgFile: TPkgFile): string;
function SearchFile(const AFilename: string;
@ -230,8 +226,6 @@ type
InObject: TObject): TPkgFile; override;
function SearchUnitInDesigntimePackages(const AnUnitName: string;
InObject: TObject): TPkgFile; override;
function AddDependencyToUnitOwners(const OwnedFilename,
RequiredUnitname: string): TModalResult; override;
procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList); override;
function RevertPackages(APackageList: TStringList): TModalResult; override;
@ -245,6 +239,14 @@ type
function GetPackageCount: integer; override;
function GetPackages(Index: integer): TIDEPackage; override;
function FindPackageWithName(const PkgName: string; IgnorePackage: TIDEPackage = nil): TIDEPackage; override;
function IsOwnerDependingOnPkg(AnOwner: TObject; const PkgName: string;
out DependencyOwner: TObject): boolean; override;
procedure GetRequiredPackages(AnOwner: TObject; PkgList: TFPList;
Flags: TPkgIntfRequiredFlags = []) override;
function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage;
OnlyTestIfPossible: boolean = false): TModalResult; override;
function AddDependencyToUnitOwners(const OwnedFilename,
RequiredUnitname: string): TModalResult; override;
function RedirectPackageDependency(APackage: TIDEPackage): TIDEPackage; override;
// project
@ -1740,7 +1742,8 @@ var
i: Integer;
begin
PkgList:=nil;
PackageGraph.GetAllRequiredPackages(PackageGraph.FirstAutoInstallDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,
PackageGraph.FirstAutoInstallDependency,PkgList);
if PkgList=nil then exit;
for i:=0 to PkgList.Count-1 do
if TObject(PkgList[i]) is TLazPackage then
@ -2716,7 +2719,8 @@ begin
exit;
end;
PkgList:=nil;
PackageGraph.GetAllRequiredPackages(Project1.FirstRequiredDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,Project1.FirstRequiredDependency,
PkgList);
if PkgList=nil then exit;
try
for i:=0 to PkgList.Count-1 do begin
@ -3265,6 +3269,22 @@ begin
Result:=true;
end;
procedure TPkgManager.GetRequiredPackages(AnOwner: TObject; PkgList: TFPList;
Flags: TPkgIntfRequiredFlags);
var
Dependency: TPkgDependency;
begin
Dependency:=nil;
if AnOwner is TProject then
Dependency:=TProject(AnOwner).FirstRequiredDependency
else if AnOwner is TLazPackage then
Dependency:=TLazPackage(AnOwner).FirstRequiredDependency
else if AnOwner=PkgBoss then
Dependency:=PackageGraph.FirstAutoInstallDependency;
if Dependency=nil then exit;
PackageGraph.GetAllRequiredPackages(nil,Dependency,PkgList,Flags);
end;
function TPkgManager.AddDependencyToOwners(OwnerList: TFPList;
APackage: TIDEPackage; OnlyTestIfPossible: boolean): TModalResult;
var
@ -3995,7 +4015,7 @@ begin
ADependency:=NextDependency;
end;
PackageGraph.GetAllRequiredPackages(NewFirstAutoInstallDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,NewFirstAutoInstallDependency,PkgList);
// try save all modified packages
for i:=0 to PkgList.Count-1 do begin
@ -4134,7 +4154,7 @@ begin
// get all required packages
//debugln('TPkgManager.MainIDEitmPkgEditInstallPkgsClick GetAllRequiredPackages for ',DependencyListAsString(NewFirstAutoInstallDependency,pdlRequires));
if LoadDependencyList(NewFirstAutoInstallDependency,false)<>mrOk then exit(mrCancel);
PackageGraph.GetAllRequiredPackages(NewFirstAutoInstallDependency,PkgList);
PackageGraph.GetAllRequiredPackages(nil,NewFirstAutoInstallDependency,PkgList);
// mark packages for installation
//debugln('TPkgManager.MainIDEitmPkgEditInstallPkgsClick mark packages for installation');