-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathextractAppPackage.nsh
More file actions
150 lines (127 loc) · 3.87 KB
/
extractAppPackage.nsh
File metadata and controls
150 lines (127 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
; Shadow of app-builder-lib templates/nsis/include/extractAppPackage.nsh
; (buildResources is searched before the bundled template — see NSIS !addincludedir order.)
;
; Changes: Call HspKillBeforeCopy before every CopyFiles (and each retry) so taskkill + wait
; runs after uninstall/old files, not only in customCheckAppRunning. More automatic retries
; before the "cannot close app" dialog. Sync with upstream when upgrading electron-builder.
; HspInstallStepStatus: step 3 = decompress start, step 4 = payload on disk (must match HSP_INSTALL_STEP_TOTAL in installer-hooks.nsi).
!macro extractEmbeddedAppPackage
!ifdef COMPRESS
SetCompress off
!endif
Var /GLOBAL packageArch
!insertmacro identify_package
!insertmacro compute_files_for_current_arch
!ifdef COMPRESS
SetCompress "${COMPRESS}"
!endif
!insertmacro decompress
!insertmacro custom_files_post_decompression
!macroend
!macro identify_package
!ifdef APP_32
StrCpy $packageArch "32"
!endif
!ifdef APP_64
${if} ${RunningX64}
${OrIf} ${IsNativeARM64}
StrCpy $packageArch "64"
${endif}
!endif
!ifdef APP_ARM64
${if} ${IsNativeARM64}
StrCpy $packageArch "ARM64"
${endif}
!endif
!macroend
!macro compute_files_for_current_arch
${if} $packageArch == "ARM64"
!ifdef APP_ARM64
!insertmacro arm64_app_files
!endif
${elseif} $packageArch == "64"
!ifdef APP_64
!insertmacro x64_app_files
!endif
${else}
!ifdef APP_32
!insertmacro ia32_app_files
!endif
${endIf}
!macroend
!macro custom_files_post_decompression
${if} $packageArch == "ARM64"
!ifmacrodef customFiles_arm64
!insertmacro customFiles_arm64
!endif
${elseif} $packageArch == "64"
!ifmacrodef customFiles_x64
!insertmacro customFiles_x64
!endif
${else}
!ifmacrodef customFiles_ia32
!insertmacro customFiles_ia32
!endif
${endIf}
!macroend
!macro arm64_app_files
File /oname=$PLUGINSDIR\app-arm64.${COMPRESSION_METHOD} "${APP_ARM64}"
!macroend
!macro x64_app_files
File /oname=$PLUGINSDIR\app-64.${COMPRESSION_METHOD} "${APP_64}"
!macroend
!macro ia32_app_files
File /oname=$PLUGINSDIR\app-32.${COMPRESSION_METHOD} "${APP_32}"
!macroend
!macro decompress
!ifdef ZIP_COMPRESSION
!insertmacro HspInstallStepStatus 3
nsisunz::Unzip "$PLUGINSDIR\app-$packageArch.zip" "$INSTDIR"
Pop $R0
StrCmp $R0 "success" +3
MessageBox MB_OK|MB_ICONEXCLAMATION "$(decompressionFailed)$\n$R0"
Quit
!insertmacro HspInstallStepStatus 4
!else
!insertmacro extractUsing7za "$PLUGINSDIR\app-$packageArch.7z"
!endif
!macroend
!macro extractUsing7za FILE
!insertmacro HspInstallStepStatus 3
Push $OUTDIR
CreateDirectory "$PLUGINSDIR\7z-out"
ClearErrors
SetOutPath "$PLUGINSDIR\7z-out"
Nsis7z::Extract "${FILE}"
Pop $R0
SetOutPath $R0
# Retry counter
StrCpy $R1 0
LoopExtract7za:
IntOp $R1 $R1 + 1
Call HspKillBeforeCopy
# Attempt to copy files in atomic way
CopyFiles /SILENT "$PLUGINSDIR\7z-out\*" $OUTDIR
IfErrors 0 DoneExtract7za
DetailPrint `Can't modify "${PRODUCT_NAME}"'s files.`
${if} $R1 < 15
# Automatic retries (same work as user clicking Retry: kill + wait + copy again).
Goto RetryExtract7za
${else}
MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "$(appCannotBeClosed)" /SD IDRETRY IDCANCEL AbortExtract7za
${endIf}
# As an absolutely last resort after a few automatic attempts and user
# intervention - we will just overwrite everything with `Nsis7z::Extract`
# even though it is not atomic and will ignore errors.
# Clear the temporary folder first to make sure we don't use twice as
# much disk space.
RMDir /r "$PLUGINSDIR\7z-out"
Nsis7z::Extract "${FILE}"
Goto DoneExtract7za
AbortExtract7za:
Quit
RetryExtract7za:
Goto LoopExtract7za
DoneExtract7za:
!insertmacro HspInstallStepStatus 4
!macroend