From f8ce6c0ed18b235b64cf495d8da166916edf9df7 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Sat, 30 Aug 2025 06:15:11 +0200 Subject: [PATCH] fix(developer): handle failure to create destination path when generating new project Add better error handling for situation where destination path cannot be created, for all project types. Also report back the Windows error message which hopefully clarifies why the directory could not be created. Fixes: #14348 Fixes: KEYMAN-DEVELOPER-1P1 Fixes: KEYMAN-DEVELOPER-2SN Test-bot: skip --- ...Developer.System.ImportWindowsKeyboard.pas | 2 ++ ...veloper.System.KeyboardProjectTemplate.pas | 3 ++- ...man.Developer.System.KeymanConvertMain.pas | 22 ++++++++++++++++--- ...per.System.LdmlKeyboardProjectTemplate.pas | 3 ++- ....Developer.System.ModelProjectTemplate.pas | 3 ++- ...t.UfrmNewLDMLKeyboardProjectParameters.pas | 7 +++++- ....Project.UfrmNewModelProjectParameters.pas | 7 +++++- ...er.UI.Project.UfrmNewProjectParameters.pas | 7 +++++- 8 files changed, 45 insertions(+), 9 deletions(-) diff --git a/developer/src/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas b/developer/src/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas index f5384903d9..3643f8c70c 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas @@ -251,6 +251,8 @@ begin except on E:EKeyboardProjectTemplate do Exit(Fail('Unable to generate template: '+E.Message)); + on E:EFOpenError do + Exit(Fail('Unable to create project; template files may be missing: '+E.Message)); end; FProjectFilename := FTemplate.ProjectFilename; diff --git a/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas b/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas index dc274d082d..b1f5a3e406 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas @@ -86,7 +86,8 @@ end; procedure TKeyboardProjectTemplate.Generate; begin if not ForceDirectories(BasePath + ID + '\' + SFolder_Source) then - raise EKeyboardProjectTemplate.Create('Could not create destination path '+BasePath+ID); + raise EKeyboardProjectTemplate.Create('Could not create destination path '''+BasePath+ID+'''. '+ + 'Please check the path and try again. The error was: '+SysErrorMessage(GetLastError)); WriteDocumentation; diff --git a/developer/src/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas b/developer/src/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas index f65bfb0683..b6eae962d2 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas @@ -7,6 +7,7 @@ procedure Run; implementation uses + System.Classes, System.SysUtils, Winapi.ActiveX, @@ -100,7 +101,12 @@ begin except on E:EKeyboardProjectTemplate do begin - writeln(E.Message); + writeln('ERROR: Unable to create project: '+E.Message); + Exit(False); + end; + on E:EFOpenError do + begin + writeln('ERROR: Unable to create project; template files may be missing: '+E.Message); Exit(False); end; end; @@ -138,7 +144,12 @@ begin except on E:ELDMLKeyboardProjectTemplate do begin - writeln(E.Message); + writeln('ERROR: Unable to create project: '+E.Message); + Exit(False); + end; + on E:EFOpenError do + begin + writeln('ERROR: Unable to create project; template files may be missing: '+E.Message); Exit(False); end; end; @@ -176,7 +187,12 @@ begin except on E:EModelProjectTemplate do begin - writeln(E.Message); + writeln('ERROR: Unable to create project: '+E.Message); + Exit(False); + end; + on E:EFOpenError do + begin + writeln('ERROR: Unable to create project; template files may be missing: '+E.Message); Exit(False); end; end; diff --git a/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas b/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas index 6f5bfc7041..4b396dbc8e 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas @@ -56,7 +56,8 @@ end; procedure TLDMLKeyboardProjectTemplate.Generate; begin if not ForceDirectories(BasePath + ID + '\' + SFolder_Source) then - raise ELDMLKeyboardProjectTemplate.Create('Could not create destination path '+BasePath+ID); + raise ELDMLKeyboardProjectTemplate.Create('Could not create destination path '''+BasePath+ID+'''. '+ + 'Please check the path and try again. The error was: '+SysErrorMessage(GetLastError)); WriteDocumentation; diff --git a/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas b/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas index 42ac45d082..cceee29475 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas @@ -70,7 +70,8 @@ end; procedure TModelProjectTemplate.Generate; begin if not ForceDirectories(BasePath + ID + '\' + SFolder_Source) then - raise EModelProjectTemplate.Create('Could not create destination path '+BasePath+ID); + raise EModelProjectTemplate.Create('Could not create destination path '''+BasePath+ID+'''. '+ + 'Please check the path and try again. The error was: '+SysErrorMessage(GetLastError)); WriteDocumentation; diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.pas index 3868b6281b..d51ecc695b 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.pas @@ -154,11 +154,16 @@ begin try pt.Generate; except - on E:EFOpenError do + on E:ELDMLKeyboardProjectTemplate do begin ShowMessage('Unable to create project: '+E.Message); Exit(False); end; + on E:EFOpenError do + begin + ShowMessage('Unable to create project; template files may be missing: '+E.Message); + Exit(False); + end; end; frmKeymanDeveloper.OpenProject(pt.ProjectFilename); diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewModelProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewModelProjectParameters.pas index 6f94062480..7640d253fa 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewModelProjectParameters.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewModelProjectParameters.pas @@ -166,11 +166,16 @@ begin try pt.Generate; except - on E:EFOpenError do + on E:EModelProjectTemplate do begin ShowMessage('Unable to create project: '+E.Message); Exit(False); end; + on E:EFOpenError do + begin + ShowMessage('Unable to create project; template files may be missing: '+E.Message); + Exit(False); + end; end; frmKeymanDeveloper.OpenProject(pt.ProjectFilename); diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas index bac2ffd9a9..d13dfebbaa 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas @@ -167,11 +167,16 @@ begin try pt.Generate; except - on E:EFOpenError do + on E:EKeyboardProjectTemplate do begin ShowMessage('Unable to create project: '+E.Message); Exit(False); end; + on E:EFOpenError do + begin + ShowMessage('Unable to create project; template files may be missing: '+E.Message); + Exit(False); + end; end; frmKeymanDeveloper.OpenProject(pt.ProjectFilename);