246 lines
4.9 KiB
NSIS
Raw Normal View History

2025-06-30 09:38:03 +08:00
Function un.checkAppRunning
!insertmacro CHECK_APP_RUNNING
FunctionEnd
Function un.onInit
SetOutPath $INSTDIR
${LogSet} on
!insertmacro check64BitAndSetRegView
${If} ${Silent}
call un.checkAppRunning
${else}
!ifdef ONE_CLICK
MessageBox MB_OKCANCEL "$(areYouSureToUninstall)" IDOK +2
Quit
# one-click installer executes uninstall section in the silent mode, but we must show message dialog if silent mode was not explicitly set by user (using /S flag)
call un.checkAppRunning
SetSilent silent
!endif
${endIf}
!insertmacro initMultiUser
!ifmacrodef customUnInit
!insertmacro customUnInit
!endif
FunctionEnd
Function un.atomicRMDir
Exch $R0
Push $R1
Push $R2
Push $R3
StrCpy $R3 "$INSTDIR$R0\*.*"
FindFirst $R1 $R2 $R3
loop:
StrCmp $R2 "" break
StrCmp $R2 "." continue
StrCmp $R2 ".." continue
IfFileExists "$INSTDIR$R0\$R2\*.*" isDir isNotDir
isDir:
CreateDirectory "$PLUGINSDIR\old-install$R0\$R2"
Push "$R0\$R2"
Call un.atomicRMDir
Pop $R3
${if} $R3 != 0
Goto done
${endIf}
Goto continue
isNotDir:
ClearErrors
Rename "$INSTDIR$R0\$R2" "$PLUGINSDIR\old-install$R0\$R2"
# Ignore errors when renaming ourselves.
StrCmp "$R0\$R2" "${UNINSTALL_FILENAME}" 0 +2
ClearErrors
IfErrors 0 +3
StrCpy $R3 "$INSTDIR$R0\$R2"
Goto done
continue:
FindNext $R1 $R2
Goto loop
break:
StrCpy $R3 0
done:
FindClose $R1
StrCpy $R0 $R3
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
Function un.restoreFiles
Exch $R0
Push $R1
Push $R2
Push $R3
StrCpy $R3 "$PLUGINSDIR\old-install$R0\*.*"
FindFirst $R1 $R2 $R3
loop:
StrCmp $R2 "" break
StrCmp $R2 "." continue
StrCmp $R2 ".." continue
IfFileExists "$INSTDIR$R0\$R2\*.*" isDir isNotDir
isDir:
CreateDirectory "$INSTDIR$R0\$R2"
Push "$R0\$R2"
Call un.restoreFiles
Pop $R3
Goto continue
isNotDir:
Rename "$PLUGINSDIR\old-install$R0\$R2" "$INSTDIR$R0\$R2"
continue:
FindNext $R1 $R2
Goto loop
break:
StrCpy $R0 0
FindClose $R1
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
Section "un.install"
# for assisted installer we check it here to show progress
!ifndef ONE_CLICK
${IfNot} ${Silent}
call un.checkAppRunning
${endIf}
!endif
!insertmacro setLinkVars
!ifmacrodef customUnInstall
!insertmacro customUnInstall
!endif
# delete the installed files
!ifmacrodef customRemoveFiles
!insertmacro customRemoveFiles
!else
${if} ${isUpdated}
CreateDirectory "$PLUGINSDIR\old-install"
Push ""
Call un.atomicRMDir
Pop $R0
${if} $R0 != 0
DetailPrint "File is busy, aborting: $R0"
# Attempt to restore previous directory
Push ""
Call un.restoreFiles
Pop $R0
Abort `Can't rename "$INSTDIR" to "$PLUGINSDIR\old-install".`
${endif}
${endif}
# Remove all files (or remaining shallow directories from the block above)
RMDir /r $INSTDIR
!endif
${ifNot} ${isKeepShortcuts}
WinShell::UninstAppUserModelId "${APP_ID}"
!ifndef DO_NOT_CREATE_DESKTOP_SHORTCUT
WinShell::UninstShortcut "$oldDesktopLink"
Delete "$oldDesktopLink"
!endif
!ifndef DO_NOT_CREATE_START_MENU_SHORTCUT
WinShell::UninstShortcut "$oldStartMenuLink"
Delete "$oldStartMenuLink"
ReadRegStr $R1 SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory
${ifNot} $R1 == ""
RMDir "$SMPROGRAMS\$R1"
${endIf}
!endif
${endIf}
# refresh the desktop
System::Call 'shell32::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
!ifmacrodef unregisterFileAssociations
!insertmacro unregisterFileAssociations
!endif
Var /GLOBAL isDeleteAppData
StrCpy $isDeleteAppData "0"
ClearErrors
${GetParameters} $R0
${GetOptions} $R0 "--delete-app-data" $R1
${if} ${Errors}
!ifdef DELETE_APP_DATA_ON_UNINSTALL
${ifNot} ${isUpdated}
StrCpy $isDeleteAppData "1"
${endif}
!endif
${else}
StrCpy $isDeleteAppData "1"
${endIf}
${if} $isDeleteAppData == "1"
# electron always uses per user app data
${if} $installMode == "all"
SetShellVarContext current
${endif}
RMDir /r "$APPDATA\${APP_FILENAME}"
!ifdef APP_PRODUCT_FILENAME
RMDir /r "$APPDATA\${APP_PRODUCT_FILENAME}"
!endif
# electron use package.json name for cache,indexdb etc.
!ifdef APP_PACKAGE_NAME
RMDir /r "$APPDATA\${APP_PACKAGE_NAME}"
!endif
${if} $installMode == "all"
SetShellVarContext all
${endif}
${endif}
DeleteRegKey SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}"
!ifdef UNINSTALL_REGISTRY_KEY_2
DeleteRegKey SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY_2}"
!endif
DeleteRegKey SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}"
!ifdef ONE_CLICK
!insertmacro quitSuccess
!endif
SectionEnd