dub package cache, use a single static registry and prevent too much update at startup

This commit is contained in:
Basile Burg 2018-05-06 17:26:49 +02:00
parent 68151b063e
commit 35a0544849
1 changed files with 35 additions and 34 deletions

View File

@ -40,16 +40,14 @@ type
TDubLocalPackages = class TDubLocalPackages = class
strict private strict private
fRoot: string; class var fLocalPackages: array of TDubLocalPackage;
fLocalPackages: array of TDubLocalPackage; class var fDoneFirstUpdate: boolean;
public public
destructor destroy; override; class procedure deinit;
procedure update; class procedure update;
function find(const name: string; out package: PDubLocalPackage): boolean; overload; class function find(const name: string; out package: PDubLocalPackage): boolean; overload;
function find(const name, op: string; constref opVer: TSemVer; class function find(const name, op: string; constref opVer: TSemVer;
out package: PDubLocalPackage): PSemver; overload; out package: PDubLocalPackage): PSemver; overload;
function fetch(constref version: TSemVer): PDubLocalPackage;
function getPackageePath(package: PDubLocalPackage): string;
end; end;
(** (**
@ -131,7 +129,6 @@ type
fSaveAsUtf8: boolean; fSaveAsUtf8: boolean;
fCompiled: boolean; fCompiled: boolean;
fMsgs: ICEMessagesDisplay; fMsgs: ICEMessagesDisplay;
fLocalPackages: TDubLocalPackages;
fNextTerminatedCommand: TDubCommand; fNextTerminatedCommand: TDubCommand;
fAsProjectItf: ICECommonProject; fAsProjectItf: ICECommonProject;
procedure doModified; procedure doModified;
@ -210,6 +207,7 @@ type
var var
DubCompiler: DCompiler = dmd; DubCompiler: DCompiler = dmd;
DubCompilerFilename: string = 'dmd'; DubCompilerFilename: string = 'dmd';
Lfm: ICELifetimeManager = nil;
const const
DubSdlWarning = 'this feature is deactivated in DUB projects with the SDL format'; DubSdlWarning = 'this feature is deactivated in DUB projects with the SDL format';
@ -361,7 +359,7 @@ begin
exit(fVersions.Items[i]); exit(fVersions.Items[i]);
end; end;
destructor TDubLocalPackages.destroy; class procedure TDubLocalPackages.deinit;
var var
i: integer; i: integer;
begin begin
@ -370,7 +368,7 @@ begin
inherited; inherited;
end; end;
procedure TDubLocalPackages.update; class procedure TDubLocalPackages.update;
var var
p: TStringList; p: TStringList;
r: TStringList; r: TStringList;
@ -382,17 +380,31 @@ var
k: integer; k: integer;
d: PDubLocalPackage = nil; d: PDubLocalPackage = nil;
h: TStringRange = (ptr: nil; pos: 0; len: 0); h: TStringRange = (ptr: nil; pos: 0; len: 0);
x: string;
begin begin
if not assigned(Lfm) then
Lfm := getLifeTimeManager;
if not assigned(Lfm) or not (Lfm.getLifetimeStatus = lfsLoaded) then
begin
if fDoneFirstUpdate then
exit;
end;
fDoneFirstUpdate := true;
for i := 0 to high(fLocalPackages) do
fLocalPackages[i].Free;
setLength(fLocalPackages, 0); setLength(fLocalPackages, 0);
r := TStringList.Create; r := TStringList.Create;
getPackagesLocations(r); getPackagesLocations(r);
try for k := 0 to r.Count -1 do try for k := 0 to r.Count -1 do
begin begin
fRoot := r[k]; x := r[k];
p := TStringList.Create; p := TStringList.Create;
try try
listFolders(p, fRoot); listFolders(p, x);
for i := 0 to p.Count-1 do for i := 0 to p.Count-1 do
begin begin
j := 0; j := 0;
@ -436,7 +448,7 @@ begin
end; end;
function TDubLocalPackages.find(const name: string; out package: PDubLocalPackage): boolean; class function TDubLocalPackages.find(const name: string; out package: PDubLocalPackage): boolean;
var var
i: integer; i: integer;
begin begin
@ -451,7 +463,7 @@ begin
end; end;
end; end;
function TDubLocalPackages.find(const name, op: string; constref opVer: TSemVer; class function TDubLocalPackages.find(const name, op: string; constref opVer: TSemVer;
out package: PDubLocalPackage): PSemVer; out package: PDubLocalPackage): PSemVer;
var var
hi: TSemVer; hi: TSemVer;
@ -498,16 +510,6 @@ begin
result := package^.highest; result := package^.highest;
end; end;
end; end;
function TDubLocalPackages.fetch(constref version: TSemVer): PDubLocalPackage;
begin
result := nil;
end;
function TDubLocalPackages.getPackageePath(package: PDubLocalPackage): string;
begin
result := fRoot + package^.Name;
end;
{$ENDREGION} {$ENDREGION}
{$REGION Options ---------------------------------------------------------------} {$REGION Options ---------------------------------------------------------------}
@ -664,8 +666,7 @@ begin
doModified; doModified;
fModified:=false; fModified:=false;
fLocalPackages := TDubLocalPackages.Create; TDubLocalPackages.update;
fLocalPackages.update;
end; end;
destructor TCEDubProject.destroy; destructor TCEDubProject.destroy;
@ -679,7 +680,6 @@ begin
fConfigs.Free; fConfigs.Free;
fSrcs.Free; fSrcs.Free;
fImportPaths.Free; fImportPaths.Free;
fLocalPackages.Free;
inherited; inherited;
end; end;
{$ENDREGION --------------------------------------------------------------------} {$ENDREGION --------------------------------------------------------------------}
@ -1389,7 +1389,7 @@ procedure TCEDubProject.updateImportPathsFromJson;
end; end;
// Try to fetch if not present at all // Try to fetch if not present at all
if not fLocalPackages.find(n, pck) and dubBuildOptions.autoFetch then if not TDubLocalPackages.find(n, pck) and dubBuildOptions.autoFetch then
begin begin
with TProcess.Create(nil) do with TProcess.Create(nil) do
try try
@ -1400,13 +1400,13 @@ procedure TCEDubProject.updateImportPathsFromJson;
Parameters.Add(n); Parameters.Add(n);
Execute; Execute;
if ExitStatus = 0 then if ExitStatus = 0 then
fLocalPackages.update(); TDubLocalPackages.update();
finally finally
free; free;
end; end;
end; end;
if fLocalPackages.find(n, pck) then if TDubLocalPackages.find(n, pck) then
begin begin
j := deps.Items[i]; j := deps.Items[i];
@ -1429,7 +1429,7 @@ procedure TCEDubProject.updateImportPathsFromJson;
q.init('v' + p); q.init('v' + p);
// Finds a match for the version in the local packages list. // Finds a match for the version in the local packages list.
u := fLocalPackages.find(n, o, q, pck); u := TDubLocalPackages.find(n, o, q, pck);
// Try to fetch the right version if no match // Try to fetch the right version if no match
if not assigned(u) and dubBuildOptions.autoFetch then if not assigned(u) and dubBuildOptions.autoFetch then
@ -1445,8 +1445,8 @@ procedure TCEDubProject.updateImportPathsFromJson;
Execute; Execute;
if ExitStatus = 0 then if ExitStatus = 0 then
begin begin
fLocalPackages.update(); TDubLocalPackages.update();
u := fLocalPackages.find(n, o, q, pck); u := TDubLocalPackages.find(n, o, q, pck);
end; end;
finally finally
free; free;
@ -1694,5 +1694,6 @@ initialization
dubBuildOptions:= TCEDubBuildOptions.create(nil); dubBuildOptions:= TCEDubBuildOptions.create(nil);
finalization finalization
dubBuildOptions.free; dubBuildOptions.free;
TDubLocalPackages.deinit;
end. end.