IDE: changed lpk on disk: started switching to alternative lpk

git-svn-id: trunk@40221 -
This commit is contained in:
mattias 2013-02-09 11:15:25 +00:00
parent 5d4b0a28da
commit 3022dc2cb1
6 changed files with 80 additions and 52 deletions

View File

@ -66,23 +66,21 @@ type
Shift: TShiftState; X, Y: Integer); Shift: TShiftState; X, Y: Integer);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
private private
FPackageList: TFPList; FPackageList: TStringList;
FUnitList: TFPList; FUnitList: TFPList;
FCachedDiffs: TFPList; // List of PDiffItem FCachedDiffs: TFPList; // List of PDiffItem
procedure FillFilesListBox; procedure FillFilesListBox;
procedure SetPackageList(const AValue: TFPList);
procedure SetUnitList(const AValue: TFPList);
procedure ShowDiff; procedure ShowDiff;
function GetCachedDiff(FileOwner: TObject): PDiffItem; function GetCachedDiff(FileOwner: TObject; AltFilename: string): PDiffItem;
procedure ClearCache; procedure ClearCache;
public public
property UnitList: TFPList read FUnitList write SetUnitList; // list of TUnitInfo property UnitList: TFPList read FUnitList write FUnitList; // list of TUnitInfo
property PackageList: TFPList read FPackageList write SetPackageList; // list of TLazPackage property PackageList: TStringList read FPackageList write FPackageList; // list of alternative filename and TLazPackage
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
end; end;
function ShowDiskDiffsDialog(AnUnitList, APackageList: TFPList): TModalResult; function ShowDiskDiffsDialog(AnUnitList: TFPList; APackageList: TStringList): TModalResult;
implementation implementation
@ -92,7 +90,7 @@ implementation
var var
DiskDiffsDlg: TDiskDiffsDlg = nil; DiskDiffsDlg: TDiskDiffsDlg = nil;
function ShowDiskDiffsDialog(AnUnitList, APackageList: TFPList): TModalResult; function ShowDiskDiffsDialog(AnUnitList: TFPList; APackageList: TStringList): TModalResult;
function ListsAreEmpty: boolean; function ListsAreEmpty: boolean;
begin begin
@ -142,13 +140,17 @@ function ShowDiskDiffsDialog(AnUnitList, APackageList: TFPList): TModalResult;
PackageDidNotChange: Boolean; PackageDidNotChange: Boolean;
fs: TFileStreamUTF8; fs: TFileStreamUTF8;
CurSource, DiskSource: string; CurSource, DiskSource: string;
AltFilename: String;
begin begin
if APackageList=nil then exit; if APackageList=nil then exit;
for i:=APackageList.Count-1 downto 0 do begin for i:=APackageList.Count-1 downto 0 do begin
CurPackage:=TLazPackage(APackageList[i]); AltFilename:=APackageList[i];
CurPackage:=TLazPackage(APackageList.Objects[i]);
PackageDidNotChange:=false; PackageDidNotChange:=false;
if CurPackage.LPKSource=nil then if CurPackage.LPKSource=nil then
continue;// this package was not loaded/saved continue;// this package was not loaded/saved
if CompareFilenames(CurPackage.Filename,AltFilename)<>0 then
continue; // lpk has vanished, an alternative lpk was found => show
try try
CurPackage.SaveToString(CurSource); CurPackage.SaveToString(CurSource);
fs:=TFileStreamUTF8.Create(CurPackage.Filename,fmOpenRead); fs:=TFileStreamUTF8.Create(CurPackage.Filename,fmOpenRead);
@ -219,30 +221,24 @@ end;
procedure TDiskDiffsDlg.FillFilesListBox; procedure TDiskDiffsDlg.FillFilesListBox;
var i: integer; var i: integer;
AnUnitInfo: TUnitInfo;
APackage: TLazPackage;
begin begin
FilesListBox.Items.BeginUpdate; FilesListBox.Items.BeginUpdate;
FilesListBox.Items.Clear; FilesListBox.Items.Clear;
if UnitList<>nil then if UnitList<>nil then
for i:=0 to UnitList.Count-1 do for i:=0 to UnitList.Count-1 do begin
FilesListBox.Items.AddObject(TUnitInfo(UnitList[i]).ShortFilename, AnUnitInfo:=TUnitInfo(UnitList[i]);
TUnitInfo(UnitList[i])); FilesListBox.Items.AddObject(AnUnitInfo.ShortFilename,AnUnitInfo);
end;
if PackageList<>nil then if PackageList<>nil then
for i:=0 to PackageList.Count-1 do for i:=0 to PackageList.Count-1 do begin
FilesListBox.Items.AddObject(TLazPackage(PackageList[i]).Filename, APackage:=TLazPackage(PackageList.Objects[i]);
TLazPackage(PackageList[i])); FilesListBox.Items.AddObject(APackage.Filename,APackage);
end;
FilesListBox.Items.EndUpdate; FilesListBox.Items.EndUpdate;
end; end;
procedure TDiskDiffsDlg.SetPackageList(const AValue: TFPList);
begin
FPackageList:=AValue;
end;
procedure TDiskDiffsDlg.SetUnitList(const AValue: TFPList);
begin
FUnitList:=AValue;
end;
procedure TDiskDiffsDlg.ShowDiff; procedure TDiskDiffsDlg.ShowDiff;
var var
i: integer; i: integer;
@ -252,15 +248,13 @@ begin
DiffItem:=nil; DiffItem:=nil;
if (i>=0) and (UnitList<>nil) then begin if (i>=0) and (UnitList<>nil) then begin
if i<UnitList.Count then if i<UnitList.Count then
DiffItem:=GetCachedDiff(TUnitInfo(UnitList[i])) DiffItem:=GetCachedDiff(TUnitInfo(UnitList[i]),'');
else dec(i,UnitList.Count);
dec(i,UnitList.Count);
end; end;
if (i>=0) and (PackageList<>nil) then begin if (i>=0) and (PackageList<>nil) then begin
if i<PackageList.Count then if i<PackageList.Count then
DiffItem:=GetCachedDiff(TLazPackage(PackageList[i])) DiffItem:=GetCachedDiff(TLazPackage(PackageList.Objects[i]),PackageList[i]);
else dec(i,PackageList.Count);
dec(i,PackageList.Count);
end; end;
if DiffItem<>nil then begin if DiffItem<>nil then begin
DiffSynEdit.Lines.Text:=DiffItem^.Diff; DiffSynEdit.Lines.Text:=DiffItem^.Diff;
@ -269,7 +263,8 @@ begin
end; end;
end; end;
function TDiskDiffsDlg.GetCachedDiff(FileOwner: TObject): PDiffItem; function TDiskDiffsDlg.GetCachedDiff(FileOwner: TObject; AltFilename: string
): PDiffItem;
var var
i: integer; i: integer;
fs: TFileStreamUTF8; fs: TFileStreamUTF8;
@ -296,7 +291,9 @@ begin
end else if FileOwner is TLazPackage then begin end else if FileOwner is TLazPackage then begin
// compare disk and package // compare disk and package
APackage:=TLazPackage(FileOwner); APackage:=TLazPackage(FileOwner);
if APackage.LPKSource<>nil then if AltFilename<>'' then
Filename:=AltFilename
else if APackage.LPKSource<>nil then
Filename:=APackage.LPKSource.Filename Filename:=APackage.LPKSource.Filename
else else
Filename:=APackage.GetFullFilename(true); Filename:=APackage.GetFullFilename(true);

