From bfb638cfc25b9af051859dc6325b03b5eded2c52 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 31 Dec 2019 10:26:54 -0500 Subject: [PATCH] Try EnVar_plugin for updating path. This should be more robust and not fail after upgrading. --- appveyor.yml | 1 + janet-installer.nsi | 23 +-- tools/EnVar_plugin.zip | Bin 0 -> 33630 bytes tools/EnvVarUpdate.nsh | 312 ----------------------------------------- 4 files changed, 14 insertions(+), 322 deletions(-) create mode 100644 tools/EnVar_plugin.zip delete mode 100644 tools/EnvVarUpdate.nsh diff --git a/appveyor.yml b/appveyor.yml index 00cafd69..4df22d58 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,6 +24,7 @@ install: # Replace makensis.exe and files with special long string build. This should # prevent issues when setting PATH during installation. - 7z e "tools\nsis-3.05-strlen_8192.zip" -o"C:\Program Files (x86)\NSIS\" -y + - 7z e "tools\EnVar_plugin.zip" -o"C:\Program Files (x86)\NSIS\" -y - build_win all - refreshenv # We need to reload vcvars after refreshing diff --git a/janet-installer.nsi b/janet-installer.nsi index 00533247..78787268 100644 --- a/janet-installer.nsi +++ b/janet-installer.nsi @@ -20,7 +20,6 @@ VIFileVersion "${PRODUCT_VERSION}" # Includes !include "MultiUser.nsh" !include "MUI2.nsh" -!include ".\tools\EnvVarUpdate.nsh" !include "LogicLib.nsh" # Basics @@ -124,6 +123,15 @@ section "Janet" BfWSection # Start Menu createShortCut "$SMPROGRAMS\Janet.lnk" "$INSTDIR\bin\janet.exe" "" "$INSTDIR\logo.ico" + # Update path + ${If} $MultiUser.InstallMode == "AllUsers" + EnVar::SetHKLM + ${Else} + EnVar::SetHKCU + ${EndIf} + EnVar::AddValue "PATH" "$INSTDIR\bin" + Pop $0 + # Set up Environment variables !insertmacro WriteEnv JANET_PATH "$INSTDIR\Library" !insertmacro WriteEnv JANET_HEADERPATH "$INSTDIR\C" @@ -132,13 +140,6 @@ section "Janet" BfWSection SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - # Update path - ${If} $MultiUser.InstallMode == "AllUsers" - ${EnvVarUpdate} $0 "PATH" "A" "HKLM" "$INSTDIR\bin" ; Append - ${Else} - ${EnvVarUpdate} $0 "PATH" "A" "HKCU" "$INSTDIR\bin" ; Append - ${EndIf} - # Registry information for add/remove programs WriteRegStr SHCTX "${UNINST_KEY}" "DisplayName" "Janet" WriteRegStr SHCTX "${UNINST_KEY}" "InstallLocation" "$INSTDIR" @@ -185,10 +186,12 @@ section "uninstall" # Unset PATH ${If} $MultiUser.InstallMode == "AllUsers" - ${un.EnvVarUpdate} $0 "PATH" "R" "HKLM" "$INSTDIR\bin" ; Remove + EnVar::SetHKLM ${Else} - ${un.EnvVarUpdate} $0 "PATH" "R" "HKCU" "$INSTDIR\bin" ; Remove + EnVar::SetHKCU ${EndIf} + EnVar::DeleteValue "PATH" "$INSTDIR\bin" + Pop $0 # make sure windows knows about the change SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 diff --git a/tools/EnVar_plugin.zip b/tools/EnVar_plugin.zip new file mode 100644 index 0000000000000000000000000000000000000000..cdee545e9ca50757bed846b7db7a5688f3cec1ff GIT binary patch literal 33630 zcma&NW3VVe+a!2w+qP}pW81cE+qP}nwr$(C&$)BoiJh5mcP3)Ca6}z(UFz; zRJFVmFbE33e~za}HSzym_1_ z07#9AGWPvNYcl^pfP4S|sQ(+*#Mafok%w+R6yX=2;Eq8yKseE4Og5;n{0c3y zn9I^cVg>Qdo^bwfl1MUvMnc0?tIx~KHO(u&^AH0za+$%}GA?5y!|rUoL{~MJF93=q z$W0a|p|AZFC_R+X8LS5IHGEf1Y^)Ccehyv5^BZY)NMvxA$!}H>BY4UAV)$AMOL2+Mj`t$%+ ziokJE1IPk`rv2fNA-#zp1e^Rdn>vp)lGoMf=pZ;(kI(1vd14BxIWVHn9y9TA16C%> zlO+WHeL5*ekG`iLHf`eI8oP-#<3o!4@p{$l&mn1=picJ_CPCK0w3PmAHo?JVkXl%s z9^j?psm`1_%sOThKbr3Jwh*mWo{pCU)?UC=scwETQr`Xz{0ri*#V=27+~<#}83!J0 zrcak255}tj4-K!C

