Opkman: More bugfix + optimizations.

git-svn-id: trunk@53669 -
This commit is contained in:
balazs 2016-12-13 13:00:35 +00:00
parent 0f58c1ef85
commit 025eab7ffe
8 changed files with 73 additions and 37 deletions

View File

@ -543,7 +543,7 @@ Type
Procedure UnZipAllFiles(AFileName : String);
Procedure Clear;
Procedure Examine;
Function GetZipSize(var IsDirZipped: Boolean): Int64;
Function GetZipSize(var IsDirZipped: Boolean; var ABaseDir: String): Int64;
Public
Property BufferSize : LongWord Read FBufSize Write SetBufSize;
Property OnOpenInputStream: TCustomInputStreamEvent read FOnOpenInputStream write FOnOpenInputStream;
@ -2643,12 +2643,11 @@ begin
end;
end;
function TUnZipper.GetZipSize(var IsDirZipped: Boolean): Int64;
function TUnZipper.GetZipSize(var IsDirZipped: Boolean; var ABaseDir: String): Int64;
var
I: Integer;
Item: TFullZipFileEntry;
AllFiles: Boolean;
BasePath: String;
P: Integer;
begin
AllFiles := (FFiles.Count = 0);
@ -2656,14 +2655,13 @@ begin
try
ReadZipDirectory;
Result := 0;
BasePath := '';
if FEntries.Count > 0 then
begin
P := Pos('/', TZipFileEntry(FEntries.Items[0]).ArchiveFileName);
if P = 0 then
P := Pos('\', TZipFileEntry(FEntries.Items[0]).ArchiveFileName);
if P <> 0 then
BasePath := Copy(TZipFileEntry(FEntries.Items[0]).ArchiveFileName, 1, P);
ABaseDir := Copy(TZipFileEntry(FEntries.Items[0]).ArchiveFileName, 1, P);
end;
for i:=0 to FEntries.Count-1 do
begin
@ -2672,10 +2670,14 @@ begin
begin
Result := Result + TZipFileEntry(Item).Size;
if IsDirZipped then
if Pos(BasePath, Item.ArchiveFileName) = 0 then
if Pos(ABaseDir, Item.ArchiveFileName) = 0 then
IsDirZipped := False;
end;
end;
if not IsDirZipped then
ABaseDir := ''
else
ABaseDir := Copy(ABaseDir, 1, Length(ABaseDir) - 1);
finally
CloseInput;
end;

View File

@ -45,11 +45,12 @@ const
cRestrictedDirectoryDef = 'lib,backup';
cHelpPage = 'http://wiki.freepascal.org/Online_Package_Manager';
{$ifdef win64}
OpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-x64_86-win64.zip';
cOpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-x64_86-win64.zip';
{$endif}
{$ifdef win32}
OpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-i386-win32.zip';
cOpenSSLURL = 'http://packages.lazarus-ide.org/openssl-1.0.2j-i386-win32.zip';
{$endif}
cExtractDir = 'ExtractDir';
resourcestring
//package manager

View File

@ -170,7 +170,10 @@ begin
Exit;
end;
SD.FileName := 'update_' + FPackage.DisplayName;
if FPackage.DisplayName <> '' then
SD.FileName := 'update_' + FPackage.DisplayName
else
SD.FileName := 'update_' + FPackage.Name;
if SD.Execute then
begin
UpdatePackage := TUpdatePackage.Create;

View File

@ -196,10 +196,10 @@ end;
procedure TMainFrm.GetPackageList;
begin
Updates.PauseUpdate;
Caption := rsLazarusPackageManager;
VisualTree.VST.Clear;
if SerializablePackages.Count > 0 then
SerializablePackages.Clear;
VisualTree.VST.Invalidate;
EnableDisableControls(False);
SetupMessage(rsMainFrm_rsMessageDownload);
PackageDownloader.DownloadJSON(10000);
@ -314,13 +314,14 @@ begin
Exit;
end;
VisualTree.PopulateTree;
Updates.StartUpdate;
EnableDisableControls(True);
SetupMessage;
mJSON.Text := AJSON;
cbAll.Checked := False;
Caption := rsLazarusPackageManager + ' ' + Format(rsPackagesFound, [
IntToStr(SerializablePackages.Count)]);
if Assigned(Updates) then
Updates.StartUpdate;
end;
etConfig:
begin
@ -542,9 +543,6 @@ end;
procedure TMainFrm.tbRefreshClick(Sender: TObject);
begin
Updates.PauseUpdate;
VisualTree.VST.Clear;
VisualTree.VST.Invalidate;
GetPackageList;
end;

View File

@ -156,7 +156,10 @@ begin
begin
Node := FVST.AddChild(nil);
Data := FVST.GetNodeData(Node);
Data^.FName := SerializablePackages.Items[I].DisplayName;
if SerializablePackages.Items[I].DisplayName <> '' then
Data^.FName := SerializablePackages.Items[I].DisplayName
else
Data^.FName := SerializablePackages.Items[I].Name;
Data^.FImageIndex := 0;
end;
end
@ -172,7 +175,10 @@ begin
Inc(InvCnt);
Node := FVST.AddChild(nil);
Data := FVST.GetNodeData(Node);
Data^.FName := SerializablePackages.Items[I].DisplayName;
if SerializablePackages.Items[I].DisplayName <> '' then
Data^.FName := SerializablePackages.Items[I].DisplayName
else
Data^.FName := SerializablePackages.Items[I].Name;
Data^.FImageIndex := 0;
SerializablePackages.Items[I].ChangePackageStates(ctAdd, psError);
end;

View File

@ -32,7 +32,7 @@ interface
uses
Classes, SysUtils, FileUtil, Variants, fpjson, jsonparser, md5, contnrs,
PackageIntf, Laz2_XMLCfg;
PackageIntf, Laz2_XMLCfg, LazFileUtils;
type
@ -206,6 +206,7 @@ type
FSVNURL: String;
FUpdateSize: Int64;
FIsDirZipped: Boolean;
FZippedBaseDir: String;
FPackageFiles: TCollection;
function GetDownloadable: Boolean;
function GetExtractable: Boolean;
@ -221,6 +222,7 @@ type
property IsExtractable: Boolean read GetExtractable;
property UpdateSize: Int64 read FUpdateSize write FUpdateSize;
property IsDirZipped: Boolean read FIsDirZipped write FIsDirZipped;
property ZippedBaseDir: String read FZippedBaseDir write FZippedBaseDir;
property DownloadZipURL: String read FDownloadZipURL write FDownloadZipURL;
property HasUpdate: Boolean read FHasUpdate write FHasUpdate;
property DisableInOPM: Boolean read FDisableInOPM write FDisableInOPM;
@ -941,7 +943,13 @@ var
Package: TPackage;
begin
Clear;
Result := True;
if Trim(JSON) = '' then
begin
Result := False;
Exit;
end
else
Result := True;
Parser := TJSONParser.Create(JSON);
try
Data := Parser.Parse;
@ -1021,7 +1029,7 @@ var
FileName: String;
begin
FileName := Options.LocalRepositoryArchive + APackage.RepositoryFileName;
Result := (FileExists(FileName)) and
Result := (FileExistsUTF8(FileName)) and
(MD5Print(MD5File(FileName)) = APackage.RepositoryFileHash) and
(FileUtil.FileSize(FileName) = APackage.RepositoryFileSize);
end;
@ -1036,7 +1044,7 @@ begin
begin
PackageFile := TPackageFile(APackage.FPackageFiles.Items[I]);
PackageFile.FPackageAbsolutePath := Options.LocalRepositoryPackages + APackage.PackageBaseDir + PackageFile.FPackageRelativePath + PackageFile.Name;
if not FileExists(PackageFile.FPackageAbsolutePath) then
if not FileExistsUTF8(PackageFile.FPackageAbsolutePath) then
begin
Result := False;
Break;
@ -1124,11 +1132,14 @@ function TSerializablePackages.IsPackageInstalled(const APackageFile: TPackageFi
begin
APackageFile.InstalledFileName := Package.Filename;
APackageFile.InstalledFileVersion := IntToStr(Package.Version.Major) + '.' +
IntToStr(Package.Version.Minor) + '.' +
IntToStr(Package.Version.Release) + '.' +
IntToStr(Package.Version.Build);
APackageFile.InstalledFileDescription := GetPackageDescription(Package.Filename);
APackageFile.InstalledFileLincese := GetPackageLicense(Package.Filename);
IntToStr(Package.Version.Minor) + '.' +
IntToStr(Package.Version.Release) + '.' +
IntToStr(Package.Version.Build);
if FileExistsUTF8(APackageFile.InstalledFileName) then
begin
APackageFile.InstalledFileDescription := GetPackageDescription(Package.Filename);
APackageFile.InstalledFileLincese := GetPackageLicense(Package.Filename);
end;
Result := True;
Break;
end;
@ -1144,14 +1155,16 @@ begin
begin
FileName := StringReplace(APackageFile.Name, '.lpk', '.opkman', [rfIgnoreCase]);
Result := (psExtracted in APackageFile.PackageStates) and
FileExists(Options.LocalRepositoryPackages + APackageBaseDir + APackageFile.PackageRelativePath + FileName);
FileExistsUTF8(Options.LocalRepositoryPackages + APackageBaseDir + APackageFile.PackageRelativePath + FileName);
if Result then
begin
APackageFile.InstalledFileName := Options.LocalRepositoryPackages + APackageBaseDir + APackageFile.FPackageRelativePath + APackageFile.Name;
APackageFile.InstalledFileVersion := GetPackageVersion(APackageFile.InstalledFileName);
APackageFile.InstalledFileDescription := GetPackageDescription(APackageFile.InstalledFileName);
APackageFile.InstalledFileLincese := GetPackageLicense(APackageFile.InstalledFileName);
Result := True;
if FileExistsUTF8(APackageFile.InstalledFileName) then
begin
APackageFile.InstalledFileVersion := GetPackageVersion(APackageFile.InstalledFileName);
APackageFile.InstalledFileDescription := GetPackageDescription(APackageFile.InstalledFileName);
APackageFile.InstalledFileLincese := GetPackageLicense(APackageFile.InstalledFileName);
end;
end
else
Result := CheckIDEPackages
@ -1360,7 +1373,7 @@ begin
(PackageFile.PackageType in [ptRunTime, ptRunTimeOnly]) then
begin
FileName := StringReplace(PackageFile.Name, '.lpk', '.opkman', [rfIgnoreCase]);
FileCreate(Options.LocalRepositoryPackages + Items[I].PackageBaseDir + PackageFile.PackageRelativePath + FileName);
FileCreateUTF8(Options.LocalRepositoryPackages + Items[I].PackageBaseDir + PackageFile.PackageRelativePath + FileName);
end;
end;
end;

View File

@ -235,6 +235,9 @@ var
PackageFile: TPackageFile;
HasUpdate: Boolean;
begin
if (not Assigned(SerializablePackages)) or (SerializablePackages.Count = 0) then
Exit;
FVersion := FXML.GetValue('Version/Value', 0);
PackageCount := FXML.GetValue('Count/Value', 0);
for I := 0 to PackageCount - 1 do
@ -281,7 +284,7 @@ var
Package: TPackage;
PackageFile: TPackageFile;
begin
if SerializablePackages.Count = 0 then
if (not Assigned(SerializablePackages)) or (SerializablePackages.Count = 0) then
Exit;
FXML.Clear;
FXML.SetDeleteValue('Version/Value', OpkVersion, 0);
@ -369,9 +372,9 @@ begin
FileExistsUTF8(ExtractFilePath(ParamStr(0)) + 'ssleay32.dll');
if not FOpenSSLAvaialable then
begin
ZipFile := ExtractFilePath(ParamStr(0)) + ExtractFileName(OpenSSLURL);
ZipFile := ExtractFilePath(ParamStr(0)) + ExtractFileName(cOpenSSLURL);
try
FHTTPClient.Get(OpenSSLURL, ZipFile);
FHTTPClient.Get(cOpenSSLURL, ZipFile);
except
end;
if FileExistsUTF8(ZipFile) then
@ -450,7 +453,7 @@ begin
CheckForOpenSSL;
while not Terminated do
begin
if (FNeedToUpdate) and (not FBusyUpdating) and (not FPaused) and (FOpenSSLAvaialable) then
if Assigned(SerializablePackages) and (FNeedToUpdate) and (not FBusyUpdating) and (not FPaused) and (FOpenSSLAvaialable) then
begin
FBusyUpdating := True;
try

View File

@ -165,6 +165,11 @@ begin
FUnZipper.Examine;
FUnZipper.UnZipAllFiles;
SerializablePackages.Items[I].ChangePackageStates(ctAdd, psExtracted);
if (SerializablePackages.Items[I].IsDirZipped ) and (SerializablePackages.Items[I].PackageBaseDir <> SerializablePackages.Items[I].ZippedBaseDir) then
begin
CopyDirTree(FUnZipper.OutputPath + SerializablePackages.Items[I].ZippedBaseDir, DelDir, [cffOverwriteFile]);
DeleteDirectory(FUnZipper.OutputPath + SerializablePackages.Items[I].ZippedBaseDir, False);
end;
Synchronize(@DoOnZipProgress);
FTotPos := FTotPos + FCurSize;
except
@ -226,6 +231,7 @@ procedure TPackageUnzipper.StartUnZip(const ASrcDir, ADstDir: String;
var
I: Integer;
IsDirZipped: Boolean;
BaseDir: String;
begin
if FStarted then
Exit;
@ -243,8 +249,12 @@ begin
FUnZipper.FileName := FSrcDir + SerializablePackages.Items[I].RepositoryFileName;
FUnZipper.Examine;
IsDirZipped := True;
FTotSize := FTotSize + FUnZipper.GetZipSize(IsDirZipped);
BaseDir := '';
FTotSize := FTotSize + FUnZipper.GetZipSize(IsDirZipped, BaseDir);
SerializablePackages.Items[I].IsDirZipped := IsDirZipped;
if BaseDir <> '' then
BaseDir := AppendPathDelim(BaseDir);
SerializablePackages.Items[I].ZippedBaseDir := BaseDir;
Inc(FTotCnt);
except
on E: Exception do