View File

@ -8470,7 +8470,7 @@ end;
function TMainIDE.DoCheckFilesOnDisk(Instantaneous: boolean): TModalResult; function TMainIDE.DoCheckFilesOnDisk(Instantaneous: boolean): TModalResult;
var var
AnUnitList: TFPList; // list of TUnitInfo AnUnitList: TFPList; // list of TUnitInfo
APackageList: TFPList; // list of TLazPackage APackageList: TStringList; // list of alternative lpkfilename and TLazPackage
i: integer; i: integer;
CurUnit: TUnitInfo; CurUnit: TUnitInfo;
begin begin

View File

@ -81,8 +81,9 @@ type
InObject: TObject): TPkgFile; virtual; abstract; InObject: TObject): TPkgFile; virtual; abstract;
function AddDependencyToUnitOwners(const OwnedFilename, function AddDependencyToUnitOwners(const OwnedFilename,
RequiredUnitname: string): TModalResult; virtual; abstract; RequiredUnitname: string): TModalResult; virtual; abstract;
procedure GetPackagesChangedOnDisk(var ListOfPackages: TFPList); virtual; abstract; procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList); virtual; abstract;
function RevertPackages(APackageList: TFPList): TModalResult; virtual; abstract; function RevertPackages(APackageList: TStringList // list of TLazPackage and alternative lpk file name
): TModalResult; virtual; abstract;
// project // project
function OpenProjectDependencies(AProject: TProject; function OpenProjectDependencies(AProject: TProject;

View File

@ -67,7 +67,7 @@ type
TLPKInfo = class TLPKInfo = class
public public
ID: TLazPackageID; ID: TLazPackageID; // name and version
LPKFilename: string; LPKFilename: string;
InLazSrc: boolean; // lpk is in lazarus source directory InLazSrc: boolean; // lpk is in lazarus source directory
Installed: TPackageInstallType; Installed: TPackageInstallType;

View File

@ -250,7 +250,7 @@ type
Policy: TPackageUpdatePolicy): TFPList; Policy: TPackageUpdatePolicy): TFPList;
function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage; function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion): TFPList; const NewName: string; NewVersion: TPkgVersion): TFPList;
procedure GetPackagesChangedOnDisk(var ListOfPackages: TFPList); procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList); // returns list of new filename and TLazPackage
procedure CalculateTopologicalLevels; procedure CalculateTopologicalLevels;
procedure SortDependencyListTopologically( procedure SortDependencyListTopologically(
var FirstDependency: TPkgDependency; TopLevelFirst: boolean); var FirstDependency: TPkgDependency; TopLevelFirst: boolean);
@ -343,6 +343,7 @@ type
procedure ChangeDependency(Dependency, NewDependency: TPkgDependency); procedure ChangeDependency(Dependency, NewDependency: TPkgDependency);
function OpenDependency(Dependency: TPkgDependency; function OpenDependency(Dependency: TPkgDependency;
ShowAbort: boolean): TLoadPackageResult; ShowAbort: boolean): TLoadPackageResult;
function FindAlternativeLPK(APackage: TLazPackage): string;
procedure OpenInstalledDependency(Dependency: TPkgDependency; procedure OpenInstalledDependency(Dependency: TPkgDependency;
InstallType: TPackageInstallType; var Quiet: boolean); InstallType: TPackageInstallType; var Quiet: boolean);
procedure OpenRequiredDependencyList(FirstDependency: TPkgDependency); procedure OpenRequiredDependencyList(FirstDependency: TPkgDependency);
@ -4492,26 +4493,34 @@ begin
end; end;
end; end;
procedure TLazPackageGraph.GetPackagesChangedOnDisk( procedure TLazPackageGraph.GetPackagesChangedOnDisk(out
var ListOfPackages: TFPList); ListOfPackages: TStringList);
// if package source is changed in IDE (codetools) // if package source is changed in IDE (codetools)
// then changes on disk are ignored // then changes on disk are ignored
var var
APackage: TLazPackage; APackage: TLazPackage;
i: Integer; i: Integer;
NewFilename: String;
begin begin
ListOfPackages:=nil;
MarkNeededPackages; MarkNeededPackages;
for i:=FItems.Count-1 downto 0 do begin for i:=FItems.Count-1 downto 0 do begin
APackage:=TLazPackage(FItems[i]); APackage:=TLazPackage(FItems[i]);
if (not (lpfNeeded in APackage.Flags)) if (not (lpfNeeded in APackage.Flags))
or APackage.ReadOnly or APackage.Modified or APackage.Modified
or (APackage.LPKSource=nil) then or APackage.IsVirtual then
continue;
if (not APackage.LPKSource.FileNeedsUpdate) then
continue; continue;
NewFilename:=APackage.Filename;
if FileExistsCached(APackage.Filename) then begin
if (not APackage.LPKSource.FileNeedsUpdate) then
continue;
end else begin
// lpk has vanished -> search alternative
end;
if ListOfPackages=nil then if ListOfPackages=nil then
ListOfPackages:=TFPList.Create; ListOfPackages:=TStringList.Create;
ListOfPackages.Add(APackage); ListOfPackages.AddObject(NewFilename,APackage);
end; end;
end; end;
@ -4965,6 +4974,23 @@ begin
Result:=Dependency.LoadPackageResult; Result:=Dependency.LoadPackageResult;
end; end;
function TLazPackageGraph.FindAlternativeLPK(APackage: TLazPackage): string;
var
Dependency: TPkgDependency;
begin
Result:='';
// first check for preferred dependencies
Dependency:=APackage.FirstUsedByDependency;
while Dependency<>nil do begin
if (Dependency.DefaultFilename<>'') and Dependency.PreferDefaultFilename
then begin
//PreferredFilename:=Dependency.FindDefaultFilename;
end;
Dependency:=Dependency.NextUsedByDependency;
end;
end;
procedure TLazPackageGraph.OpenInstalledDependency(Dependency: TPkgDependency; procedure TLazPackageGraph.OpenInstalledDependency(Dependency: TPkgDependency;
InstallType: TPackageInstallType; var Quiet: boolean); InstallType: TPackageInstallType; var Quiet: boolean);
var var

