From 967bf6dfd1486c0927244b72c507884b012859de Mon Sep 17 00:00:00 2001 From: mattias Date: Fri, 18 May 2018 21:34:39 +0000 Subject: [PATCH] IDE: fix invalid localized package names git-svn-id: trunk@57961 - --- components/codetools/basiccodetools.pas | 33 ++++++++++++++++++++ components/ideintf/packagedependencyintf.pas | 6 ++-- packager/packageeditor.pas | 11 +++++-- packager/packagesystem.pas | 6 ++-- packager/pkgmanager.pas | 20 ++++++------ 5 files changed, 58 insertions(+), 18 deletions(-) diff --git a/components/codetools/basiccodetools.pas b/components/codetools/basiccodetools.pas index 80878ee3a3..b4c8f079fc 100644 --- a/components/codetools/basiccodetools.pas +++ b/components/codetools/basiccodetools.pas @@ -113,6 +113,7 @@ function FindNextIdentifierSkipStrings(const Source: string; StartPos, MaxPos: integer): integer; function IsValidIdentPair(const NamePair: string): boolean; function IsValidIdentPair(const NamePair: string; out First, Second: string): boolean; +function ExtractPasIdentifier(const Ident: string; AllowDots: Boolean): string; // line/code ends function SrcPosToLineCol(const s: string; Position: integer; @@ -4818,6 +4819,38 @@ begin until false; end; +function ExtractPasIdentifier(const Ident: string; AllowDots: Boolean): string; +var + p: Integer; +begin + p:=1; + Result:=Ident; + while p<=length(Result) do begin + if Result[p] in ['a'..'z','A'..'Z','_'] then begin + inc(p); + while p<=length(Result) do begin + case Result[p] of + 'a'..'z','A'..'Z','_','0'..'9': inc(p); + '.': + if AllowDots then + break + else + Delete(Result,p,1); + else + Delete(Result,p,1); + end; + end; + if p>length(Result) then exit; + // p is now on the '.' + inc(p); + end else + Delete(Result,p,1); + end; + p:=length(Result); + if (p>0) and (Result[p]='.') then + Delete(Result,p,1); +end; + function GetLineIndentWithTabs(const Source: string; Position: integer; TabWidth: integer): integer; var p: integer; diff --git a/components/ideintf/packagedependencyintf.pas b/components/ideintf/packagedependencyintf.pas index 918b3260f3..4a0f93e24c 100644 --- a/components/ideintf/packagedependencyintf.pas +++ b/components/ideintf/packagedependencyintf.pas @@ -101,9 +101,9 @@ type property Removed: boolean read FRemoved write FRemoved; end; - function IsValidUnitName(AUnitName: String): Boolean; inline; - function IsValidPkgName(APkgName: String): Boolean; inline; - function PackageFileNameIsValid(const AFilename: string): boolean; +function IsValidUnitName(AUnitName: String): Boolean; inline; +function IsValidPkgName(APkgName: String): Boolean; inline; +function PackageFileNameIsValid(const AFilename: string): boolean; implementation diff --git a/packager/packageeditor.pas b/packager/packageeditor.pas index 19fc64ad65..86bdb749a7 100644 --- a/packager/packageeditor.pas +++ b/packager/packageeditor.pas @@ -377,6 +377,7 @@ type function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult; function ShowAddDialog(var DlgPage: TAddToPkgType): TModalResult; function ShowAddDepDialog: TModalResult; + function PkgNameToFormName(const PkgName: string): string; public // IFilesEditorInterface function FilesEditTreeView: TTreeView; @@ -1879,8 +1880,7 @@ procedure TPackageEditorForm.SetLazPackage(const AValue: TLazPackage); begin //force editor name change when package name changed! if (FLazPackage=Nil) - and ( (AValue=Nil) or (Name=PackageEditorWindowPrefix - +StringReplace(AValue.Name,'.','_',[rfReplaceAll])) ) + and ( (AValue=Nil) or (Name=PkgNameToFormName(AValue.Name)) ) then exit; if FLazPackage<>nil then @@ -2077,7 +2077,7 @@ procedure TPackageEditorForm.UpdateAll(Immediately: boolean); begin if csDestroying in ComponentState then exit; if LazPackage=nil then exit; - Name:=PackageEditorWindowPrefix + StringReplace(LazPackage.Name,'.','_',[rfReplaceAll]); + Name:=PkgNameToFormName(LazPackage.Name); if fForcedFlags<>[] then fFlags:=fFlags+fForcedFlags // Flags forcing a partial update else @@ -2292,6 +2292,11 @@ begin end; end; +function TPackageEditorForm.PkgNameToFormName(const PkgName: string): string; +begin + Result:=PackageEditorWindowPrefix+StringReplace(PkgName,'.','_',[rfReplaceAll]); +end; + procedure TPackageEditorForm.BeginUpdate; begin inc(fUpdateLock); diff --git a/packager/packagesystem.pas b/packager/packagesystem.pas index b7fd7b9b2e..e040feb88b 100644 --- a/packager/packagesystem.pas +++ b/packager/packagesystem.pas @@ -265,7 +265,7 @@ type public // searching function CheckIfPackageCanBeClosed(APackage: TLazPackage): boolean; - function CreateUniquePkgName(const Prefix: string; + function CreateUniquePkgName(Prefix: string; IgnorePackage: TLazPackage): string; function CreateUniqueUnitName(const Prefix: string): string; function DependencyExists(Dependency: TPkgDependency; @@ -1778,11 +1778,13 @@ begin Result:=false; end; -function TLazPackageGraph.CreateUniquePkgName(const Prefix: string; +function TLazPackageGraph.CreateUniquePkgName(Prefix: string; IgnorePackage: TLazPackage): string; var i: Integer; begin + if not IsValidPkgName(Prefix) then + RaiseException('invalid pkg name "'+Prefix+'"'); // try Prefix alone if not PackageNameExists(Prefix,IgnorePackage) then begin Result:=Prefix; diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index f20d9340f6..a0ffc33b1d 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -61,15 +61,15 @@ uses IDEMsgIntf, SrcEditorIntf, ComponentReg, PropEdits, IDEDialogs, UnitResources, // IDE PkgRegisterBase, IDECmdLine, LazarusIDEStrConsts, IDEProcs, ObjectLists, - DialogProcs, IDECommands, IDEOptionDefs, EnvironmentOpts, MiscOptions, - InputHistory, Project, PackageEditor, AddToPackageDlg, + DialogProcs, IDECommands, IDEOptionDefs, EnvironmentOpts, + MiscOptions, InputHistory, Project, PackageEditor, AddToPackageDlg, PackageDefs, PackageLinks, PackageSystem, OpenInstalledPkgDlg, - PkgGraphExplorer, BrokenDependenciesDlg, CompilerOptions, - IDETranslations, TransferMacros, BuildLazDialog, NewDialog, FindInFilesDlg, - ProjectInspector, SourceEditor, ProjPackChecks, AddFileToAPackageDlg, - LazarusPackageIntf, PublishProjectDlg, PkgLinksDlg, - InterPkgConflictFiles, InstallPkgSetDlg, ConfirmPkgListDlg, NewPkgComponentDlg, - BaseBuildManager, BasePkgManager, MainBar, MainIntf, MainBase, ModeMatrixOpts; + PkgGraphExplorer, BrokenDependenciesDlg, CompilerOptions, IDETranslations, + TransferMacros, BuildLazDialog, NewDialog, FindInFilesDlg, ProjectInspector, + SourceEditor, ProjPackChecks, AddFileToAPackageDlg, LazarusPackageIntf, + PublishProjectDlg, PkgLinksDlg, InterPkgConflictFiles, InstallPkgSetDlg, + ConfirmPkgListDlg, NewPkgComponentDlg, BaseBuildManager, BasePkgManager, + MainBar, MainIntf, MainBase, ModeMatrixOpts; type { TPkgManager } @@ -3509,7 +3509,7 @@ var begin Result:=mrCancel; // create a new package with standard dependencies - NewPackage:=PackageGraph.CreateNewPackage(lisPkgMangNewPackage); + NewPackage:=PackageGraph.CreateNewPackage(ExtractPasIdentifier(lisPkgMangNewPackage,true)); PackageGraph.AddDependencyToPackage(NewPackage, PackageGraph.FCLPackage.CreateDependencyWithOwner(NewPackage)); NewPackage.Modified:=false; @@ -5229,7 +5229,7 @@ begin if APackage=nil then begin // create new package // create a new package with standard dependencies - APackage:=PackageGraph.CreateNewPackage(lisPkgMangNewPackage); + APackage:=PackageGraph.CreateNewPackage(ExtractPasIdentifier(lisPkgMangNewPackage,true)); PackageGraph.AddDependencyToPackage(APackage, PackageGraph.IDEIntfPackage.CreateDependencyWithOwner(APackage)); APackage.Modified:=false;