XTmeJ-}plFv?UCY>6%jcGAnFYMOFqoUf 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 Q@%qOG2><}^_Vd&K2WuDd_5c6? literal 0 HcmV?d00001 diff --git a/tools/EnvVarUpdate.nsh b/tools/EnvVarUpdate.nsh deleted file mode 100644 index 54a804d7..00000000 --- a/tools/EnvVarUpdate.nsh +++ /dev/null @@ -1,312 +0,0 @@ -/** - * EnvVarUpdate.nsh - * : Environmental Variables: append, prepend, and remove entries - * - * WARNING: If you use StrFunc.nsh header then include it before this file - * with all required definitions. This is to avoid conflicts - * - * Usage: - * ${EnvVarUpdate} "ResultVar" "EnvVarName" "Action" "RegLoc" "PathString" - * - * Credits: - * Version 1.0 - * * Cal Turney (turnec2) - * * Amir Szekely (KiCHiK) and e-circ for developing the forerunners of this - * function: AddToPath, un.RemoveFromPath, AddToEnvVar, un.RemoveFromEnvVar, - * WriteEnvStr, and un.DeleteEnvStr - * * Diego Pedroso (deguix) for StrTok - * * Kevin English (kenglish_hi) for StrContains - * * Hendri Adriaens (Smile2Me), Diego Pedroso (deguix), and Dan Fuhry - * (dandaman32) for StrReplace - * - * Version 1.1 (compatibility with StrFunc.nsh) - * * techtonik - * - * http://nsis.sourceforge.net/Environmental_Variables:_append%2C_prepend%2C_and_remove_entries - * - */ - - -!ifndef ENVVARUPDATE_FUNCTION -!define ENVVARUPDATE_FUNCTION -!verbose push -!verbose 3 -!include "LogicLib.nsh" -!include "WinMessages.NSH" -!include "StrFunc.nsh" - -; ---------------------------------- Macro Definitions ---------------------------------------- -!macro _EnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString - Push "${EnvVarName}" - Push "${Action}" - Push "${RegLoc}" - Push "${PathString}" - Call EnvVarUpdate - Pop "${ResultVar}" -!macroend -!define EnvVarUpdate '!insertmacro "_EnvVarUpdateConstructor"' - -!macro _unEnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString - Push "${EnvVarName}" - Push "${Action}" - Push "${RegLoc}" - Push "${PathString}" - Call un.EnvVarUpdate - Pop "${ResultVar}" -!macroend -!define un.EnvVarUpdate '!insertmacro "_unEnvVarUpdateConstructor"' -; ---------------------------------- Macro Definitions end------------------------------------- - -;----------------------------------- EnvVarUpdate start---------------------------------------- -!define hklm_all_users 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' -!define hkcu_current_user 'HKCU "Environment"' - -!macro EnvVarUpdate UN - -Function ${UN}EnvVarUpdate - - Push $0 - Exch 4 - Exch $1 - Exch 3 - Exch $2 - Exch 2 - Exch $3 - Exch - Exch $4 - Push $5 - Push $6 - Push $7 - Push $8 - Push $9 - Push $R0 - - /* After this point: - ------------------------- - $0 = ResultVar (returned) - $1 = EnvVarName (input) - $2 = Action (input) - $3 = RegLoc (input) - $4 = PathString (input) - $5 = Orig EnvVar (read from registry) - $6 = Len of $0 (temp) - $7 = tempstr1 (temp) - $8 = Entry counter (temp) - $9 = tempstr2 (temp) - $R0 = tempChar (temp) */ - - ; Step 1: Read contents of EnvVarName from RegLoc - ; - ; Check for empty EnvVarName - ${If} $1 == "" - SetErrors - DetailPrint "ERROR: EnvVarName is blank" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ; Check for valid Action - ${If} $2 != "A" - ${AndIf} $2 != "P" - ${AndIf} $2 != "R" - SetErrors - DetailPrint "ERROR: Invalid Action - must be A, P, or R" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ${If} $3 == HKLM - ReadRegStr $5 ${hklm_all_users} $1 ; Get EnvVarName from all users into $5 - ${ElseIf} $3 == HKCU - ReadRegStr $5 ${hkcu_current_user} $1 ; Read EnvVarName from current user into $5 - ${Else} - SetErrors - DetailPrint 'ERROR: Action is [$3] but must be "HKLM" or HKCU"' - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ; Check for empty PathString - ${If} $4 == "" - SetErrors - DetailPrint "ERROR: PathString is blank" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ; Make sure we've got some work to do - ${If} $5 == "" - ${AndIf} $2 == "R" - SetErrors - DetailPrint "$1 is empty - Nothing to remove" - Goto EnvVarUpdate_Restore_Vars - ${EndIf} - - ; Step 2: Scrub EnvVar - ; - StrCpy $0 $5 ; Copy the contents to $0 - ; Remove spaces around semicolons (NOTE: spaces before the 1st entry or - ; after the last one are not removed here but instead in Step 3) - ${If} $0 != "" ; If EnvVar is not empty ... - ${Do} - ${${UN}StrStr} $7 $0 " ;" - ${If} $7 == "" - ${ExitDo} - ${EndIf} - ${${UN}StrRep} $0 $0 " ;" ";" ; Remove ';' - ${Loop} - ${Do} - ${${UN}StrStr} $7 $0 "; " - ${If} $7 == "" - ${ExitDo} - ${EndIf} - ${${UN}StrRep} $0 $0 "; " ";" ; Remove ';' - ${Loop} - ${Do} - ${${UN}StrStr} $7 $0 ";;" - ${If} $7 == "" - ${ExitDo} - ${EndIf} - ${${UN}StrRep} $0 $0 ";;" ";" - ${Loop} - - ; Remove a leading or trailing semicolon from EnvVar - StrCpy $7 $0 1 0 - ${If} $7 == ";" - StrCpy $0 $0 "" 1 ; Change ';' to '' - ${EndIf} - StrLen $6 $0 - IntOp $6 $6 - 1 - StrCpy $7 $0 1 $6 - ${If} $7 == ";" - StrCpy $0 $0 $6 ; Change ';' to '' - ${EndIf} - ; DetailPrint "Scrubbed $1: [$0]" ; Uncomment to debug - ${EndIf} - - /* Step 3. Remove all instances of the target path/string (even if "A" or "P") - $6 = bool flag (1 = found and removed PathString) - $7 = a string (e.g. path) delimited by semicolon(s) - $8 = entry counter starting at 0 - $9 = copy of $0 - $R0 = tempChar */ - - ${If} $5 != "" ; If EnvVar is not empty ... - StrCpy $9 $0 - StrCpy $0 "" - StrCpy $8 0 - StrCpy $6 0 - - ${Do} - ${${UN}StrTok} $7 $9 ";" $8 "0" ; $7 = next entry, $8 = entry counter - - ${If} $7 == "" ; If we've run out of entries, - ${ExitDo} ; were done - ${EndIf} ; - - ; Remove leading and trailing spaces from this entry (critical step for Action=Remove) - ${Do} - StrCpy $R0 $7 1 - ${If} $R0 != " " - ${ExitDo} - ${EndIf} - StrCpy $7 $7 "" 1 ; Remove leading space - ${Loop} - ${Do} - StrCpy $R0 $7 1 -1 - ${If} $R0 != " " - ${ExitDo} - ${EndIf} - StrCpy $7 $7 -1 ; Remove trailing space - ${Loop} - ${If} $7 == $4 ; If string matches, remove it by not appending it - StrCpy $6 1 ; Set 'found' flag - ${ElseIf} $7 != $4 ; If string does NOT match - ${AndIf} $0 == "" ; and the 1st string being added to $0, - StrCpy $0 $7 ; copy it to $0 without a prepended semicolon - ${ElseIf} $7 != $4 ; If string does NOT match - ${AndIf} $0 != "" ; and this is NOT the 1st string to be added to $0, - StrCpy $0 $0;$7 ; append path to $0 with a prepended semicolon - ${EndIf} ; - - IntOp $8 $8 + 1 ; Bump counter - ${Loop} ; Check for duplicates until we run out of paths - ${EndIf} - - ; Step 4: Perform the requested Action - ; - ${If} $2 != "R" ; If Append or Prepend - ${If} $6 == 1 ; And if we found the target - DetailPrint "Target is already present in $1. It will be removed and" - ${EndIf} - ${If} $0 == "" ; If EnvVar is (now) empty - StrCpy $0 $4 ; just copy PathString to EnvVar - ${If} $6 == 0 ; If found flag is either 0 - ${OrIf} $6 == "" ; or blank (if EnvVarName is empty) - DetailPrint "$1 was empty and has been updated with the target" - ${EndIf} - ${ElseIf} $2 == "A" ; If Append (and EnvVar is not empty), - StrCpy $0 $0;$4 ; append PathString - ${If} $6 == 1 - DetailPrint "appended to $1" - ${Else} - DetailPrint "Target was appended to $1" - ${EndIf} - ${Else} ; If Prepend (and EnvVar is not empty), - StrCpy $0 $4;$0 ; prepend PathString - ${If} $6 == 1 - DetailPrint "prepended to $1" - ${Else} - DetailPrint "Target was prepended to $1" - ${EndIf} - ${EndIf} - ${Else} ; If Action = Remove - ${If} $6 == 1 ; and we found the target - DetailPrint "Target was found and removed from $1" - ${Else} - DetailPrint "Target was NOT found in $1 (nothing to remove)" - ${EndIf} - ${If} $0 == "" - DetailPrint "$1 is now empty" - ${EndIf} - ${EndIf} - - ; Step 5: Update the registry at RegLoc with the updated EnvVar and announce the change - ; - ClearErrors - ${If} $3 == HKLM - WriteRegExpandStr ${hklm_all_users} $1 $0 ; Write it in all users section - ${ElseIf} $3 == HKCU - WriteRegExpandStr ${hkcu_current_user} $1 $0 ; Write it to current user section - ${EndIf} - - IfErrors 0 +4 - MessageBox MB_OK|MB_ICONEXCLAMATION "Could not write updated $1 to $3" - DetailPrint "Could not write updated $1 to $3" - Goto EnvVarUpdate_Restore_Vars - - ; "Export" our change - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - EnvVarUpdate_Restore_Vars: - ; - ; Restore the user's variables and return ResultVar - Pop $R0 - Pop $9 - Pop $8 - Pop $7 - Pop $6 - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Push $0 ; Push my $0 (ResultVar) - Exch - Pop $0 ; Restore his $0 - -FunctionEnd - -!macroend ; EnvVarUpdate UN -!insertmacro EnvVarUpdate "" -!insertmacro EnvVarUpdate "un." -;----------------------------------- EnvVarUpdate end---------------------------------------- - -!verbose pop -!endif