View File

@ -232,8 +232,8 @@ type
InObject: TObject): TPkgFile; override; InObject: TObject): TPkgFile; override;
function AddDependencyToUnitOwners(const OwnedFilename, function AddDependencyToUnitOwners(const OwnedFilename,
RequiredUnitname: string): TModalResult; override; RequiredUnitname: string): TModalResult; override;
procedure GetPackagesChangedOnDisk(var ListOfPackages: TFPList); override; procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList); override;
function RevertPackages(APackageList: TFPList): TModalResult; override; function RevertPackages(APackageList: TStringList): TModalResult; override;
// package graph // package graph
function AddPackageToGraph(APackage: TLazPackage; Replace: boolean): TModalResult; function AddPackageToGraph(APackage: TLazPackage; Replace: boolean): TModalResult;
@ -623,7 +623,7 @@ begin
Result:=DoCreatePackageMakefile(APackage,false); Result:=DoCreatePackageMakefile(APackage,false);
end; end;
function TPkgManager.OnPackageEditorCreateFpmakefile(Sender: TObject; function TPkgManager.OnPackageEditorCreateFpmakeFile(Sender: TObject;
APackage: TLazPackage): TModalResult; APackage: TLazPackage): TModalResult;
begin begin
Result:=DoCreatePackageFpmakefile(APackage,false); Result:=DoCreatePackageFpmakefile(APackage,false);
@ -3415,20 +3415,24 @@ begin
end; end;
end; end;
procedure TPkgManager.GetPackagesChangedOnDisk(var ListOfPackages: TFPList); procedure TPkgManager.GetPackagesChangedOnDisk(out ListOfPackages: TStringList);
begin begin
if PackageGraph=nil then exit; if PackageGraph=nil then exit;
PackageGraph.GetPackagesChangedOnDisk(ListOfPackages); PackageGraph.GetPackagesChangedOnDisk(ListOfPackages);
end; end;
function TPkgManager.RevertPackages(APackageList: TFPList): TModalResult; function TPkgManager.RevertPackages(APackageList: TStringList): TModalResult;
var var
i: Integer; i: Integer;
APackage: TLazPackage; APackage: TLazPackage;
Filename: String;
begin begin
if APackageList=nil then exit(mrOk); if APackageList=nil then exit(mrOk);
for i:=0 to APackageList.Count-1 do begin for i:=0 to APackageList.Count-1 do begin
APackage:=TLazPackage(APackageList[i]); APackage:=TLazPackage(APackageList.Objects[i]);
Filename:=APackageList[i];
if Filename='' then
Filename:=APackage.Filename;
if FileExistsCached(APackage.Filename) then if FileExistsCached(APackage.Filename) then
Result:=DoOpenPackageFile(APackage.Filename,[pofRevert],true) Result:=DoOpenPackageFile(APackage.Filename,[pofRevert],true)
else else