IDE: checked all places where TPkgFile.Filename should use GetFullFilename, save package files on save package

git-svn-id: trunk@35382 -
This commit is contained in:
mattias 2012-02-15 22:28:12 +00:00
parent cef54d4751
commit de85f6cc4c
10 changed files with 123 additions and 106 deletions

View File

@ -1711,7 +1711,7 @@ begin
BaseDir:=APackage.DirectoryExpanded;
if BaseDir='' then exit;
SrcFilename:=PkgFile.Filename;
SrcFilename:=PkgFile.GetFullFilename;
if ResolveIncludeFiles then begin
CodeBuf:=CodeToolBoss.FindFile(SrcFilename);
if CodeBuf<>nil then begin

View File

@ -414,17 +414,15 @@ var
begin
for i:=0 to APackage.FileCount-1 do begin
PkgFile:=APackage.Files[i];
if FilenameIsPascalUnit(PkgFile.Filename) then begin
Filename:=PkgFile.Filename;
if FilenameIsPascalUnit(Filename) then begin
Filename:=ExtractFileNameOnly(Filename);
if (CompareFilenames(Prefix,copy(Filename,1,length(Prefix)))=0) then
begin
Identifier:=ExtractFileNameOnly(Filename);
if APackage<>StartModuleOwner then
Identifier:='#'+APackage.Name+'.'+Identifier;
fItems.Add(Identifier, lisPackageUnit);
end;
Filename:=PkgFile.GetFullFilename;
if FilenameIsPascalUnit(Filename) then begin
Filename:=ExtractFileNameOnly(Filename);
if (CompareFilenames(Prefix,copy(Filename,1,length(Prefix)))=0) then
begin
Identifier:=ExtractFileNameOnly(Filename);
if APackage<>StartModuleOwner then
Identifier:='#'+APackage.Name+'.'+Identifier;
fItems.Add(Identifier, lisPackageUnit);
end;
end;
end;

View File

@ -768,11 +768,7 @@ begin
end;
if (PkgFile<>nil) and (PkgFile.FileType in PkgFileRealUnitTypes) then begin
// normal unit in lpk
if not FilenameIsAbsolute(PkgFile.Filename) then begin
InvalidPathError('Unit "'+PkgFile.Filename+'" has no help.');
exit;
end;
Filename:=PkgFile.Filename;
Filename:=PkgFile.GetFullFilename;
end else if SysUtils.CompareText(PkgName,'fcl')=0 then begin
// search in FPC sources
Filename:=CodeToolBoss.DirectoryCachePool.FindUnitInUnitSet('',AnUnitName);

View File

@ -3868,6 +3868,8 @@ resourcestring
+'installed, but the lpk file was not found. All its components are '
+'deactivated. Please fix this.';
lisPkgSysPackageFileNotFound = 'Package file not found';
lisPkgMangTheFileOfPackageWasNotFound = 'The file "%s" of package %s was not'
+' found.';
lisPkgSysThePackageIsInstalledButNoValidPackageFileWasFound = 'The package %'
+'s%s%s is installed, but no valid package file (.lpk) was found.%sA broken '
+'dummy package was created.';

View File

@ -9034,13 +9034,6 @@ begin
WasVirtual:=AnUnitInfo.IsVirtual;
WasPascalSource:=FilenameIsPascalSource(AnUnitInfo.Filename);
// check if file is writable on disk
if (not AnUnitInfo.IsVirtual)
and FileExistsUTF8(AnUnitInfo.Filename) then
AnUnitInfo.FileReadOnly:=not FileIsWritable(AnUnitInfo.Filename)
else
AnUnitInfo.FileReadOnly:=false;
// if this file is part of the project and the project is virtual then save
// project first
if (not (sfProjectSaving in Flags)) and Project1.IsVirtual
@ -9075,13 +9068,6 @@ begin
exit;
end;
// if file is readonly then a simple Save is skipped
if (AnUnitInfo.ReadOnly) and ([sfSaveToTestDir,sfSaveAs]*Flags=[]) then
begin
Result:=mrOk;
exit;
end;
// if nothing modified then a simple Save can be skipped
//writeln('TMainIDE.DoSaveEditorFile A ',AnUnitInfo.Filename,' ',AnUnitInfo.NeedsSaveToDisk);
if ([sfSaveToTestDir,sfSaveAs]*Flags=[])
@ -9096,6 +9082,20 @@ begin
exit;
end;
// check if file is writable on disk
if (not AnUnitInfo.IsVirtual)
and FileExistsUTF8(AnUnitInfo.Filename) then
AnUnitInfo.FileReadOnly:=not FileIsWritable(AnUnitInfo.Filename)
else
AnUnitInfo.FileReadOnly:=false;
// if file is readonly then a simple Save is skipped
if (AnUnitInfo.ReadOnly) and ([sfSaveToTestDir,sfSaveAs]*Flags=[]) then
begin
Result:=mrOk;
exit;
end;
// load old resource file
LFMCode:=nil;
ResourceCode:=nil;

