Windows installer only - Bug 1100604 - Replace LineFind with custom code in RemovePrecompleteEntries macro. r=bbondy
authorRobert Strong <robert.bugzilla@gmail.com>
Tue, 18 Nov 2014 14:03:50 -0800
changeset 240747 0f95bc7706c03dd386aa0bce4af0feb430e89a06
parent 240746 63832cac8084f46a53d1226f79ad7e361c13c9d7
child 240748 4cfd2bff3cc595e1eca693f9bf94d93f35c84b68
push id4311
push userraliiev@mozilla.com
push dateMon, 12 Jan 2015 19:37:41 +0000
treeherdermozilla-beta@150c9fed433b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbbondy
bugs1100604
milestone36.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Windows installer only - Bug 1100604 - Replace LineFind with custom code in RemovePrecompleteEntries macro. r=bbondy
toolkit/mozapps/installer/windows/nsis/common.nsh
--- a/toolkit/mozapps/installer/windows/nsis/common.nsh
+++ b/toolkit/mozapps/installer/windows/nsis/common.nsh
@@ -4460,129 +4460,155 @@
   Push "${_INSTALL_STEP_COUNTER}"
   !verbose ${_MOZFUNC_VERBOSE}
   Call OnStubInstallUninstall
   Pop ${_INSTALL_STEP_COUNTER}
   !verbose pop
 !macroend
 
 /**
- * Parses the precomplete file to remove an installation's files.
- *
- * When modifying this macro be aware that LineFind uses all registers except
- * $R0-$R3 so be cautious. Callers of this macro are not affected.
+ * Parses the precomplete file to remove an installation's files and directories.
  *
  * @param   _PROGRESSBAR
  *          The progress bar to update using PBM_STEPIT. Can also be "false" if
  *          updating a progressbar isn't needed.
  * @param   _INSTALL_STEP_COUNTER
  *          The install step counter to increment. The variable specified in
  *          this parameter is also updated. Can also be "false" if a counter
  *          isn't needed.
- *
- * $R2 = _PROGRESSBAR
- * $R3 = _INSTALL_STEP_COUNTER
+ * $R2 = false if all files were deleted or moved to the tobedeleted directory.
+ *       true if file(s) could not be moved to the tobedeleted directory.
+ * $R3 = Path to temporary precomplete file.
+ * $R4 = File handle for the temporary precomplete file.
+ * $R5 = String returned from FileRead.
+ * $R6 = First seven characters of the string returned from FileRead.
+ * $R7 = Temporary file path used to rename files that are in use.
+ * $R8 = _PROGRESSBAR
+ * $R9 = _INSTALL_STEP_COUNTER
  */
 !macro RemovePrecompleteEntries
 
   !ifndef ${_MOZFUNC_UN}RemovePrecompleteEntries
     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
-    !insertmacro ${_MOZFUNC_UN_TMP}LineFind
     !insertmacro ${_MOZFUNC_UN_TMP}TrimNewLines
     !insertmacro ${_MOZFUNC_UN_TMP}WordReplace
     !undef _MOZFUNC_UN
     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
     !undef _MOZFUNC_UN_TMP
 
     !verbose push
     !verbose ${_MOZFUNC_VERBOSE}
     !define ${_MOZFUNC_UN}RemovePrecompleteEntries "!insertmacro ${_MOZFUNC_UN}RemovePrecompleteEntriesCall"
 
     Function ${_MOZFUNC_UN}RemovePrecompleteEntries
-      Exch $R3
+      Exch $R9
       Exch 1
-      Exch $R2
-      Push $R1
-      Push $R0
-      Push $TmpVal
+      Exch $R8
+      Push $R7
+      Push $R6
+      Push $R5
+      Push $R4
+      Push $R3
+      Push $R2
 
       ${If} ${FileExists} "$INSTDIR\precomplete"
-        ; Copy the uninstall log file to a temporary file
-        GetTempFileName $TmpVal
-        CopyFiles /SILENT /FILESONLY "$INSTDIR\precomplete" "$TmpVal"
-
+        StrCpy $R2 "false"
+
+        RmDir /r "$INSTDIR\${TO_BE_DELETED}"
         CreateDirectory "$INSTDIR\${TO_BE_DELETED}"
-
+        GetTempFileName $R3 "$INSTDIR\${TO_BE_DELETED}"
+        Delete "$R3"
+        Rename "$INSTDIR\precomplete" "$R3"
+
+        ClearErrors
         ; Rename and then remove files
