From f9870ed2983b324a2c917cbf0a4cae4a8d473dca Mon Sep 17 00:00:00 2001 From: mattias Date: Thu, 3 Aug 2023 11:12:53 +0200 Subject: [PATCH] ide: using cache and support star dirs --- ide/checkcompileropts.pas | 4 +- ide/etfpcmsgparser.pas | 2 +- .../ideconfig/include/unix/lazbaseconf.inc | 2 +- ide/packages/ideconfig/searchpathprocs.pas | 52 +++++++++++++------ packager/packagesystem.pas | 7 ++- packager/pkgmanager.pas | 40 ++++++++++---- 6 files changed, 74 insertions(+), 33 deletions(-) diff --git a/ide/checkcompileropts.pas b/ide/checkcompileropts.pas index a565e87dad..2a89d79f19 100644 --- a/ide/checkcompileropts.pas +++ b/ide/checkcompileropts.pas @@ -811,10 +811,10 @@ begin PPUFilename:=PPUFiles[i]; AUnitName:=ExtractFileNameOnly(PPUFilename); // search .pas/.pp/.p file - if SearchPascalUnitInPath(AUnitName,'',SrcPath,';',ctsfcAllCase)<>'' then + if SearchUnitInSearchPath(AUnitName,'',SrcPath,true)<>'' then PPUFiles.Delete(i) - // check for main source else if (Options.Owner is TLazProject) then begin + // check for main source CurProject:=TLazProject(Options.Owner); if (CurProject.MainFileID>=0) then begin ProjFile:=CurProject.MainFile; diff --git a/ide/etfpcmsgparser.pas b/ide/etfpcmsgparser.pas index b27230a8db..71bdbde5d7 100644 --- a/ide/etfpcmsgparser.pas +++ b/ide/etfpcmsgparser.pas @@ -3209,7 +3209,7 @@ begin if (aPhase in [etpspAfterReadLine,etpspAfterSync]) and (fIncludePathValidForWorkerDir=MsgWorkerDir) then begin // include path is valid and in worker thread - // -> search file + // -> search file (todo: needs a thread safe function for star directories) aFilename:=FileUtil.SearchFileInPath(aFilename,MsgWorkerDir,fIncludePath,';', [FileUtil.sffSearchLoUpCase,sffFile]); if aFilename<>'' then diff --git a/ide/packages/ideconfig/include/unix/lazbaseconf.inc b/ide/packages/ideconfig/include/unix/lazbaseconf.inc index e787bfacaa..fe1365ec90 100644 --- a/ide/packages/ideconfig/include/unix/lazbaseconf.inc +++ b/ide/packages/ideconfig/include/unix/lazbaseconf.inc @@ -115,13 +115,13 @@ begin Browser:=''; // prefer open source ;) if Find('xdg-open',Browser) then exit; + if Find('firefox',Browser) then exit; if Find('mozilla',Browser) then exit; if Find('galeon',Browser) then exit; if Find('konqueror',Browser) then exit; if Find('safari',Browser) then exit; if Find('netscape',Browser) then exit; if Find('opera',Browser) then exit; - if Find('iexplore.exe',Browser) then exit; end; {--------------------------------------------------------------------------- diff --git a/ide/packages/ideconfig/searchpathprocs.pas b/ide/packages/ideconfig/searchpathprocs.pas index d65d68e32d..93cf7eb4c6 100644 --- a/ide/packages/ideconfig/searchpathprocs.pas +++ b/ide/packages/ideconfig/searchpathprocs.pas @@ -99,6 +99,8 @@ type function SearchFileInSearchPath(const Filename, BasePath: string; SearchPath: string; Flags: TSPSearchFileFlags = []): string; overload; +function SearchUnitInSearchPath(const AnUnitname, BasePath: string; + SearchPath: string; AnyCase: boolean): string; overload; procedure CollectFilesInSearchPath(const SearchPath: string; Files: TFilenameToStringTree; const Value: string = ''); overload; @@ -647,8 +649,6 @@ var p: Integer; CurPath, Base: String; Cache: TCTDirectoryBaseCache; - StarCache: TCTStarDirectoryCache; - DirCache: TCTDirectoryCache; FileCase: TCTSearchFileCase; begin if Filename='' then @@ -689,20 +689,40 @@ begin Cache:=CodeToolBoss.DirectoryCachePool.GetBaseCache(CurPath); if Cache=nil then continue; - if Cache is TCTStarDirectoryCache then - begin - StarCache:=TCTStarDirectoryCache(Cache); - Result:=StarCache.FindFile(Filename,FileCase); - if Result<>'' then - if Fits(StarCache.Directory+Result) then - exit; - end else if Cache is TCTDirectoryCache then begin - DirCache:=TCTDirectoryCache(Cache); - Result:=DirCache.FindFile(Filename,FileCase); - if Result<>'' then - if Fits(DirCache.Directory+Result) then - exit; - end; + Result:=Cache.FindFile(Filename,FileCase); + if Result<>'' then + if Fits(Cache.Directory+Result) then + exit; + until false; + Result:=''; +end; + +function SearchUnitInSearchPath(const AnUnitname, BasePath: string; + SearchPath: string; AnyCase: boolean): string; +var + Base, CurPath: String; + p: Integer; + Cache: TCTDirectoryBaseCache; +begin + Base:=AppendPathDelim(ExpandFileNameUTF8(BasePath)); + if BasePath<>'' then + begin + // search in current directory + Result:=CodeToolBoss.DirectoryCachePool.FindUnitInDirectory(Base,AnUnitname,AnyCase); + if Result<>'' then exit; + end; + // search in search path + p:=1; + repeat + CurPath:=GetNextDirectoryInSearchPath(SearchPath,p); + if CurPath='' then break; + CurPath:=TrimAndExpandDirectory(CurPath,Base); + + Cache:=CodeToolBoss.DirectoryCachePool.GetBaseCache(CurPath); + if Cache=nil then continue; + Result:=Cache.FindUnitSource(AnUnitname,AnyCase); + if Result<>'' then + exit(Cache.Directory+Result); until false; Result:=''; end; diff --git a/packager/packagesystem.pas b/packager/packagesystem.pas index 71e8cf7e0e..c053f2f4a6 100644 --- a/packager/packagesystem.pas +++ b/packager/packagesystem.pas @@ -5496,15 +5496,14 @@ var function CheckFile(const ShortFilename: string): TModalResult; var AmbiguousFilename: String; - SearchFlags: TSearchFileInPathFlags; + SearchFlags: TSPSearchFileFlags; begin Result:=mrOk; SearchFlags:=[]; if CompareFilenames(PkgDir,PkgOutputDir)=0 then - Include(SearchFlags,sffDontSearchInBasePath); + Include(SearchFlags,TSPSearchFileFlag.DontSearchInBasePath); repeat - AmbiguousFilename:=SearchFileInPath(ShortFilename,PkgDir,SrcDirs,';', - SearchFlags); + AmbiguousFilename:=SearchFileInSearchPath(ShortFilename,PkgDir,SrcDirs,SearchFlags); if (AmbiguousFilename='') then exit; if not YesToAll then Result:=IDEMessageDialog(lisAmbiguousUnitFound, diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index 927f6ada85..ade6e552ec 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -3819,11 +3819,39 @@ function TPkgManager.CheckUserSearchPaths(aCompilerOptions: TBaseCompilerOptions var aPackage: TLazPackage; CurUnitPath: String; - CurIncPath: String; CurSrcPath: String; CurOutPath: String; SrcDirToPkg: TFilenameToPointerTree; + function GetPkgOfSrcDirToPkg(Dir: string): TLazPackage; + var + MaskType: TSPMaskType; + Item: PStringToPointerTreeItem; + CurDir: String; + begin + MaskType:=GetSPMaskType(Dir); + if MaskType=TSPMaskType.None then + begin + Result:=TLazPackage(SrcDirToPkg[Dir]); + exit; + end; + Dir:=ChompPathDelim(ExtractFilePath(Dir)); + for Item in SrcDirToPkg do + begin + CurDir:=Item^.Name; + case MaskType of + TSPMaskType.Star: + if CompareFilenames(ChompPathDelim(ExtractFilePath(CurDir)),Dir)=0 then + exit(TLazPackage(Item^.Value)); + TSPMaskType.StarStar: + if (CompareFilenames(CurDir,Dir)=0) + or FileIsInPath(CurDir,Dir) then + exit(TLazPackage(Item^.Value)); + end; + end; + Result:=nil; + end; + function CheckPathContainsDirOfOtherPkg(Option: TParsedCompilerOptString ): TModalResult; var @@ -3836,11 +3864,6 @@ var begin Result:=mrOk; case Option of - pcosIncludePath: - begin - aType:='include files search path'; - aSearchPath:=CurIncPath; - end; pcosUnitPath: begin aType:='other unit files search path (aka unit path)'; @@ -3860,7 +3883,7 @@ var if Dir='' then break; Dir:=ChompPathDelim(Dir); if not FilenameIsAbsolute(Dir) then continue; - OtherPackage:=TLazPackage(SrcDirToPkg[Dir]); + OtherPackage:=GetPkgOfSrcDirToPkg(Dir); if (OtherPackage<>nil) and (OtherPackage<>aPackage) then begin // search path contains source directory of another package if Option=pcosIncludePath then; @@ -3951,7 +3974,6 @@ begin if (aPackage<>nil) and (aPackage.AutoUpdate=pupManually) then exit; CurUnitPath:=aCompilerOptions.ParsedOpts.GetParsedValue(pcosUnitPath); - CurIncPath:=aCompilerOptions.ParsedOpts.GetParsedValue(pcosIncludePath); CurSrcPath:=aCompilerOptions.ParsedOpts.GetParsedValue(pcosSrcPath); CurOutPath:=aCompilerOptions.ParsedOpts.GetParsedValue(pcosOutputDir); //debugln(['TPkgManager.CheckUserSearchPaths CompOpts=',aCompilerOptions.GetOwnerName,' UnitPath="',CurUnitPath,'" IncPath="',CurIncPath,'" SrcPath="',CurSrcPath,'" OutPath="',CurOutPath,'"']); @@ -4264,7 +4286,7 @@ begin for i:=0 to PkgList.Count-1 do begin APackage:=TLazPackage(PkgList[i]); IncPath:=APackage.CompilerOptions.GetIncludePath(false); - Result:=SearchFileInPath(Filename,APackage.Directory,IncPath,';',ctsfcDefault); + Result:=SearchFileInSearchPath(Filename,APackage.Directory,IncPath); if Result<>'' then exit; end; finally