Installer: Write environment variables as expandable strings
authorSebastian Schuberth <sschuberth@gmail.com>
Wed, 5 Feb 2014 13:16:35 +0000 (5 14:16 +0100)
committerSebastian Schuberth <sschuberth@gmail.com>
Wed, 5 Feb 2014 13:18:30 +0000 (5 14:18 +0100)
This allows to refer to other variables from within a variable.

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

index dadf875..50824ec 100644 (file)
@@ -54,10 +54,12 @@ external 'SetEnvironmentVariableA@Kernel32.dll stdcall delayload';
 #endif\r
 \r
 // Sets the environment variable "VarName" to the concatenation of "DirStrings"\r
-// using ";" as the delimiter. If "AllUsers" is true, a common variable is set,\r
-// else a user-specific one. If "DeleteIfEmpty" is true and "DirStrings" is\r
-// empty, "VarName" is deleted instead of set if it exists.\r
-function SetEnvStrings(VarName:string;AllUsers,DeleteIfEmpty:Boolean;DirStrings:TArrayOfString):Boolean;\r
+// using ";" as the delimiter. If "Expandable" is true, the "DirStrings" will be\r
+// written as expandable strings, i.e. they may in turn contain environment variable\r
+// names that are expanded at evaluation time. If "AllUsers" is true, a common\r
+// variable is set, else a user-specific one. If "DeleteIfEmpty" is true and\r
+// "DirStrings" is empty, "VarName" is deleted instead of set if it exists.\r
+function SetEnvStrings(VarName:string;DirStrings:TArrayOfString;Expandable,AllUsers,DeleteIfEmpty:Boolean):Boolean;\r
 var\r
     Path,KeyName:string;\r
     i:Longint;\r
@@ -81,7 +83,11 @@ begin
             Result:=(not RegValueExists(HKEY_LOCAL_MACHINE,KeyName,VarName)) or\r
                          RegDeleteValue(HKEY_LOCAL_MACHINE,KeyName,VarName);\r
         end else begin\r
-            Result:=RegWriteStringValue(HKEY_LOCAL_MACHINE,KeyName,VarName,Path);\r
+            if Expandable then begin\r
+                Result:=RegWriteExpandStringValue(HKEY_LOCAL_MACHINE,KeyName,VarName,Path);\r
+            end else begin\r
+                Result:=RegWriteStringValue(HKEY_LOCAL_MACHINE,KeyName,VarName,Path);\r
+            end;\r
         end;\r
     end else begin\r
         KeyName:='Environment';\r
@@ -89,7 +95,11 @@ begin
             Result:=(not RegValueExists(HKEY_CURRENT_USER,KeyName,VarName)) or\r
                          RegDeleteValue(HKEY_CURRENT_USER,KeyName,VarName);\r
         end else begin\r
-            Result:=RegWriteStringValue(HKEY_CURRENT_USER,KeyName,VarName,Path);\r
+            if Expandable then begin\r
+                Result:=RegWriteExpandStringValue(HKEY_CURRENT_USER,KeyName,VarName,Path);\r
+            end else begin\r
+                Result:=RegWriteStringValue(HKEY_CURRENT_USER,KeyName,VarName,Path);\r
+            end;\r
         end;\r
     end;\r
 \r
index 4c4cb0a..ba5b355 100644 (file)
@@ -354,7 +354,7 @@ begin
     end;\r
 end;\r
 \r
-procedure SetAndMarkEnvString(Name,Value:String);\r
+procedure SetAndMarkEnvString(Name,Value:String;Expandable:Boolean);\r
 var\r
     Env:TArrayOfString;\r
     FileName,Msg:String;\r
@@ -363,7 +363,7 @@ begin
     Env[0]:=Value;\r
 \r
     // Try to set the variable as specified by the user.\r
-    if not SetEnvStrings(Name,IsAdminLoggedOn,True,Env) then begin\r
+    if not SetEnvStrings(Name,Env,Expandable,IsAdminLoggedOn,True) then begin\r
         Msg:='Line {#__LINE__}: Unable to set the '+Name+' environment variable.';\r
 \r
         // This is not a critical error, so just notify the user and continue.\r
@@ -392,7 +392,7 @@ begin
 \r
     if (GetArrayLength(Env)=1) and\r
        (CompareStr(RemoveQuotes(Env[0]),GetIniString('Environment',Name,'',FileName))=0) then begin\r
-        if not SetEnvStrings(Name,IsAdminLoggedOn,True,[]) then begin\r
+        if not SetEnvStrings(Name,[],False,IsAdminLoggedOn,True) then begin\r
             Msg:='Line {#__LINE__}: Unable to delete the '+Name+' environment variable.';\r
 \r
             // This is not a critical error, so just notify the user and continue.\r
@@ -1016,8 +1016,8 @@ begin
     DeleteMarkedEnvString('SVN_SSH');\r
 \r
     if (PuTTYPage<>NIL) and RdbSSH[GS_Plink].Checked then begin\r
-        SetAndMarkEnvString('GIT_SSH',EdtPlink.Text);\r
-        SetAndMarkEnvString('SVN_SSH',EdtPlink.Text);\r
+        SetAndMarkEnvString('GIT_SSH',EdtPlink.Text,True);\r
+        SetAndMarkEnvString('SVN_SSH',EdtPlink.Text,True);\r
     end;\r
 \r
     // Get the current user's directories in PATH.\r
@@ -1050,13 +1050,13 @@ begin
             EnvHome:=GetEnvStrings('HOME',IsAdminLoggedOn);\r
             i:=GetArrayLength(EnvHome);\r
             if (i=0) or ((i=1) and (Length(EnvHome[0])=0)) then begin\r
-                SetAndMarkEnvString('HOME',ExpandConstant('{%HOMEDRIVE}{%HOMEPATH}'));\r
+                SetAndMarkEnvString('HOME','%HOMEDRIVE%%HOMEPATH%',True);\r
             end;\r
         end;\r
     end;\r
 \r
     // Set the current user's PATH directories.\r
-    if not SetEnvStrings('PATH',IsAdminLoggedOn,True,EnvPath) then begin\r
+    if not SetEnvStrings('PATH',EnvPath,True,IsAdminLoggedOn,True) then begin\r
         Msg:='Line {#__LINE__}: Unable to set the PATH environment variable.';\r
 \r
         // This is not a critical error, so just notify the user and continue.\r
@@ -1361,7 +1361,7 @@ begin
     end;\r
 \r
     // Reset the current user's directories in PATH.\r
-    if not SetEnvStrings('PATH',IsAdminLoggedOn,True,EnvPath) then begin\r
+    if not SetEnvStrings('PATH',EnvPath,True,IsAdminLoggedOn,True) then begin\r
         Msg:='Line {#__LINE__}: Unable to revert any possible changes to PATH.';\r
 \r
         // This is not a critical error, so just notify the user and continue.\r