-        ${${_MOZFUNC_UN}LineFind} "$TmpVal" "/NUL" "1:-1" "${_MOZFUNC_UN}RemovePrecompleteEntriesCallback"
-
+        FileOpen $R4 "$R3" r
+        ${Do}
+          FileRead $R4 $R5
+          ${If} ${Errors}
+            ${Break}
+          ${EndIf}
+
+          ${${_MOZFUNC_UN}TrimNewLines} "$R5" $R5
+          ; Replace all occurrences of "/" with "\".
+          ${${_MOZFUNC_UN}WordReplace} "$R5" "/" "\" "+" $R5
+
+          ; Copy the first 7 chars
+          StrCpy $R6 "$R5" 7
+          ${If} "$R6" == "remove "
+            ; Copy the string starting after the 8th char
+            StrCpy $R5 "$R5" "" 8
+            ; Copy all but the last char to remove the double quote.
+            StrCpy $R5 "$R5" -1
+            ${If} ${FileExists} "$INSTDIR\$R5"
+              ${Unless} "$R9" == "false"
+                IntOp $R9 $R9 + 2
+              ${EndUnless}
+              ${Unless} "$R8" == "false"
+                SendMessage $R8 ${PBM_STEPIT} 0 0
+                SendMessage $R8 ${PBM_STEPIT} 0 0
+              ${EndUnless}
+
+              ClearErrors
+              Delete "$INSTDIR\$R5"
+              ${If} ${Errors}
+                GetTempFileName $R7 "$INSTDIR\${TO_BE_DELETED}"
+                Delete "$R7"
+                ClearErrors
+                Rename "$INSTDIR\$R5" "$R7"
+                ${Unless} ${Errors}
+                  Delete /REBOOTOK "$R7"
+
+                  ClearErrors
+                ${EndUnless}
+!ifdef __UNINSTALL__
+                ${If} ${Errors}
+                  Delete /REBOOTOK "$INSTDIR\$R5"
+                  StrCpy $R2 "true"
+                  ClearErrors
+                ${EndIf}
+!endif
+              ${EndIf}
+            ${EndIf}
+          ${ElseIf} "$R6" == "rmdir $\""
+            ; Copy the string starting after the 7th char.
+            StrCpy $R5 "$R5" "" 7
+            ; Copy all but the last two chars to remove the slash and the double quote.
+            StrCpy $R5 "$R5" -2
+            ${If} ${FileExists} "$INSTDIR\$R5"
+              ; Ignore directory removal errors
+              RmDir "$INSTDIR\$R5"
+              ClearErrors
+            ${EndIf}
+          ${EndIf}
+        ${Loop}
+        FileClose $R4
+
+        ${If} ${RebootFlag}
+        ${AndIf} "$R2" == "false"
+          ; Clear the reboot flag if all files were deleted or moved to the
+          ; tobedeleted directory.
+          SetRebootFlag false
+        ${EndIf}
         ; Delete the temporary precomplete file
-        Delete /REBOOTOK "$TmpVal"
+        Delete /REBOOTOK "$R3"
       ${EndIf}
 
       ClearErrors
 
-      Pop $TmpVal
-      Pop $R0
-      Pop $R1
-      Exch $R2
+      Pop $R2
+      Pop $R3
+      Pop $R4
+      Pop $R5
+      Pop $R6
+      Pop $R7
+      Exch $R8
       Exch 1
-      Exch $R3
-    FunctionEnd
-
-    Function ${_MOZFUNC_UN}RemovePrecompleteEntriesCallback
-      ${${_MOZFUNC_UN}TrimNewLines} "$R9" $R9
-      ; Replace all occurrences of "/" with "\".
-      ${${_MOZFUNC_UN}WordReplace} "$R9" "/" "\" "+" $R9
-
-      ; Copy the first 7 chars
-      StrCpy $R1 "$R9" 7
-      ${If} "$R1" == "remove "
-        ; Copy the string starting after the 8th char
-        StrCpy $R9 "$R9" "" 8
-        ; Copy all but the last char to remove the double quote.
-        StrCpy $R9 "$R9" -1
-        ${If} ${FileExists} "$INSTDIR\$R9"
-          ${Unless} "$R3" == "false"
-            IntOp $R3 $R3 + 2
-          ${EndUnless}
-          ${Unless} "$R2" == "false"
-            SendMessage $R2 ${PBM_STEPIT} 0 0
-            SendMessage $R2 ${PBM_STEPIT} 0 0
-          ${EndUnless}
-
-          ClearErrors
-          Delete "$INSTDIR\$R9"
-          ${If} ${Errors}
-            GetTempFileName $R0 "$INSTDIR\${TO_BE_DELETED}"
-            Delete "$R0"
-            ClearErrors
-            Rename "$INSTDIR\$R9" "$R0"
-!ifdef __UNINSTALL__
-            ${If} ${Errors}
-              Delete /REBOOTOK "$INSTDIR\$R9"
-            ${EndIf}
-!endif
-          ${EndIf}
-        ${EndIf}
-      ${ElseIf} "$R1" == "rmdir $\""
-        ; Copy the string starting after the 7th char.
-        StrCpy $R9 "$R9" "" 7
-        ; Copy all but the last two chars to remove the slash and the double quote.
-        StrCpy $R9 "$R9" -2
-        ${If} ${FileExists} "$INSTDIR\$R9"
-          ; Ignore directory removal errors
-          RmDir "$INSTDIR\$R9"
-        ${EndIf}
-      ${EndIf}
-
-      ClearErrors
-
-      Push 0
+      Exch $R9
     FunctionEnd
 
     !verbose pop
   !endif
 !macroend
 
 !macro RemovePrecompleteEntriesCall _PROGRESSBAR _INSTALL_STEP_COUNTER
   !verbose push