Installer: Early check whether the installation directory is writable
authorSebastian Schuberth <sschuberth@gmail.com>
Sat, 14 May 2011 17:34:32 +0000 (14 19:34 +0200)
committerSebastian Schuberth <sschuberth@gmail.com>
Wed, 12 Sep 2012 07:52:52 +0000 (12 09:52 +0200)
This avoids the user from going through all the settings again in case
a directory was chosen that cannot be written to in setup's very last
copy step.

Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
share/WinGit/helpers.inc.iss
share/WinGit/install.iss

index ff187bf..0377dc5 100644 (file)
@@ -60,3 +60,25 @@ begin
         Result:=(Pos(Component,Value)>0);\r
     end;\r
 end;\r
+\r
+// Checks whether the specified directory can be created and written to.\r
+// Note that the created dummy file is not explicitly deleted here, so that\r
+// needs to be done as part of the uninstall process.\r
+function IsDirWritable(DirName:String):Boolean;\r
+var\r
+    FileName:String;\r
+begin\r
+    Result:=False;\r
+\r
+    if not ForceDirectories(DirName) then begin\r
+        Exit;\r
+    end;\r
+\r
+    FileName:=DirName+'\setup.ini';\r
+\r
+    if not SetIniBool('Dummy','Writable',true,FileName) then begin\r
+        Exit;\r
+    end;\r
+\r
+    Result:=GetIniBool('Dummy','Writable',false,FileName);\r
+end;\r
index b5d1de3..1abcd13 100644 (file)
@@ -698,6 +698,14 @@ procedure CurPageChanged(CurPageID:Integer);
 var\r
     i:Integer;\r
 begin\r
+    if CurPageID=wpSelectDir then begin\r
+        if not IsDirWritable(WizardDirValue) then begin\r
+            // If the default directory is not writable, choose another default that most likely is.\r
+            // This will be checked later again when the user clicks "Next".\r
+            WizardForm.DirEdit.Text:=ExpandConstant('{localappdata}\{#APP_NAME}');\r
+        end;\r
+    end;\r
+\r
     // Uncheck the console font option by default.\r
     if CurPageID=wpSelectComponents then begin\r
         for i:=0 to WizardForm.ComponentsList.Items.Count-1 do begin\r
@@ -723,6 +731,19 @@ var
 begin\r
     Result:=True;\r
 \r
+    if CurPageID=wpSelectDir then begin\r
+        if not IsDirWritable(WizardDirValue) then begin\r
+            MsgBox(\r
+                'The specified installation directory does not seem to be writable. ' +\r
+            +   'Please choose another directory or restart setup as a user with sufficient permissions.'\r
+            ,   mbCriticalError\r
+            ,   MB_OK\r
+            );\r
+            Result:=False;\r
+            Exit;\r
+        end;\r
+    end;\r
+\r
     if (PuTTYPage<>NIL) and (CurPageID=PuTTYPage.ID) then begin\r
         Result:=RdbSSH[GS_OpenSSH].Checked or\r
             (RdbSSH[GS_Plink].Checked and FileExists(EdtPlink.Text));\r