View File

@ -79,7 +79,7 @@ type
function GetFullFilename: string; virtual; abstract;
function GetShortFilename(UseUp: boolean): string; virtual; abstract;
public
property Filename: string read FFilename write SetFilename; // can contain macros if package was auto created
property Filename: string read FFilename write SetFilename; // can contain macros
property LazPackage: TIDEPackage read GetIDEPackage;
property Removed: boolean read FRemoved write SetRemoved;
property DisableI18NForLFM: boolean read FDisableI18NForLFM write SetDisableI18NForLFM;

View File

@ -181,7 +181,6 @@ type
procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string;
UsePathDelim: TPathDelimSwitch);
procedure ConsistencyCheck;
function GetShortFilename(UseUp: boolean): string; override;
function ComponentCount: integer;
procedure AddPkgComponent(APkgComponent: TPkgComponent);
procedure RemovePkgComponent(APkgComponent: TPkgComponent);
@ -189,6 +188,7 @@ type
function MakeSense: boolean;
procedure UpdateSourceDirectoryReference;
function GetFullFilename: string; override;
function GetShortFilename(UseUp: boolean): string; override;
function GetResolvedFilename: string; // GetFullFilename + ReadAllLinks
public
property AddToUsesPkgSection: boolean
@ -1495,14 +1495,9 @@ var
begin
NewFilename:=AValue;
DoDirSeparators(NewFilename);
LazPackage.LongenFilename(NewFilename);
if Filename=NewFilename then exit;
inherited SetFilename(NewFilename);
fFullFilenameStamp:=CompilerParseStamp;
if fFullFilenameStamp=Low(fFullFilenameStamp) then
fFullFilenameStamp:=High(fFullFilenameStamp)
else
dec(fFullFilenameStamp);
fFullFilenameStamp:=InvalidParseStamp;
OldDirectory:=FDirectory;
FDirectory:=ExtractFilePath(Filename);
if OldDirectory<>FDirectory then begin
@ -1646,11 +1641,15 @@ begin
if fFullFilenameStamp<>CompilerParseStamp then begin
fFullFilename:=Filename;
fFullFilenameStamp:=CompilerParseStamp;
if LazPackage<>nil then
LazPackage.SubstitutePkgMacros(fFullFilename,false)
else
if LazPackage<>nil then begin
LazPackage.SubstitutePkgMacros(fFullFilename,false);
fFullFilename:=TrimFilename(fFullFilename);
LazPackage.LongenFilename(fFullFilename);
end
else begin
IDEMacros.SubstituteMacros(fFullFilename);
fFullFilename:=TrimAndExpandFilename(fFullFilename);
fFullFilename:=TrimAndExpandFilename(fFullFilename);
end;
end;
Result:=fFullFilename;
end;
@ -1775,7 +1774,7 @@ end;
function TPkgFile.GetResolvedFilename: string;
begin
Result:=ReadAllLinks(GetFullFilename,false);
if Result='' then Result:=Filename;
if Result='' then Result:=GetFullFilename;
end;
{ TPkgDependency }
@ -3112,14 +3111,16 @@ begin
Cnt:=FileCount;
for i:=0 to Cnt-1 do begin
Result:=Files[i];
if CompareFilenames(Result.Filename,TheFilename)=0 then
if (CompareFilenames(Result.Filename,TheFilename)=0)
or (CompareFilenames(Result.GetFullFilename,TheFilename)=0) then
exit;
end;
if not IgnoreRemoved then begin
Cnt:=RemovedFilesCount;
for i:=0 to Cnt-1 do begin
Result:=RemovedFiles[i];
if CompareFilenames(Result.Filename,TheFilename)=0 then
if (CompareFilenames(Result.Filename,TheFilename)=0)
or (CompareFilenames(Result.GetFullFilename,TheFilename)=0) then
exit;
end;
end;
@ -3252,6 +3253,7 @@ begin
end;
with Result do begin
Filename:=NewFilename;
debugln(['TLazPackage.AddFile Is=',Filename,' Should=',NewFilename]);
Unit_Name:=NewUnitName;
FileType:=NewFileType;
Flags:=NewFlags;
@ -3262,6 +3264,7 @@ begin
AutoReferenceSourceDir:=true;
end;
FFiles.Add(Result);
debugln(['TLazPackage.AddFile Is=',Result.Filename,' Should=',NewFilename]);
Modified:=true;
end;
@ -3315,7 +3318,7 @@ begin
while i>=0 do begin
if i>=FileCount then continue;
AFilename:=Files[i].GetResolvedFilename;
if (AFilename='') or (not FileExistsCached(Files[i].Filename)) then
if (AFilename='') or (not FileExistsCached(AFilename)) then
begin
RemoveFile(Files[i]);
Result:=true;
@ -3423,6 +3426,7 @@ var
NewShortFilename: string;
NewFilename: String;
CurDir: String;
AFilename: String;
begin
Result:=false;
Cnt:=FileCount;
@ -3430,10 +3434,11 @@ begin
try
for i:=0 to Cnt-1 do begin
CurFile:=Files[i];
CurDir:=CurFile.Directory;
//debugln('TLazPackage.FixFilesCaseSensitivity A ',dbgs(i),' CurFile.Filename=',CurFile.Filename);
AFilename:=CurFile.GetFullFilename;
CurShortFilename:=ExtractFilename(AFilename);
CurDir:=ExtractFilePath(AFilename);
DirListing:=AddDirectoryListing(CurDir);
CurShortFilename:=ExtractFilename(CurFile.Filename);
DirListID:=IndexOfFileInStringList(DirListing,CurShortFilename,false);
//debugln('TLazPackage.FixFilesCaseSensitivity B ',dbgs(i),' CurShortFilename=',CurShortFilename,' DirListID=',dbgs(DirListID));
if DirListID<0 then continue;

