Skip to content

Commit e35933d

Browse files
committed
fix(nsis): correct fix of #722 (NSIS Installer Not Working on Second Invocation)
1 parent 29f6436 commit e35933d

File tree

8 files changed

+157
-145
lines changed

8 files changed

+157
-145
lines changed

src/util/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export function exec(file: string, args?: Array<string> | null, options?: ExecOp
8585
resolve(stdout)
8686
}
8787
else {
88-
let message = red(removePassword(error.message))
88+
let message = red(removePassword(`Exit code: ${(<any>error).code}. ${error.message}`))
8989
if (stdout.length !== 0) {
9090
message += `\n${yellow(stdout)}`
9191
}

templates/nsis/common.nsh

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,46 @@ Unicode true
2929
!endif
3030
${EndIf}
3131
!endif
32-
!macroend
32+
!macroend
33+
34+
# avoid exit code 2
35+
!macro quitSuccess
36+
SetErrorLevel 0
37+
Quit
38+
!macroend
39+
40+
!ifndef BUILD_UNINSTALLER
41+
Function GetInQuotes
42+
Exch $R0
43+
Push $R1
44+
Push $R2
45+
Push $R3
46+
47+
StrCpy $R2 -1
48+
IntOp $R2 $R2 + 1
49+
StrCpy $R3 $R0 1 $R2
50+
StrCmp $R3 "" 0 +3
51+
StrCpy $R0 ""
52+
Goto Done
53+
StrCmp $R3 '"' 0 -5
54+
55+
IntOp $R2 $R2 + 1
56+
StrCpy $R0 $R0 "" $R2
57+
58+
StrCpy $R2 0
59+
IntOp $R2 $R2 + 1
60+
StrCpy $R3 $R0 1 $R2
61+
StrCmp $R3 "" 0 +3
62+
StrCpy $R0 ""
63+
Goto Done
64+
StrCmp $R3 '"' 0 -5
65+
66+
StrCpy $R0 $R0 $R2
67+
Done:
68+
69+
Pop $R3
70+
Pop $R2
71+
Pop $R1
72+
Exch $R0
73+
FunctionEnd
74+
!endif

templates/nsis/installSection.nsh

Lines changed: 31 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,28 @@
1+
# http://stackoverflow.com/questions/24595887/waiting-for-nsis-uninstaller-to-finish-in-nsis-installer-either-fails-or-the-uni
2+
!macro uninstallOldVersion ROOT_KEY
3+
ReadRegStr $R0 ${ROOT_KEY} "${UNINSTALL_REGISTRY_KEY}" UninstallString
4+
${if} $R0 != ""
5+
Push $R0
6+
Call GetInQuotes
7+
Pop $R0
8+
9+
ReadRegStr $R1 ${ROOT_KEY} "${INSTALL_REGISTRY_KEY}" InstallLocation
10+
${if} $R1 != ""
11+
${AndIf} $R0 != ""
12+
CopyFiles /SILENT /FILESONLY "$R0" "$PLUGINSDIR\old-uninstaller.exe"
13+
14+
${if} $installMode == "CurrentUser"
15+
${OrIf} ${ROOT_KEY} == "HKEY_CURRENT_USER"
16+
StrCpy $0 "/currentuser"
17+
${else}
18+
StrCpy $0 "/allusers"
19+
${endif}
20+
# MessageBox MB_OK|MB_ICONEXCLAMATION '"$PLUGINSDIR\old-uninstaller.exe" "_?=$R1" /S /KEEP_APP_DATA $0'
21+
ExecWait '"$PLUGINSDIR\old-uninstaller.exe" "_?=$R1" /S /KEEP_APP_DATA $0'
22+
${endif}
23+
${endif}
24+
!macroend
25+
126
InitPluginsDir
227

328
!ifdef HEADER_ICO
@@ -24,62 +49,9 @@ ${endif}
2449
${endif}
2550
!endif
2651

27-
### remove old < 6.4.1 versions
28-
29-
ReadRegStr $R0 SHCTX "${UNINSTALL_REGISTRY_KEY}" UninstallString
30-
${if} $R0 != ""
31-
ReadRegStr $R2 SHCTX "${INSTALL_REGISTRY_KEY}" UninstallerPath
32-
${if} $R2 == ""
33-
ReadRegStr $R1 SHCTX "${INSTALL_REGISTRY_KEY}" InstallLocation
34-
ExecWait "$R0 _?=$R1 /S /KEEP_APP_DATA"
35-
Delete "$R1\Uninstall *.exe"
36-
ClearErrors
37-
${endif}
38-
${endif}
39-
40-
# remove per-user installation
41-
${if} $installMode == "all"
42-
ReadRegStr $R0 HKEY_CURRENT_USER "${UNINSTALL_REGISTRY_KEY}" UninstallString
43-
${if} $R0 != ""
44-
ReadRegStr $R2 HKEY_CURRENT_USER "${INSTALL_REGISTRY_KEY}" UninstallerPath
45-
${if} $R2 == ""
46-
ReadRegStr $R1 HKEY_CURRENT_USER "${INSTALL_REGISTRY_KEY}" InstallLocation
47-
ExecWait "$R0 _?=$R1 /S /KEEP_APP_DATA"
48-
Delete "$R1\Uninstall *.exe"
49-
ClearErrors
50-
${endif}
51-
${endif}
52-
${endif}
53-
54-
###
55-
56-
57-
# http://stackoverflow.com/questions/24595887/waiting-for-nsis-uninstaller-to-finish-in-nsis-installer-either-fails-or-the-uni
58-
59-
ReadRegStr $R0 SHCTX "${UNINSTALL_REGISTRY_KEY}" UninstallerPath
60-
${if} $R0 != ""
61-
ReadRegStr $R1 SHCTX "${INSTALL_REGISTRY_KEY}" InstallLocation
62-
${if} $R1 != ""
63-
CopyFiles /SILENT /FILESONLY "$R0" "$PLUGINSDIR\old-uninstaller.exe"
64-
65-
${if} $installMode == "all"
66-
ExecWait "$PLUGINSDIR\old-uninstaller.exe _?=$R1 /S /KEEP_APP_DATA /allusers"
67-
${Else}
68-
ExecWait "$PLUGINSDIR\old-uninstaller.exe _?=$R1 /S /KEEP_APP_DATA /currentuser"
69-
${endif}
70-
${endif}
71-
${endif}
72-
73-
# remove per-user installation
52+
!insertmacro uninstallOldVersion SHELL_CONTEXT
7453
${if} $installMode == "all"
75-
ReadRegStr $R0 HKEY_CURRENT_USER "${UNINSTALL_REGISTRY_KEY}" UninstallerPath
76-
${if} $R0 != ""
77-
ReadRegStr $R1 HKEY_CURRENT_USER "${INSTALL_REGISTRY_KEY}" InstallLocation
78-
${if} $R1 != ""
79-
CopyFiles /SILENT /FILESONLY "$R0" "$PLUGINSDIR\old-uninstaller.exe"
80-
ExecWait "$PLUGINSDIR\old-uninstaller.exe _?=$R1 /S /KEEP_APP_DATA /currentuser"
81-
${endif}
82-
${endif}
54+
!insertmacro uninstallOldVersion HKEY_CURRENT_USER
8355
${endif}
8456

8557
SetOutPath $INSTDIR
@@ -94,9 +66,9 @@ SetCompress off
9466
SetCompress "${COMPRESS}"
9567

9668
!ifdef APP_64
97-
${If} ${RunningX64}
69+
${if} ${RunningX64}
9870
Nsis7z::Extract "$PLUGINSDIR\app-64.7z"
99-
${Else}
71+
${else}
10072
Nsis7z::Extract "$PLUGINSDIR\app-32.7z"
10173
${endif}
10274
!else
@@ -135,5 +107,5 @@ WinShell::SetLnkAUMI "$desktopLink" "${APP_ID}"
135107
Call StartApp
136108
${EndIf}
137109
!endif
138-
Quit
139-
!endif
110+
!insertmacro quitSuccess
111+
!endif

templates/nsis/installer.nsi

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ Var desktopLink
3535
Function .onInit
3636
!ifdef BUILD_UNINSTALLER
3737
WriteUninstaller "${UNINSTALLER_OUT_FILE}"
38-
# avoid exit code 2
39-
SetErrorLevel 0
40-
Quit
38+
!insertmacro quitSuccess
4139
!else
4240
!insertmacro check64BitAndSetRegView
4341
!insertmacro initMultiUser

templates/nsis/multiUser.nsh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ Var installMode
7474
WriteRegStr SHCTX "${UNINSTALL_REGISTRY_KEY}" DisplayName "${UNINSTALL_DISPLAY_NAME} (only current user)"
7575
WriteRegStr SHCTX "${UNINSTALL_REGISTRY_KEY}" UninstallString '"$INSTDIR\${UNINSTALL_FILENAME}" /currentuser'
7676
${endif}
77-
WriteRegStr SHCTX "${UNINSTALL_REGISTRY_KEY}" UninstallerPath "$INSTDIR\${UNINSTALL_FILENAME}"
7877

7978
WriteRegStr SHCTX "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${VERSION}"
8079
WriteRegStr SHCTX "${UNINSTALL_REGISTRY_KEY}" "DisplayIcon" "$appExe,0"

templates/nsis/uninstaller.nsh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,5 @@ Section "un.install"
6363
!insertmacro customUnInstall
6464
!endif
6565

66-
Quit
66+
!insertmacro quitSuccess
6767
SectionEnd

test/src/helpers/expectedContents.ts

Lines changed: 78 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -87,83 +87,84 @@ export const expectedWinContents = [
8787

8888
export const nsisPerMachineInstall = pathSorter([
8989
"Program Files/TestApp",
90-
"Program Files/TestApp/blink_image_resources_200_percent.pak",
91-
"Program Files/TestApp/content_resources_200_percent.pak",
92-
"Program Files/TestApp/content_shell.pak",
93-
"Program Files/TestApp/d3dcompiler_47.dll",
94-
"Program Files/TestApp/ffmpeg.dll",
95-
"Program Files/TestApp/icudtl.dat",
96-
"Program Files/TestApp/libEGL.dll",
97-
"Program Files/TestApp/libGLESv2.dll",
98-
"Program Files/TestApp/LICENSE",
99-
"Program Files/TestApp/LICENSES.chromium.html",
100-
"Program Files/TestApp/natives_blob.bin",
101-
"Program Files/TestApp/node.dll",
102-
"Program Files/TestApp/snapshot_blob.bin",
103-
"Program Files/TestApp/TestApp.exe",
104-
"Program Files/TestApp/ui_resources_200_percent.pak",
105-
"Program Files/TestApp/Uninstall TestApp.exe",
106-
"Program Files/TestApp/views_resources_200_percent.pak",
107-
"Program Files/TestApp/xinput1_3.dll",
108-
"Program Files/TestApp/resources",
109-
"Program Files/TestApp/resources/app.asar",
110-
"Program Files/TestApp/resources/electron.asar",
111-
"Program Files/TestApp/resources/foo.ico",
112-
"Program Files/TestApp/locales",
113-
"Program Files/TestApp/locales/am.pak",
114-
"Program Files/TestApp/locales/ar.pak",
115-
"Program Files/TestApp/locales/bg.pak",
116-
"Program Files/TestApp/locales/bn.pak",
117-
"Program Files/TestApp/locales/ca.pak",
118-
"Program Files/TestApp/locales/cs.pak",
119-
"Program Files/TestApp/locales/da.pak",
120-
"Program Files/TestApp/locales/de.pak",
121-
"Program Files/TestApp/locales/el.pak",
122-
"Program Files/TestApp/locales/en-GB.pak",
123-
"Program Files/TestApp/locales/en-US.pak",
124-
"Program Files/TestApp/locales/es-419.pak",
125-
"Program Files/TestApp/locales/es.pak",
126-
"Program Files/TestApp/locales/et.pak",
127-
"Program Files/TestApp/locales/fa.pak",
128-
"Program Files/TestApp/locales/fake-bidi.pak",
129-
"Program Files/TestApp/locales/fi.pak",
130-
"Program Files/TestApp/locales/fil.pak",
131-
"Program Files/TestApp/locales/fr.pak",
132-
"Program Files/TestApp/locales/gu.pak",
133-
"Program Files/TestApp/locales/he.pak",
134-
"Program Files/TestApp/locales/hi.pak",
135-
"Program Files/TestApp/locales/hr.pak",
136-
"Program Files/TestApp/locales/hu.pak",
137-
"Program Files/TestApp/locales/id.pak",
138-
"Program Files/TestApp/locales/it.pak",
139-
"Program Files/TestApp/locales/ja.pak",
140-
"Program Files/TestApp/locales/kn.pak",
141-
"Program Files/TestApp/locales/ko.pak",
142-
"Program Files/TestApp/locales/lt.pak",
143-
"Program Files/TestApp/locales/lv.pak",
144-
"Program Files/TestApp/locales/ml.pak",
145-
"Program Files/TestApp/locales/mr.pak",
146-
"Program Files/TestApp/locales/ms.pak",
147-
"Program Files/TestApp/locales/nb.pak",
148-
"Program Files/TestApp/locales/nl.pak",
149-
"Program Files/TestApp/locales/pl.pak",
150-
"Program Files/TestApp/locales/pt-BR.pak",
151-
"Program Files/TestApp/locales/pt-PT.pak",
152-
"Program Files/TestApp/locales/ro.pak",
153-
"Program Files/TestApp/locales/ru.pak",
154-
"Program Files/TestApp/locales/sk.pak",
155-
"Program Files/TestApp/locales/sl.pak",
156-
"Program Files/TestApp/locales/sr.pak",
157-
"Program Files/TestApp/locales/sv.pak",
158-
"Program Files/TestApp/locales/sw.pak",
159-
"Program Files/TestApp/locales/ta.pak",
160-
"Program Files/TestApp/locales/te.pak",
161-
"Program Files/TestApp/locales/th.pak",
162-
"Program Files/TestApp/locales/tr.pak",
163-
"Program Files/TestApp/locales/uk.pak",
164-
"Program Files/TestApp/locales/vi.pak",
165-
"Program Files/TestApp/locales/zh-CN.pak",
166-
"Program Files/TestApp/locales/zh-TW.pak",
90+
"Program Files/TestApp/1.1.0",
91+
"Program Files/TestApp/1.1.0/blink_image_resources_200_percent.pak",
92+
"Program Files/TestApp/1.1.0/content_resources_200_percent.pak",
93+
"Program Files/TestApp/1.1.0/content_shell.pak",
94+
"Program Files/TestApp/1.1.0/d3dcompiler_47.dll",
95+
"Program Files/TestApp/1.1.0/ffmpeg.dll",
96+
"Program Files/TestApp/1.1.0/icudtl.dat",
97+
"Program Files/TestApp/1.1.0/libEGL.dll",
98+
"Program Files/TestApp/1.1.0/libGLESv2.dll",
99+
"Program Files/TestApp/1.1.0/LICENSE",
100+
"Program Files/TestApp/1.1.0/LICENSES.chromium.html",
101+
"Program Files/TestApp/1.1.0/locales",
102+
"Program Files/TestApp/1.1.0/natives_blob.bin",
103+
"Program Files/TestApp/1.1.0/node.dll",
104+
"Program Files/TestApp/1.1.0/resources",
105+
"Program Files/TestApp/1.1.0/snapshot_blob.bin",
106+
"Program Files/TestApp/1.1.0/TestApp.exe",
107+
"Program Files/TestApp/1.1.0/ui_resources_200_percent.pak",
108+
"Program Files/TestApp/1.1.0/Uninstall TestApp.exe",
109+
"Program Files/TestApp/1.1.0/views_resources_200_percent.pak",
110+
"Program Files/TestApp/1.1.0/xinput1_3.dll",
111+
"Program Files/TestApp/1.1.0/locales/am.pak",
112+
"Program Files/TestApp/1.1.0/locales/ar.pak",
113+
"Program Files/TestApp/1.1.0/locales/bg.pak",
114+
"Program Files/TestApp/1.1.0/locales/bn.pak",
115+
"Program Files/TestApp/1.1.0/locales/ca.pak",
116+
"Program Files/TestApp/1.1.0/locales/cs.pak",
117+
"Program Files/TestApp/1.1.0/locales/da.pak",
118+
"Program Files/TestApp/1.1.0/locales/de.pak",
119+
"Program Files/TestApp/1.1.0/locales/el.pak",
120+
"Program Files/TestApp/1.1.0/locales/en-GB.pak",
121+
"Program Files/TestApp/1.1.0/locales/en-US.pak",
122+
"Program Files/TestApp/1.1.0/locales/es-419.pak",
123+
"Program Files/TestApp/1.1.0/locales/es.pak",
124+
"Program Files/TestApp/1.1.0/locales/et.pak",
125+
"Program Files/TestApp/1.1.0/locales/fa.pak",
126+
"Program Files/TestApp/1.1.0/locales/fake-bidi.pak",
127+
"Program Files/TestApp/1.1.0/locales/fi.pak",
128+
"Program Files/TestApp/1.1.0/locales/fil.pak",
129+
"Program Files/TestApp/1.1.0/locales/fr.pak",
130+
"Program Files/TestApp/1.1.0/locales/gu.pak",
131+
"Program Files/TestApp/1.1.0/locales/he.pak",
132+
"Program Files/TestApp/1.1.0/locales/hi.pak",
133+
"Program Files/TestApp/1.1.0/locales/hr.pak",
134+
"Program Files/TestApp/1.1.0/locales/hu.pak",
135+
"Program Files/TestApp/1.1.0/locales/id.pak",
136+
"Program Files/TestApp/1.1.0/locales/it.pak",
137+
"Program Files/TestApp/1.1.0/locales/ja.pak",
138+
"Program Files/TestApp/1.1.0/locales/kn.pak",
139+
"Program Files/TestApp/1.1.0/locales/ko.pak",
140+
"Program Files/TestApp/1.1.0/locales/lt.pak",
141+
"Program Files/TestApp/1.1.0/locales/lv.pak",
142+
"Program Files/TestApp/1.1.0/locales/ml.pak",
143+
"Program Files/TestApp/1.1.0/locales/mr.pak",
144+
"Program Files/TestApp/1.1.0/locales/ms.pak",
145+
"Program Files/TestApp/1.1.0/locales/nb.pak",
146+
"Program Files/TestApp/1.1.0/locales/nl.pak",
147+
"Program Files/TestApp/1.1.0/locales/pl.pak",
148+
"Program Files/TestApp/1.1.0/locales/pt-BR.pak",
149+
"Program Files/TestApp/1.1.0/locales/pt-PT.pak",
150+
"Program Files/TestApp/1.1.0/locales/ro.pak",
151+
"Program Files/TestApp/1.1.0/locales/ru.pak",
152+
"Program Files/TestApp/1.1.0/locales/sk.pak",
153+
"Program Files/TestApp/1.1.0/locales/sl.pak",
154+
"Program Files/TestApp/1.1.0/locales/sr.pak",
155+
"Program Files/TestApp/1.1.0/locales/sv.pak",
156+
"Program Files/TestApp/1.1.0/locales/sw.pak",
157+
"Program Files/TestApp/1.1.0/locales/ta.pak",
158+
"Program Files/TestApp/1.1.0/locales/te.pak",
159+
"Program Files/TestApp/1.1.0/locales/th.pak",
160+
"Program Files/TestApp/1.1.0/locales/tr.pak",
161+
"Program Files/TestApp/1.1.0/locales/uk.pak",
162+
"Program Files/TestApp/1.1.0/locales/vi.pak",
163+
"Program Files/TestApp/1.1.0/locales/zh-CN.pak",
164+
"Program Files/TestApp/1.1.0/locales/zh-TW.pak",
165+
"Program Files/TestApp/1.1.0/resources/app.asar",
166+
"Program Files/TestApp/1.1.0/resources/electron.asar",
167+
"Program Files/TestApp/1.1.0/resources/foo.ico",
167168
"users/Public/Desktop/TestApp.lnk",
168169
"users/Public/Start Menu/Programs/TestApp.lnk"
169170
])

test/src/nsisTest.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ async function doTest(outDir: string, perUser: boolean) {
8282
await wine.exec(path.join(outDir, "TestApp Setup 1.1.0.exe"), "/S")
8383

8484
const instDir = perUser ? path.join(wine.userDir, "Local Settings", "Application Data", "Programs") : path.join(driveC, "Program Files")
85-
const appAsar = path.join(instDir, "TestApp", "resources", "app.asar")
85+
const appAsar = path.join(instDir, "TestApp", "1.1.0", "resources", "app.asar")
8686
assertThat(JSON.parse(extractFile(appAsar, "package.json").toString())).hasProperties({
8787
name: "TestApp"
8888
})
@@ -97,7 +97,7 @@ async function doTest(outDir: string, perUser: boolean) {
9797
const appDataFile = path.join(wine.userDir, "Application Data", "TestApp", "doNotDeleteMe")
9898
await outputFile(appDataFile, "app data must be not removed")
9999
fsBefore = await listFiles()
100-
await wine.exec(path.join(outDir, "TestApp Setup 1.1.0.exe", "/S"))
100+
await wine.exec(path.join(outDir, "TestApp Setup 1.1.0.exe"), "/S")
101101
fsAfter = await listFiles()
102102

103103
fsChanges = diff(fsBefore, fsAfter, driveC)

0 commit comments

Comments
 (0)