IDE: fixed crash when mapping old lpl files to new lpl files, bug #29127

git-svn-id: trunk@50563 -
This commit is contained in:
mattias 2015-12-02 11:37:19 +00:00
parent 5da9a99e13
commit 2cc0991827

View File

@ -474,7 +474,7 @@ var
CurPkgLink, OldPkgLink, OtherPkgLink: TPackageLink; CurPkgLink, OldPkgLink, OtherPkgLink: TPackageLink;
sl: TStringListUTF8; sl: TStringListUTF8;
LPLFilename: String; LPLFilename: String;
LPKFilename: string; LPKFilename, LazDir: string;
Files: TStrings; Files: TStrings;
i: Integer; i: Integer;
OldNode, OtherNode: TAvgLvlTreeNode; OldNode, OtherNode: TAvgLvlTreeNode;
@ -498,6 +498,7 @@ begin
GlobalLinksDir:=GetGlobalLinkDirectory; GlobalLinksDir:=GetGlobalLinkDirectory;
CodeToolBoss.DirectoryCachePool.GetListing(GlobalLinksDir,Files,false); CodeToolBoss.DirectoryCachePool.GetListing(GlobalLinksDir,Files,false);
LazDir:=EnvironmentOptions.GetParsedLazarusDirectory;
for i:=0 to Files.Count-1 do begin for i:=0 to Files.Count-1 do begin
LPLFilename:=GlobalLinksDir+Files[i]; LPLFilename:=GlobalLinksDir+Files[i];
if CompareFileExt(LPLFilename,'lpl')<>0 then continue; if CompareFileExt(LPLFilename,'lpl')<>0 then continue;
@ -535,10 +536,10 @@ begin
CurPkgLink.Name:=NewPkgName; CurPkgLink.Name:=NewPkgName;
CurPkgLink.Version.Assign(PkgVersion); CurPkgLink.Version.Assign(PkgVersion);
IDEMacros.SubstituteMacros(LPKFilename); IDEMacros.SubstituteMacros(LPKFilename);
//debugln(['TPackageLinks.UpdateGlobalLinks EnvironmentOptions.LazarusDirectory=',EnvironmentOptions.LazarusDirectory]); //debugln(['TPackageLinks.UpdateGlobalLinks EnvironmentOptions.LazarusDirectory=',LazDir]);
LPKFilename:=TrimFilename(LPKFilename); LPKFilename:=TrimFilename(LPKFilename);
if (FileIsInDirectory(LPKFilename,EnvironmentOptions.GetParsedLazarusDirectory)) then if (FileIsInDirectory(LPKFilename,LazDir)) then
LPKFilename:=CreateRelativePath(LPKFilename,EnvironmentOptions.GetParsedLazarusDirectory); LPKFilename:=CreateRelativePath(LPKFilename,LazDir);
CurPkgLink.LPKFilename:=LPKFilename; CurPkgLink.LPKFilename:=LPKFilename;
//debugln('TPackageLinks.UpdateGlobalLinks PkgName="',CurPkgLink.Name,'" ', //debugln('TPackageLinks.UpdateGlobalLinks PkgName="',CurPkgLink.Name,'" ',
// ' PkgVersion=',CurPkgLink.Version.AsString, // ' PkgVersion=',CurPkgLink.Version.AsString,
@ -550,7 +551,7 @@ begin
// keep LastUsed date for global link // keep LastUsed date for global link
OldPkgLink:=TPackageLink(OldNode.Data); OldPkgLink:=TPackageLink(OldNode.Data);
CurPkgLink.LastUsed:=OldPkgLink.LastUsed; CurPkgLink.LastUsed:=OldPkgLink.LastUsed;
UnmappedGlobalLinks.Remove(OldPkgLink); UnmappedGlobalLinks.Delete(OldNode);
MappedGlobalLinks.Add(OldPkgLink); MappedGlobalLinks.Add(OldPkgLink);
//if CompareText(OldPkgLink.Name,'lclbase')=0 then //if CompareText(OldPkgLink.Name,'lclbase')=0 then
// debugln(['TPackageLinks.UpdateGlobalLinks keeping LastUsed of '+OldPkgLink.Name,' ',DateToCfgStr(OldPkgLink.LastUsed,DateTimeAsCfgStrFormat)]); // debugln(['TPackageLinks.UpdateGlobalLinks keeping LastUsed of '+OldPkgLink.Name,' ',DateToCfgStr(OldPkgLink.LastUsed,DateTimeAsCfgStrFormat)]);
@ -582,9 +583,10 @@ begin
if CompareText(OtherPkgLink.Name,OldPkgLink.Name)<>0 then break; if CompareText(OtherPkgLink.Name,OldPkgLink.Name)<>0 then break;
OtherNode:=FGlobalLinks.FindSuccessor(OtherNode); OtherNode:=FGlobalLinks.FindSuccessor(OtherNode);
if MappedGlobalLinks.Find(OtherPkgLink)<>nil then continue; if MappedGlobalLinks.Find(OtherPkgLink)<>nil then continue;
// found a new lpl without an old lpl // found a new lpl for the old lpl
MappedGlobalLinks.Remove(OldPkgLink); if not UnmappedGlobalLinks.Remove(OldPkgLink) then
UnmappedGlobalLinks.Add(OldPkgLink); debugln(['TPackageLinks.UpdateGlobalLinks inconsistency UnmappedGlobalLinks.Remove']);
MappedGlobalLinks.Add(OldPkgLink);
if OtherPkgLink.LastUsed<OldPkgLink.LastUsed then begin if OtherPkgLink.LastUsed<OldPkgLink.LastUsed then begin
debugln(['Hint: (lazarus) [TPackageLinks.UpdateGlobalLinks] using LastUsed date of '+OldPkgLink.IDAsString+' for new '+OtherPkgLink.IDAsString+' in '+OtherPkgLink.LPKFilename]); debugln(['Hint: (lazarus) [TPackageLinks.UpdateGlobalLinks] using LastUsed date of '+OldPkgLink.IDAsString+' for new '+OtherPkgLink.IDAsString+' in '+OtherPkgLink.LPKFilename]);
OtherPkgLink.LastUsed:=OldPkgLink.LastUsed; OtherPkgLink.LastUsed:=OldPkgLink.LastUsed;