mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 19:39:28 +02:00
IDE: fixed updating package LastUsed date when there are several versions of a package
git-svn-id: trunk@50279 -
This commit is contained in:
parent
5bda0931e7
commit
ac1f94688e
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user