IDE: fixed updating package LastUsed date when there are several versions of a package

git-svn-id: trunk@50279 -
This commit is contained in:
mattias 2015-11-11 02:11:37 +00:00
parent 5bda0931e7
commit ac1f94688e
3 changed files with 96 additions and 40 deletions

View File

@ -140,12 +140,15 @@ type
Dependency: TPkgDependency; IgnoreFiles: TFilenameToStringTree): TPackageLink; Dependency: TPkgDependency; IgnoreFiles: TFilenameToStringTree): TPackageLink;
function FindLinkWithPackageIDInTree(LinkTree: TAvgLvlTree; function FindLinkWithPackageIDInTree(LinkTree: TAvgLvlTree;
APackageID: TLazPackageID): TPackageLink; APackageID: TLazPackageID): TPackageLink;
function FindLinkWithLPKFilenameInTree(LinkTree: TAvgLvlTree;
const PkgName, LPKFilename: string): TPackageLink;
function GetModified: boolean; function GetModified: boolean;
procedure IteratePackagesInTree(MustExist: boolean; LinkTree: TAvgLvlTree; procedure IteratePackagesInTree(MustExist: boolean; LinkTree: TAvgLvlTree;
Event: TIteratePackagesEvent); Event: TIteratePackagesEvent);
procedure SetModified(const AValue: boolean); procedure SetModified(const AValue: boolean);
procedure SetQueueSaveUserLinks(AValue: boolean); procedure SetQueueSaveUserLinks(AValue: boolean);
procedure OnAsyncSaveUserLinks({%H-}Data: PtrInt); procedure OnAsyncSaveUserLinks({%H-}Data: PtrInt);
function GetNewerLink(Link1, Link2: TPackageLink): TPackageLink;
public public
UserLinkLoadTime: longint; UserLinkLoadTime: longint;
UserLinkLoadTimeValid: boolean; UserLinkLoadTimeValid: boolean;
@ -165,12 +168,11 @@ type
function NeedSaveUserLinks(const ConfigFilename: string): boolean; function NeedSaveUserLinks(const ConfigFilename: string): boolean;
procedure WriteLinkTree(LinkTree: TAvgLvlTree); procedure WriteLinkTree(LinkTree: TAvgLvlTree);
function FindLinkWithPkgName(const PkgName: string; function FindLinkWithPkgName(const PkgName: string;
IgnoreFiles: TFilenameToStringTree = nil; IgnoreFiles: TFilenameToStringTree = nil): TPackageLink;
FirstUserLinks: boolean = true): TPackageLink;
function FindLinkWithDependency(Dependency: TPkgDependency; function FindLinkWithDependency(Dependency: TPkgDependency;
IgnoreFiles: TFilenameToStringTree = nil; IgnoreFiles: TFilenameToStringTree = nil): TPackageLink;
FirstUserLinks: boolean = true): TPackageLink;
function FindLinkWithPackageID(APackageID: TLazPackageID): TPackageLink; function FindLinkWithPackageID(APackageID: TLazPackageID): TPackageLink;
function FindLinkWithFilename(const PkgName, LPKFilename: string): TPackageLink;
procedure IteratePackages(MustExist: boolean; Event: TIteratePackagesEvent; procedure IteratePackages(MustExist: boolean; Event: TIteratePackagesEvent;
Origins: TPkgLinkOrigins = AllPkgLinkOrigins); Origins: TPkgLinkOrigins = AllPkgLinkOrigins);
function AddUserLink(APackage: TLazPackage): TPackageLink; function AddUserLink(APackage: TLazPackage): TPackageLink;
@ -337,6 +339,33 @@ begin
SaveUserLinks(true); SaveUserLinks(true);
end; end;
function TPackageLinks.GetNewerLink(Link1, Link2: TPackageLink): TPackageLink;
begin
if Link1=nil then
Result:=Link2
else if Link2=nil then
Result:=Link1
else if Link1.LastUsed>Link2.LastUsed then
Result:=Link1
else
Result:=Link2;
{DbgOut('TPackageLinks.GetNewerLink ');
if Link1<>nil then
DbgOut(' Link1=',Link1.IDAsString,'=',DateToCfgStr(Link1.LastUsed,DateTimeAsCfgStrFormat))
else
DbgOut(' Link1=nil');
if Link2<>nil then
DbgOut(' Link2=',Link2.IDAsString,'=',DateToCfgStr(Link2.LastUsed,DateTimeAsCfgStrFormat))
else
DbgOut(' Link2=nil');
if Result<>nil then
DbgOut(' Result=',Result.IDAsString,'=',DateToCfgStr(Result.LastUsed,DateTimeAsCfgStrFormat))
else
DbgOut(' Result=nil');
debugln;}
end;
function TPackageLinks.FindLeftMostNode(LinkTree: TAvgLvlTree; function TPackageLinks.FindLeftMostNode(LinkTree: TAvgLvlTree;
const PkgName: string): TAvgLvlTreeNode; const PkgName: string): TAvgLvlTreeNode;
// find left most link with PkgName // find left most link with PkgName
@ -523,6 +552,8 @@ begin
CurPkgLink.LastUsed:=OldPkgLink.LastUsed; CurPkgLink.LastUsed:=OldPkgLink.LastUsed;
UnmappedGlobalLinks.Remove(OldPkgLink); UnmappedGlobalLinks.Remove(OldPkgLink);
MappedGlobalLinks.Add(OldPkgLink); MappedGlobalLinks.Add(OldPkgLink);
//if CompareText(OldPkgLink.Name,'lclbase')=0 then
// debugln(['TPackageLinks.UpdateGlobalLinks keeping LastUsed of '+OldPkgLink.Name,' ',DateToCfgStr(OldPkgLink.LastUsed,DateTimeAsCfgStrFormat)]);
end; end;
FGlobalLinks.Add(CurPkgLink); FGlobalLinks.Add(CurPkgLink);
end else begin end else begin
@ -643,6 +674,8 @@ begin
NewPkgLink.FLastUsed,LastUsedFormat) NewPkgLink.FLastUsed,LastUsedFormat)
then then
NewPkgLink.FLastUsed := 0; NewPkgLink.FLastUsed := 0;
//if CompareText(NewPkgLink.Name,'lclbase')=0 then
// debugln(['TPackageLinks.UpdateUserLinks ',NewPkgLink.IDAsString,' ',DateToCfgStr(NewPkgLink.LastUsed,DateTimeAsCfgStrFormat)]);
if not NewPkgLink.IsMakingSense then begin if not NewPkgLink.IsMakingSense then begin
debugln(['Warning: (lazarus) TPackageLinks.UpdateUserLinks invalid link: ',NewPkgLink.IDAsString]); debugln(['Warning: (lazarus) TPackageLinks.UpdateUserLinks invalid link: ',NewPkgLink.IDAsString]);
@ -675,22 +708,23 @@ begin
// load LastUsed dates of global links // load LastUsed dates of global links
Path:='GlobalPkgLinks/'; Path:='GlobalPkgLinks/';
FileVersion:=XMLConfig.GetValue(Path+'Version',0);
LinkCount:=XMLConfig.GetValue(Path+'Count',0); LinkCount:=XMLConfig.GetValue(Path+'Count',0);
UnmappedGlobalLinks:=TAvgLvlTree.Create(@ComparePackageLinks); UnmappedGlobalLinks:=TAvgLvlTree.Create(@ComparePackageLinks);
MappedGlobalLinks:=TAvgLvlTree.Create(@ComparePackageLinks); MappedGlobalLinks:=TAvgLvlTree.Create(@ComparePackageLinks);
try try
for i:=1 to LinkCount do begin for i:=1 to LinkCount do begin
ItemPath:=Path+'Item'+IntToStr(i)+'/'; ItemPath:=Path+'Item'+IntToStr(i)+'/';
NewPkgLink:=TPackageLink.Create; // create temporary TPackageLink
if not CfgStrToDate(XMLConfig.GetValue(ItemPath+'LastUsed/Value',''), if not CfgStrToDate(XMLConfig.GetValue(ItemPath+'LastUsed/Value',''),
NewPkgLink.FLastUsed,LastUsedFormat) NewPkgLink.FLastUsed,LastUsedFormat)
then begin then begin
debugln(['Hint: (lazarus) [TPackageLinks.UpdateUserLinks] ignoring invalid entry '+ItemPath]); debugln(['Hint: (lazarus) [TPackageLinks.UpdateUserLinks] ignoring invalid entry '+ItemPath]);
NewPkgLink.Free;
continue; continue;
end; end;
NewPkgLink:=TPackageLink.Create; // create temporary TPackageLink
NewPkgLink.Name:=XMLConfig.GetValue(ItemPath+'Name/Value',''); NewPkgLink.Name:=XMLConfig.GetValue(ItemPath+'Name/Value','');
NewPkgLink.IsMakingSense;
PkgVersionLoadFromXMLConfig(NewPkgLink.Version,XMLConfig,ItemPath+'Version/', PkgVersionLoadFromXMLConfig(NewPkgLink.Version,XMLConfig,ItemPath+'Version/',
FileVersion); FileVersion);
if not IsValidPkgName(NewPkgLink.Name) then begin if not IsValidPkgName(NewPkgLink.Name) then begin
@ -698,6 +732,8 @@ begin
NewPkgLink.Free; NewPkgLink.Free;
continue; continue;
end; end;
//if CompareText(NewPkgLink.Name,'lclbase')=0 then
// debugln(['TPackageLinks.UpdateUserLinks ',NewPkgLink.IDAsString,' LastUsed=',DateToCfgStr(NewPkgLink.LastUsed,DateTimeAsCfgStrFormat)]);
OtherNode:=FGlobalLinks.Find(NewPkgLink); OtherNode:=FGlobalLinks.Find(NewPkgLink);
if OtherNode<>nil then begin if OtherNode<>nil then begin
@ -706,6 +742,8 @@ begin
MappedGlobalLinks.Add(NewPkgLink); MappedGlobalLinks.Add(NewPkgLink);
if OtherLink.LastUsed<NewPkgLink.LastUsed then if OtherLink.LastUsed<NewPkgLink.LastUsed then
OtherLink.LastUsed:=NewPkgLink.LastUsed; OtherLink.LastUsed:=NewPkgLink.LastUsed;
//if CompareText(OtherLink.Name,'lclbase')=0 then
// debugln(['TPackageLinks.UpdateUserLinks updating LastUsed of '+OtherLink.Name,' ',DateToCfgStr(OtherLink.LastUsed,DateTimeAsCfgStrFormat)]);
continue; continue;
end; end;
@ -1050,6 +1088,21 @@ begin
Result:=nil; Result:=nil;
end; end;
function TPackageLinks.FindLinkWithLPKFilenameInTree(LinkTree: TAvgLvlTree;
const PkgName, LPKFilename: string): TPackageLink;
var
CurNode: TAvgLvlTreeNode;
begin
CurNode:=FindLeftMostNode(LinkTree,PkgName);
while CurNode<>nil do begin
Result:=TPackageLink(CurNode.Data);
if CompareText(PkgName,Result.Name)<>0 then break;
if CompareFilenames(Result.GetEffectiveFilename,LPKFilename)=0 then exit;
CurNode:=LinkTree.FindSuccessor(CurNode);
end;
Result:=nil;
end;
function TPackageLinks.GetModified: boolean; function TPackageLinks.GetModified: boolean;
begin begin
Result:=FSavedChangeStamp<>FChangeStamp; Result:=FSavedChangeStamp<>FChangeStamp;
@ -1094,39 +1147,43 @@ begin
end; end;
function TPackageLinks.FindLinkWithPkgName(const PkgName: string; function TPackageLinks.FindLinkWithPkgName(const PkgName: string;
IgnoreFiles: TFilenameToStringTree; FirstUserLinks: boolean): TPackageLink; IgnoreFiles: TFilenameToStringTree): TPackageLink;
var
UserLink, GlobalLink: TPackageLink;
begin begin
Result:=nil; UserLink:=FindLinkWithPkgNameInTree(FUserLinksSortID,PkgName,IgnoreFiles);
if FirstUserLinks then GlobalLink:=FindLinkWithPkgNameInTree(FGlobalLinks,PkgName,IgnoreFiles);
Result:=FindLinkWithPkgNameInTree(FUserLinksSortID,PkgName,IgnoreFiles); Result:=GetNewerLink(UserLink,GlobalLink);
if Result=nil then
Result:=FindLinkWithPkgNameInTree(FGlobalLinks,PkgName,IgnoreFiles);
if (Result=nil) and (not FirstUserLinks) then
Result:=FindLinkWithPkgNameInTree(FUserLinksSortID,PkgName,IgnoreFiles);
end; end;
function TPackageLinks.FindLinkWithDependency(Dependency: TPkgDependency; function TPackageLinks.FindLinkWithDependency(Dependency: TPkgDependency;
IgnoreFiles: TFilenameToStringTree; FirstUserLinks: boolean): TPackageLink; IgnoreFiles: TFilenameToStringTree): TPackageLink;
var
UserLink, GlobalLink: TPackageLink;
begin begin
Result:=nil; UserLink:=FindLinkWithDependencyInTree(FUserLinksSortID,Dependency,IgnoreFiles);
if FirstUserLinks then GlobalLink:=FindLinkWithDependencyInTree(FGlobalLinks,Dependency,IgnoreFiles);
Result:=FindLinkWithDependencyInTree(FUserLinksSortID,Dependency,IgnoreFiles); Result:=GetNewerLink(UserLink,GlobalLink);
if Result=nil then
Result:=FindLinkWithDependencyInTree(FGlobalLinks,Dependency,IgnoreFiles);
if (Result=nil) and (not FirstUserLinks) then
Result:=FindLinkWithDependencyInTree(FUserLinksSortID,Dependency,IgnoreFiles);
//if Result=nil then begin
//debugln('TPackageLinks.FindLinkWithDependency A ',Dependency.AsString);
// WriteLinkTree(FGlobalLinks);
//end;
end; end;
function TPackageLinks.FindLinkWithPackageID(APackageID: TLazPackageID function TPackageLinks.FindLinkWithPackageID(APackageID: TLazPackageID
): TPackageLink; ): TPackageLink;
var
UserLink, GlobalLink: TPackageLink;
begin begin
Result:=FindLinkWithPackageIDInTree(FUserLinksSortID,APackageID); UserLink:=FindLinkWithPackageIDInTree(FUserLinksSortID,APackageID);
if Result=nil then GlobalLink:=FindLinkWithPackageIDInTree(FGlobalLinks,APackageID);
Result:=FindLinkWithPackageIDInTree(FGlobalLinks,APackageID); Result:=GetNewerLink(UserLink,GlobalLink);
end;
function TPackageLinks.FindLinkWithFilename(const PkgName, LPKFilename: string
): TPackageLink;
var
UserLink, GlobalLink: TPackageLink;
begin
UserLink:=FindLinkWithLPKFilenameInTree(FUserLinksSortID,PkgName,LPKFilename);
GlobalLink:=FindLinkWithLPKFilenameInTree(FGlobalLinks,PkgName,LPKFilename);
Result:=GetNewerLink(UserLink,GlobalLink);
end; end;
procedure TPackageLinks.IteratePackages(MustExist: boolean; procedure TPackageLinks.IteratePackages(MustExist: boolean;
@ -1196,17 +1253,16 @@ begin
PkgVersionLoadFromXMLConfig(PkgVersion,LPK); PkgVersionLoadFromXMLConfig(PkgVersion,LPK);
// check if link already exists // check if link already exists
OldLink:=FindLinkWithPkgName(PkgName); OldLink:=FindLinkWithFilename(PkgName,PkgFilename);
if (OldLink<>nil) then begin if (OldLink<>nil) then begin
// link exists // link exists
if CompareFilenames(OldLink.GetEffectiveFilename,PkgFilename)=0 then begin Result:=OldLink;
Result:=OldLink; Result.LastUsed:=Now;
Result.LastUsed:=Now; if LPK<>nil then
if LPK<>nil then Result.Version.Assign(PkgVersion);
Result.Version.Assign(PkgVersion); exit;
exit;
end;
end; end;
// add user link // add user link
NewLink:=TPackageLink.Create; NewLink:=TPackageLink.Create;
NewLink.Reference; NewLink.Reference;

View File

@ -5705,7 +5705,7 @@ begin
// nothing found via dependencies // nothing found via dependencies
// search in links // search in links
PkgLink:=PkgLinks.FindLinkWithPkgName(APackage.Name,IgnoreFiles,true); PkgLink:=PkgLinks.FindLinkWithPkgName(APackage.Name,IgnoreFiles);
if PkgLink<>nil then begin if PkgLink<>nil then begin
Result:=PkgLink.GetEffectiveFilename; Result:=PkgLink.GetEffectiveFilename;
exit; exit;

View File

@ -3296,7 +3296,7 @@ begin
Link:=PkgLinks.AddUserLink(APackage); Link:=PkgLinks.AddUserLink(APackage);
if Link<>nil then if Link<>nil then
begin begin
debugln(['Hint: (lazarus) TPkgManager.AddPackageToGraph LinkLastUsed=',DateToCfgStr(Link.LastUsed),' ',dbgs(Link.Origin)]); //debugln(['Hint: (lazarus) TPkgManager.AddPackageToGraph LinkLastUsed=',DateToCfgStr(Link.LastUsed,DateTimeAsCfgStrFormat),' ',dbgs(Link.Origin)]);
PkgLinks.SaveUserLinks; PkgLinks.SaveUserLinks;
end; end;