View File

@ -492,7 +492,7 @@ begin
if (PkgFile<>nil) then begin
if Removed then begin
// re-add file
AFilename:=PkgFile.Filename;
AFilename:=PkgFile.GetFullFilename;
if PkgFile.FileType in PkgFileRealUnitTypes then begin
if not CheckAddingUnitFilename(LazPackage,d2ptUnit,
PackageEditors.OnGetIDEFileInfo,AFilename) then exit;
@ -544,7 +544,7 @@ var
begin
PkgEditMenuSectionFileType.Clear;
VirtualFileExists:=(CurFile.FileType=pftVirtualUnit)
and FileExistsUTF8(CurFile.Filename);
and FileExistsCached(CurFile.GetFullFilename);
for CurPFT:=Low(TPkgFileType) to High(TPkgFileType) do begin
NewMenuItem:=RegisterIDEMenuCommand(PkgEditMenuSectionFileType,
'SetFileType'+IntToStr(ord(CurPFT)),
@ -1536,8 +1536,10 @@ var
Include(NewPkgFileFlags,pffHasRegisterProc);
end;
end;
debugln(['AddNewFile AAA1 NewFilename=',NewFilename]);
FNextSelectedPart := LazPackage.AddFile(NewFilename,NewUnitName,NewFileType,
NewPkgFileFlags, cpNormal);
debugln(['AddNewFile AAA2 ',TPkgFile(FNextSelectedPart).Filename]);
UpdateAll(true);
end;
end;

View File

@ -2947,6 +2947,7 @@ var
o: TPkgOutputDir;
Stats: PPkgLastCompileStats;
SrcPPUFile: String;
AFilename: String;
begin
Result:=mrYes;
{$IFDEF VerbosePkgCompile}
@ -3103,8 +3104,9 @@ begin
for i:=0 to APackage.FileCount-1 do begin
CurFile:=APackage.Files[i];
//debugln(['TLazPackageGraph.CheckIfPackageNeedsCompilation CurFile.Filename="',CurFile.Filename,'" Exists=',FileExistsUTF8(CurFile.Filename),' NewerThanStateFile=',StateFileAge<FileAgeCached(CurFile.Filename)]);
if FileExistsCached(CurFile.Filename)
and (StateFileAge<FileAgeCached(CurFile.Filename)) then begin
AFilename:=CurFile.GetFullFilename;
if FileExistsCached(AFilename)
and (StateFileAge<FileAgeCached(AFilename)) then begin
DebugLn('TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile Src has changed ',APackage.IDAsString,' ',CurFile.Filename);
exit(mrYes);
end;
@ -3934,6 +3936,7 @@ var
NewShortenSrc: String;
BeautifyCodeOptions: TBeautifyCodeOptions;
AddedUnitNames: TStringToStringTree;
AFilename: String;
procedure UseUnit(AnUnitName: string);
begin
@ -3967,12 +3970,13 @@ begin
CurFile:=APackage.Files[i];
if CurFile.FileType=pftMainUnit then continue;
// update unitname
if FilenameIsPascalUnit(CurFile.Filename)
AFilename:=CurFile.GetFullFilename;
if FilenameIsPascalUnit(AFilename)
and (CurFile.FileType in PkgFileUnitTypes) then begin
NeedsRegisterProcCall:=CurFile.HasRegisterProc
and (APackage.PackageType in [lptDesignTime,lptRunAndDesignTime]);
CurUnitName:=ExtractFileNameOnly(CurFile.Filename);
CurUnitName:=ExtractFileNameOnly(AFilename);
if not (NeedsRegisterProcCall or CurFile.AddToUsesPkgSection) then
continue;
@ -3981,7 +3985,7 @@ begin
// the filename is all lowercase, so we can use the nicer unitname from
// the source.
CodeBuffer:=CodeToolBoss.LoadFile(CurFile.Filename,false,false);
CodeBuffer:=CodeToolBoss.LoadFile(AFilename,false,false);
if CodeBuffer<>nil then begin
// if the unit is edited, the unitname is probably already cached
CurSrcUnitName:=CodeToolBoss.GetCachedSourceName(CodeBuffer);

View File

@ -287,6 +287,7 @@ type
function DoCloseAllPackageEditors: TModalResult; override;
function DoAddActiveUnitToAPackage: TModalResult;
function DoNewPackageComponent: TModalResult;
function SavePackageFiles(APackage: TLazPackage): TModalResult;
function WarnAboutMissingPackageFiles(APackage: TLazPackage): TModalResult;
function AddPackageDependency(APackage: TLazPackage; const ReqPackage: string;
OnlyTestIfPossible: boolean = false): TModalResult; override;
@ -459,7 +460,7 @@ begin
if PkgFile.FileType=pftVirtualUnit then
Filename:=FindVirtualUnitSource(PkgFile);
if Filename='' then
Filename:=PkgFile.Filename;
Filename:=PkgFile.GetFullFilename;
MainIDE.DoOpenFileAndJumpToIdentifier(
Filename,PkgComponent.ComponentClass.ClassName,
-1, -1, // open page somewhere
@ -2318,6 +2319,10 @@ begin
exit;
end;
// save new or changed files
Result:=SavePackageFiles(APackage);
if Result<>mrOk then exit;
// warn about missing files
Result:=WarnAboutMissingPackageFiles(APackage);
if Result<>mrOk then exit;
@ -2635,9 +2640,6 @@ begin
if Result<>mrOk then exit;
end;
Result:=WarnAboutMissingPackageFiles(APackage);
if Result<>mrOk then exit;
Result:=PackageGraph.CompilePackage(APackage,Flags,false);
end;
@ -3080,7 +3082,7 @@ begin
for j:=0 to CurPackage.FileCount-1 do begin
CurPkgFile:=CurPackage.Files[j];
if CurPkgFile.FileType in PkgFileUnitTypes then
AddFile(CurOwner,CurPkgFile.Filename);
AddFile(CurOwner,CurPkgFile.GetFullFilename);
end;
end else if CurOwner is TProject then begin
CurProject:=TProject(CurOwner);
@ -3286,7 +3288,8 @@ begin
exit;
end;
end;
Result:=MainIDE.DoOpenMacroFile(Self,PkgFile.Filename);
Result:=MainIDE.DoOpenEditorFile(PkgFile.GetFullFilename,-1,-1,
[ofOnlyIfExists,ofAddToRecent,ofRegularFile]);
end;
function TPkgManager.FindVirtualUnitSource(PkgFile: TPkgFile): string;
@ -3296,7 +3299,7 @@ begin
and (PkgFile.LazPackage<>nil)
and (not FileExistsUTF8(PkgFile.Filename)) then begin
Result:=MainIDE.FindSourceFile(PkgFile.GetShortFilename(false),
PkgFile.LazPackage.Directory,[]);
PkgFile.LazPackage.Directory,[]);
end;
end;
@ -3488,12 +3491,48 @@ begin
Result:=CurEditor.ShowAddDialog(Page);
end;
function TPkgManager.WarnAboutMissingPackageFiles(APackage: TLazPackage): TModalResult;
function TPkgManager.SavePackageFiles(APackage: TLazPackage): TModalResult;
var
i, j: Integer;
i: Integer;
AFile: TPkgFile;
AFilename: String;
SaveFlags: TSaveFlags;
SrcEdit: TSourceEditor;
begin
Result:=mrOk;
for i:=0 to APackage.FileCount-1 do begin
AFile:=APackage.Files[i];
if AFile.FileType=pftVirtualUnit then continue;
AFilename:=AFile.Filename;
if System.Pos('$(',AFilename)>0 then begin
// filename contains macros -> skip
//debugln(['TPkgManager.SavePackageFiles macros ',AFilename]);
continue;
end;
// check if open in editor
SrcEdit:=SourceEditorManager.SourceEditorIntfWithFilename(AFilename);
if SrcEdit=nil then
begin
// not open in source editor => skip
//debugln(['TPkgManager.SavePackageFiles no src edit ',AFilename]);
continue;
end;
SaveFlags:=[sfCanAbort];
if not FilenameIsAbsolute(AFilename) then
SaveFlags:=[sfSaveAs];
debugln(['TPkgManager.SavePackageFiles saving ',AFilename]);
Result:=LazarusIDE.DoSaveEditorFile(SrcEdit,SaveFlags);
if Result=mrIgnore then Result:=mrOk;
if Result<>mrOk then exit;
end;
end;
function TPkgManager.WarnAboutMissingPackageFiles(APackage: TLazPackage
): TModalResult;
var
i: Integer;
AFile: TPkgFile;
AFilename: String;
UEInfo: TUnitEditorInfo;
begin
Result:=mrOk;
for i:=0 to APackage.FileCount-1 do begin
@ -3502,47 +3541,18 @@ begin
AFilename:=AFile.GetFullFilename;
if System.Pos('$(',AFilename)>0 then begin
// filename contains macros -> skip
continue;
end;
if FilenameIsAbsolute(APackage.Filename) and FilenameIsAbsolute(AFilename) then begin
APackage.LongenFilename(AFilename);
end;
if FilenameIsAbsolute(AFilename) then begin
// "Normal" file
if not FileExistsCached(AFilename) then begin
if not APackage.IsVirtual then
AFilename:=CreateRelativePath(AFilename,APackage.Directory);
for j := 0 to Project1.AllEditorsInfoCount-1 do begin
UEInfo:=Project1.AllEditorsInfo[j];
if Assigned(UEInfo.EditorComponent) then // Editor is open
if UEInfo.UnitInfo.Filename=AFilename then begin //,sfSaveNonProjectFiles
Result:=LazarusIDE.DoSaveEditorFile(UEInfo.EditorComponent,[sfSaveAs]);
Break;
end;
end;
{ Result:=IDEQuestionDialog(lisPkgMangPackageFileMissing,
Format(lisPkgMangTheFileOfPackageIsMissing,
['"', AFilename, '"', #13, APackage.IDAsString]),
mtWarning,[mrIgnore,mrAbort]);
if Result<>mrAbort then
Result:=mrOk;
// one warning is enough
exit;
}
end;
end
else begin
Assert(False, 'Package Filename can be Virtual after all');
{ if not APackage.IsVirtual then begin
// an unsaved file
Result:=IDEQuestionDialog(lisPkgMangPackageFileNotSaved,
Format(lisPkgMangTheFileOfPackageNeedsToBeSavedFirst,
['"', AFilename, '"', #13, APackage.IDAsString]),
mtWarning, [mrIgnore, lisPkgMangIgnoreAndSavePackageNow, mrAbort]);
if Result<>mrAbort then
Result:=mrOk;
end;
}
end;
if FilenameIsAbsolute(AFilename) and FileExistsCached(AFilename) then
continue;
Result:=IDEQuestionDialog(lisPkgSysPackageFileNotFound,
Format(lisPkgMangTheFileOfPackageWasNotFound, [AFilename, APackage.
IDAsString]),
mtWarning,[mrIgnore,mrAbort]);
if Result<>mrAbort then
Result:=mrOk;
// one warning is enough
exit;
end;
end;