(* This script is meant to 1) Identify installed instances of the product 2) check whether the user has write-access (and if not ask for authentification) 3) install the shipped tarball *) -- strings for localisations - to be meant to be replaced -- by a makefile or similar set OKLabel to "[OKLabel]" set InstallLabel to "[InstallLabel]" set AbortLabel to "[AbortLabel]" set intro to "[IntroText1] [IntroText2] [IntroText3]" set chooseMyOwn to "[ChooseMyOwnText]" set listPrompt to "[ListPromptText]" set chooseManual to "[ChooseManualText]" set listOKLabel to "[ListOKLabelText]" set listCancelLabel to "[ListCancelLabel]" set appInvalid to "[AppInvalidText1] [AppInvalidText2]" -- string will begin with the chosen application's name set startInstall to "[StartInstallText1] [StartInstallText2]" set IdentifyQ to "[IdentifyQText] [IdentifyQText2]" set IdentifyYES to "[IdentifyYES]" set IdentifyNO to "[IdentifyNO]" set installFailed to "[InstallFailedText]" set installComplete to "[InstallCompleteTextPatch]" set sourcedir to (do shell script "dirname " & quoted form of POSIX path of (path to of me)) display dialog intro buttons {AbortLabel, InstallLabel} default button 2 if (button returned of result) is AbortLabel then return 2 end if set the found_ooos to (do shell script "mdfind \"kMDItemContentType == 'com.apple.application-bundle' && kMDItemDisplayName == '[PRODUCTNAME]*' && kMDItemDisplayName != '[FULLPRODUCTNAME].app'\"") & " " & chooseMyOwn -- the choice returned is of type "list" -- Show selection dialog only if more than one or no product was found if (get first paragraph of found_ooos) is "" then set the choice to (choose from list of paragraphs in found_ooos default items (get last paragraph of found_ooos) with prompt listPrompt OK button name listOKLabel cancel button name listCancelLabel) if choice is false then -- do nothing, the user cancelled the installation return 2 --aborted by user else if (choice as string) is chooseMyOwn then -- yeah, one needs to use "choose file", otherwise -- the user would not be able to select the .app set the choice to POSIX path of (choose file with prompt chooseManual of type "com.apple.application-bundle" without showing package contents and invisibles) end if else if (get second paragraph of found_ooos) is chooseMyOwn then -- set choice to found installation set the choice to (get first paragraph of found_ooos) else set the choice to (choose from list of paragraphs in found_ooos default items (get first paragraph of found_ooos) with prompt listPrompt OK button name listOKLabel cancel button name listCancelLabel) if choice is false then -- do nothing, the user cancelled the installation return 2 --aborted by user else if (choice as string) is chooseMyOwn then -- yeah, one needs to use "choose file", otherwise -- the user would not be able to select the .app set the choice to POSIX path of (choose file with prompt chooseManual of type "com.apple.application-bundle" without showing package contents and invisibles) end if end if -- now only check whether the path is really from [PRODUCTNAME] try do shell script "grep '[PRODUCTNAME] [PRODUCTVERSION]' " & quoted form of (choice as string) & "/Contents/Info.plist" on error display dialog (choice as string) & appInvalid buttons {InstallLabel} default button 1 with icon 0 return 3 --wrong target-directory end try (* display dialog startInstall buttons {AbortLabel, InstallLabel} default button 2 if (button returned of result) is AbortLabel then return 2 end if *) set tarCommand to "/usr/bin/tar -C " & quoted form of (choice as string) & " -xjf " & quoted form of sourcedir & "/tarball.tar.bz2" try do shell script tarCommand on error errMSG number errNUM display dialog IdentifyQ buttons {IdentifyYES, IdentifyNO} with icon 2 if (button returned of result) is IdentifyYES then try do shell script tarCommand with administrator privileges on error errMSG number errNUM display dialog installFailed buttons {OKLabel} default button 1 with icon 0 -- -60005 username/password wrong -- -128 aborted by user -- 2 error from tar - tarball not found (easy to test) return errNUM end try else return 2 -- aborted by user end if end try display dialog installComplete buttons {OKLabel} default button 1