IDE: change lazarus dir, fixed reloading lpl, reload lpk in topological order

git-svn-id: trunk@33183 -
This commit is contained in:
mattias 2011-10-30 18:17:19 +00:00
parent c3252ee544
commit ba97db223f
8 changed files with 158 additions and 102 deletions

View File

@ -249,7 +249,7 @@ begin
if OwnerComboBox.Text=lisEdtDefCurrentProject then
CurOwner:=Project1
else
CurOwner:=PackageGraph.FindAPackageWithName(OwnerComboBox.Text,nil);
CurOwner:=PackageGraph.FindPackageWithName(OwnerComboBox.Text,nil);
if CurOwner=nil then begin
DebugLn(['TChgEncodingDialog.UpdatePreview package not found: ',OwnerComboBox.Text]);
exit;

View File

@ -1551,7 +1551,7 @@ begin
end;
// search package in graph
PkgName:=ExtractFileNameOnly(fLazPFilename);
LazPackage:=PackageGraph.FindAPackageWithName(PkgName,nil);
LazPackage:=PackageGraph.FindPackageWithName(PkgName,nil);
if LazPackage<>nil then begin
// there is already a package loaded with this name ...
if CompareFilenames(LazPackage.Filename,fLazPFilename)<>0 then begin

View File

@ -586,7 +586,7 @@ begin
// nothing
end else begin
// package
APackage:=PackageGraph.FindAPackageWithName(UnitList.Owner,nil);
APackage:=PackageGraph.FindPackageWithName(UnitList.Owner,nil);
if APackage<>nil then begin
// check if package can be added to project
if Project1.FindDependencyByName(APackage.Name)=nil then begin
@ -969,7 +969,7 @@ begin
exit;
end else begin
// package
APackage:=PackageGraph.FindAPackageWithName(SelectedUnit.UnitList.Owner,nil);
APackage:=PackageGraph.FindPackageWithName(SelectedUnit.UnitList.Owner,nil);
if APackage=nil then begin
DebugLn(['TCodeBrowserView.UseUnitInSrcEditor package not '
+'found: ', SelectedUnit.UnitList.Owner]);
@ -1159,7 +1159,7 @@ begin
end else if Options.Scope=ProjectDescription then begin
RootOwner:=CodeBrowserProjectName;
end else begin
APackage:=PackageGraph.FindAPackageWithName(Options.Scope,nil);
APackage:=PackageGraph.FindPackageWithName(Options.Scope,nil);
if APackage<>nil then
RootOwner:=APackage.Name;
end;
@ -1176,7 +1176,7 @@ begin
then begin
AddPackages(Project1.FirstRequiredDependency);
end else if FWorkingParserRoot.Owner<>'' then begin
APackage:=PackageGraph.FindAPackageWithName(FWorkingParserRoot.Owner,nil);
APackage:=PackageGraph.FindPackageWithName(FWorkingParserRoot.Owner,nil);
if APackage<>nil then
AddPackages(APackage.FirstRequiredDependency);
end;
@ -1536,7 +1536,7 @@ begin
end else if List.Owner=CodeBrowserProjectName then begin
AddFilesOfProject(Project1);
end else begin
APackage:=PackageGraph.FindAPackageWithName(List.Owner,nil);
APackage:=PackageGraph.FindPackageWithName(List.Owner,nil);
AddFilesOfPackage(APackage);
end;
@ -2638,7 +2638,7 @@ begin
if Node=nil then exit;
if not (Node is TCodeBrowserUnitList) then exit;
UnitList:=TCodeBrowserUnitList(Node);
Result:=PackageGraph.FindAPackageWithName(UnitList.Owner,nil);
Result:=PackageGraph.FindPackageWithName(UnitList.Owner,nil);
end;
function TCodeBrowserView.GetCurUnitInSrcEditor(out FileOwner: TObject; out
@ -2713,7 +2713,7 @@ begin
// nothing
end else begin
// open package
APackage:=PackageGraph.FindAPackageWithName(List.Owner,nil);
APackage:=PackageGraph.FindPackageWithName(List.Owner,nil);
if APackage<>nil then begin
PackageEditingInterface.DoOpenPackageWithName(List.Owner,[],false);
end;

View File

@ -1743,7 +1743,7 @@ begin
exit;
end;
// check package
Result:=PackageGraph.FindAPackageWithName(Modulename,nil);
Result:=PackageGraph.FindPackageWithName(Modulename,nil);
if Result<>nil then exit;
// check IDE as project
if SysUtils.CompareText(IDEProjectName,Modulename)=0 then begin
@ -1816,7 +1816,7 @@ begin
// check the packagename in the fpdoc file
PkgName:=FPDocFile.GetPackageName;
if PkgName<>'' then begin
Pkg:=PackageGraph.FindAPackageWithName(PkgName,nil);
Pkg:=PackageGraph.FindPackageWithName(PkgName,nil);
if InPackage(Pkg) then exit;
end;
@ -2061,7 +2061,7 @@ begin
PkgName:=copy(Path,2,p-2);
//DebugLn(['TCodeHelpManager.GetLinkedFPDocNode PkgName=',PkgName]);
if PkgName='' then exit;
Pkg:=PackageGraph.FindAPackageWithName(PkgName,nil);
Pkg:=PackageGraph.FindPackageWithName(PkgName,nil);
if Pkg=nil then exit;
InvalidPath:=p;
ModuleOwner:=Pkg;

View File

@ -407,7 +407,7 @@ begin
sl:=TStringList.Create;
for i:=0 to FNewInstalledPackages.Count-1 do begin
NewPackageID:=TLazPackageID(FNewInstalledPackages[i]);
APackage:=PackageGraph.FindAPackageWithName(NewPackageID.Name,nil);
APackage:=PackageGraph.FindPackageWithName(NewPackageID.Name,nil);
if APackage<>nil then
NewPackageID:=APackage;
s:=NewPackageID.IDAsString;

View File

@ -158,6 +158,7 @@ type
procedure RemoveOldUserLinks;
procedure BeginUpdate;
procedure EndUpdate;
function IsUpdating: boolean;
procedure SaveUserLinks;
function NeedSaveUserLinks(const ConfigFilename: string): boolean;
procedure WriteLinkTree(LinkTree: TAVLTree);
@ -425,7 +426,6 @@ begin
FGlobalLinks.FreeAndClear;
GlobalLinksDir:=GetGlobalLinkDirectory;
//debugln('UpdateGlobalLinks A ',GlobalLinksDir);
if FindFirstUTF8(GlobalLinksDir+'*.lpl', faAnyFile, FileInfo)=0 then begin
PkgVersion:=TPkgVersion.Create;
repeat
@ -453,13 +453,15 @@ begin
end;
sl.Free;
if NewFilename='' then continue;
//debugln(['TPackageLinks.UpdateGlobalLinks NewFilename="',NewFilename,'"']);
NewPkgLink:=TPackageLink.Create;
NewPkgLink.Reference;
NewPkgLink.Origin:=ploGlobal;
NewPkgLink.Name:=NewPkgName;
NewPkgLink.Version.Assign(PkgVersion);
IDEMacros.SubstituteMacros(NewFilename);
//debugln(['TPackageLinks.UpdateGlobalLinks EnvironmentOptions.LazarusDirectory=',EnvironmentOptions.LazarusDirectory]);
NewFilename:=TrimFilename(NewFilename);
if (EnvironmentOptions.LazarusDirectory<>'')
and (FileIsInDirectory(NewFilename,EnvironmentOptions.LazarusDirectory)) then
@ -622,6 +624,11 @@ begin
if (plsUserLinksNeedUpdate in FStates) then UpdateUserLinks;
end;
function TPackageLinks.IsUpdating: boolean;
begin
Result:=fUpdateLock>0;
end;
procedure TPackageLinks.SaveUserLinks;
var
ConfigFilename: String;
@ -850,34 +857,37 @@ var
NewLink: TPackageLink;
begin
BeginUpdate;
// check if link already exists
OldLink:=FindLinkWithPackageID(APackage);
if (OldLink<>nil) then begin
// link exists -> check if it is already the right value
if (OldLink.Compare(APackage)=0)
and (OldLink.GetEffectiveFilename=APackage.Filename) then begin
Result:=OldLink;
Result.LastUsed:=Now;
exit;
try
// check if link already exists
OldLink:=FindLinkWithPackageID(APackage);
if (OldLink<>nil) then begin
// link exists -> check if it is already the right value
if (OldLink.Compare(APackage)=0)
and (OldLink.GetEffectiveFilename=APackage.Filename) then begin
Result:=OldLink;
Result.LastUsed:=Now;
exit;
end;
RemoveLink(APackage);
end;
RemoveLink(APackage);
// add user link
NewLink:=TPackageLink.Create;
NewLink.Reference;
NewLink.AssignID(APackage);
NewLink.Filename:=APackage.Filename;
if NewLink.MakeSense then begin
FUserLinksSortID.Add(NewLink);
FUserLinksSortFile.Add(NewLink);
Modified:=true;
end else begin
NewLink.Release;
NewLink:=nil;
end;
Result:=NewLink;
Result.LastUsed:=Now;
finally
EndUpdate;
end;
// add user link
NewLink:=TPackageLink.Create;
NewLink.Reference;
NewLink.AssignID(APackage);
NewLink.Filename:=APackage.Filename;
if NewLink.MakeSense then begin
FUserLinksSortID.Add(NewLink);
FUserLinksSortFile.Add(NewLink);
Modified:=true;
end else begin
NewLink.Release;
NewLink:=nil;
end;
EndUpdate;
Result:=NewLink;
Result.LastUsed:=Now;
end;
function TPackageLinks.AddUserLink(const PkgFilename, PkgName: string
@ -888,9 +898,9 @@ var
LPK: TXMLConfig;
PkgVersion: TPkgVersion;
begin
BeginUpdate;
PkgVersion:=TPkgVersion.Create;
LPK:=nil;
BeginUpdate;
try
// load version
LPK:=LoadXMLConfigViaCodeBuffer(PkgFilename);
@ -924,11 +934,11 @@ begin
NewLink.Release;
NewLink:=nil;
end;
EndUpdate;
Result:=NewLink;
if Result<>nil then
Result.LastUsed:=Now;
finally
EndUpdate;
PkgVersion.Free;
LPK.Free;
end;
@ -940,27 +950,29 @@ var
OldLink: TPackageLink;
begin
BeginUpdate;
// remove from user links
ANode:=FUserLinksSortID.FindKey(APackageID,@ComparePackageIDAndLink);
if ANode<>nil then begin
OldLink:=TPackageLink(ANode.Data);
FUserLinksSortID.Delete(ANode);
FUserLinksSortFile.RemovePointer(OldLink);
OldLink.Release;
Modified:=true;
try
// remove from user links
ANode:=FUserLinksSortID.FindKey(APackageID,@ComparePackageIDAndLink);
if ANode<>nil then begin
OldLink:=TPackageLink(ANode.Data);
FUserLinksSortID.Delete(ANode);
FUserLinksSortFile.RemovePointer(OldLink);
OldLink.Release;
Modified:=true;
end;
// remove from global links
ANode:=FGlobalLinks.FindKey(APackageID,@ComparePackageIDAndLink);
if ANode<>nil then begin
OldLink:=TPackageLink(ANode.Data);
FGlobalLinks.Delete(ANode);
OldLink.Release;
Modified:=true;
end;
finally
EndUpdate;
end;
// remove from global links
ANode:=FGlobalLinks.FindKey(APackageID,@ComparePackageIDAndLink);
if ANode<>nil then begin
OldLink:=TPackageLink(ANode.Data);
FGlobalLinks.Delete(ANode);
OldLink.Release;
Modified:=true;
end;
EndUpdate;
end;
initialization
PkgLinks:=nil;

View File

@ -195,8 +195,6 @@ type
function CreateUniqueUnitName(const Prefix: string): string;
function DependencyExists(Dependency: TPkgDependency;
Flags: TFindPackageFlags): boolean;
function FindAPackageWithName(const PkgName: string;
IgnorePackage: TLazPackage): TLazPackage;
function FindBrokenDependencyPath(APackage: TLazPackage;
FirstDependency: TPkgDependency): TFPList;
function FindAllBrokenDependencies(APackage: TLazPackage;
@ -230,6 +228,8 @@ type
Flags: TFindPackageFlags): TAVLTreeNode;
function FindOpenPackage(Dependency: TPkgDependency;
Flags: TFindPackageFlags): TLazPackage;
function FindPackageWithName(const PkgName: string;
IgnorePackage: TLazPackage): TLazPackage;
function FindPackageWithFilename(const TheFilename: string): TLazPackage;
function FindPackageWithID(PkgID: TLazPackageID): TLazPackage;
function FindPackageWithIDMask(PkgIDMask: TLazPackageID): TLazPackage;
@ -600,7 +600,7 @@ begin
Result:=mrOk;
Dependency.RequiredPackage:=NewPackage;
Dependency.LoadPackageResult:=lprSuccess;
OldPackage:=FindAPackageWithName(NewPackage.Name,NewPackage);
OldPackage:=FindPackageWithName(NewPackage.Name,NewPackage);
if OldPackage=nil then
AddPackage(NewPackage)
else
@ -963,7 +963,7 @@ begin
Result:=nil;
end;
function TLazPackageGraph.FindAPackageWithName(const PkgName: string;
function TLazPackageGraph.FindPackageWithName(const PkgName: string;
IgnorePackage: TLazPackage): TLazPackage;
var
ANode: TAVLTreeNode;
@ -1251,7 +1251,7 @@ function TLazPackageGraph.DependencyExists(Dependency: TPkgDependency;
begin
Result:=true;
if FindNodeOfDependency(Dependency,Flags)<>nil then exit;
if FindAPackageWithName(Dependency.PackageName,nil)=nil then begin
if FindPackageWithName(Dependency.PackageName,nil)=nil then begin
// no package with same name open
// -> try package links
if fpfSearchInPkgLinks in Flags then
@ -4941,7 +4941,7 @@ begin
// no compatible package yet open
Dependency.RequiredPackage:=nil;
Dependency.LoadPackageResult:=lprNotFound;
APackage:=FindAPackageWithName(Dependency.PackageName,nil);
APackage:=FindPackageWithName(Dependency.PackageName,nil);
if APackage=nil then begin
// no package with same name open
// -> try package links

View File

@ -48,7 +48,7 @@ uses
contnrs, InterfaceBase, StringHashList, Translations, LResources,
// codetools
CodeToolsCfgScript, CodeToolsConfig, CodeToolManager, CodeCache,
BasicCodeTools, FileProcs, Laz_XMLCfg,
CodeToolsStructs, BasicCodeTools, FileProcs, Laz_XMLCfg,
// IDE Interface
SrcEditorIntf, NewItemIntf, ProjectIntf, PackageIntf, CompOptsIntf,
MenuIntf, IDEWindowIntf, PropEdits, MacroIntf, LazIDEIntf,
@ -545,7 +545,7 @@ begin
finally
NewDependency.Free;
end;
APackage:=PackageGraph.FindAPackageWithName(APackageName,nil);
APackage:=PackageGraph.FindPackageWithName(APackageName,nil);
if APackage=nil then exit;
AForm:=PackageEditors.OpenEditor(APackage);
end;
@ -1077,7 +1077,7 @@ begin
end;
// check package name conflict
ConflictPkg:=PackageGraph.FindAPackageWithName(NewPkgName,APackage);
ConflictPkg:=PackageGraph.FindPackageWithName(NewPkgName,APackage);
if ConflictPkg<>nil then begin
Result:=IDEMessageDialog(lisPkgMangPackageNameAlreadyExists,
Format(lisPkgMangThereIsAlreadyAnotherPackageWithTheName, ['"',
@ -1836,7 +1836,7 @@ begin
end;
// check if Package with same name is already loaded
ConflictPkg:=PackageGraph.FindAPackageWithName(APackage.Name,nil);
ConflictPkg:=PackageGraph.FindPackageWithName(APackage.Name,nil);
if ConflictPkg<>nil then begin
if not PackageGraph.PackageCanBeReplaced(ConflictPkg,APackage) then begin
Result:=IDEMessageDialog(lisPkgMangPackageConflicts,
@ -1986,7 +1986,7 @@ begin
for i:=0 to RequiredPackages.Count-1 do begin
PkgName:=Trim(RequiredPackages[i]);
if (PkgName='') or (not IsValidIdent(PkgName)) then continue;
APackage:=PackageGraph.FindAPackageWithName(PkgName,nil);
APackage:=PackageGraph.FindPackageWithName(PkgName,nil);
if APackage=nil then begin
DebugLn(['TPkgManager.AddProjectDependencies package not found: ',PkgName]);
continue;
@ -2126,7 +2126,7 @@ begin
finally
NewDependency.Free;
end;
APackage:=PackageGraph.FindAPackageWithName(APackageName,nil);
APackage:=PackageGraph.FindPackageWithName(APackageName,nil);
if APackage=nil then exit;
Result:=DoOpenPackage(APackage,Flags,ShowAbort);
end;
@ -2441,44 +2441,88 @@ const
var
NewLazarusSrcDir: String;
OldLazarusSrcDir: String;
APackage: TLazPackage;
VisitedPkgs: TStringToStringTree;
ReloadPkgs: TStringList;
function PkgInOldLazarusDir(APackage: TLazPackage): boolean;
begin
Result:=FileIsInPath(APackage.Filename,OldLazarusSrcDir)
or PackageGraph.IsStaticBasePackage(APackage.Name)
or (SysUtils.CompareText(copy(APackage.Filename,1,length(LazDirMacro)),LazDirMacro)=0)
end;
procedure GatherLazarusSrcPackages(APackage: TLazPackage);
var
ADependency: TPkgDependency;
begin
if APackage=nil then exit;
if VisitedPkgs.Contains(APackage.Name) then exit;
VisitedPkgs[APackage.Name]:='1';
// search the dependencies first
ADependency:=APackage.FirstRequiredDependency;
while ADependency<>nil do begin
GatherLazarusSrcPackages(ADependency.RequiredPackage);
ADependency:=ADependency.NextRequiresDependency;
end;
if PkgInOldLazarusDir(APackage) then begin
// this package was from the old lazarus source directory
ReloadPkgs.Add(APackage.Name);
end;
end;
function ReloadPkg(APackage: TLazPackage): boolean;
var
Link: TPackageLink;
MsgResult: TModalResult;
Filename: String;
ADependency: TPkgDependency;
begin
Result:=true;
if APackage=nil then exit;
if not PkgInOldLazarusDir(APackage) then exit;
// this package was from the old lazarus source directory
// check if there is a package in the new version
Link:=PkgLinks.FindLinkWithPkgName(APackage.Name);
if Link<>nil then begin
Filename:=TrimFilename(Link.Filename);
if not FilenameIsAbsolute(Filename) then
Filename:=AppendPathDelim(NewLazarusSrcDir)+Filename;
if FileIsInPath(Filename,NewLazarusSrcDir)
and FileExistsUTF8(Filename) then
begin
DebugLn(['TPkgManager.LazarusSrcDirChanged load: ',Filename]);
// open package in new lazarus source directory
MsgResult:=DoOpenPackageFile(Filename,[pofDoNotOpenEditor,pofRevert],true);
if MsgResult=mrAbort then exit(false);
end;
end;
end;
var
i: Integer;
Link: TPackageLink;
MsgResult: TModalResult;
Filename: String;
begin
if PackageGraph=nil then exit;
OldLazarusSrcDir:=FLastLazarusSrcDir;
NewLazarusSrcDir:=EnvironmentOptions.LazarusDirectory;
FLastLazarusSrcDir:=NewLazarusSrcDir;
if CompareFilenames(OldLazarusSrcDir,NewLazarusSrcDir)=0 then exit;
debugln(['TPkgManager.LazarusSrcDirChanged loading new lpl files from ',PkgLinks.GetGlobalLinkDirectory]);
if PkgLinks.IsUpdating then
debugln(['TPkgManager.LazarusSrcDirChanged inconsistency: pkglinks are locked']);
PkgLinks.UpdateGlobalLinks;
i:=0;
while i<PackageGraph.Count do begin
APackage:=PackageGraph.Packages[i];
if (SysUtils.CompareText(copy(APackage.Filename,1,length(LazDirMacro)),LazDirMacro)=0)
or FileIsInPath(APackage.Filename,OldLazarusSrcDir)
or (PackageGraph.IsStaticBasePackage(APackage.Name) and (not APackage.AutoCreated))
then begin
// this package was from the old lazarus source directory
// check if there is a package in the new version
Link:=PkgLinks.FindLinkWithPkgName(APackage.Name);
if Link<>nil then begin
Filename:=TrimFilename(Link.Filename);
if not FilenameIsAbsolute(Filename) then
Filename:=AppendPathDelim(NewLazarusSrcDir)+Filename;
if FileIsInPath(Filename,NewLazarusSrcDir)
and FileExistsUTF8(Filename) then
begin
DebugLn(['TPkgManager.LazarusSrcDirChanged load: ',Filename]);
// open package in new lazarus source directory
MsgResult:=DoOpenPackageFile(Filename,[pofDoNotOpenEditor,pofRevert],true);
if MsgResult=mrAbort then break;
end;
end;
end;
inc(i);
VisitedPkgs:=TStringToStringTree.Create(false);
ReloadPkgs:=TStringList.Create;
try
// collect candidates
for i:=0 to PackageGraph.Count-1 do
GatherLazarusSrcPackages(PackageGraph.Packages[i]);
// reload
for i:=0 to ReloadPkgs.Count-1 do
ReloadPkg(PackageGraph.FindPackageWithName(ReloadPkgs[i],nil));
finally
ReloadPkgs.Free;
VisitedPkgs.Free;
end;
end;