diff --git a/.hgtags b/.hgtags index 83c86a413d..0cbde9dd04 100644 --- a/.hgtags +++ b/.hgtags @@ -408,3 +408,11 @@ c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280 ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286 2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287 e06898df8644fe567bee94f817d03abc1c380993 3.4.5-beta3 +a676b4d6c037b39fe5b8e42cf8839a9303936089 DRTVWR-289 +28fa8b944a0c1869636ab00cc400f5aa71f6fa3c DRTVWR-290 +7f09bbc28c297f14b67961be7b6575445fa160e8 DRTVWR-291 +b23419a2748483c98f3b84b630468a21c88feba5 DRTVWR-292 +1567de5700c273b583dac41b64275c223287306e 3.4.5-beta4 +1cce8447f8f574673e3f47d6fe584262e6964fe2 DRTVWR-296 +0a5d409161ef2a89b28c9a741051dd2dedc707d6 DRTVWR-297 +852b69ef0b5fe6b13b69cc2217282cc64de6afab 3.4.5-beta5 diff --git a/doc/contributions.txt b/doc/contributions.txt index 10d6818bd3..e86ef11a72 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1251,6 +1251,7 @@ Whimsy Winx Whirly Fizzle STORM-1895 MAINT-873 + STORM-1930 Whoops Babii VWR-631 VWR-1640 diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp index 957704da47..0cfb810906 100644 --- a/indra/media_plugins/webkit/windows_volume_catcher.cpp +++ b/indra/media_plugins/webkit/windows_volume_catcher.cpp @@ -71,7 +71,7 @@ VolumeCatcherImpl::VolumeCatcherImpl() { mSystemIsVistaOrHigher = isWindowsVistaOrHigher(); - if ( mSystemIsVistaOrHigher ) + if ( ! mSystemIsVistaOrHigher ) { HMODULE handle = ::LoadLibrary(L"winmm.dll"); if(handle) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7282b8978f..baedac1f2d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1854,7 +1854,6 @@ if (LINUX) set(COPY_INPUT_DEPENDENCIES ${VIEWER_BINARY_NAME} linux-crash-logger - linux-updater SLPlugin media_plugin_webkit media_plugin_gstreamer010 diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index d8b1887a90..24413caf6a 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -523,6 +523,7 @@ F32 LLDrawable::updateXform(BOOL undamped) dist_squared = dist_vec_squared(new_pos, target_pos); LLQuaternion new_rot = nlerp(lerp_amt, old_rot, target_rot); + // FIXME: This can be negative! It is be possible for some rots to 'cancel out' pos or size changes. dist_squared += (1.f - dot(new_rot, target_rot)) * 10.f; LLVector3 new_scale = lerp(old_scale, target_scale, lerp_amt); @@ -548,9 +549,12 @@ F32 LLDrawable::updateXform(BOOL undamped) } else { - dist_squared = dist_vec_squared(old_pos, target_pos); - dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f; - dist_squared += dist_vec_squared(old_scale, target_scale); + // The following fixes MAINT-1742 but breaks vehicles similar to MAINT-2275 + // dist_squared = dist_vec_squared(old_pos, target_pos); + + // The following fixes MAINT-2247 but causes MAINT-2275 + //dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f; + //dist_squared += dist_vec_squared(old_scale, target_scale); } LLVector3 vec = mCurrentScale-target_scale; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 39a429e9c6..17311dd75e 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -215,17 +215,19 @@ public: ~LLMeshHeaderResponder() { - if (!mProcessed && !LLApp::isQuitting()) - { //something went wrong, retry - llwarns << "Timeout or service unavailable, retrying." << llendl; - LLMeshRepository::sHTTPRetryCount++; - LLMeshRepoThread::HeaderRequest req(mMeshParams); - LLMutexLock lock(gMeshRepo.mThread->mMutex); - gMeshRepo.mThread->mHeaderReqQ.push(req); + if (!LLApp::isQuitting()) + { + if (!mProcessed) + { //something went wrong, retry + llwarns << "Timeout or service unavailable, retrying." << llendl; + LLMeshRepository::sHTTPRetryCount++; + LLMeshRepoThread::HeaderRequest req(mMeshParams); + LLMutexLock lock(gMeshRepo.mThread->mMutex); + gMeshRepo.mThread->mHeaderReqQ.push(req); + } + LLMeshRepoThread::decActiveHeaderRequests(); } - - LLMeshRepoThread::decActiveHeaderRequests(); } virtual void completedRaw(U32 status, const std::string& reason, @@ -252,13 +254,16 @@ public: ~LLMeshLODResponder() { - if (!mProcessed && !LLApp::isQuitting()) + if (!LLApp::isQuitting()) { - llwarns << "Killed without being processed, retrying." << llendl; - LLMeshRepository::sHTTPRetryCount++; - gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD); + if (!mProcessed) + { + llwarns << "Killed without being processed, retrying." << llendl; + LLMeshRepository::sHTTPRetryCount++; + gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD); + } + LLMeshRepoThread::decActiveLODRequests(); } - LLMeshRepoThread::decActiveLODRequests(); } virtual void completedRaw(U32 status, const std::string& reason, diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 35e2e96bab..36234b9536 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -186,8 +186,11 @@ private: // Populate the menu with items like "New Skin", "New Pants", etc. static void populateCreateWearableSubmenus(LLMenuGL* menu) { - LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE); - LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE); + // MAINT-2276...these menus are created as dummies because they are not available + // when this function is called. This prevents their parent from popping up later. + // + //LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE); + //LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE); for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i) { @@ -200,8 +203,11 @@ private: p.on_click.function_name = "Wearable.Create"; p.on_click.parameter = LLSD(type_name); - LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ? - menu_clothes : menu_bp; + //LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ? menu_clothes : menu_bp; + // This is a work-around for MAINT-2276 wherein the parent toggleable menu does not appear + // It puts everything under one menu, but that menu appears, which is better than not. + // + LLView* parent = menu; LLUICtrlFactory::create(p, parent); } } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 5da1561afe..4cdb568d17 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1540,17 +1540,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use // Actually extract the data. if (parcel) { - if (sequence_id == SELECTED_PARCEL_SEQ_ID - && parcel->getLocalID() != INVALID_PARCEL_ID - && parcel->getLocalID() != local_id) - { - // The parcel has a valid parcel ID but it doesn't match the parcel - // for the data received. - llinfos << "Expecting data for parcel " << parcel->getLocalID() \ - << " but got data for parcel " << local_id << llendl; - return; - } - parcel->init(owner_id, FALSE, FALSE, FALSE, claim_date, claim_price_per_meter, rent_price_per_meter, diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 44c18c2cce..c8f5cbb2b0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -8872,14 +8872,6 @@ Cannot save to object contents: Item with that name already exists in inventory Cannot save to object contents: This would modify the attachment permissions. - - fail -Not permitted to edit this! - - - - fail -You don't have permission to modify that object. - - - - fail -Can't enable physics for an object that contributes to the navmesh. - - - - fail -Can't enable physics for keyframed objects. - - - - fail -Can't enable physics for object -- insufficient land resources. - - - - fail -Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS] - - - - - fail -[AV_FREEZER] has frozen you. You cannot move or interact with the world. - - - - fail -[AV_FREEZER] has frozen you for [AV_FREEZE_TIME] seconds. You cannot move or interact with the world. - - - - fail -Avatar frozen. - - - - fail -[AV_FREEZER] has unfrozen you. - - - - fail -Avatar unfrozen. - - - - fail -Freeze failed because you don't have admin permission for that parcel. - - - - fail -Your freeze expired, go about your business. - - - - fail -Sorry, can't freeze that user. - - - - fail -You are now the owner of object [OBJECT_NAME] - - - - fail -Can't rez object at [OBJECT_POS] because the owner of this land does not allow it. Use the land tool to see land ownership. - - - - fail -Object can not be rezzed because there are too many requests. - - - - fail -You cannot sit because you cannot move at this time. - - - - fail -You cannot sit because you are not allowed on that land. - - - - fail -Try moving closer. Can't sit on object because -it is not in the same region as you. - - - - fail -Unable to create new object. The region is full. - - - - fail -Failed to place object at specified location. Please try again. - - - - fail -You Can't create trees and grass on land you don't own. - - - - fail -Copy failed because you lack permission to copy the object '[OBJ_NAME]'. - - - - fail -Copy failed because the object '[OBJ_NAME]' cannot be transferred to you. - - - - fail -Copy failed because the object '[OBJ_NAME]' contributes to navmesh. - - - - fail -Duplicate with no root objects selected. - - - - fail -Can't duplicate objects because the region is full. - - - - fail -Can't duplicate objects - Can't find the parcel they are on. - - - - fail -Can't create object because -the parcel is full. - - - - fail -Attempt to rez an object failed. - - - - fail -Unable to create item that has caused problems on this region. - - - - fail -That inventory item has been blacklisted. - - - - fail -You are not currently allowed to create objects. - - - - fail -Land Search Blocked. -You have performed too many land searches too quickly. -Please try again in a minute. - - - - fail -Not enough script resources available to attach object! - - - - fail -You died and have been teleported to your home location - - - - fail -You are no longer allowed here and have [EJECT_TIME] seconds to leave. - - - - fail -You can't enter this region because -the server is full. - - - - fail -Save Back To Inventory has been disabled. - - - - fail -Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists. - - - - fail -Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'. - - - - fail -Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled. - - - - fail -You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'. - - - - fail -You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. - - - - fail -You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. - - - - fail -Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system. - - - - fail -Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'. - - - - fail -Cannot save your selection because the object '[OBJ_NAME]' is not copyable. - - - - fail -You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'. - - - - fail -Internal Error: Unknown destination type. - - - - fail -Delete failed because object not found - - - - fail -Sorry, can't eject that user. - - - - fail -This region does not allow you to set your home location here. - - - - fail -You can only set your 'Home Location' on your land or at a mainland Infohub. - - - - fail -Home position set. - - - - fail -Avatar ejected. - - - - fail -Eject failed because you don't have admin permission for that parcel. - - - - fail -Can't move object '[OBJECT_NAME]' to -[OBJ_POSITION] in region [REGION_NAME] because the parcel is full. - - - - fail -Can't move object '[OBJECT_NAME]' to -[OBJ_POSITION] in region [REGION_NAME] because your objects are not allowed on this parcel. - - - - fail -Can't move object '[OBJECT_NAME]' to -[OBJ_POSITION] in region [REGION_NAME] because there are not enough resources for this object on this parcel. - - - - fail -Can't move object '[OBJECT_NAME]' to -[OBJ_POSITION] in region [REGION_NAME] because the other region is running an older version which does not support receiving this object via region crossing. - - - - fail -Can't move object '[OBJECT_NAME]' to -[OBJ_POSITION] in region [REGION_NAME] because you cannot modify the navmesh across region boundaries. - - - - fail -Can't move object '[OBJECT_NAME]' to -[OBJ_POSITION] in region [REGION_NAME] because of an unknown reason. ([FAILURE_TYPE]) - - - - fail -You don't have permission to modify that object - - - - fail -Can't enable physics for an object that contributes to the navmesh. - - - - fail -Can't enable physics for keyframed objects. - - - - fail -Can't enable physics for object -- insufficient land resources. - - - - fail -Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS] - - - - fail -This object cannot have a concave piece because it is phantom and contributes to the navmesh. - - - - fail -Unable to add item! - - - - fail -Unable to edit this! - - - - fail -Not permitted to edit this. - - - - fail -Not permitted to copy that inventory. - - - - fail -Cannot save to object contents: Item no longer exists. - - - - fail -Cannot save to object contents: Item with that name already exists in inventory - - - - fail -Cannot save to object contents: This would modify the attachment permissions. - - - - fail -Not permitted to edit this! - - - - fail -Too many scripts. - - - - fail -Unable to add script! - - - - fail -Asset server didn't respond in a timely fashion. Object returned to sim. - - - - fail -This region does not have physics shapes enabled. - - - - fail -You cannot modify the navmesh across region boundaries. - - - - fail -You don't have permission to modify that object. - - - - fail -Can't enable physics for an object that contributes to the navmesh. - - - - fail -Can't enable physics for keyframed objects. - - - - fail -Can't enable physics for object -- insufficient land resources. - - - - fail -Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS] - - - - fail -Cannot set physics properties on that object type. - - - - fail -Cannot set root prim to have no shape. - - - - fail -This region does not have physics materials enabled. - - - - fail -Only root prims may have their physics materials adjusted. - - - - fail -Setting physics materials on characters is not yet supported. - - - - fail -One or more of the specified physics material properties was invalid. - - - - fail -You may not alter the stitching type of a mesh object. - - - - fail -You may not alter the shape of a mesh object - - - - fail -You can't enter this region because \nthe region is full. - - - - fail -Link failed -- owners differ - - - - fail -Link failed -- cannot modify the navmesh across region boundaries. - - - - fail -Link failed because you do not have edit permission. - - - - fail -Link failed -- too many primitives - - - - fail -Link failed -- cannot link no-copy with no-transfer - - - - fail -Link failed -- nothing linkable. - - - - fail -Link failed -- too many pathfinding characters - - - - fail -Link failed -- insufficient land resources - - - - fail -Object uses too many physics resources -- its dynamics have been disabled. - - - - fail -You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' - - - - fail -You have been teleported home by the object '[OBJECT_NAME]' - - - - fail -You have been teleported by an attachment on [ITEM_ID] - - - - fail -You have been teleported by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' - - - - fail -You have been teleported by the object '[OBJECT_NAME]' owned by [OWNER_ID] - - - - fail -You have been teleported by the object '[OBJECT_NAME]' owned by an unknown user. - - - - fail -Unable to create requested object. The region is full. - - - - fail -You can't attach multiple objects to one spot. - - - - fail -You can't create multiple objects here. - - - - fail -Unable to create requested object. Object is missing from database. - - - - fail -Unable to create requested object. The request timed out. Please try again. - - - - fail -Unable to create requested object. Please try again. - - - - fail -Rez failed, requested object took too long to load. - - - - fail -Failed to place object at specified location. Please try again. - - - - fail -You cannot create plants on this land. - - - - fail -Cannot restore object. No world position found. - - - - fail -Unable to rez object because its mesh data is invalid. - - - - fail -Unable to rez object because there are already too many scripts in this region. - - - - fail -Your access privileges don't allow you to create objects there. - - - - fail -You are not currently allowed to create objects. - - - - fail -Invalid object parameters - - - - fail -Your access privileges don't allow you to duplicate objects here. - - - - fail -You are not allowed to change this shape. - - - - fail -Your access privileges don't allow you to claim objects here. - - - - fail -Deed failed because you do not have permission to deed objects for your group. - - - - fail -Your access privileges don't allow you to buy objects here. - - - - fail -Cannot attach object because an avatar is sitting on it. - - - - fail -Trees and grasses cannot be worn as attachments. - - - - fail -Cannot attach group-owned objects. - - - - fail -Cannot attach objects that you don't own. - - - - fail -Cannot attach objects that contribute to navmesh. - - - - fail -Cannot attach object because you do not have permission to move it. - - - - fail -Not enough script resources available to attach object! - - - - fail -You can't drop objects here; try the Free Trial area. - - - - fail -You can't drop mesh attachments. Detach to inventory and then rez in world. - - - - fail -Failed to drop attachment: you don't have permission to drop there. - - - - fail -Failed to drop attachment: insufficient available land resource. - - - - fail -Failed to drop attachments: insufficient available resources. - - - - fail -Cannot drop object here. Parcel is full. - - - - fail -Can't touch/grab this object because you are banned from the land parcel. - - - - fail -Please narrow your delete parameters. - - - - fail -Unable to upload asset. - - - - fail -Could not find user to teleport home - - - - fail -godlike request failed - - - - fail -generic request failed - - - - fail -Unable to upload postcard. Try again later. - - - - fail -Unable to fetch inventory details for the group notice. - - - - fail -Unable to send group notice -- not permitted. - - - - fail -Unable to send group notice -- could not construct inventory. - - - - fail -Unable to parse inventory in notice. - - - - fail -Terrain upload failed. - - - - fail -Terrain file written. - - - - fail -Terrain file written, starting download... - - - - fail -Terrain baked. - - - - fail -Only the first 10 selected objects have been disabled. Refresh and make additional selections if required. - - - - fail -You need to update your viewer to buy this parcel. - - - - fail -You can't buy this land due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating. - - - - fail -Unable to buy, this parcel is not for sale. - - - - fail -Unable to buy, the sale price or land area has changed. - - - - fail -You are not the authorized buyer for this parcel. - - - - fail -You cannot purchase this parcel because it is already awaiting purchase aut - - - - fail -You cannot build objects here because doing so would overflow the parcel. - - - - fail -You selected land with different owners. Please select a smaller area and try again. - - - - fail -Not enough leased parcels in selection to join. - - - - fail -Can't divide land.\nThere is more than one parcel selected.\nTry selecting a smaller piece of land. - - - - fail -Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug... - - - - fail -Can't divide land. Whole parcel is selected.\nTry selecting a smaller piece of land. - - - - fail -Land has been divided. - - - - fail -You purchased a pass. - - - - fail -Region does not allow classified advertisements. - - - - fail -Your pass to this land is about to expire. - - - - fail -There is no suitable surface to sit on, try another spot. - - - - fail -No room to sit here, try another spot. - - - - fail -Autopilot canceled - - - - fail -Claim object failed because you don't have permission - - - - fail -Claim object failed because you don't have enough L$. - - - - fail -Cannot deed group-owned land. - - - - fail -Buy object failed because you don't have enough L$. - - - - fail -Buy inventory failed because you do not have enough L$ - - - - fail -You don't have enough L$ to buy a pass to this land. - - - - fail -Unable to buy pass right now. Try again later. - - - - fail -Can't create object because \nthe parcel is full. - - - - fail -Failed to place object at specified location. Please try again. - - - - fail -Unable to create landmark for event. - - - - fail -Your godlike powers break the freeze! - - - - fail -Request for special powers failed. This request has been logged. - - - - fail -The system is currently unable to process your request. The request timed out. - - - - fail -The system is unable to process your request. - - - - fail -Insufficient funds to create primitve. - - - - fail -Insufficient funds to create object. - - - - fail -Reset Home position since Home wasn't legal. - - - - fail -You cannot currently invite anyone to your location because the region is full. Try again later. - - - - fail -This region does not allow you to set your home location here. - - - - fail -You can only set your 'Home Location' on your land or at a mainland Infohub. - - - - fail -Home position set. - - - - fail -Cannot derez object due to inventory fault. - - - - fail -Cannot create requested inventory. - - - - fail -Cannot create requested inventory folder. - - - - fail -Cannot create that inventory. - - - - fail -Cannot create landmark. - - - - fail -Cannot create outfit right now. Try again in a minute. - - - - fail -Inventory is not for sale. - - - - fail -Unable to find inventory item. - - - - fail -Unable to find object. - - - - fail -Money transfers to objects are currently disabled in this region. - - - - fail -Could not figure out who to pay. - - - - fail -You cannot give L$ to public objects. - - - - fail -Inventory creation on in-world object failed. - - - - fail -An internal error prevented us from properly updating your viewer. The L$ balance or parcel holdings displayed in your viewer may not reflect your actual balance on the servers. - - - diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 849f3ef73d..cd243d40a4 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -147,12 +147,12 @@ height="12" layout="topleft" left_delta="87" - name="ShadersPrefText3" + name="ShadersPrefText2" top_delta="0" width="80"> Mid - - High - + High + > "$2" +# @file update_install +# @author Nat Goodspeed +# @date 2013-01-09 +# @brief Update the containing Second Life application bundle to the version in +# the specified tarball. +# +# This bash implementation is derived from the previous linux-updater.bin +# application. +# +# $LicenseInfo:firstyear=2013&license=viewerlgpl$ +# Copyright (c) 2013, Linden Research, Inc. +# $/LicenseInfo$ + +# **************************************************************************** +# script parameters +# **************************************************************************** +tarball="$1" # the file to install +markerfile="$2" # create this file on failure +mandatory="$3" # what to write to markerfile on failure + +# **************************************************************************** +# helper functions +# **************************************************************************** +# empty array +cleanups=() + +# add a cleanup action to execute on exit +function cleanup { + # wacky bash syntax for appending to array + cleanups[${#cleanups[*]}]="$*" +} + +# called implicitly on exit +function onexit { + for action in "${cleanups[@]}" + do # don't quote, support actions consisting of multiple words + $action + done +} +trap 'onexit' EXIT + +# write to log file +function log { + # our log file will be open as stderr -- but until we set up that + # redirection, logging to stderr is better than nothing + echo "$*" 1>&2 +} + +# We display status by leaving one background xmessage process running. This +# is the pid of that process. +statuspid="" + +function clear_message { + [ -n "$statuspid" ] && kill $statuspid + statuspid="" +} + +# make sure we remove any message box we might have put up +cleanup clear_message + +# can we use zenity, or must we fall back to xmessage? +zenpath="$(which zenity)" +if [ -n "$zenpath" ] +then # zenity on PATH and is executable + # display a message box and continue + function status { + # clear any previous message + clear_message + # put up a new zenity box and capture its pid + "$zenpath" --info --title "Second Life Viewer Updater" \ + --width=320 --height=120 --text="$*" & + statuspid=$! + } + + # display an error box and wait for user + function errorbox { + "$zenpath" --error --title "Second Life Viewer Updater" \ + --width=320 --height=120 --text="$*" + } + +else # no zenity, use xmessage instead + # display a message box and continue + function status { + # clear any previous message + clear_message + # put up a new xmessage and capture its pid + xmessage -buttons OK:2 -center "$*" & + statuspid=$! + } + + # display an error box and wait for user + function errorbox { + xmessage -buttons OK:2 -center "$*" + } fi -rm -f "$1" +# display an error box and terminate +function fail { + # Log the message + log "$@" + # tell subsequent viewer things went south + echo "$mandatory" > "$markerfile" + # add boilerplate + errorbox "An error occurred while updating Second Life: +$* +Please download the latest viewer from www.secondlife.com." + exit 1 +} + +# Find a graphical sudo program and define mysudo function. On error, $? is +# nonzero; output is in $err instead of being written to stdout/stderr. +gksudo="$(which gksudo)" +kdesu="$(which kdesu)" +if [ -n "$gksudo" ] +then function mysudo { + # gksudo allows you to specify description + err="$("$gksudo" --description "Second Life Viewer Updater" "$@" 2>&1)" + } +elif [ -n "$kdesu" ] +then function mysudo { + err="$("$kdesu" "$@" 2>&1)" + } +else # couldn't find either one, just try it anyway + function mysudo { + err="$("$@" 2>&1)" + } +fi + +# Move directories, using mysudo if we think it necessary. On error, $? is +# nonzero; output is in $err instead of being written to stdout/stderr. +function sudo_mv { + # If we have write permission to both parent directories, shouldn't need + # sudo. + if [ -w "$(dirname "$1")" -a -w "$(dirname "$2")" ] + then err="$(mv "$@" 2>&1)" + else # use available sudo program; mysudo sets $? and $err + mysudo mv "$@" + fi +} + +# **************************************************************************** +# main script logic +# **************************************************************************** +mydir="$(dirname "$0")" +# We happen to know that the viewer specifies a marker-file pathname within +# the logs directory. +logsdir="$(dirname "$markerfile")" +logname="$logsdir/updater.log" + +# move aside old updater.log; we're about to create a new one +[ -f "$logname" ] && mv "$logname" "$logname.old" + +# Set up redirections for this script such that stderr is logged. (But first +# move the previous stderr to file descriptor 3.) +exec 3>&2- 2> "$logname" + +# Rather than setting up a special pipeline to timestamp every line of stderr, +# produce header lines into log file indicating timestamp and the arguments +# with which we were invoked. +date 1>&2 +log "$0 $*" + +# Log every command we execute, along with any stderr it might produce +set -x + +status 'Installing Second Life...' + +# Creating tempdir under /tmp means it's possible that tempdir is on a +# different filesystem than INSTALL_DIR. One is tempted to create tempdir on a +# path derived from `dirname INSTALL_DIR` -- but it seems modern 'mv' can +# handle moving across filesystems?? +tempdir="$(mktemp -d)" +tempinstall="$tempdir/install" +# capture the actual error message, if any +err="$(mkdir -p "$tempinstall" 2>&1)" || fail "$err" +cleanup rm -rf "$tempdir" + +# If we already knew the name of the tarball's top-level directory, we could +# just move that when all was said and done. Since we don't, untarring to the +# 'install' subdir with --strip 1 effectively renames that top-level +# directory. +# untar failures tend to be voluminous -- don't even try to capture, just log +tar --strip 1 -xjf "$tarball" -C "$tempinstall" || fail "Untar command failed" + +INSTALL_DIR="$(cd "$mydir/.." ; pwd)" + +# Considering we're launched from a subdirectory of INSTALL_DIR, would be +# surprising if it did NOT already exist... +if [ -e "$INSTALL_DIR" ] +then backup="$INSTALL_DIR.backup" + backupn=1 + while [ -e "$backup" ] + do backup="$INSTALL_DIR.backup.$backupn" + ((backupn += 1)) + done + # on error, fail with actual error message from sudo_mv: permissions, + # cross-filesystem mv, ...? + sudo_mv "$INSTALL_DIR" "$backup" || fail "$err" +fi +# We unpacked the tarball into tempinstall. Move that. +if ! sudo_mv "$tempinstall" "$INSTALL_DIR" +then # If we failed to move the temp install to INSTALL_DIR, try to restore + # INSTALL_DIR from backup. Save $err because next sudo_mv will trash it! + realerr="$err" + sudo_mv "$backup" "$INSTALL_DIR" + fail "$realerr" +fi + +# Removing the tarball here, rather than with a 'cleanup' action, means we +# only remove it if we succeeded. +rm -f "$tarball" + +# Launch the updated viewer. Restore original stderr from file descriptor 3, +# though -- otherwise updater.log gets cluttered with the viewer log! +"$INSTALL_DIR/secondlife" 2>&3- &