IDE: package links: remove old links to same lpk files, fixed using the recently used lpk of two packages with same name

git-svn-id: branches/fixes_1_4@47648 -
This commit is contained in:
mattias 2015-02-07 13:49:34 +00:00
parent c1fb58d3d5
commit 5bc33bf3f1

View File

@ -238,13 +238,19 @@ begin
end;
end;
function CompareLinksForFilename(Data1, Data2: Pointer): integer;
var
Link1: TPackageLink absolute Data1;
Link2: TPackageLink absolute Data2;
begin
Result:=CompareFilenames(Link1.LPKFilename,Link2.LPKFilename);
end;
function CompareLinksForFilenameAndFileAge(Data1, Data2: Pointer): integer;
var
Link1: TPackageLink;
Link2: TPackageLink;
Link1: TPackageLink absolute Data1;
Link2: TPackageLink absolute Data2;
begin
Link1:=TPackageLink(Data1);
Link2:=TPackageLink(Data2);
// first compare filenames
Result:=CompareFilenames(Link1.LPKFilename,Link2.LPKFilename);
if Result<>0 then exit;
@ -549,6 +555,8 @@ var
NewPkgLink: TPackageLink;
ItemPath: String;
FileVersion: LongInt;
OtherNode: TAvgLvlTreeNode;
OtherLink: TPackageLink;
begin
if fUpdateLock>0 then begin
Include(FStates,plsUserLinksNeedUpdate);
@ -611,11 +619,30 @@ begin
then
NewPkgLink.FLastUsed := 0;
if NewPkgLink.MakeSense then begin
FUserLinksSortID.Add(NewPkgLink);
FUserLinksSortFile.Add(NewPkgLink);
end else
if not NewPkgLink.MakeSense then begin
debugln(['Warning: TPackageLinks.UpdateUserLinks invalid link: ',NewPkgLink.IDAsString]);
NewPkgLink.Release;
continue;
end;
OtherNode:=FUserLinksSortFile.FindKey(NewPkgLink,@CompareLinksForFilename);
if OtherNode<>nil then begin
// a link to the same file
OtherLink:=TPackageLink(OtherNode.Data);
debugln(['Warning: TPackageLinks.UpdateUserLinks two links for file: ',NewPkgLink.LPKFilename,' A=',OtherLink.IDAsString,' B=',NewPkgLink.IDAsString]);
if OtherLink.LastUsed<NewPkgLink.LastUsed then begin
debugln(['Warning: TPackageLinks.UpdateUserLinks removing older link ',OtherLink.IDAsString]);
FUserLinksSortID.Delete(OtherNode);
FUserLinksSortFile.Delete(OtherNode);
OtherLink.Release;
end else begin
debugln(['Warning: TPackageLinks.UpdateUserLinks ignoring older link ',NewPkgLink.IDAsString]);
NewPkgLink.Release;
continue;
end;
end;
FUserLinksSortID.Add(NewPkgLink);
FUserLinksSortFile.Add(NewPkgLink);
end;
XMLConfig.Modified:=false;
XMLConfig.Free;
@ -801,7 +828,8 @@ begin
else begin
// there are two packages fitting
if ((Link.LastUsed>Result.LastUsed)
or (Link.Version.Compare(Result.Version)>0))
or ((Abs(Link.LastUsed-Result.LastUsed)<1/86400)
and (Link.Version.Compare(Result.Version)>0)))
and FileExistsCached(Link.GetEffectiveFilename) then
Result:=Link; // this one is better
end;
@ -819,26 +847,51 @@ function TPackageLinks.FindLinkWithDependencyInTree(LinkTree: TAvgLvlTree;
var
Link: TPackageLink;
CurNode: TAvgLvlTreeNode;
{$IFDEF VerbosePkgLinkSameName}
Node1: TAvgLvlTreeNode;
{$ENDIF}
begin
Result:=nil;
if (Dependency=nil) or (not Dependency.MakeSense) then begin
DebugLn(['TPackageLinks.FindLinkWithDependencyInTree Dependency makes no sense']);
exit;
end;
if CompareText(Dependency.PackageName,'tstver')=0 then
debugln(['TPackageLinks.FindLinkWithDependencyInTree AAA1 ',Dependency.AsString(true)]);
// if there are several fitting the description, use the last used
// and highest version
CurNode:=FindLeftMostNode(LinkTree,Dependency.PackageName);
{$IFDEF VerbosePkgLinkSameName}
if CompareText(Dependency.PackageName,'tstver')=0 then begin
Node1:=CurNode.Precessor;
if Node1<>nil then
debugln(['TPackageLinks.FindLinkWithDependencyInTree Precessor=',TPackageLink(Node1.Data).IDAsString]);
Node1:=CurNode.Successor;
if Node1<>nil then
debugln(['TPackageLinks.FindLinkWithDependencyInTree Successor=',TPackageLink(Node1.Data).IDAsString]);
end;
{$ENDIF}
while CurNode<>nil do begin
Link:=TPackageLink(CurNode.Data);
{$IFDEF VerbosePkgLinkSameName}
if CompareText(Dependency.PackageName,'tstver')=0 then
debugln(['TPackageLinks.FindLinkWithDependencyInTree Link=',Link.IDAsString]);
{$ENDIF}
if Dependency.IsCompatible(Link.Version)
and ((IgnoreFiles=nil) or (not IgnoreFiles.Contains(Link.GetEffectiveFilename)))
then begin
if Result=nil then
Result:=Link
else begin
{$IFDEF VerbosePkgLinkSameName}
if CompareText(Dependency.PackageName,'tstver')=0 then
debugln(['TPackageLinks.FindLinkWithDependencyInTree Link=',Link.IDAsString,' LastUsed=',DateTimeToStr(Link.LastUsed),' Result=',Result.IDAsString,' LastUsed=',DateTimeToStr(Result.LastUsed)]);
{$ENDIF}
// there are two packages fitting
if ((Link.LastUsed>Result.LastUsed)
or (Link.Version.Compare(Result.Version)>0))
or ((Abs(Link.LastUsed-Result.LastUsed)<1/86400)
and (Link.Version.Compare(Result.Version)>0)))
and FileExistsCached(Link.GetEffectiveFilename) then
Result:=Link; // this one is better
end;