From 840cb864a3b41ccff310077eff487c3fa1d6b805 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sat, 5 Jan 2013 09:17:51 -0500 Subject: [PATCH 01/82] MAINT-2155: replace embedded mac-updater.app with a Python script. Remove mac-updater subtree from viewer source, along with the update_install bash script that invoked it. Remove all mention of mac-updater in CMakeLists.txt files and in viewer_manifest.py. Change Mac update_install bash script references in viewer_manifest.py and in llupdaterservice.cpp (which invokes it) to new Python update_install.py. Add update_install.py, messageframe.py (which puts up some Tkinter UI) and janitor.py (cloned from vita, it's exactly what we need here). --- indra/CMakeLists.txt | 3 +- indra/mac_updater/AutoUpdater.nib | Bin 5251 -> 0 bytes indra/mac_updater/AutoUpdater.xib | 520 -------------- indra/mac_updater/CMakeLists.txt | 89 --- indra/mac_updater/Info.plist | 26 - indra/mac_updater/MacUpdater-Info.plist | 30 - indra/mac_updater/MacUpdaterAppDelegate.h | 60 -- indra/mac_updater/MacUpdaterAppDelegate.mm | 288 -------- indra/mac_updater/mac_updater.cpp | 659 ------------------ indra/mac_updater/mac_updater.h | 91 --- indra/mac_updater/main.m | 34 - indra/newview/CMakeLists.txt | 5 +- indra/newview/viewer_manifest.py | 7 +- .../updater/llupdaterservice.cpp | 4 + .../updater/scripts/darwin/janitor.py | 133 ++++ .../updater/scripts/darwin/messageframe.py | 66 ++ .../updater/scripts/darwin/update_install | 10 - .../updater/scripts/darwin/update_install.py | 336 +++++++++ 18 files changed, 546 insertions(+), 1815 deletions(-) delete mode 100755 indra/mac_updater/AutoUpdater.nib delete mode 100644 indra/mac_updater/AutoUpdater.xib delete mode 100644 indra/mac_updater/CMakeLists.txt delete mode 100644 indra/mac_updater/Info.plist delete mode 100644 indra/mac_updater/MacUpdater-Info.plist delete mode 100644 indra/mac_updater/MacUpdaterAppDelegate.h delete mode 100644 indra/mac_updater/MacUpdaterAppDelegate.mm delete mode 100644 indra/mac_updater/mac_updater.cpp delete mode 100644 indra/mac_updater/mac_updater.h delete mode 100644 indra/mac_updater/main.m create mode 100644 indra/viewer_components/updater/scripts/darwin/janitor.py create mode 100644 indra/viewer_components/updater/scripts/darwin/messageframe.py delete mode 100644 indra/viewer_components/updater/scripts/darwin/update_install create mode 100755 indra/viewer_components/updater/scripts/darwin/update_install.py diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 24c98bfada..45608de674 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -86,8 +86,7 @@ if (VIEWER) add_dependencies(viewer linux-crash-logger-strip-target linux-updater) elseif (DARWIN) add_subdirectory(${VIEWER_PREFIX}mac_crash_logger) - add_subdirectory(${VIEWER_PREFIX}mac_updater) - add_dependencies(viewer mac-updater mac-crash-logger) + add_dependencies(viewer mac-crash-logger) elseif (WINDOWS) add_subdirectory(${VIEWER_PREFIX}win_crash_logger) # cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake diff --git a/indra/mac_updater/AutoUpdater.nib b/indra/mac_updater/AutoUpdater.nib deleted file mode 100755 index 03883e2b86c2052210d544c47293202eb0730456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5251 zcma)A3w#viwLfQec6N7WcD_jnPf-F%k;*FxZ>i?RE0Bc8=D{mjHoKE#W!Vk;Kw`}0 zt5UA5RYA1W`nVF%TSY5ATBT~e){DK?Dk3OvDFPy;h=_;?!aXyy38>ur>&)-RPQJ%^ z{LlZK?|d}0M8b(=Ufy;<5WoQV z$yiG!;EG3|(Zk>ZH}r!X$b}!nFqi^mFcqf39PmRFVsI<`67GWg;aBhgtb_IN7(5A2 z!*lRF`~hBu*Wu6bHvA3VgRSrZ9Du{{DV&4zh$x^7W%Qzky)Ya5;~*T4qi{SH<76zu zsW=TQaTdfC5564?VDkU;?zyr2OC9Wo#jxgK16M&`xEikZ>w2ZHCY%U2M2y;SG!(lzQCI1kZUZ;XXid~q`ewyq$@w%G4kc;= zk(80B$qhyViNsuc%v?o#N@LL|p-sRi{5tEBVejzky(@ji!Jv^KP2os5*_vJ+i__|! z-yi!J$)|9EPv_0NlHb59cq4D(P4AP>+0Y*b%p-$L8!H2g3@&oV>`sH; zhabT}xE2P@wVjC4g4y<`k*KF#sYEii$OfQ;*5#NYuYL z;n%OO^i?N}cv&=Q#2W)aqbzAGDhnCWWVkVG#OGA{DgsM=;aiL@AvIy+X1|`*DW)tj z%OLyX0SYIr@de|C5j7QAA+c4J1cD30(IygBTQw;XXflIm&sc~Na;8x0+plMI&iRt9 z5u+lISjb)6&4FLfWe*?6$Lm67_EG@u;h;0W-m9%Gf86LH*##r>+J|Jfjm#?;lAWJl z(BAIXGkr!d77dk$8;$JhmQa9Pq^Q`McR)E*5Pp>~9cI8xm<2wlf@;F67G_&kST+&2 zlJP(|nlx>$G?pfbCFTUlSz@_jxoJ)i3@xP0h?6^$;uK>OHHx4w)v$y%B=~Ty^065R z8P^Z3wpq`D63Xz7$x3bIg$JF{4Z{$BZK^$F#Tah8D}H#g`cshXm9^3YJ)AEwyOZMuxS7EnLWR zVvd!I7MfF1O--bAMm!vgQ!-{0d3is6O-|7qupTb+{$_l$cS1Y-8!RJ~yzo=F4Q_|! z@H1FJ5ZwVkhhM;*W}cC!mJ%Xd*LMMFq!dpQb<@Qm8IMKGSkaCu3Q%b*5;F-+0JX&8 z#7|`eA;X-kaaP7Rp;9g7pXQ&U^75 zy2N|d_*xT`%=0M)OeCz?Z6yC8c${Sa7M`FjwawwA!F%bBio9W?JD)LNTekt8>Xh06 z8-8fsMl$bNOJ5&;6_xe0qAsj2SN40}t0XTi_eFTg${KUwq_7bQnK4`sFTy7HBjk`* z#a2-_N7J;n?Rf=WO^4Fj^%%SYe}dQGzaWRAYKGp7w_QtUT~|K(_3p&!u|u*)jxjks zVzgN-^4i;XQ3Y7=y-a(9a&0rbX;J!rOiJ?{4_wXmJ% zeh44J4%kVfyI?o$fxTqkN3b92E%w^wtvH#ChZ|B!D&};uP722p$;*Z^iIvTg%ApJp4yFMYFh_lKpHSKZb);N-KTkf!0`xvZ%8ncEBOX zx#Eny?-Mve^eK+V1FaqK3FPdBqmhvApPFrkil!*U>wOYSm!=;|yG>udgW$M1w}; zyH(&Km31rK2ifVa>oY76(19Wm+SX*zoJO1|{XaBEH+ras*jpY$cPGbfc?zmzc||H| zR(}iIb*Px=&b@Tk%z@9vh7w{2$Bp<~`^D#THH}>fw*lwu9 zzLe2xEs7PA)i%9MYFLr*wJvIiMZ!Ug0mL0TJMxJyT&5^nCFuL|eApLrsnD2|t)p_9 zuZ!k-?fdHrY29EPY_0QArseBSbDesHbtKJ}XRW*9s`|^lpt#vKUO`ru&N@@)6)huK zm`gsG9u#)Tvg!RAPFdHP;yv2hs4Q6hNB-!s^qHSmFxKoqvfJ|WE`Q9K%OAUpU^!M; z$(!!Xj72TxY2AV4W;00LBTmN|6p(b-eMWK}jm(6cYBNa5bSr^X)JkAA)?h8ak(cs` zL{XfBb8#Nd$2y9xp8{1LXfVtinm|okm~zIvwUCflDjqa=2`{Fg7Mk*?rNss=@*=8K z6@g&7dn#^eq2w`|$hi57I%{4@AZ{Dkh)q^wSQ&1Zo}%W`tQBU19*eKTMr?*0VlK^f zjb3iwLhzxV446PXDXi;~Z5|PqmbKtw^uwEcGM~f?`L(q{D-*A`wJ$;Hc)E9Luur@$ z^-FN+57c+2NgE&djGl?N!cZ#sK5Db57o#I!`*%|Z{dgBI;}UU2rH+X@H98e?znf5G z)U;0URuXtq321_ha>fFhrf@ah2ZSjVYF~38ZiLFHnwnnla*yrC8vHf&w02WI!DtMm zBFThV*XV4E7zE@4_#3n8{+}y|CYP3Xy7;i=BHhJ$q@64zSL^9De=of>PZt~^?W9bu z_M_MQz4X$2r_|?6skG-`fiBHU;a`E!W^bpKw=FIBH+%=*#Vz88#yz+f_u)slAODUA_zXUi&*DB_#jAM@ujRA(96p!NG}+Pranve=~cEpbMY)6`e>(Z=lMYT zHWTy$ULc@F zoaL-?);ayofHUX}IUAk-?p*DB)VaaA$+_9N#d*;Asq?t=g!82Hl=HOnjPtDImU>Is z(zQ~aR3MF%Zjg$k3aLh_lNzL(rJqTwq(`L3rQb?VN>53@lQv2(O8+fwm3B#cq@SQ z%hX@0tJMe84t2e{L48_%MtxTOv-($cr+Pp=s2*02s7KW=)GyVqyqfnaZ?1Q|x5PWs z+u#j(8@!bD6uFn%e>>2hfd!GHCy~sAPm)WcAHTF7tgKcJiVQ;aw z**k0t+sd}F57-X2i|t|i*nW0^9b|{u5q6XvW5?MEc9NZ9r`Z{HmYrkYvWvP~mvu$Y h(tGGV^=y5(K9VZWG(CM676iMA6h!;C^Iv`5{{n9D2p<3d diff --git a/indra/mac_updater/AutoUpdater.xib b/indra/mac_updater/AutoUpdater.xib deleted file mode 100644 index b29fffba3a..0000000000 --- a/indra/mac_updater/AutoUpdater.xib +++ /dev/null @@ -1,520 +0,0 @@ - - - - 1070 - 11G63 - 2182 - 1138.51 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2182 - - - NSTextField - NSView - NSWindowTemplate - NSProgressIndicator - NSCustomObject - IBNSLayoutConstraint - NSButtonCell - NSButton - NSUserDefaultsController - NSTextFieldCell - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSObject - - - FirstResponder - - - NSApplication - - - 15 - 2 - {{196, 240}, {402, 120}} - 544735232 - Window - NSWindow - - - - - 256 - - - - 268 - {{17, 83}, {79, 17}} - - - - _NS:1505 - YES - - 68288064 - 272630784 - Initalizing... - - LucidaGrande - 13 - 1044 - - _NS:1505 - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - - - - 268 - {{18, 55}, {366, 20}} - - - - _NS:9 - {250, 250} - 16399 - 100 - - - - 268 - {{308, 19}, {74, 19}} - - - - _NS:9 - YES - - -2080244224 - 134217728 - Cancel - - LucidaGrande - 12 - 16 - - _NS:9 - - -2038152961 - 164 - - - 400 - 75 - - - - {402, 120} - - - - - {{0, 0}, {1680, 1028}} - {10000000000000, 10000000000000} - YES - - - MacUpdaterAppDelegate - - - YES - - - - - - - title: values - - - - - - title: values - title - values - 2 - - - 41 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - - - - - - 2 - - - - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 3 - 0 - - 3 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 3 - 0 - - 4 - 1 - - 8 - - 1000 - 6 - 24 - 3 - - - - - 4 - 0 - - 4 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - - - 3 - - - - - - - - 4 - - - - - 8 - - - - - - 20 - - - - - 22 - - - - - - 7 - 0 - - 0 - 1 - - 74 - - 1000 - 3 - 9 - 1 - - - - - - - 23 - - - - - 31 - - - - - 32 - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - 40 - - - - - 42 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{357, 418}, {480, 270}} - - - - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 42 - - - - - MacUpdaterAppDelegate - NSObject - - cancel: - id - - - cancel: - - cancel: - id - - - - NSProgressIndicator - NSTextField - NSWindow - - - - mProgressBar - NSProgressIndicator - - - mProgressText - NSTextField - - - window - NSWindow - - - - IBProjectSource - ./Classes/MacUpdaterAppDelegate.h - - - - - 0 - IBCocoaFramework - YES - 3 - YES - - diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt deleted file mode 100644 index 7382e912bf..0000000000 --- a/indra/mac_updater/CMakeLists.txt +++ /dev/null @@ -1,89 +0,0 @@ -# -*- cmake -*- - -project(mac_updater) - -include(00-Common) -include(OpenSSL) -include(CURL) -include(CARes) -include(LLCommon) -include(LLVFS) -include(Linking) - -include_directories( - ${LLCOMMON_INCLUDE_DIRS} - ${LLVFS_INCLUDE_DIRS} - ${CURL_INCLUDE_DIRS} - ${CARES_INCLUDE_DIRS} - ) - -set(mac_updater_SOURCE_FILES - main.m - MacUpdaterAppDelegate.mm - mac_updater.cpp - ) - -set(mac_updater_HEADER_FILES - MacUpdaterAppDelegate.h - mac_updater.h - CMakeLists.txt - ) - -set_source_files_properties(${mac_updater_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND mac_updater_SOURCE_FILES ${mac_updater_HEADER_FILES}) - - -set(mac_updater_RESOURCE_FILES - AutoUpdater.nib - ) -set_source_files_properties( - ${mac_updater_RESOURCE_FILES} - PROPERTIES - HEADER_FILE_ONLY TRUE - ) -SOURCE_GROUP("Resources" FILES ${mac_updater_RESOURCE_FILES}) -list(APPEND mac_updater_SOURCE_FILES ${mac_updater_RESOURCE_FILES}) - -add_executable(mac-updater - MACOSX_BUNDLE - ${mac_updater_SOURCE_FILES}) - -set_target_properties(mac-updater - PROPERTIES - MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/MacUpdater-Info.plist - ) - -find_library(COCOA_LIBRARY Cocoa) -find_library(IOKIT_LIBRARY IOKit) - -target_link_libraries(mac-updater - ${LLVFS_LIBRARIES} - ${OPENSSL_LIBRARIES} - ${CRYPTO_LIBRARIES} - ${COCOA_LIBRARIES} - ${BOOST_FILESYSTEM_LIBRARY} - ${IOKIT_LIBRARY} - ${CURL_LIBRARIES} - ${CARES_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ) - -add_custom_command( - TARGET mac-updater POST_BUILD -# COMMAND ${CMAKE_COMMAND} -# ARGS -# -E -# copy_directory -# ${CMAKE_CURRENT_SOURCE_DIR}/AutoUpdater.nib -# ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy - ${CMAKE_CURRENT_SOURCE_DIR}/AutoUpdater.nib - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib - ) - -ll_deploy_sharedlibs_command(mac-updater) diff --git a/indra/mac_updater/Info.plist b/indra/mac_updater/Info.plist deleted file mode 100644 index bb27fddb03..0000000000 --- a/indra/mac_updater/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - mac-updater - CFBundleGetInfoString - - CFBundleIconFile - - CFBundleIdentifier - com.secondlife.indra.autoupdater - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleShortVersionString - - CFBundleSignature - ???? - CFBundleVersion - 1.0.0 - - diff --git a/indra/mac_updater/MacUpdater-Info.plist b/indra/mac_updater/MacUpdater-Info.plist deleted file mode 100644 index 92137095ff..0000000000 --- a/indra/mac_updater/MacUpdater-Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - mac-updater - CFBundleGetInfoString - - CFBundleIconFile - - CFBundleIdentifier - com.secondlife.indra.autoupdater - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleShortVersionString - - CFBundleSignature - ???? - CFBundleVersion - 1.0.0 - NSMainNibFile - AutoUpdater - NSPrincipalClass - NSApplication - - diff --git a/indra/mac_updater/MacUpdaterAppDelegate.h b/indra/mac_updater/MacUpdaterAppDelegate.h deleted file mode 100644 index c051214bb8..0000000000 --- a/indra/mac_updater/MacUpdaterAppDelegate.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file MacUpdaterAppDelegate.h - * @brief - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - - -#import -#include -#include "mac_updater.h" - -#ifndef LL_MAC_UPDATE_DELEGATE_H -#define LL_MAC_UPDATE_DELEGATE_H - -@interface MacUpdaterAppDelegate : NSObject -{ - IBOutlet NSProgressIndicator *mProgressBar; - IBOutlet NSTextField *mProgressText; -} -- (void)setWindow:(NSWindow *)newWindow; -- (NSWindow *)window; -- (IBAction)cancel:(id)sender; -- (void) setProgress:(int)cur max:(int) max; -- (void) setProgressText:(const std::string&)str; -- (int) parse_args:(NSArray *) args; -- (void)stopAlert; -- (void)stopAlertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo; - - -NSWindow *_window; -bool mAnimated; -double mProgressPercentage; -@property (assign) IBOutlet NSWindow *window; -LLMacUpdater mUpdater; - -@end - -#endif //LL_MAC_UPDATE_DELEGATE_H - - diff --git a/indra/mac_updater/MacUpdaterAppDelegate.mm b/indra/mac_updater/MacUpdaterAppDelegate.mm deleted file mode 100644 index 4457419a94..0000000000 --- a/indra/mac_updater/MacUpdaterAppDelegate.mm +++ /dev/null @@ -1,288 +0,0 @@ -/** - * @file MacUpdaterAppDelegate.mm - * @brief - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#import "MacUpdaterAppDelegate.h" -#include "llvfs_objc.h" -#include -#include - -@implementation MacUpdaterAppDelegate - -MacUpdaterAppDelegate *gWindow; -bool gCancelled = false; -bool gFailure =false; - - -//@synthesize window = _window; -- (void)setWindow:(NSWindow *)window -{ - _window = window; -} - -- (NSWindow *)window -{ - return _window; -} - -- (id)init -{ - self = [super init]; - if (self) { - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - mAnimated = false; - mProgressPercentage = 0.0; - NSArray *arguments = [[NSProcessInfo processInfo] arguments]; - - [self parse_args:arguments]; - gWindow = self; - - mUpdater.doUpdate(); - [pool drain]; - [pool release]; - } - return self; -} - -- (void)dealloc -{ - [super dealloc]; -} - -std::string* NSToString( NSString *ns_str ) -{ - return ( new std::string([ns_str UTF8String]) ); -} - - -- (void) setProgress:(int)cur max:(int) max -{ - bool indeterminate = false; - if (max==0) - { - indeterminate = true; - } - else - { - double percentage = ((double)cur / (double)max) * 100.0; - [mProgressBar setDoubleValue:percentage]; - } - [mProgressBar setIndeterminate:indeterminate]; -} - -- (void) setProgressText:(const std::string& )str -{ - [mProgressText setStringValue:[NSString stringWithUTF8String:str.c_str()]]; -} - -void sendDone() -{ - [ [ (id) gWindow window ] close]; -} - -void sendStopAlert() -{ - [ gWindow stopAlert ]; -} - -void setProgress(int cur, int max) -{ - [ (id) gWindow setProgress:cur max:max]; -} - -void setProgressText(const std::string& str) -{ - [ (id) gWindow setProgressText:str]; -} - -void sendProgress(int cur, int max, const std::string str) -{ - setProgress(cur,max); - setProgressText(str); -} - -bool mkTempDir(boost::filesystem::path& temp_dir) -{ - NSString * tempDir = NSTemporaryDirectory(); - if (tempDir == nil) - tempDir = @"/tmp/"; - - std::string* temp_str = NSToString(tempDir); - *temp_str += std::string("SecondLifeUpdate_XXXXXX"); - - std::cout << "tempDir is " << temp_str << std::endl; - - char temp[PATH_MAX] = ""; /* Flawfinder: ignore */ - strncpy(temp, temp_str->c_str(), temp_str->length()); - - if(mkdtemp(temp) == NULL) - { - return false; - } - - temp_dir = boost::filesystem::path(temp); - - return true; -} -bool copyDir(const std::string& src_dir, const std::string& dest_dir) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString* file = [NSString stringWithCString:src_dir.c_str() - encoding:[NSString defaultCStringEncoding]]; - NSString* toParent = [NSString stringWithCString:dest_dir.c_str() - encoding:[NSString defaultCStringEncoding]]; - NSError* error = nil; - - bool result = [[NSFileManager defaultManager] copyItemAtPath: file toPath: toParent error:&error]; - - if (!result) { - NSLog(@"Error during copy: %@", [error localizedDescription]); - } - [pool release]; - - return result; -} - -- (int) parse_args:(NSArray *) args -{ - int i; - int argc = [args count]; - - mUpdater.mApplicationPath = NSToString( [args objectAtIndex:0] ); - - for( i = 1; i < argc; i++ ) - { - NSString* ns_arg = [args objectAtIndex:i]; - const char *arg = [ns_arg UTF8String]; - - if ((!strcmp(arg, "-url")) && (i < argc)) - { - mUpdater.mUpdateURL = NSToString( [args objectAtIndex:(++i)] ); - } - else if ((!strcmp(arg, "-name")) && (i < argc)) - { - mUpdater.mProductName = NSToString( [args objectAtIndex:(++i)] ); - } - else if ((!strcmp(arg, "-bundleid")) && (i < argc)) - { - mUpdater.mBundleID = NSToString( [args objectAtIndex:(++i)] ); - } - else if ((!strcmp(arg, "-dmg")) && (i < argc)) - { - mUpdater.mDmgFile = NSToString( [args objectAtIndex:(++i)] ); - } - else if ((!strcmp(arg, "-marker")) && (i < argc)) - { - mUpdater.mMarkerPath = NSToString( [args objectAtIndex:(++i)] ); - } - } - return 0; -} - -bool isDirWritable(const std::string& dir_name) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *fullPath = [NSString stringWithCString:dir_name.c_str() - encoding:[NSString defaultCStringEncoding]]; - - NSFileManager *fm = [NSFileManager defaultManager]; - bool result = [fm isWritableFileAtPath:fullPath]; - [pool release]; - - return result; -} - -std::string* getUserTrashFolder() -{ - std::string *result; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *trash_str=[NSHomeDirectory() stringByAppendingPathComponent:@".Trash"]; - - result = NSToString( trash_str ); - - [pool release]; - return result; - -} - -bool isFSRefViewerBundle(const std::string& targetURL) -{ - bool result = false; - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *fullPath = [NSString stringWithCString:targetURL.c_str() - encoding:[NSString defaultCStringEncoding]]; - NSBundle *targetBundle = [NSBundle bundleWithPath:fullPath]; - NSString *targetBundleStr = [targetBundle bundleIdentifier]; - NSString *sourceBundleStr = [NSString stringWithCString:mUpdater.mBundleID->c_str() - encoding:[NSString defaultCStringEncoding]]; - - result = [targetBundleStr isEqualToString:sourceBundleStr]; - - if(!result) - { - std::cout << "Target bundle ID mismatch." << std::endl; - } - - [pool release]; - - return result; -} - - -- (IBAction)cancel:(id)sender -{ - gCancelled = true; - sendDone(); -} - -- (void)stopAlert -{ - NSAlert *alert = [[NSAlert alloc] init]; - [alert setAlertStyle:NSInformationalAlertStyle]; - [alert setMessageText:@"Error"]; - [alert setInformativeText:@"An error occurred while updating Second Life. Please download the latest version from www.secondlife.com."]; - - [alert beginSheetModalForWindow:_window - modalDelegate:self - - didEndSelector:@selector(stopAlertDidEnd:returnCode: - contextInfo:) - contextInfo:nil]; - } - - - (void)stopAlertDidEnd:(NSAlert *)alert - returnCode:(int)returnCode contextInfo:(void *)contextInfo -{ - [alert release]; -} - - -@end diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp deleted file mode 100644 index bc9fec3558..0000000000 --- a/indra/mac_updater/mac_updater.cpp +++ /dev/null @@ -1,659 +0,0 @@ -/** - * @file mac_updater.cpp - * @brief - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include "llerror.h" -#include "lltimer.h" -#include "lldir.h" -#include "llfile.h" - -#include "llstring.h" - -#include "llerrorcontrol.h" -#include "mac_updater.h" -#include - -pthread_t updatethread; - -LLMacUpdater* LLMacUpdater::sInstance = NULL; - -LLMacUpdater::LLMacUpdater(): - mUpdateURL (NULL), - mProductName (NULL), - mBundleID (NULL), - mDmgFile (NULL), - mMarkerPath (NULL) -{ - sInstance = this; -} - -void LLMacUpdater::doUpdate() -{ - // We assume that all the logs we're looking for reside on the current drive - gDirUtilp->initAppDirs("SecondLife"); - - LLError::initForApplication( gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); - - // Rename current log file to ".old" - std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "updater.log.old"); - std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "updater.log"); - LLFile::rename(log_file.c_str(), old_log_file.c_str()); - - // Set the log file to updater.log - LLError::logToFile(log_file); - - if ((mUpdateURL == NULL) && (mDmgFile == NULL)) - { - llinfos << "Usage: mac_updater -url | -dmg [-name ] [-program ]" << llendl; - exit(1); - } - else - { - llinfos << "Update url is: " << mUpdateURL << llendl; - if (mProductName) - { - llinfos << "Product name is: " << *mProductName << llendl; - } - else - { - mProductName = new std::string("Second Life"); - } - if (mBundleID) - { - llinfos << "Bundle ID is: " << *mBundleID << llendl; - } - else - { - mBundleID = new std::string("com.secondlife.indra.viewer"); - } - } - - llinfos << "Starting " << *mProductName << " Updater" << llendl; - - pthread_create(&updatethread, - NULL, - &sUpdatethreadproc, - NULL); - - - void *threadresult; - - pthread_join(updatethread, &threadresult); - - if(gCancelled || gFailure) - { - sendStopAlert(); - - if(mMarkerPath != 0) - { - // Create a install fail marker that can be used by the viewer to - // detect install problems. - std::ofstream stream(mMarkerPath->c_str()); - if(stream) stream << -1; - } - exit(-1); - } else { - exit(0); - } - - return; -} - -//SPATTERS TODO this should be moved to lldir_mac.cpp -const std::string LLMacUpdater::walkParents( signed int depth, const std::string& childpath ) -{ - boost::filesystem::path fullpath(childpath.c_str()); - - while (depth > 0 && fullpath.has_parent_path()) - { - fullpath = boost::filesystem::path(fullpath.parent_path()); - --depth; - } - - return fullpath.string(); -} - -//#if 0 -//size_t curl_download_callback(void *data, size_t size, size_t nmemb, -// void *user_data) -//{ -// S32 bytes = size * nmemb; -// char *cdata = (char *) data; -// for (int i =0; i < bytes; i += 1) -// { -// gServerResponse.append(cdata[i]); -// } -// return bytes; -//} -//#endif - -int curl_progress_callback_func(void *clientp, - double dltotal, - double dlnow, - double ultotal, - double ulnow) -{ - int max = (int)(dltotal / 1024.0); - int cur = (int)(dlnow / 1024.0); - setProgress(cur, max); - - if(gCancelled) - return(1); - - return(0); -} - -bool LLMacUpdater::isApplication(const std::string& app_str) -{ - return !(bool) app_str.compare( app_str.length()-4, 4, ".app"); -} - -// Search through the directory specified by 'parent' for an item that appears to be a Second Life viewer. -bool LLMacUpdater::findAppBundleOnDiskImage(const boost::filesystem::path& dir_path, - boost::filesystem::path& path_found) -{ - if ( !boost::filesystem::exists( dir_path ) ) return false; - - boost::filesystem::directory_iterator end_itr; - - for ( boost::filesystem::directory_iterator itr( dir_path ); - itr != end_itr; - ++itr ) - { - if ( boost::filesystem::is_directory(itr->status()) ) - { - std::string dir_name = itr->path().string(); - if ( isApplication(dir_name) ) - { - if(isFSRefViewerBundle(dir_name)) - { - llinfos << dir_name << " is the one" << llendl; - - path_found = itr->path(); - return true; - } - } - } - } - return false; -} - -bool LLMacUpdater::verifyDirectory(const boost::filesystem::path* directory, bool isParent) -{ - bool replacingTarget; - std::string app_str = directory->string(); - - if (boost::filesystem::is_directory(*directory)) - { - // This is fine, just means we're not replacing anything. - replacingTarget = true; - } - else - { - replacingTarget = isParent; - } - - //Check that the directory is writeable. - if(!isDirWritable(app_str)) - { - // Parent directory isn't writable. - llinfos << "Target directory not writable." << llendl; - replacingTarget = false; - } - return replacingTarget; -} - -bool LLMacUpdater::getViewerDir(boost::filesystem::path &app_dir) -{ - std::string app_dir_str; - - //Walk up 6 levels from the App Updater's installation point. - app_dir_str = walkParents( 6, *mApplicationPath ); - - app_dir = boost::filesystem::path(app_dir_str); - - //Check to see that the directory's name ends in .app Lame but it's the best thing we have to go on. - //If it's not there, we're going to default to /Applications/VIEWERNAME - if (!isApplication(app_dir_str)) - { - llinfos << "Target search failed, defaulting to /Applications/" << *mProductName << ".app." << llendl; - std::string newpath = std::string("/Applications/") + mProductName->c_str(); - app_dir = boost::filesystem::path(newpath); - } - return verifyDirectory(&app_dir); -} - -bool LLMacUpdater::downloadDMG(const std::string& dmgName, boost::filesystem::path* temp_dir) -{ - LLFILE *downloadFile = NULL; - char temp[PATH_MAX] = ""; /* Flawfinder: ignore */ - - chdir(temp_dir->string().c_str()); - - snprintf(temp, sizeof(temp), "SecondLife.dmg"); - - downloadFile = LLFile::fopen(temp, "wb"); /* Flawfinder: ignore */ - if(downloadFile == NULL) - { - return false; - } - - bool success = false; - - CURL *curl = curl_easy_init(); - - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - // curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curl_download_callback); - curl_easy_setopt(curl, CURLOPT_FILE, downloadFile); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, &curl_progress_callback_func); - curl_easy_setopt(curl, CURLOPT_URL, mUpdateURL); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); - - sendProgress(0, 1, std::string("Downloading...")); - - CURLcode result = curl_easy_perform(curl); - - curl_easy_cleanup(curl); - - if(gCancelled) - { - llinfos << "User cancel, bailing out."<< llendl; - goto close_file; - } - - if(result != CURLE_OK) - { - llinfos << "Error " << result << " while downloading disk image."<< llendl; - goto close_file; - } - - fclose(downloadFile); - downloadFile = NULL; - - success = true; - -close_file: - // Close disk image file if necessary - if(downloadFile != NULL) - { - llinfos << "Closing download file." << llendl; - - fclose(downloadFile); - downloadFile = NULL; - } - - return success; -} - -bool LLMacUpdater::doMount(const std::string& dmgName, char* deviceNode, const boost::filesystem::path& temp_dir) -{ - char temp[PATH_MAX] = ""; /* Flawfinder: ignore */ - - sendProgress(0, 0, std::string("Mounting image...")); - chdir(temp_dir.string().c_str()); - std::string mnt_dir = temp_dir.string() + std::string("/mnt"); - LLFile::mkdir(mnt_dir.c_str(), 0700); - - // NOTE: we could add -private at the end of this command line to keep the image from showing up in the Finder, - // but if our cleanup fails, this makes it much harder for the user to unmount the image. - std::string mountOutput; - boost::format cmdFormat("hdiutil attach %s -mountpoint mnt"); - cmdFormat % dmgName; - FILE* mounter = popen(cmdFormat.str().c_str(), "r"); /* Flawfinder: ignore */ - - if(mounter == NULL) - { - llinfos << "Failed to mount disk image, exiting."<< llendl; - return false; - } - - // We need to scan the output from hdiutil to find the device node it uses to attach the disk image. - // If we don't have this information, we can't detach it later. - while(mounter != NULL) - { - size_t len = fread(temp, 1, sizeof(temp)-1, mounter); - temp[len] = 0; - mountOutput.append(temp); - if(len < sizeof(temp)-1) - { - // End of file or error. - int result = pclose(mounter); - if(result != 0) - { - // NOTE: We used to abort here, but pclose() started returning - // -1, possibly when the size of the DMG passed a certain point - llinfos << "Unexpected result closing pipe: " << result << llendl; - } - mounter = NULL; - } - } - - if(!mountOutput.empty()) - { - const char *s = mountOutput.c_str(); - const char *prefix = "/dev/"; - char *sub = strstr(s, prefix); - - if(sub != NULL) - { - sub += strlen(prefix); /* Flawfinder: ignore */ - sscanf(sub, "%1023s", deviceNode); /* Flawfinder: ignore */ - } - } - - if(deviceNode[0] != 0) - { - llinfos << "Disk image attached on /dev/" << deviceNode << llendl; - } - else - { - llinfos << "Disk image device node not found!" << llendl; - return false; - } - - return true; -} - -bool LLMacUpdater::moveApplication (const boost::filesystem::path& app_dir, - const boost::filesystem::path& temp_dir, - boost::filesystem::path& aside_dir) -{ - try - { - //Grab filename from installdir append to tempdir move set aside_dir to moved path. - std::string install_str = app_dir.parent_path().string(); - std::string temp_str = temp_dir.string(); - std::string app_str = app_dir.filename().string(); - aside_dir = boost::filesystem::path( boost::filesystem::operator/(temp_dir,app_str) ); - std::cout << "Attempting to move " << app_dir.string() << " to " << aside_dir.string() << std::endl; - - boost::filesystem::rename(app_dir, aside_dir); - } - catch(boost::filesystem::filesystem_error e) - { - llinfos << "Application move failed." << llendl; - return false; - } - return true; -} - -bool LLMacUpdater::doInstall(const boost::filesystem::path& app_dir, - const boost::filesystem::path& temp_dir, - boost::filesystem::path& mount_dir, - bool replacingTarget) -{ - std::string temp_name = temp_dir.string() + std::string("/mnt"); - - llinfos << "Disk image mount point is: " << temp_name << llendl; - - mount_dir = boost::filesystem::path(temp_name.c_str()); - - if (! boost::filesystem::exists ( mount_dir ) ) - { - llinfos << "Couldn't make FSRef to disk image mount point." << llendl; - return false; - } - - sendProgress(0, 0, std::string("Searching for the app bundle...")); - - boost::filesystem::path source_dir; - - if ( !findAppBundleOnDiskImage(mount_dir, source_dir) ) - { - llinfos << "Couldn't find application bundle on mounted disk image." << llendl; - return false; - } - else - { - llinfos << "found the bundle." << llendl; - } - - sendProgress(0, 0, std::string("Preparing to copy files...")); - - // this will hold the name of the destination target - boost::filesystem::path aside_dir; - - if(replacingTarget) - { - - if (! moveApplication (app_dir, temp_dir, aside_dir) ) - { - llwarns << "failed to move aside old version." << llendl; - return false; - } - } - - sendProgress(0, 0, std::string("Copying files...")); - - llinfos << "Starting copy..." << llendl; - // If we were replacingTarget, we've moved the app to a temp directory. - // Otherwise the destination should be empty. - // We have mounted the DMG as a volume so we should be able to just - // move the app from the volume to the destination and everything will just work. - - - // Copy the new version from the disk image to the target location. - - //The installer volume is mounted read-only so we can't move. Instead copy and then unmount. - if (! copyDir(source_dir.string(), app_dir.string()) ) - { - llwarns << "Failed to copy " << source_dir.string() << " to " << app_dir.string() << llendl; - - // Something went wrong during the copy. Attempt to put the old version back and bail. - boost::filesystem::rename(app_dir, aside_dir); - return false; - - } - - // The update has succeeded. Clear the cache directory. - - sendProgress(0, 0, std::string("Clearing cache...")); - - llinfos << "Clearing cache..." << llendl; - - gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""), "*.*"); - - llinfos << "Clear complete." << llendl; - - return true; -} - -void* LLMacUpdater::updatethreadproc(void*) -{ - char tempDir[PATH_MAX] = ""; /* Flawfinder: ignore */ - char temp[PATH_MAX] = ""; /* Flawfinder: ignore */ - // *NOTE: This buffer length is used in a scanf() below. - char deviceNode[1024] = ""; /* Flawfinder: ignore */ - - bool replacingTarget = false; - - boost::filesystem::path app_dir; - boost::filesystem::path temp_dir; - boost::filesystem::path mount_dir; - - // Attempt to get a reference to the Second Life application bundle containing this updater. - // Any failures during this process will cause us to default to updating /Applications/Second Life.app - - try - { - replacingTarget = getViewerDir( app_dir ); - - if (!mkTempDir(temp_dir)) - { - throw 0; - } - - //In case the dir doesn't exist, try to create it. If create fails, verify it exists. - if (! boost::filesystem::create_directory(app_dir)) - { - - - if(isFSRefViewerBundle(app_dir.string())) - { - // This is the bundle we're looking for. - replacingTarget = true; - } - else - { - throw 0; - } - } - - if ( !verifyDirectory(&app_dir, true) ) - { - // We're so hosed. - llinfos << "Applications directory not found, giving up." << llendl; - throw 0; - } - - // Skip downloading the file if the dmg was passed on the command line. - std::string dmgName; - if(mDmgFile != NULL) { - //Create a string from the mDmgFile then a dir reference to that. - //change to that directory and begin install. - - boost::filesystem::path dmg_path(*mDmgFile); - - dmgName = dmg_path.string(); - std::string* dmgPath = new std::string(dmg_path.parent_path().string()); - if ( !boost::filesystem::exists( dmg_path.parent_path() ) ) { - llinfos << "Path " << *dmgPath << " is not writeable. Aborting." << llendl; - throw 0; - } - - chdir(dmgPath->c_str()); - } else { - // Continue on to download file. - dmgName = "SecondLife.dmg"; - - - if (!downloadDMG(dmgName, &temp_dir)) - { - throw 0; - } - } - - if (!doMount(dmgName, deviceNode, temp_dir)) - { - throw 0; - } - - if (!doInstall( app_dir, temp_dir, mount_dir, replacingTarget )) - { - throw 0; - } - - } - catch(...) - { - if(!gCancelled) - gFailure = true; - } - - // Failures from here on out are all non-fatal and not reported. - sendProgress(0, 3, std::string("Cleaning up...")); - - setProgress(1, 3); - // Unmount image - if(deviceNode[0] != 0) - { - llinfos << "Detaching disk image." << llendl; - - snprintf(temp, sizeof(temp), "hdiutil detach '%s'", deviceNode); - system(temp); /* Flawfinder: ignore */ - } - - setProgress(2, 3); - std::string *trash_str=getUserTrashFolder(); - - // Move work directory to the trash - if(tempDir[0] != 0) - { - llinfos << "Moving work directory to the trash." << llendl; - - try - { - boost::filesystem::path trash_dir(*trash_str); - boost::filesystem::rename(mount_dir, trash_dir); - } - catch(boost::filesystem::filesystem_error e) - { - llwarns << "Failed to move " << mount_dir.string() << " to " << *trash_str << llendl; - return (NULL); - } - } - - std::string app_name_str = app_dir.string(); - - if(!gCancelled && !gFailure && !app_name_str.empty()) - { - //SPATTERS todo is there no better way to do this than system calls? - llinfos << "Touching application bundle." << llendl; - - std::stringstream touch_str; - - touch_str << "touch '" << app_name_str << "'"; - - system(touch_str.str().c_str()); /* Flawfinder: ignore */ - - llinfos << "Launching updated application." << llendl; - - std::stringstream open_str; - - open_str << "open '" << app_name_str << "'"; - - system(open_str.str().c_str()); /* Flawfinder: ignore */ - } - - sendDone(); - - return (NULL); -} - -//static -void* LLMacUpdater::sUpdatethreadproc(void* vptr) -{ - if (!sInstance) - { - llerrs << "LLMacUpdater not instantiated before use. Aborting." << llendl; - return (NULL); - } - return sInstance->updatethreadproc(vptr); -} - diff --git a/indra/mac_updater/mac_updater.h b/indra/mac_updater/mac_updater.h deleted file mode 100644 index f65b481cb6..0000000000 --- a/indra/mac_updater/mac_updater.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @file mac_updater.h - * @brief - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include -#include -#include - -#ifndef LL_MAC_UPDATER_H -#define LL_MAC_UPDATER_H -extern bool gCancelled; -extern bool gFailure; - -void *updatethreadproc(void*); -std::string* walkParents( signed int depth, std::string* childpath ); -std::string* getUserTrashFolder(); - -void setProgress(int cur, int max); -void setProgressText(const std::string& str); -void sendProgress(int cur, int max, std::string str); -void sendDone(); -void sendStopAlert(); - -bool isFSRefViewerBundle(const std::string& targetURL); -bool isDirWritable(const std::string& dir_name); -bool mkTempDir(boost::filesystem::path& temp_dir); -bool copyDir(const std::string& src_dir, const std::string& dest_dir); - -int oldmain(); - -class LLMacUpdater -{ -public: - LLMacUpdater(); - void doUpdate(); - const std::string walkParents( signed int depth, const std::string& childpath ); - bool isApplication(const std::string& app_str); - void filterFile(const char* filename); - - bool findAppBundleOnDiskImage(const boost::filesystem::path& dir_path, - boost::filesystem::path& path_found); - - bool verifyDirectory(const boost::filesystem::path* directory, bool isParent=false); - bool getViewerDir(boost::filesystem::path &app_dir); - bool downloadDMG(const std::string& dmgName, boost::filesystem::path* temp_dir); - bool doMount(const std::string& dmgName, char* deviceNode, const boost::filesystem::path& temp_dir); - bool moveApplication (const boost::filesystem::path& app_dir, - const boost::filesystem::path& temp_dir, - boost::filesystem::path& aside_dir); - bool doInstall(const boost::filesystem::path& app_dir, - const boost::filesystem::path& temp_dir, - boost::filesystem::path& mount_dir, - bool replacingTarget); - void* updatethreadproc(void*); - static void* sUpdatethreadproc(void*); - -public: - std::string *mUpdateURL; - std::string *mProductName; - std::string *mBundleID; - std::string *mDmgFile; - std::string *mMarkerPath; - std::string *mApplicationPath; - static LLMacUpdater *sInstance; - -}; -#endif - - diff --git a/indra/mac_updater/main.m b/indra/mac_updater/main.m deleted file mode 100644 index aa3776a87d..0000000000 --- a/indra/mac_updater/main.m +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @file main.m - * @brief - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#import - -int main(int argc, char *argv[]) -{ - int retVal = NSApplicationMain(argc, (const char **)argv); - - return retVal; -} diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index dff2c04fbc..5da282cbd3 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1960,7 +1960,7 @@ if (DARWIN) DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger) + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-crash-logger) if (ENABLE_SIGNING) set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}") @@ -2013,12 +2013,11 @@ if (PACKAGE) # *TODO: Generate these search dirs in the cmake files related to each binary. list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") - list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_updater/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/webkit/${CMAKE_CFG_INTDIR}") set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2") - set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-updater mac-crash-logger") + set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger") set(VIEWER_LIB_GLOB "*.dylib") endif (DARWIN) if (LINUX) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ea75d4f4f6..c09043b879 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -672,7 +672,9 @@ class DarwinManifest(ViewerManifest): self.path("../packages/lib/release/libndofdev.dylib", dst="Resources/libndofdev.dylib") self.path("../packages/lib/release/libhunspell-1.3.0.dylib", dst="Resources/libhunspell-1.3.0.dylib") - self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install") + if self.prefix(dst="MacOS"): + self.path2basename("../viewer_components/updater/scripts/darwin", "*.py") + self.end_prefix() # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): @@ -764,7 +766,6 @@ class DarwinManifest(ViewerManifest): # our apps for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), - ("mac_updater", "mac-updater.app"), # plugin launcher (os.path.join("llplugin", "slplugin"), "SLPlugin.app"), ): @@ -810,7 +811,7 @@ class DarwinManifest(ViewerManifest): def copy_finish(self): # Force executable permissions to be set for scripts # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802 - for script in 'Contents/MacOS/update_install',: + for script in 'Contents/MacOS/update_install.py',: self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) def package_finish(self): diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index bc73c72ddc..3fa96dd223 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -60,6 +60,8 @@ namespace { #ifdef LL_WINDOWS std::string scriptFile = "update_install.bat"; +#elif LL_DARWIN + std::string scriptFile = "update_install.py"; #else std::string scriptFile = "update_install"; #endif @@ -71,6 +73,8 @@ namespace #ifdef LL_WINDOWS return LL_COPY_INSTALL_SCRIPT_TO_TEMP; #else + // This is important on Mac because update_install.py looks at its own + // script pathname to discover the viewer app bundle to update. return LL_RUN_INSTALL_SCRIPT_IN_PLACE; #endif }; diff --git a/indra/viewer_components/updater/scripts/darwin/janitor.py b/indra/viewer_components/updater/scripts/darwin/janitor.py new file mode 100644 index 0000000000..cdf33df731 --- /dev/null +++ b/indra/viewer_components/updater/scripts/darwin/janitor.py @@ -0,0 +1,133 @@ +#!/usr/bin/python +"""\ +@file janitor.py +@author Nat Goodspeed +@date 2011-09-14 +@brief Janitor class to clean up arbitrary resources + +2013-01-04 cloned from vita because it's exactly what update_install.py needs. + +$LicenseInfo:firstyear=2011&license=viewerlgpl$ +Copyright (c) 2011, Linden Research, Inc. +$/LicenseInfo$ +""" + +import sys +import functools +import itertools + +class Janitor(object): + """ + Usage: + + Basic: + self.janitor = Janitor(sys.stdout) # report cleanup actions on stdout + ... + self.janitor.later(os.remove, some_temp_file) + self.janitor.later(os.remove, some_other_file) + ... + self.janitor.cleanup() # perform cleanup actions + + Context Manager: + with Janitor() as janitor: # clean up quietly + ... + janitor.later(shutil.rmtree, some_temp_directory) + ... + # exiting 'with' block performs cleanup + + Test Class: + class TestMySoftware(unittest.TestCase, Janitor): + def __init__(self): + Janitor.__init__(self) # quiet cleanup + ... + + def setUp(self): + ... + self.later(os.rename, saved_file, original_location) + ... + + def tearDown(self): + Janitor.tearDown(self) # calls cleanup() + ... + # Or, if you have no other tearDown() logic for + # TestMySoftware, you can omit the TestMySoftware.tearDown() + # def entirely and let it inherit Janitor.tearDown(). + """ + def __init__(self, stream=None): + """ + If you pass stream= (e.g.) sys.stdout or sys.stderr, Janitor will + report its cleanup operations as it performs them. If you don't, it + will perform them quietly -- unless one or more of the actions throws + an exception, in which case you'll get output on stderr. + """ + self.stream = stream + self.cleanups = [] + + def later(self, func, *args, **kwds): + """ + Pass the callable you want to call at cleanup() time, plus any + positional or keyword args you want to pass it. + """ + # Get a name string for 'func' + try: + # A free function has a __name__ + name = func.__name__ + except AttributeError: + try: + # A class object (even builtin objects like ints!) support + # __class__.__name__ + name = func.__class__.__name__ + except AttributeError: + # Shrug! Just use repr() to get a string describing this func. + name = repr(func) + # Construct a description of this operation in Python syntax from + # args, kwds. + desc = "%s(%s)" % \ + (name, ", ".join(itertools.chain((repr(a) for a in args), + ("%s=%r" % (k, v) for (k, v) in kwds.iteritems())))) + # Use functools.partial() to bind passed args and keywords to the + # passed func so we get a nullary callable that does what caller + # wants. + bound = functools.partial(func, *args, **kwds) + self.cleanups.append((desc, bound)) + + def cleanup(self): + """ + Perform all the actions saved with later() calls. + """ + # Typically one allocates resource A, then allocates resource B that + # depends on it. In such a scenario it's appropriate to delete B + # before A -- so perform cleanup actions in reverse order. (This is + # the same strategy used by atexit().) + while self.cleanups: + # Until our list is empty, pop the last pair. + desc, bound = self.cleanups.pop(-1) + + # If requested, report the action. + if self.stream is not None: + print >>self.stream, desc + + try: + # Call the bound callable + bound() + except Exception, err: + # This is cleanup. Report the problem but continue. + print >>(self.stream or sys.stderr), "Calling %s\nraised %s: %s" % \ + (desc, err.__class__.__name__, err) + + def tearDown(self): + """ + If a unittest.TestCase subclass (or a nose test class) adds Janitor as + one of its base classes, and has no other tearDown() logic, let it + inherit Janitor.tearDown(). + """ + self.cleanup() + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + # Perform cleanup no matter how we exit this 'with' statement + self.cleanup() + # Propagate any exception from the 'with' statement, don't swallow it + return False diff --git a/indra/viewer_components/updater/scripts/darwin/messageframe.py b/indra/viewer_components/updater/scripts/darwin/messageframe.py new file mode 100644 index 0000000000..8f58848882 --- /dev/null +++ b/indra/viewer_components/updater/scripts/darwin/messageframe.py @@ -0,0 +1,66 @@ +#!/usr/bin/python +"""\ +@file messageframe.py +@author Nat Goodspeed +@date 2013-01-03 +@brief Define MessageFrame class for popping up messages from a command-line + script. + +$LicenseInfo:firstyear=2013&license=viewerlgpl$ +Copyright (c) 2013, Linden Research, Inc. +$/LicenseInfo$ +""" + +import Tkinter as tk +import os + +# Tricky way to obtain the filename of the main script (default title string) +import __main__ + +# This class is intended for displaying messages from a command-line script. +# Getting the base class right took a bit of trial and error. +# If you derive from tk.Frame, the destroy() method doesn't actually close it. +# If you derive from tk.Toplevel, it pops up a separate Tk frame too. destroy() +# closes this frame, but not that one. +# Deriving from tk.Tk appears to do the right thing. +class MessageFrame(tk.Tk): + def __init__(self, text="", title=os.path.splitext(os.path.basename(__main__.__file__))[0], + width=320, height=120): + tk.Tk.__init__(self) + self.grid() + self.title(title) + self.var = tk.StringVar() + self.var.set(text) + self.msg = tk.Label(self, textvariable=self.var) + self.msg.grid() + # from http://stackoverflow.com/questions/3352918/how-to-center-a-window-on-the-screen-in-tkinter : + self.update_idletasks() + + # The constants below are to adjust for typical overhead from the + # frame borders. + xp = (self.winfo_screenwidth() / 2) - (width / 2) - 8 + yp = (self.winfo_screenheight() / 2) - (height / 2) - 20 + self.geometry('{0}x{1}+{2}+{3}'.format(width, height, xp, yp)) + self.update() + + def set(self, text): + self.var.set(text) + self.update() + +if __name__ == "__main__": + # When run as a script, just test the MessageFrame. + import sys + import time + + frame = MessageFrame("something in the way she moves....") + time.sleep(3) + frame.set("smaller") + time.sleep(3) + frame.set("""this has +several +lines""") + time.sleep(3) + frame.destroy() + print "Destroyed!" + sys.stdout.flush() + time.sleep(3) diff --git a/indra/viewer_components/updater/scripts/darwin/update_install b/indra/viewer_components/updater/scripts/darwin/update_install deleted file mode 100644 index e7f36dc5a3..0000000000 --- a/indra/viewer_components/updater/scripts/darwin/update_install +++ /dev/null @@ -1,10 +0,0 @@ -#! /bin/bash - -# -# The first argument contains the path to the installer app. The second a path -# to a marker file which should be created if the installer fails.q -# - -cd "$(dirname "$0")" -(../Resources/mac-updater.app/Contents/MacOS/mac-updater -dmg "$1" -name "Second Life Viewer"; if [ $? -ne 0 ]; then echo $3 >> "$2"; fi;) & -exit 0 diff --git a/indra/viewer_components/updater/scripts/darwin/update_install.py b/indra/viewer_components/updater/scripts/darwin/update_install.py new file mode 100755 index 0000000000..e8b96e6123 --- /dev/null +++ b/indra/viewer_components/updater/scripts/darwin/update_install.py @@ -0,0 +1,336 @@ +#!/usr/bin/python +"""\ +@file update_install.py +@author Nat Goodspeed +@date 2012-12-20 +@brief Update the containing Second Life application bundle to the version in + the specified disk image file. + + This Python implementation is derived from the previous mac-updater + application, a funky mix of C++, classic C and Objective-C. + +$LicenseInfo:firstyear=2012&license=viewerlgpl$ +Copyright (c) 2012, Linden Research, Inc. +$/LicenseInfo$ +""" + +import os +import sys +import cgitb +import errno +import glob +import plistlib +import re +import shutil +import subprocess +import tempfile +import time +from janitor import Janitor +from messageframe import MessageFrame +import Tkinter, tkMessageBox + +TITLE = "SecondLife Updater" +# Magic bundle identifier used by all Second Life viewer bundles +BUNDLE_IDENTIFIER = "com.secondlife.indra.viewer" + +# Global handle to the MessageFrame so we can update message +FRAME = None +# Global handle to logfile, once it's open +LOGF = None + +# **************************************************************************** +# Logging and messaging +# +# This script is normally run implicitly by the old viewer to update to the +# new viewer. Its UI consists of a MessageFrame and possibly a Tk error box. +# Log details to updater.log -- especially uncaught exceptions! +# **************************************************************************** +def log(message): + """write message only to LOGF (also called by status() and fail())""" + # If we don't even have LOGF open yet, at least write to Console log + logf = LOGF or sys.stderr + logf.writelines((time.strftime("%Y-%m-%dT%H:%M:%SZ ", time.gmtime()), message, '\n')) + logf.flush() + +def status(message): + """display and log normal progress message""" + log(message) + + global FRAME + if not FRAME: + FRAME = MessageFrame(message, TITLE) + else: + FRAME.set(message) + +def fail(message): + """log message, produce error box, then terminate with nonzero rc""" + log(message) + + # If we haven't yet called status() (we don't yet have a FRAME), perform a + # bit of trickery to bypass the spurious "main window" that Tkinter would + # otherwise pop up if the first call is showerror(). + if not FRAME: + root = Tkinter.Tk() + root.withdraw() + + # If we do have a LOGF available, mention it in the error box. + if LOGF: + message = "%s\n(Updater log in %s)" % (message, LOGF.name) + + # We explicitly specify the WARNING icon because, at least on the Tkinter + # bundled with the system-default Python 2.7 on Mac OS X 10.7.4, the + # ERROR, QUESTION and INFO icons are all the silly Tk rocket ship. At + # least WARNING has an exclamation in a yellow triangle, even though + # overlaid by a smaller image of the rocket ship. + tkMessageBox.showerror(TITLE, +"""An error occurred while updating Second Life: +%s +Please download the latest viewer from www.secondlife.com.""" % message, + icon=tkMessageBox.WARNING) + sys.exit(1) + +def exception(err): + """call fail() with an exception instance""" + fail("%s exception: %s" % (err.__class__.__name__, str(err))) + +def excepthook(type, value, traceback): + """ + Store this hook function into sys.excepthook until we have a logfile. + """ + # At least in older Python versions, it could be tricky to produce a + # string from 'type' and 'value'. For instance, an OSError exception would + # pass type=OSError and value=some_tuple. Empirically, this funky + # expression seems to work. + exception(type(*value)) +sys.excepthook = excepthook + +class ExceptHook(object): + """ + Store an instance of this class into sys.excepthook once we have a logfile + open. + """ + def __init__(self, logfile): + # There's no magic to the cgitb.enable() function -- it merely stores + # an instance of cgitb.Hook into sys.excepthook, passing enable()'s + # params into Hook.__init__(). Sadly, enable() doesn't forward all its + # params using (*args, **kwds) syntax -- another story. But the point + # is that all the goodness is in the cgitb.Hook class. Capture an + # instance. + self.hook = cgitb.Hook(file=logfile, format="text") + + def __call__(self, type, value, traceback): + # produce nice text traceback to logfile + self.hook(type, value, traceback) + # Now display an error box. + excepthook(type, value, traceback) + +def write_marker(markerfile, markertext): + log("writing %r to %s" % (markertext, markerfile)) + try: + with open(markerfile, "w") as markerf: + markerf.write(markertext) + except IOError, err: + # write_marker() is invoked by fail(), and fail() is invoked by other + # error-handling functions. If we try to invoke any of those, we'll + # get infinite recursion. If for any reason we can't write markerfile, + # try to log it -- otherwise shrug. + log("%s exception: %s" % (err.__class__.__name__, err)) + +# **************************************************************************** +# Main script logic +# **************************************************************************** +def main(dmgfile, markerfile, markertext, appdir=None): + # Should we fail, we're supposed to write 'markertext' to 'markerfile'. + # Wrap the fail() function so we do that. + global fail + oldfail = fail + def fail(message): + write_marker(markerfile, markertext) + oldfail(message) + + try: + # Starting with the Cocoafied viewer, we'll find viewer logs in + # ~/Library/Application Support/$CFBundleIdentifier/logs rather than in + # ~/Library/Application Support/SecondLife/logs as before. This could be + # obnoxious -- but we Happen To Know that markerfile is a path specified + # within the viewer's logs directory. Use that. + logsdir = os.path.dirname(markerfile) + + # Move the old updater.log file out of the way + logname = os.path.join(logsdir, "updater.log") + try: + os.rename(logname, logname + ".old") + except OSError, err: + # Nonexistence is okay. Anything else, not so much. + if err.errno != errno.EEXIST: + raise + + # Open new updater.log. + global LOGF + LOGF = open(logname, "w") + + # Now that LOGF is in fact open for business, use it to log any further + # uncaught exceptions. + sys.excepthook = ExceptHook(LOGF) + + # log how this script was invoked + log(' '.join(repr(arg) for arg in sys.argv)) + + # prepare for other cleanup + with Janitor(LOGF) as janitor: + + # Hopefully caller explicitly stated the viewer bundle to update. + # But if not, try to derive it from our own pathname. (The only + # trouble with that is that the old viewer might copy this script + # to a temp dir before running.) + if not appdir: + # Somewhat peculiarly, this script is currently packaged in + # Appname.app/Contents/MacOS with the viewer executable. But even if we + # decide to move it to Appname.app/Contents/Resources, we'll still find + # Appname.app two levels up from dirname(__file__). + appdir = os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir, os.pardir)) + if not appdir.endswith(".app"): + fail(appdir + " is not an application directory") + + # We need to install into appdir's parent directory -- can we? + installdir = os.path.abspath(os.path.join(appdir, os.pardir)) + if not os.access(installdir, os.W_OK): + fail("Can't modify " + installdir) + + # invent a temporary directory + tempdir = tempfile.mkdtemp() + log("created " + tempdir) + # clean it up when we leave + janitor.later(shutil.rmtree, tempdir) + + status("Mounting image...") + + mntdir = os.path.join(tempdir, "mnt") + log("mkdir " + mntdir) + os.mkdir(mntdir) + command = ["hdiutil", "attach", dmgfile, "-mountpoint", mntdir] + log(' '.join(command)) + # Instantiating subprocess.Popen launches a child process with the + # specified command line. stdout=PIPE passes a pipe to its stdout. + hdiutil = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=LOGF) + # Popen.communicate() reads that pipe until the child process + # terminates, returning (stdout, stderr) output. Select just stdout. + hdiutil_out = hdiutil.communicate()[0] + if hdiutil.returncode != 0: + fail("Couldn't mount " + dmgfile) + # hdiutil should report the devnode. Find that. + found = re.search(r"/dev/[^ ]*\b", hdiutil_out) + if not found: + # If we don't spot the devnode, log it and continue -- we only + # use it to detach it. Don't fail the whole update if we can't + # clean up properly. + log("Couldn't spot devnode in hdiutil output:\n" + hdiutil_out) + else: + # If we do spot the devnode, detach it when done. + janitor.later(subprocess.call, ["hdiutil", "detach", found.group(0)], + stdout=LOGF, stderr=subprocess.STDOUT) + + status("Searching for app bundle...") + + for candidate in glob.glob(os.path.join(mntdir, "*.app")): + log("Considering " + candidate) + try: + # By convention, a valid Mac app bundle has a + # Contents/Info.plist file containing at least + # CFBundleIdentifier. + CFBundleIdentifier = \ + plistlib.readPlist(os.path.join(candidate, "Contents", + "Info.plist"))["CFBundleIdentifier"] + except Exception, err: + # might be IOError, xml.parsers.expat.ExpatError, KeyError + # Any of these means it's not a valid app bundle. Instead + # of aborting, just skip this candidate and continue. + log("%s not a valid app bundle: %s: %s" % + (candidate, err.__class__.__name__, err)) + continue + + if CFBundleIdentifier == BUNDLE_IDENTIFIER: + break + + log("unrecognized CFBundleIdentifier: " + CFBundleIdentifier) + + else: + fail("Could not find Second Life viewer in " + dmgfile) + + # Here 'candidate' is the new viewer to install + log("Found " + candidate) + status("Preparing to copy files...") + + # move old viewer to temp location in case copy from .dmg fails + aside = os.path.join(tempdir, os.path.basename(appdir)) + log("mv %r %r" % (appdir, aside)) + # Use shutil.move() instead of os.rename(). move() first tries + # os.rename(), but falls back to shutil.copytree() if the dest is + # on a different filesystem. + shutil.move(appdir, aside) + + status("Copying files...") + + # shutil.copytree()'s target must not already exist. But we just + # moved appdir out of the way. + log("cp -p %r %r" % (candidate, appdir)) + try: + # The viewer app bundle does include internal symlinks. Keep them + # as symlinks. + shutil.copytree(candidate, appdir, symlinks=True) + except Exception, err: + # copy failed -- try to restore previous viewer before crumping + type, value, traceback = sys.exc_info() + log("exception response: mv %r %r" % (aside, appdir)) + shutil.move(aside, appdir) + # let our previously-set sys.excepthook handle this + raise type, value, traceback + + status("Clearing cache...") + + # We don't know whether the previous viewer was old-style or + # new-style (Cocoa). Clear both kinds of caches. + for cachesubdir in "SecondLife", BUNDLE_IDENTIFIER: + wildcard = "~/Library/Caches/%s/*" % cachesubdir + log("rm " + wildcard) + for f in glob.glob(os.path.expanduser(wildcard)): + # Don't try to remove subdirs this way + if os.path.isfile(f): + try: + os.remove(f) + except Exception, err: + log("%s removing %s: %s" % (err.__class__.__name__, f, err)) + + status("Cleaning up...") + + log("touch " + appdir) + os.utime(appdir, None) # set to current time + + command = ["open", appdir] + log(' '.join(command)) + subprocess.check_call(command, stdout=LOGF, stderr=subprocess.STDOUT) + + except Exception, err: + # Because we carefully set sys.excepthook -- and even modify it to log + # the problem once we have our log file open -- you might think we + # could just let exceptions propagate. But when we do that, on + # exception in this block, we FIRST restore the no-side-effects fail() + # and THEN implicitly call sys.excepthook(), which calls the (no-side- + # effects) fail(). Explicitly call sys.excepthook() BEFORE restoring + # fail(). Only then do we get the enriched fail() behavior. + sys.excepthook(*sys.exc_info()) + + finally: + # When we leave main() -- for whatever reason -- reset fail() the way + # it was before, because the bound markerfile, markertext params + # passed to this main() call are no longer applicable. + fail = oldfail + +if __name__ == "__main__": + # We expect this script to be invoked with: + # - the pathname to the .dmg we intend to install; + # - the pathname to an update-error marker file to create on failure; + # - the content to write into the marker file; + # - optionally, the pathname of the Second Life viewer to update. + main(*sys.argv[1:]) From c3542b5e46c6599a4f3003b7a598072c9898412b Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 8 Jan 2013 14:50:34 -0500 Subject: [PATCH 02/82] MAINT-2155: when permitting missing old logfile, check for ENOENT instead of errno.EEXIST. Sigh. --- .../viewer_components/updater/scripts/darwin/update_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/viewer_components/updater/scripts/darwin/update_install.py b/indra/viewer_components/updater/scripts/darwin/update_install.py index e8b96e6123..87b931fbeb 100755 --- a/indra/viewer_components/updater/scripts/darwin/update_install.py +++ b/indra/viewer_components/updater/scripts/darwin/update_install.py @@ -162,7 +162,7 @@ def main(dmgfile, markerfile, markertext, appdir=None): os.rename(logname, logname + ".old") except OSError, err: # Nonexistence is okay. Anything else, not so much. - if err.errno != errno.EEXIST: + if err.errno != errno.ENOENT: raise # Open new updater.log. From 4ca04bd89c3ed2f876ad5780200cdaba5ef469ac Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 8 Jan 2013 22:24:07 -0500 Subject: [PATCH 03/82] MAINT-2155: Match window title of mac-updater.app's message window --- .../viewer_components/updater/scripts/darwin/update_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/viewer_components/updater/scripts/darwin/update_install.py b/indra/viewer_components/updater/scripts/darwin/update_install.py index 87b931fbeb..3402f90a2a 100755 --- a/indra/viewer_components/updater/scripts/darwin/update_install.py +++ b/indra/viewer_components/updater/scripts/darwin/update_install.py @@ -29,7 +29,7 @@ from janitor import Janitor from messageframe import MessageFrame import Tkinter, tkMessageBox -TITLE = "SecondLife Updater" +TITLE = "Second Life Viewer Updater" # Magic bundle identifier used by all Second Life viewer bundles BUNDLE_IDENTIFIER = "com.secondlife.indra.viewer" From 540909bae99e36ce4e7ea169a83e89b1117a9993 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 8 Jan 2013 22:31:47 -0500 Subject: [PATCH 04/82] MAINT-2155: re-remove remnants of mac_updater source subtree. Merging up to viewer-development brought in additional mac_updater sources. Delete them along with the rest. --- indra/mac_updater/AutoUpdater.nib/classes.nib | 4 -- indra/mac_updater/AutoUpdater.nib/info.nib | 14 ----- indra/mac_updater/AutoUpdater.nib/objects.xib | 56 ------------------- 3 files changed, 74 deletions(-) delete mode 100644 indra/mac_updater/AutoUpdater.nib/classes.nib delete mode 100644 indra/mac_updater/AutoUpdater.nib/info.nib delete mode 100644 indra/mac_updater/AutoUpdater.nib/objects.xib diff --git a/indra/mac_updater/AutoUpdater.nib/classes.nib b/indra/mac_updater/AutoUpdater.nib/classes.nib deleted file mode 100644 index ea58db1189..0000000000 --- a/indra/mac_updater/AutoUpdater.nib/classes.nib +++ /dev/null @@ -1,4 +0,0 @@ -{ -IBClasses = (); -IBVersion = 1; -} diff --git a/indra/mac_updater/AutoUpdater.nib/info.nib b/indra/mac_updater/AutoUpdater.nib/info.nib deleted file mode 100644 index a49a92385b..0000000000 --- a/indra/mac_updater/AutoUpdater.nib/info.nib +++ /dev/null @@ -1,14 +0,0 @@ - - - - - IBDocumentLocation - 103 138 356 240 0 0 1280 1002 - IBFramework Version - 362.0 - IBSystem Version - 7D24 - targetFramework - IBCarbonFramework - - diff --git a/indra/mac_updater/AutoUpdater.nib/objects.xib b/indra/mac_updater/AutoUpdater.nib/objects.xib deleted file mode 100644 index 310411b711..0000000000 --- a/indra/mac_updater/AutoUpdater.nib/objects.xib +++ /dev/null @@ -1,56 +0,0 @@ - - - IBCarbonFramework - - NSApplication - - - - 405 222 533 663 - Second Life Updater - - 0 0 128 441 - - - 20 20 44 421 - what - Initializing… - - - 88 351 108 421 - Cancel - not! - 2 - - - 51 19 70 422 - prog - 50 - - - - FALSE - 2 - 3 - 7 - - - - - - - - - - - - - - - File's Owner - - Updater - - - 194 - From d7e90f4160aaa81e30206c80047b82833c049482 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 7 Feb 2013 11:56:57 -0500 Subject: [PATCH 05/82] derive version number from indra/VIEWER_VERSION.txt --- build.sh | 15 - indra/CMakeLists.txt | 1 + indra/cmake/BuildVersion.cmake | 58 ++- indra/cmake/CMakeLists.txt | 1 - indra/cmake/Variables.cmake | 2 +- indra/lib/python/indra/util/llmanifest.py | 41 +-- indra/llcommon/CMakeLists.txt | 1 - indra/llcommon/llversionviewer.h | 41 --- indra/newview/CMakeLists.txt | 72 +++- indra/newview/English.lproj/InfoPlist.strings | 4 +- indra/newview/Info-SecondLife.plist | 2 +- indra/newview/VIEWER_VERSION.txt | 1 + indra/newview/linux_tools/wrapper.sh | 2 +- indra/newview/llappviewer.cpp | 2 +- indra/newview/llversioninfo.cpp | 58 +-- indra/newview/llversioninfo.h | 1 + indra/newview/res/viewerRes.rc | 10 +- indra/newview/tests/llversioninfo_test.cpp | 28 +- indra/newview/viewer_manifest.py | 8 +- .../viewer_components/updater/CMakeLists.txt | 7 + .../updater/llupdaterservice.cpp | 15 +- scripts/build_version.py | 77 ---- scripts/update_version_files.py | 343 ------------------ 23 files changed, 194 insertions(+), 596 deletions(-) delete mode 100644 indra/llcommon/llversionviewer.h create mode 100644 indra/newview/VIEWER_VERSION.txt delete mode 100755 scripts/build_version.py delete mode 100755 scripts/update_version_files.py diff --git a/build.sh b/build.sh index 15f0463aff..e96aec58ec 100755 --- a/build.sh +++ b/build.sh @@ -159,21 +159,6 @@ fi # Check to see if we're skipping the platform eval '$build_'"$arch" || pass -# Run the version number update script -# File no longer exists in code-sep branch, so let's make sure it exists in order to use it. -if test -f scripts/update_version_files.py ; then - begin_section UpdateVer - eval $(python scripts/update_version_files.py \ - --channel="$viewer_channel" \ - --server_channel="$server_channel" \ - --revision=$revision \ - --verbose \ - | sed -n -e "s,Setting viewer channel/version: '\([^']*\)' / '\([^']*\)',VIEWER_CHANNEL='\1';VIEWER_VERSION='\2',p")\ - || fail update_version_files.py - echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json - end_section UpdateVer -fi - if [ -z "$AUTOBUILD" ] then export autobuild_dir="$here/../../../autobuild/bin/" diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 001bb4b935..dde700c932 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -19,6 +19,7 @@ project(${ROOT_PROJECT_NAME}) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(Variables) +include(BuildVersion) if (DARWIN) # 2.6.4 fixes a Mac bug in get_target_property(... "SLPlugin" LOCATION): diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index 60a519c9af..7ee852bf72 100644 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -1,18 +1,48 @@ # -*- cmake -*- +# Construct the viewer version number based on the indra/VIEWER_VERSION file -include(Python) +if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/newview/ + set(VIEWER_VERSION_BASE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/newview/VIEWER_VERSION.txt") -macro (build_version _target) - execute_process( - COMMAND ${PYTHON_EXECUTABLE} ${SCRIPTS_DIR}/build_version.py - llversion${_target}.h ${LLCOMMON_INCLUDE_DIRS} - OUTPUT_VARIABLE ${_target}_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ) + if ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) + file(STRINGS ${VIEWER_VERSION_BASE_FILE} VIEWER_SHORT_VERSION REGEX "^[0-9]+\\.[0-9]+\\.[0-9]+") + string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" VIEWER_VERSION_MAJOR ${VIEWER_SHORT_VERSION}) + string(REGEX REPLACE "^[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" VIEWER_VERSION_MINOR ${VIEWER_SHORT_VERSION}) + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" VIEWER_VERSION_PATCH ${VIEWER_SHORT_VERSION}) - if (${_target}_VERSION) - message(STATUS "Version of ${_target} is ${${_target}_VERSION}") - else (${_target}_VERSION) - message(SEND_ERROR "Could not determine ${_target} version") - endif (${_target}_VERSION) -endmacro (build_version) + if (DEFINED ENV{revision}) + set(VIEWER_VERSION_REVISION $ENV{revision}) + message("Revision (from environment): ${VIEWER_VERSION_REVISION}") + + else (DEFINED ENV{revision}) + find_program(MERCURIAL hg) + if (DEFINED MERCURIAL) + execute_process( + COMMAND ${MERCURIAL} parents --template "{rev}" + OUTPUT_VARIABLE VIEWER_VERSION_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (DEFINED VIEWER_VERSION_REVISION) + message("Revision (from hg) ${VIEWER_VERSION_REVISION}") + else (DEFINED VIEWER_VERSION_REVISION) + set(VIEWER_VERSION_REVISION 0 ) + message("Revision not set, repository not found, using ${VIEWER_VERSION_REVISION}") + endif (DEFINED VIEWER_VERSION_REVISION) + else (DEFINED MERCURIAL) + set(VIEWER_VERSION_REVISION 0) + message("Revision not set, 'hg' not found (${MERCURIAL}), using ${VIEWER_VERSION_REVISION}") + endif (DEFINED MERCURIAL) + endif (DEFINED ENV{revision}) + message("Building Version ${VIEWER_SHORT_VERSION} ${VIEWER_VERSION_REVISION}") + else ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) + message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'") + endif ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) + + set(VIEWER_CHANNEL_VERSION_DEFINES + "LL_VIEWER_CHANNEL=\"${VIEWER_CHANNEL}\"" + "LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR}" + "LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR}" + "LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}" + "LL_VIEWER_VERSION_BUILD=${VIEWER_VERSION_REVISION}" + ) +endif (NOT DEFINED VIEWER_SHORT_VERSION) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 569034a6fb..4f567988b7 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -12,7 +12,6 @@ set(cmake_SOURCE_FILES Audio.cmake BerkeleyDB.cmake Boost.cmake - BuildVersion.cmake CARes.cmake CURL.cmake CMakeCopyIfDifferent.cmake diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 4b459f1a48..6c3b7801b9 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -141,7 +141,7 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(GRID agni CACHE STRING "Target Grid") set(VIEWER ON CACHE BOOL "Build Second Life viewer.") -set(VIEWER_CHANNEL "LindenDeveloper" CACHE STRING "Viewer Channel Name") +set(VIEWER_CHANNEL "Second Life Test" CACHE STRING "Viewer Channel Name") set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for A/B Testing") if (XCODE_VERSION GREATER 4.2) diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 97cc31bba0..eaa94925b1 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -84,28 +84,6 @@ def get_default_platform(dummy): 'darwin':'darwin' }[sys.platform] -def get_default_version(srctree): - # look up llversion.h and parse out the version info - paths = [os.path.join(srctree, x, 'llversionviewer.h') for x in ['llcommon', '../llcommon', '../../indra/llcommon.h']] - for p in paths: - if os.path.exists(p): - contents = open(p, 'r').read() - major = re.search("LL_VERSION_MAJOR\s=\s([0-9]+)", contents).group(1) - minor = re.search("LL_VERSION_MINOR\s=\s([0-9]+)", contents).group(1) - patch = re.search("LL_VERSION_PATCH\s=\s([0-9]+)", contents).group(1) - build = re.search("LL_VERSION_BUILD\s=\s([0-9]+)", contents).group(1) - return major, minor, patch, build - -def get_channel(srctree): - # look up llversionserver.h and parse out the version info - paths = [os.path.join(srctree, x, 'llversionviewer.h') for x in ['llcommon', '../llcommon', '../../indra/llcommon.h']] - for p in paths: - if os.path.exists(p): - contents = open(p, 'r').read() - channel = re.search("LL_CHANNEL\s=\s\"(.+)\";\s*$", contents, flags = re.M).group(1) - return channel - - DEFAULT_SRCTREE = os.path.dirname(sys.argv[0]) DEFAULT_CHANNEL = 'Second Life Release' @@ -140,7 +118,7 @@ ARGUMENTS=[ default=""), dict(name='channel', description="""The channel to use for updates, packaging, settings name, etc.""", - default=get_channel), + default='CHANNEL UNSET'), dict(name='login_channel', description="""The channel to use for login handshake/updates only.""", default=None), @@ -164,10 +142,8 @@ ARGUMENTS=[ contain the name of the final package in a form suitable for use by a .bat file.""", default=None), - dict(name='version', - description="""This specifies the version of Second Life that is - being packaged up.""", - default=get_default_version), + dict(name='versionfile', + description="""The name of a file containing the full version number."""), dict(name='signature', description="""This specifies an identity to sign the viewer with, if any. If no value is supplied, the default signature will be used, if any. Currently @@ -232,9 +208,14 @@ def main(): args[arg['name']] = default # fix up version - if isinstance(args.get('version'), str): - args['version'] = args['version'].split('.') - + if isinstance(args.get('versionfile'), str): + try: # read in the version string + vf = open(args['versionfile'], 'r') + args['version'] = vf.read().strip().split('.') + except: + print "Unable to read versionfile '%s'" % args['versionfile'] + raise + # default and agni are default if args['grid'] in ['default', 'agni']: args['grid'] = '' diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 5cce8ff2c4..f3afd9c1a9 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -246,7 +246,6 @@ set(llcommon_HEADER_FILES lluuid.h lluuidhashmap.h llversionserver.h - llversionviewer.h llworkerthread.h ll_template_cast.h metaclass.h diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h deleted file mode 100644 index 39f9de3bc2..0000000000 --- a/indra/llcommon/llversionviewer.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file llversionviewer.h - * @brief - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLVERSIONVIEWER_H -#define LL_LLVERSIONVIEWER_H - -const S32 LL_VERSION_MAJOR = 3; -const S32 LL_VERSION_MINOR = 4; -const S32 LL_VERSION_PATCH = 5; -const S32 LL_VERSION_BUILD = 0; - -const char * const LL_CHANNEL = "Second Life Developer"; - -#if LL_DARWIN -const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.indra.viewer"; -#endif - -#endif diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e93d73ad0e..dbd6a60a7c 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -4,7 +4,6 @@ project(viewer) include(00-Common) include(Boost) -include(BuildVersion) include(DBusGlib) include(DirectX) include(OpenSSL) @@ -1228,6 +1227,21 @@ set(viewer_HEADER_FILES source_group("CMake Rules" FILES ViewerInstall.cmake) +set_source_files_properties( + llversioninfo.cpp tests/llversioninfo_test.cpp + PROPERTIES + OBJECT_DEPENDS always_generate_version + COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake + ) + +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt + COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + COMMENT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Generating viewer_version.txt + ) +add_custom_target(generate_viewer_version DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt") +add_dependencies(generate_viewer_version "${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt") + if (DARWIN) LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) @@ -1308,12 +1322,16 @@ if (WINDOWS) string(TOLOWER ${VIEWER_CHANNEL} channel_lower) if(channel_lower MATCHES "^second life release") set(ICON_PATH "release") + set(VIEWER_MACOSX_PHASE "f") elseif(channel_lower MATCHES "^second life beta viewer") set(ICON_PATH "beta") + set(VIEWER_MACOSX_PHASE "b") elseif(channel_lower MATCHES "^second life development") set(ICON_PATH "development") + set(VIEWER_MACOSX_PHASE "d") elseif(channel_lower MATCHES "project") set(ICON_PATH "project") + set(VIEWER_MACOSX_PHASE "a") endif() message("Copying icons for ${ICON_PATH}") execute_process( @@ -1382,8 +1400,11 @@ if (WINDOWS) set_source_files_properties(${viewer_RESOURCE_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) + configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/res/viewerRes.rc + ${CMAKE_CURRENT_BINARY_DIR}/res/viewerRes.rc + ) set(viewer_RESOURCE_FILES - res/viewerRes.rc + ${CMAKE_CURRENT_BINARY_DIR}/res/viewerRes.rc ${viewer_RESOURCE_FILES} ) @@ -1695,10 +1716,13 @@ if (WINDOWS) --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} --grid=${GRID} + --channel=${VIEWER_CHANNEL} + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt stage_third_party_libs ${COPY_INPUT_DEPENDENCIES} COMMENT "Performing viewer_manifest copy" @@ -1757,6 +1781,7 @@ if (WINDOWS) --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} --channel=${VIEWER_CHANNEL} + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} --grid=${GRID} @@ -1766,12 +1791,14 @@ if (WINDOWS) DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ${COPY_INPUT_DEPENDENCIES} ) add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat windows-setup-build-all + generate_viewer_version ) # temporarily disable packaging of event_host until hg subrepos get # sorted out on the parabuild cluster... @@ -1854,14 +1881,11 @@ else (USE_KDU) ) endif (USE_KDU) -build_version(viewer) - set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Path to artwork files.") - if (LINUX) - set(product SecondLife-${ARCH}-${viewer_VERSION}) + set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) # These are the generated targets that are copied to package/ set(COPY_INPUT_DEPENDENCIES @@ -1883,6 +1907,7 @@ if (LINUX) --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} --channel=${VIEWER_CHANNEL} + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged --grid=${GRID} @@ -1892,11 +1917,13 @@ if (LINUX) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ${COPY_INPUT_DEPENDENCIES} ) if (PACKAGE) endif (PACKAGE) + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched COMMAND ${PYTHON_EXECUTABLE} @@ -1910,9 +1937,12 @@ if (LINUX) --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged --grid=${GRID} + --channel=${VIEWER_CHANNEL} + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --source=${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ${COPY_INPUT_DEPENDENCIES} COMMENT "Performing viewer_manifest copy" ) @@ -1929,20 +1959,29 @@ endif (LINUX) if (DARWIN) set(product "Second Life") + set_target_properties( ${VIEWER_BINARY_NAME} PROPERTIES OUTPUT_NAME "${product}" - MACOSX_BUNDLE_INFO_STRING "info string - localize me" + MACOSX_BUNDLE_INFO_STRING "Second Life Viewer" MACOSX_BUNDLE_ICON_FILE "secondlife.icns" MACOSX_BUNDLE_GUI_IDENTIFIER "Second Life" - MACOSX_BUNDLE_LONG_VERSION_STRING "ververver" + MACOSX_BUNDLE_LONG_VERSION_STRING "${VIEWER_CHANNEL} ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" MACOSX_BUNDLE_BUNDLE_NAME "Second Life" - MACOSX_BUNDLE_SHORT_VERSION_STRING "asdf" - MACOSX_BUNDLE_BUNDLE_VERSION "asdf" - MACOSX_BUNDLE_COPYRIGHT "copyright linden lab 2007 - localize me and run me through a legal wringer" + MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}" + MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}" + MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007" ) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist" + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Info.plist" + ) + #configure_file( + # "${CMAKE_CURRENT_SOURCE_DIR}/English.lproj/InfoPlist.strings" + # "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Resources/English.lproj/InfoPlist.strings" + # ) add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} @@ -1955,8 +1994,13 @@ if (DARWIN) --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app --grid=${GRID} + --channel=${VIEWER_CHANNEL} + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --source=${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + DEPENDS + ${VIEWER_BINARY_NAME} + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger) @@ -1969,6 +2013,7 @@ if (DARWIN) if (PACKAGE) add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) + add_dependencies(package generate_viewer_version) add_custom_command( TARGET package POST_BUILD @@ -1982,12 +2027,15 @@ if (DARWIN) --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app --grid=${GRID} + --channel=${VIEWER_CHANNEL} + --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched ${SIGNING_SETTING} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ) endif (PACKAGE) endif (DARWIN) diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 5c7cacedec..041b8cea0b 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.1.0.13828"; -CFBundleGetInfoString = "Second Life version 2.1.0.13828, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version %%VERSION%%"; +CFBundleGetInfoString = "Second Life version %%VERSION%%, Copyright 2004 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index f7b11b217c..a19844f11c 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -60,7 +60,7 @@ CFBundleVersion - 2.1.0.13828 + ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION} CSResourcesFileMapped diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt new file mode 100644 index 0000000000..6cb9d3dd0d --- /dev/null +++ b/indra/newview/VIEWER_VERSION.txt @@ -0,0 +1 @@ +3.4.3 diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 20936c6460..98c8674fa5 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -113,7 +113,7 @@ export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}" # Have to deal specially with gridargs.dat; typical contents look like: -# --channel "Second Life Developer" --settings settings_developer.xml +# --channel "Second Life Test" --settings settings_test.xml # Simply embedding $( +#include #include "llversioninfo.h" -#include "llversionviewer.h" +#if ! defined(LL_VIEWER_VERSION_MAJOR) \ + || ! defined(LL_VIEWER_VERSION_MINOR) \ + || ! defined(LL_VIEWER_VERSION_PATCH) \ + || ! defined(LL_VIEWER_VERSION_BUILD) + #error "Version information is undefined" +#endif + +#ifndef LL_VIEWER_CHANNEL +#define LL_VIEWER_CHANNEL "Second Life Test" +#endif +const char * const LL_CHANNEL = LL_VIEWER_CHANNEL; // -// Set the version numbers in indra/llcommon/llversionviewer.h +// Set the version numbers in indra/VIEWER_VERSION // //static S32 LLVersionInfo::getMajor() { - return LL_VERSION_MAJOR; + return LL_VIEWER_VERSION_MAJOR; } //static S32 LLVersionInfo::getMinor() { - return LL_VERSION_MINOR; + return LL_VIEWER_VERSION_MINOR; } //static S32 LLVersionInfo::getPatch() { - return LL_VERSION_PATCH; + return LL_VIEWER_VERSION_PATCH; } //static S32 LLVersionInfo::getBuild() { - return LL_VERSION_BUILD; + return LL_VIEWER_VERSION_BUILD; } //static const std::string &LLVersionInfo::getVersion() { static std::string version(""); - if (version.empty()) { - // cache the version string std::ostringstream stream; - stream << LL_VERSION_MAJOR << "." - << LL_VERSION_MINOR << "." - << LL_VERSION_PATCH << "." - << LL_VERSION_BUILD; + stream << LLVersionInfo::getShortVersion() << "." << LLVersionInfo::getBuild(); + // cache the version string version = stream.str(); } - return version; } //static const std::string &LLVersionInfo::getShortVersion() { - static std::string version(""); - - if (version.empty()) + static std::string short_version(""); + if(short_version.empty()) { // cache the version string std::ostringstream stream; - stream << LL_VERSION_MAJOR << "." - << LL_VERSION_MINOR << "." - << LL_VERSION_PATCH; - version = stream.str(); + stream << LL_VIEWER_VERSION_MAJOR << "." + << LL_VIEWER_VERSION_MINOR << "." + << LL_VIEWER_VERSION_PATCH; + short_version = stream.str(); } - - return version; + return short_version; } namespace @@ -100,7 +104,7 @@ namespace /// Storage of the channel name the viewer is using. // The channel name is set by hardcoded constant, // or by calling LLVersionInfo::resetChannel() - std::string sWorkingChannelName(LL_CHANNEL); + std::string sWorkingChannelName(LL_VIEWER_CHANNEL); // Storage for the "version and channel" string. // This will get reset too. @@ -113,11 +117,7 @@ const std::string &LLVersionInfo::getChannelAndVersion() if (sVersionChannel.empty()) { // cache the version string - std::ostringstream stream; - stream << LLVersionInfo::getChannel() - << " " - << LLVersionInfo::getVersion(); - sVersionChannel = stream.str(); + sVersionChannel = LLVersionInfo::getChannel() + " " + LLVersionInfo::getVersion(); } return sVersionChannel; diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index 6f64544f3b..077105cae8 100644 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -29,6 +29,7 @@ #define LL_LLVERSIONINFO_H #include +#include "stdtypes.h" /// /// This API provides version information for the viewer. This diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index df75f3f697..5360842134 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -135,8 +135,8 @@ TOOLNO CURSOR "llno.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,1,1,0 - PRODUCTVERSION 2,1,1,0 + FILEVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_BUILD} + PRODUCTVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_BUILD} FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -153,12 +153,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "2.1.1.0" + VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_BUILD}" VALUE "InternalName", "Second Life" - VALUE "LegalCopyright", "Copyright � 2001-2010, Linden Research, Inc." + VALUE "LegalCopyright", "Copyright � 2001, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "2.1.1.0" + VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_BUILD}" END END BLOCK "VarFileInfo" diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp index 398d8f16ed..6b0be29c2d 100644 --- a/indra/newview/tests/llversioninfo_test.cpp +++ b/indra/newview/tests/llversioninfo_test.cpp @@ -28,7 +28,6 @@ #include "../test/lltut.h" #include "../llversioninfo.h" -#include "llversionviewer.h" namespace tut { @@ -38,20 +37,20 @@ namespace tut : mResetChannel("Reset Channel") { std::ostringstream stream; - stream << LL_VERSION_MAJOR << "." - << LL_VERSION_MINOR << "." - << LL_VERSION_PATCH << "." - << LL_VERSION_BUILD; + stream << LL_VIEWER_VERSION_MAJOR << "." + << LL_VIEWER_VERSION_MINOR << "." + << LL_VIEWER_VERSION_PATCH << "." + << LL_VIEWER_VERSION_BUILD; mVersion = stream.str(); stream.str(""); - stream << LL_VERSION_MAJOR << "." - << LL_VERSION_MINOR << "." - << LL_VERSION_PATCH; + stream << LL_VIEWER_VERSION_MAJOR << "." + << LL_VIEWER_VERSION_MINOR << "." + << LL_VIEWER_VERSION_PATCH; mShortVersion = stream.str(); stream.str(""); - stream << LL_CHANNEL + stream << LL_VIEWER_CHANNEL << " " << mVersion; mVersionAndChannel = stream.str(); @@ -78,20 +77,19 @@ namespace tut { ensure_equals("Major version", LLVersionInfo::getMajor(), - LL_VERSION_MAJOR); + LL_VIEWER_VERSION_MAJOR); ensure_equals("Minor version", LLVersionInfo::getMinor(), - LL_VERSION_MINOR); + LL_VIEWER_VERSION_MINOR); ensure_equals("Patch version", LLVersionInfo::getPatch(), - LL_VERSION_PATCH); + LL_VIEWER_VERSION_PATCH); ensure_equals("Build version", LLVersionInfo::getBuild(), - LL_VERSION_BUILD); + LL_VIEWER_VERSION_BUILD); ensure_equals("Channel version", LLVersionInfo::getChannel(), - LL_CHANNEL); - + LL_VIEWER_CHANNEL); ensure_equals("Version String", LLVersionInfo::getVersion(), mVersion); diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e7108141ee..20f64dbf4b 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -666,7 +666,7 @@ class DarwinManifest(ViewerManifest): self.path(self.args['configuration'] + "/Second Life.app", dst="") if self.prefix(src="", dst="Contents"): # everything goes in Contents - self.path("Info-SecondLife.plist", dst="Info.plist") + self.path("Info.plist", dst="Info.plist") # copy additional libs in /Contents/MacOS/ self.path("../packages/lib/release/libndofdev.dylib", dst="Resources/libndofdev.dylib") @@ -694,7 +694,11 @@ class DarwinManifest(ViewerManifest): self.path("SecondLife.nib") # Translations - self.path("English.lproj") + self.path("English.lproj/language.txt") + self.replace_in(src="English.lproj/InfoPlist.strings", + dst="English.lproj/InfoPlist.strings", + searchdict={'%%VERSION%%':'.'.join(self.args['version'])} + ) self.path("German.lproj") self.path("Japanese.lproj") self.path("Korean.lproj") diff --git a/indra/viewer_components/updater/CMakeLists.txt b/indra/viewer_components/updater/CMakeLists.txt index ef82290b47..5d84f79dbd 100644 --- a/indra/viewer_components/updater/CMakeLists.txt +++ b/indra/viewer_components/updater/CMakeLists.txt @@ -38,6 +38,13 @@ set(updater_service_HEADER_FILES set_source_files_properties(${updater_service_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + llupdaterservice.cpp + PROPERTIES + OBJECT_DEPENDS always_generate_version + COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake + ) + list(APPEND updater_service_SOURCE_FILES ${updater_service_HEADER_FILES} diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index bc73c72ddc..d783360f80 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -32,7 +32,6 @@ #include "lltimer.h" #include "llupdatechecker.h" #include "llupdateinstaller.h" -#include "llversionviewer.h" #include #include @@ -44,6 +43,12 @@ #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally #endif +#if ! defined(LL_VIEWER_VERSION_MAJOR) \ + || ! defined(LL_VIEWER_VERSION_MINOR) \ + || ! defined(LL_VIEWER_VERSION_PATCH) \ + || ! defined(LL_VIEWER_VERSION_BUILD) +#error "Version information is undefined" +#endif namespace { @@ -609,10 +614,10 @@ std::string const & ll_get_version(void) { if (version.empty()) { std::ostringstream stream; - stream << LL_VERSION_MAJOR << "." - << LL_VERSION_MINOR << "." - << LL_VERSION_PATCH << "." - << LL_VERSION_BUILD; + stream << LL_VIEWER_VERSION_MAJOR << "." + << LL_VIEWER_VERSION_MINOR << "." + << LL_VIEWER_VERSION_PATCH << "." + << LL_VIEWER_VERSION_BUILD; version = stream.str(); } diff --git a/scripts/build_version.py b/scripts/build_version.py deleted file mode 100755 index 203d76fe9e..0000000000 --- a/scripts/build_version.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python -"""\ -@file build_version.py -@brief Print the build information embedded in a header file. - - Expects to be invoked from the command line with a file name and a - list of directories to search. The file name will be one of the - following: - - llversionserver.h - llversionviewer.h - - The directory list that follows will include indra/llcommon, where - these files live. - -$LicenseInfo:firstyear=2010&license=viewerlgpl$ -Second Life Viewer Source Code -Copyright (C) 2010-2011, Linden Research, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; -version 2.1 of the License only. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA -$/LicenseInfo$ -""" - -import errno, os, re - -def get_version(filename): - fp = open(filename) - data = fp.read() - fp.close() - - vals = {} - m = re.search('const S32 LL_VERSION_MAJOR = (\d+);', data) - vals['major'] = m.group(1) - m = re.search('const S32 LL_VERSION_MINOR = (\d+);', data) - vals['minor'] = m.group(1) - m = re.search('const S32 LL_VERSION_PATCH = (\d+);', data) - vals['patch'] = m.group(1) - m = re.search('const S32 LL_VERSION_BUILD = (\d+);', data) - vals['build'] = m.group(1) - - return "%(major)s.%(minor)s.%(patch)s.%(build)s" % vals - -if __name__ == '__main__': - import sys - - try: - for path in sys.argv[2:]: - name = os.path.join(path, sys.argv[1]) - try: - print get_version(name) - break - except OSError, err: - if err.errno != errno.ENOENT: - raise - else: - print >> sys.stderr, 'File not found:', sys.argv[1] - sys.exit(1) - except AttributeError: - print >> sys.stderr, 'Error: malformatted file: ', name - sys.exit(1) - except IndexError: - print >> sys.stderr, ('Usage: %s llversion[...].h [directories]' % - sys.argv[0]) diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py deleted file mode 100755 index 87036dc1c0..0000000000 --- a/scripts/update_version_files.py +++ /dev/null @@ -1,343 +0,0 @@ -#!/usr/bin/env python -"""\ -@file update_version_files.py -@brief Update all of the various files in the repository to a new version number, -instead of having to figure it out by hand - -$LicenseInfo:firstyear=2010&license=viewerlgpl$ -Second Life Viewer Source Code -Copyright (C) 2010-2011, Linden Research, Inc. - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; -version 2.1 of the License only. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA -$/LicenseInfo$ -""" - -import sys -import os.path - -# Look for indra/lib/python in all possible parent directories ... -# This is an improvement over the setup-path.py method used previously: -# * the script may blocated anywhere inside the source tree -# * it doesn't depend on the current directory -# * it doesn't depend on another file being present. - -def add_indra_lib_path(): - root = os.path.realpath(__file__) - # always insert the directory of the script in the search path - dir = os.path.dirname(root) - if dir not in sys.path: - sys.path.insert(0, dir) - - # Now go look for indra/lib/python in the parent dies - while root != os.path.sep: - root = os.path.dirname(root) - dir = os.path.join(root, 'indra', 'lib', 'python') - if os.path.isdir(dir): - if dir not in sys.path: - sys.path.insert(0, dir) - break - else: - print >>sys.stderr, "This script is not inside a valid installation." - sys.exit(1) - -add_indra_lib_path() - -import getopt, os, re, commands -from indra.util import llversion - -def usage(): - print "Usage:" - print sys.argv[0] + """ [options] - -Options: - --version - Specify the version string to replace current version. - --revision - Specify the revision to replace the last digit of the version. - By default, revision is computed from the version control system. - --skip-on-branch - Specify a regular expression against which the current branch - is matched. If it matches, then leave version strings alone. - Use this to avoid changing version strings on release candidate - builds. - --server - Update llversionserver.h only with new version - --viewer - Update llversionviewer.h only with new version - --channel - Specify the viewer channel string to replace current channel. - --server_channel - Specify the server channel string to replace current channel. - --verbose - --help - Print this message and exit. - -Common Uses: - # Update server and viewer build numbers to the current hg revision: - update_version_files.py - - # Update build numbers unless we are on a release branch: - update_version_files.py --skip-on-branch='^Branch_' - - # Update server and viewer version numbers explicitly: - update_version_files.py --version=1.18.1.6 - - # Update just the viewer version number explicitly: - update_version_files.py --viewer --version=1.18.1.6 - - # Update just the server build number to the current hg revision: - update_version_files.py --server - - # Update the viewer channel - update_version_files.py --channel="First Look Puppeteering" - - # Update the server channel - update_version_files.py --server_channel="Het Grid" - -""" -def _getstatusoutput(cmd): - """Return Win32 (status, output) of executing cmd -in a shell.""" - if os.path.sep != "/": - # stupid #%#$$ windows - cmd = 'cmd.exe /c "'+cmd+'"' - pipe = os.popen(cmd, 'r') - text = pipe.read() - sts = pipe.close() - if sts is None: sts = 0 - if text[-1:] == '\n': text = text[:-1] - return sts, text - -re_map = {} - -#re_map['filename'] = (('pattern', 'replacement'), -# ('pattern', 'replacement') -re_map['indra/llcommon/llversionviewer.h'] = \ - (('const S32 LL_VERSION_MAJOR = (\d+);', - 'const S32 LL_VERSION_MAJOR = %(VER_MAJOR)s;'), - ('const S32 LL_VERSION_MINOR = (\d+);', - 'const S32 LL_VERSION_MINOR = %(VER_MINOR)s;'), - ('const S32 LL_VERSION_PATCH = (\d+);', - 'const S32 LL_VERSION_PATCH = %(VER_PATCH)s;'), - ('const S32 LL_VERSION_BUILD = (\d+);', - 'const S32 LL_VERSION_BUILD = %(VER_BUILD)s;'), - ('const char \* const LL_CHANNEL = "(.+)";', - 'const char * const LL_CHANNEL = "%(VIEWER_CHANNEL)s";')) -re_map['indra/llcommon/llversionserver.h'] = \ - (('const S32 LL_VERSION_MAJOR = (\d+);', - 'const S32 LL_VERSION_MAJOR = %(SERVER_VER_MAJOR)s;'), - ('const S32 LL_VERSION_MINOR = (\d+);', - 'const S32 LL_VERSION_MINOR = %(SERVER_VER_MINOR)s;'), - ('const S32 LL_VERSION_PATCH = (\d+);', - 'const S32 LL_VERSION_PATCH = %(SERVER_VER_PATCH)s;'), - ('const S32 LL_VERSION_BUILD = (\d+);', - 'const S32 LL_VERSION_BUILD = %(SERVER_VER_BUILD)s;'), - ('const char \* const LL_CHANNEL = "(.+)";', - 'const char * const LL_CHANNEL = "%(SERVER_CHANNEL)s";')) -re_map['indra/newview/res/viewerRes.rc'] = \ - (('FILEVERSION [0-9,]+', - 'FILEVERSION %(VER_MAJOR)s,%(VER_MINOR)s,%(VER_PATCH)s,%(VER_BUILD)s'), - ('PRODUCTVERSION [0-9,]+', - 'PRODUCTVERSION %(VER_MAJOR)s,%(VER_MINOR)s,%(VER_PATCH)s,%(VER_BUILD)s'), - ('VALUE "FileVersion", "[0-9.]+"', - 'VALUE "FileVersion", "%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s"'), - ('VALUE "ProductVersion", "[0-9.]+"', - 'VALUE "ProductVersion", "%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s"')) - -# Trailing ',' in top level tuple is special form to avoid parsing issues with one element tuple -re_map['indra/newview/Info-SecondLife.plist'] = \ - (('CFBundleVersion\n\t[0-9.]+', - 'CFBundleVersion\n\t%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s'),) - -# This will probably only work as long as InfoPlist.strings is NOT UTF16, which is should be... -re_map['indra/newview/English.lproj/InfoPlist.strings'] = \ - (('CFBundleShortVersionString = "Second Life version [0-9.]+";', - 'CFBundleShortVersionString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s";'), - ('CFBundleGetInfoString = "Second Life version [0-9.]+', - 'CFBundleGetInfoString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s')) - - -version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') - -def main(): - script_path = os.path.dirname(__file__) - src_root = script_path + "/../" - verbose = False - - opts, args = getopt.getopt(sys.argv[1:], - "", - ['version=', - 'revision=', - 'channel=', - 'server_channel=', - 'skip-on-branch=', - 'verbose', - 'server', - 'viewer', - 'help']) - update_server = False - update_viewer = False - new_version = None - new_revision = None - new_viewer_channel = None - new_server_channel = None - skip_on_branch_re = None - for o,a in opts: - if o in ('--version'): - new_version = a - if o in ('--revision'): - new_revision = a - if o in ('--skip-on-branch'): - skip_on_branch_re = re.compile(a) - if o in ('--channel'): - new_viewer_channel = a - if o in ('--server_channel'): - new_server_channel = a - if o in ('--verbose'): - verbose = True - if o in ('--server'): - update_server = True - if o in ('--viewer'): - update_viewer = True - if o in ('--help'): - usage() - return 0 - - if not(update_server or update_viewer): - update_server = True - update_viewer = True - - # Get current channel/version from llversion*.h - try: - viewer_channel = llversion.get_viewer_channel() - viewer_version = llversion.get_viewer_version() - except IOError: - print "Viewer version file not present, skipping..." - viewer_channel = None - viewer_version = None - update_viewer = False - - try: - server_channel = llversion.get_server_channel() - server_version = llversion.get_server_version() - except IOError: - print "Server version file not present, skipping..." - server_channel = None - server_version = None - update_server = False - - if verbose: - print "Source Path:", src_root - if viewer_channel != None: - print "Current viewer channel/version: '%(viewer_channel)s' / '%(viewer_version)s'" % locals() - if server_channel != None: - print "Current server channel/version: '%(server_channel)s' / '%(server_version)s'" % locals() - print - - # Determine new channel(s) - if new_viewer_channel != None and len(new_viewer_channel) > 0: - viewer_channel = new_viewer_channel - if new_server_channel != None and len(new_server_channel) > 0: - server_channel = new_server_channel - - # Determine new version(s) - if new_version: - m = version_re.match(new_version) - if not m: - print "Invalid version string specified!" - return -1 - if update_viewer: - viewer_version = new_version - if update_server: - server_version = new_version - else: - - if llversion.using_hg(): - if new_revision: - revision = new_revision - else: - revision = llversion.get_hg_changeset() - branch = llversion.get_hg_repo() - elif new_revision: - revision = new_revision - branch = "unknown" - else: - print >>sys.stderr, "ERROR: could not determine revision and branch" - return -1 - - if skip_on_branch_re and skip_on_branch_re.match(branch): - print "Release Candidate Build, leaving version files untouched." - return 0 - if update_viewer: - m = version_re.match(viewer_version) - viewer_version = m.group(1)+"."+m.group(2)+"."+m.group(3)+"."+revision - if update_server: - m = version_re.match(server_version) - server_version = m.group(1)+"."+m.group(2)+"."+m.group(3)+"."+revision - - if verbose: - if update_viewer: - print "Setting viewer channel/version: '%(viewer_channel)s' / '%(viewer_version)s'" % locals() - if update_server: - print "Setting server channel/version: '%(server_channel)s' / '%(server_version)s'" % locals() - print - - # split out version parts - if viewer_version != None: - m = version_re.match(viewer_version) - VER_MAJOR = m.group(1) - VER_MINOR = m.group(2) - VER_PATCH = m.group(3) - VER_BUILD = m.group(4) - - if server_version != None: - m = version_re.match(server_version) - SERVER_VER_MAJOR = m.group(1) - SERVER_VER_MINOR = m.group(2) - SERVER_VER_PATCH = m.group(3) - SERVER_VER_BUILD = m.group(4) - - # For readability and symmetry with version strings: - VIEWER_CHANNEL = viewer_channel - SERVER_CHANNEL = server_channel - - # Iterate through all of the files in the map, and apply the - # substitution filters - for filename in re_map.keys(): - try: - # Read the entire file into a string - full_fn = src_root + '/' + filename - file = open(full_fn,"r") - file_str = file.read() - file.close() - - if verbose: - print "Processing file:",filename - for rule in re_map[filename]: - repl = rule[1] % locals() - file_str = re.sub(rule[0], repl, file_str) - - file = open(full_fn,"w") - file.write(file_str) - file.close() - except IOError: - print "File %(filename)s not present, skipping..." % locals() - return 0 - -if __name__ == '__main__': - sys.exit(main()) - From 5ea68c69a443fb9364c6e86ec373d3bd57382da7 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 10:50:47 -0500 Subject: [PATCH 06/82] convert to new channel name scheme and remove login_channel build time parameter --- BuildParams | 41 ++---------------- indra/cmake/Variables.cmake | 1 - indra/lib/python/indra/util/llmanifest.py | 5 +-- indra/newview/CMakeLists.txt | 11 ++--- .../newview/icons/development/secondlife.icns | Bin 233026 -> 0 bytes .../newview/icons/development/secondlife.ico | Bin 77117 -> 0 bytes .../icons/development/secondlife_128.png | Bin 17499 -> 0 bytes .../icons/development/secondlife_16.png | Bin 3471 -> 0 bytes .../icons/development/secondlife_256.BMP | Bin 196662 -> 0 bytes .../icons/development/secondlife_256.png | Bin 47952 -> 0 bytes .../icons/development/secondlife_32.png | Bin 4649 -> 0 bytes .../icons/development/secondlife_48.png | Bin 6190 -> 0 bytes .../icons/development/secondlife_512.png | Bin 147689 -> 0 bytes indra/newview/viewer_manifest.py | 40 ++++++----------- 14 files changed, 22 insertions(+), 76 deletions(-) delete mode 100644 indra/newview/icons/development/secondlife.icns delete mode 100644 indra/newview/icons/development/secondlife.ico delete mode 100644 indra/newview/icons/development/secondlife_128.png delete mode 100644 indra/newview/icons/development/secondlife_16.png delete mode 100644 indra/newview/icons/development/secondlife_256.BMP delete mode 100644 indra/newview/icons/development/secondlife_256.png delete mode 100644 indra/newview/icons/development/secondlife_32.png delete mode 100644 indra/newview/icons/development/secondlife_48.png delete mode 100644 indra/newview/icons/development/secondlife_512.png diff --git a/BuildParams b/BuildParams index c8edfeaa2f..547a591310 100644 --- a/BuildParams +++ b/BuildParams @@ -21,50 +21,29 @@ email_status_this_is_os = true # Limit extent of codeticket updates to revisions after... codeticket_since = 3.3.0-release -# ======================================== -# Viewer Development -# ======================================== - # Report changes since... viewer-development.show_changes_since = last_sprint # Build Settings -viewer-development_coverity.coverity_product = viewer -viewer-development_coverity.run_tests = false viewer-development.build_debug_release_separately = true # Notifications - to configure email notices, add a setting like this: # _.email = - -# ================================================================= -# Canonical viewer integration builds - Oz Linden -# ================================================================= -integration_viewer-development.viewer_channel = "Second Life Development" -integration_viewer-development.login_channel = "Second Life Development" -integration_viewer-development.build_viewer_update_version_manager = false -integration_viewer-development.email = viewer-development-builds@lists.secondlife.com -integration_viewer-development.build_enforce_coding_policy = false -integration_viewer-development.codeticket_add_context = false - -viewer-beta.viewer_channel = "Second Life Beta Viewer" -viewer-beta.login_channel = "Second Life Beta Viewer" -viewer-beta.build_debug_release_separately = true -viewer-beta.build_viewer_update_version_manager = true -viewer-beta.codeticket_add_context = false +# Example of how to build a Project Beta for the Bingo Project +#bingo-beta.viewer_channel = "Second Life Beta Bingo" +# Example of how to build a Project Integration build for the Bingo Project +#bingo-beta.viewer_channel = "Second Life Project Bingo" viewer-release.viewer_channel = "Second Life Release" -viewer-release.login_channel = "Second Life Release" viewer-release.build_debug_release_separately = true viewer-release.build_viewer_update_version_manager = true viewer-release.codeticket_add_context = false - # ======================================== # mesh-development # ======================================== mesh-development.viewer_channel = "Project Viewer - Mesh" -mesh-development.login_channel = "Project Viewer - Mesh" mesh-development.viewer_grid = aditi mesh-development.build_debug_release_separately = true mesh-development.build_CYGWIN_Debug = false @@ -74,7 +53,6 @@ mesh-development.build_viewer_update_version_manager = false # mesh-development-release-1-candidate # ======================================== mesh-development-release-1-candidate.viewer_channel = "Project Viewer - Mesh" -mesh-development-release-1-candidate.login_channel = "Project Viewer - Mesh" mesh-development-release-1-candidate.viewer_grid = agni mesh-development-release-1-candidate.build_debug_release_separately = true mesh-development-release-1-candidate.build_CYGWIN_Debug = false @@ -84,7 +62,6 @@ mesh-development-release-1-candidate.build_viewer_update_version_manager = false # mesh-development-rc # ======================================== mesh-development-rc.viewer_channel = "Project Viewer - Mesh" -mesh-development-rc.login_channel = "Project Viewer - Mesh" mesh-development-rc.viewer_grid = agni mesh-development-rc.build_debug_release_separately = true mesh-development-rc.build_CYGWIN_Debug = false @@ -94,7 +71,6 @@ mesh-development-rc.build_viewer_update_version_manager = false # mesh-asset-deprecation # ======================================== mesh-asset-deprecation.viewer_channel = "Project Viewer - Mesh Asset Deprecation" -mesh-asset-deprecation.login_channel = "Project Viewer - Mesh Asset Deprecation" mesh-asset-deprecation.viewer_grid = aditi mesh-asset-deprecation.build_debug_release_separately = true mesh-asset-deprecation.build_CYGWIN_Debug = false @@ -112,7 +88,6 @@ viewer-mesh.build_viewer_update_version_manager = false viewer-mesh.build_Debug = false viewer-mesh.build_RelWithDebInfo = false viewer-mesh.viewer_channel = "Project Viewer - Mesh" -viewer-mesh.login_channel = "Project Viewer - Mesh" viewer-mesh.viewer_grid = aditi viewer-mesh.email = shining@lists.lindenlab.com @@ -121,7 +96,6 @@ viewer-mesh.email = shining@lists.lindenlab.com # ======================================== viewer-pathfinding.viewer_channel = "Project Viewer - Pathfinding" -viewer-pathfinding.login_channel = "Project Viewer - Pathfinding" viewer-pathfinding.viewer_grid = agni viewer-pathfinding.build_debug_release_separately = true viewer-pathfinding.build_CYGWIN_Debug = false @@ -131,14 +105,12 @@ viewer-pathfinding.build_viewer_update_version_manager = false # asset delivery 2010 projects # ================================================================= viewer-asset-delivery.viewer_channel = "Second Life Development" -viewer-asset-delivery.login_channel = "Second Life Development" viewer-asset-delivery.build_viewer_update_version_manager = false viewer-asset-delivery.email = monty@lindenlab.com viewer-asset-delivery.build_server = false viewer-asset-delivery.build_server_tests = false viewer-asset-delivery-metrics.viewer_channel = "Second Life Development" -viewer-asset-delivery-metrics.login_channel = "Second Life Development" viewer-asset-delivery-metrics.build_viewer_update_version_manager = false viewer-asset-delivery-metrics.email = monty@lindenlab.com viewer-asset-delivery-metrics.build_server = false @@ -155,34 +127,29 @@ simon_viewer-dev-private.email_status_this_is_os = false # Vir # ======================================== vir-project-1.viewer_channel = "Second Life Release" -vir-project-1.login_channel = "Second Life Release" # ======================================== # THX-1138 / Runway projects # ======================================== viewer-thx1138-runway-shared.viewer_channel = "Project Viewer - THX-1138 Runway" -viewer-thx1138-runway-shared.login_channel = "Project Viewer - THX-1138 Runway" viewer-thx1138-runway-shared.viewer_grid = uma viewer-thx1138-runway-shared.build_debug_release_separately = true viewer-thx1138-runway-shared.build_CYGWIN_Debug = false viewer-thx1138-runway-shared.build_viewer_update_version_manager = false viewer-thx1138.viewer_channel = "Project Viewer - THX-1138" -viewer-thx1138.login_channel = "Project Viewer - THX-1138" viewer-thx1138.viewer_grid = uma viewer-thx1138.build_debug_release_separately = true viewer-thx1138.build_CYGWIN_Debug = false viewer-thx1138.build_viewer_update_version_manager = false runway-merge.viewer_channel = "Project Viewer - Runway Merge" -runway-merge.login_channel = "Project Viewer - Runway Merge" runway-merge.viewer_grid = agni runway-merge.build_debug_release_separately = true runway-merge.build_CYGWIN_Debug = false runway-merge.build_viewer_update_version_manager = false runway.viewer_channel = "Project Viewer - Runway" -runway.login_channel = "Project Viewer - Runway" runway.viewer_grid = agni runway.build_debug_release_separately = true runway.build_CYGWIN_Debug = false diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 6c3b7801b9..296da81e6c 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -142,7 +142,6 @@ set(GRID agni CACHE STRING "Target Grid") set(VIEWER ON CACHE BOOL "Build Second Life viewer.") set(VIEWER_CHANNEL "Second Life Test" CACHE STRING "Viewer Channel Name") -set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for A/B Testing") if (XCODE_VERSION GREATER 4.2) set(ENABLE_SIGNING OFF CACHE BOOL "Enable signing the viewer") diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index eaa94925b1..25a1b95b9a 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -85,7 +85,7 @@ def get_default_platform(dummy): }[sys.platform] DEFAULT_SRCTREE = os.path.dirname(sys.argv[0]) -DEFAULT_CHANNEL = 'Second Life Release' +DEFAULT_CHANNEL = 'Second Life Test' ARGUMENTS=[ dict(name='actions', @@ -119,9 +119,6 @@ ARGUMENTS=[ dict(name='channel', description="""The channel to use for updates, packaging, settings name, etc.""", default='CHANNEL UNSET'), - dict(name='login_channel', - description="""The channel to use for login handshake/updates only.""", - default=None), dict(name='installer_name', description=""" The name of the file that the installer should be packaged up into. Only used on Linux at the moment.""", diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index dbd6a60a7c..22bc09d2df 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1319,17 +1319,15 @@ if (WINDOWS) # Replace the icons with the appropriate ones for the channel # ('test' is the default) set(ICON_PATH "test") + set(VIEWER_MACOSX_PHASE "d") string(TOLOWER ${VIEWER_CHANNEL} channel_lower) if(channel_lower MATCHES "^second life release") set(ICON_PATH "release") set(VIEWER_MACOSX_PHASE "f") - elseif(channel_lower MATCHES "^second life beta viewer") + elseif(channel_lower MATCHES "^second life beta") set(ICON_PATH "beta") set(VIEWER_MACOSX_PHASE "b") - elseif(channel_lower MATCHES "^second life development") - set(ICON_PATH "development") - set(VIEWER_MACOSX_PHASE "d") - elseif(channel_lower MATCHES "project") + elseif(channel_lower MATCHES "^second life project") set(ICON_PATH "project") set(VIEWER_MACOSX_PHASE "a") endif() @@ -1785,7 +1783,6 @@ if (WINDOWS) --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} --grid=${GRID} - --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat DEPENDS @@ -1912,7 +1909,6 @@ if (LINUX) --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged --grid=${GRID} --installer_name=${product} - --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched DEPENDS @@ -2029,7 +2025,6 @@ if (DARWIN) --grid=${GRID} --channel=${VIEWER_CHANNEL} --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched ${SIGNING_SETTING} diff --git a/indra/newview/icons/development/secondlife.icns b/indra/newview/icons/development/secondlife.icns deleted file mode 100644 index 44f63d384cfdbb99bfb8ced8290f02712d215562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233026 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�enX^{QAl-wGrGTTOR4B=*Zh7u0< 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

E1}X16Q?>yY>O59NMBkGM((KP;B^&e^*| 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

  • 3msG^J_fP|8S?o?DySiLZ+MuFiifYqsc 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 QTCyKA4xHUiiz>$$|r{$M#+!i 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 z�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 z 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 F&)-0@x;Fp- diff --git a/indra/newview/icons/development/secondlife_128.png b/indra/newview/icons/development/secondlife_128.png deleted file mode 100644 index 9b9fe656fc981622898a3e5fde160d1554205745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17499 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 diff --git a/indra/newview/icons/development/secondlife_32.png b/indra/newview/icons/development/secondlife_32.png deleted file mode 100644 index 3b84f5ec77ffedf7a357560a9b7d6b19c341741c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4649 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 diff --git a/indra/newview/icons/development/secondlife_48.png b/indra/newview/icons/development/secondlife_48.png deleted file mode 100644 index d2636d9d72f47319ab66bbb04fdfa513d578d90f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6190 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Π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 Hu0mjfy%Q?O diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 20f64dbf4b..3897db177f 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -160,14 +160,6 @@ class ViewerManifest(LLManifest): if not self.path2basename(os.path.join(os.pardir, os.pardir), "summary.json"): print "No summary.json file" - def login_channel(self): - """Channel reported for login and upgrade purposes ONLY; - used for A/B testing""" - # NOTE: Do not return the normal channel if login_channel - # is not specified, as some code may branch depending on - # whether or not this is present - return self.args.get('login_channel') - def grid(self): return self.args['grid'] def channel(self): @@ -179,16 +171,23 @@ class ViewerManifest(LLManifest): def channel_lowerword(self): return self.channel_oneword().lower() + def app_name(self): + app_suffix='Test' + channel_type=self.channel_lowerword() + if channel_type == 'release' : + app_suffix='Viewer' + elif re.match('(beta|project) .*',channel_type) : + app_suffix=self.channel_unique() + return "Second Life "+app_suffix + def icon_path(self): icon_path="icons/" channel_type=self.channel_lowerword() - if channel_type == 'release' \ - or channel_type == 'development' \ - : + if channel_type == 'release' : icon_path += channel_type - elif channel_type == 'betaviewer' : + elif re.match('beta .*',channel_type) : icon_path += 'beta' - elif re.match('project.*',channel_type) : + elif re.match('project .*',channel_type) : icon_path += 'project' else : icon_path += 'test' @@ -205,14 +204,6 @@ class ViewerManifest(LLManifest): "--helperuri http://preview-%(grid)s.secondlife.com/helpers/" %\ {'grid':self.grid()} - # set command line flags for channel - channel_flags = '' - if self.login_channel() and self.login_channel() != self.channel(): - # Report a special channel during login, but use default - channel_flags = '--channel "%s"' % (self.login_channel()) - elif not self.default_channel(): - channel_flags = '--channel "%s"' % self.channel() - # Deal with settings setting_flags = '' if not self.default_channel() or not self.default_grid(): @@ -223,7 +214,7 @@ class ViewerManifest(LLManifest): setting_flags = '--settings settings_%s_%s.xml'\ % (self.grid(), self.channel_lowerword()) - return " ".join((channel_flags, grid_flags, setting_flags)).strip() + return " ".join((grid_flags, setting_flags)).strip() def extract_names(self,src): try: @@ -883,10 +874,7 @@ class DarwinManifest(ViewerManifest): # Copy everything in to the mounted .dmg - if self.default_channel() and not self.default_grid(): - app_name = "Second Life " + self.args['grid'] - else: - app_name = channel_standin.strip() + app_name = self.app_name() # Hack: # Because there is no easy way to coerce the Finder into positioning From 6e2e008280c24b9e62a6b0517ee85183fad7807a Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 11:39:46 -0500 Subject: [PATCH 07/82] increment viewer version --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 6cb9d3dd0d..d5c0c99142 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.4.3 +3.5.1 From 72b4a1962f9f036d2bd8e0094e999d6750a18eae Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 12:42:14 -0500 Subject: [PATCH 08/82] correct dependencies for forcing version number recompilations --- indra/newview/CMakeLists.txt | 14 +++++++------- indra/viewer_components/updater/CMakeLists.txt | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 22bc09d2df..627842297e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1227,13 +1227,6 @@ set(viewer_HEADER_FILES source_group("CMake Rules" FILES ViewerInstall.cmake) -set_source_files_properties( - llversioninfo.cpp tests/llversioninfo_test.cpp - PROPERTIES - OBJECT_DEPENDS always_generate_version - COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake - ) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt @@ -1242,6 +1235,13 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt add_custom_target(generate_viewer_version DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt") add_dependencies(generate_viewer_version "${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt") +set_source_files_properties( + llversioninfo.cpp tests/llversioninfo_test.cpp + PROPERTIES + OBJECT_DEPENDS generate_viewer_version + COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake + ) + if (DARWIN) LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) diff --git a/indra/viewer_components/updater/CMakeLists.txt b/indra/viewer_components/updater/CMakeLists.txt index 5d84f79dbd..7ab3711fde 100644 --- a/indra/viewer_components/updater/CMakeLists.txt +++ b/indra/viewer_components/updater/CMakeLists.txt @@ -38,6 +38,7 @@ set(updater_service_HEADER_FILES set_source_files_properties(${updater_service_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) +add_custom_target(always_generate_version) # force recompilation with version values set_source_files_properties( llupdaterservice.cpp PROPERTIES From 8c7bc4d8636fafafab573051662987af8d05eb4d Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 13:16:47 -0500 Subject: [PATCH 09/82] remove setting login channel from build script --- build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/build.sh b/build.sh index e96aec58ec..638ec33281 100755 --- a/build.sh +++ b/build.sh @@ -71,7 +71,6 @@ pre_build() -DPACKAGE:BOOL=ON \ -DRELEASE_CRASH_REPORTING:BOOL=ON \ -DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \ - -DVIEWER_LOGIN_CHANNEL:STRING="\"$viewer_login_channel\"" \ -DGRID:STRING="\"$viewer_grid\"" \ -DLL_TESTS:BOOL="$run_tests" \ -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url From c8a588836aedd1d28556b3661c4b41c41d58c858 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 16:33:24 -0500 Subject: [PATCH 10/82] remove regeneration control where not needed in updater service --- indra/viewer_components/updater/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/viewer_components/updater/CMakeLists.txt b/indra/viewer_components/updater/CMakeLists.txt index 7ab3711fde..4343f39e76 100644 --- a/indra/viewer_components/updater/CMakeLists.txt +++ b/indra/viewer_components/updater/CMakeLists.txt @@ -38,11 +38,9 @@ set(updater_service_HEADER_FILES set_source_files_properties(${updater_service_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) -add_custom_target(always_generate_version) # force recompilation with version values set_source_files_properties( llupdaterservice.cpp PROPERTIES - OBJECT_DEPENDS always_generate_version COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake ) From 44ad4f0ba10a998d0d210c7f4426c7b9a73c24ad Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 16:38:59 -0500 Subject: [PATCH 11/82] set default viewer channel only in the cmake file --- indra/newview/llversioninfo.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index a15b280fc0..35d0052bfa 100644 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -29,16 +29,14 @@ #include #include "llversioninfo.h" -#if ! defined(LL_VIEWER_VERSION_MAJOR) \ +#if ! defined(LL_VIEWER_CHANNEL) \ + || ! defined(LL_VIEWER_VERSION_MAJOR) \ || ! defined(LL_VIEWER_VERSION_MINOR) \ || ! defined(LL_VIEWER_VERSION_PATCH) \ || ! defined(LL_VIEWER_VERSION_BUILD) - #error "Version information is undefined" + #error "Channel or Version information is undefined" #endif -#ifndef LL_VIEWER_CHANNEL -#define LL_VIEWER_CHANNEL "Second Life Test" -#endif const char * const LL_CHANNEL = LL_VIEWER_CHANNEL; // From 57f3b0719a452580e78b6583715952a620056a33 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 12 Feb 2013 18:48:02 -0500 Subject: [PATCH 12/82] rearrange depends --- indra/newview/CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 627842297e..5d0d8c617a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1230,15 +1230,14 @@ source_group("CMake Rules" FILES ViewerInstall.cmake) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - COMMENT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Generating viewer_version.txt + COMMENT Generating viewer_version.txt for manifest processing ) -add_custom_target(generate_viewer_version DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt") -add_dependencies(generate_viewer_version "${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt") +add_custom_target(generate_viewer_version ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt) set_source_files_properties( llversioninfo.cpp tests/llversioninfo_test.cpp PROPERTIES - OBJECT_DEPENDS generate_viewer_version + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt # dummy dependency to force recompile every time COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake ) From f96e9d67b4eea56b485eb8a6fbf6c70a3f622c8d Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 13 Feb 2013 09:41:17 -0500 Subject: [PATCH 13/82] put precompiled headers back in llversioninfo.cpp --- indra/newview/llversioninfo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index 35d0052bfa..6a8fad0134 100644 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -25,6 +25,7 @@ * $/LicenseInfo$ */ +#include "llviewerprecompiledheaders.h" #include #include #include "llversioninfo.h" From 8556e63796867f1e58a77aeef1c34a6f03ee8962 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 13 Feb 2013 10:51:21 -0500 Subject: [PATCH 14/82] correct include path for generated viewerRes.rc --- indra/newview/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5d0d8c617a..e77d888466 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1398,13 +1398,17 @@ if (WINDOWS) PROPERTIES HEADER_FILE_ONLY TRUE) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/res/viewerRes.rc - ${CMAKE_CURRENT_BINARY_DIR}/res/viewerRes.rc + ${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc ) set(viewer_RESOURCE_FILES - ${CMAKE_CURRENT_BINARY_DIR}/res/viewerRes.rc + ${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc ${viewer_RESOURCE_FILES} ) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc + PROPERTIES COMPILE_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/res" + ) + SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) if (NOT STANDALONE) From f7160b28e24994b8dcf4c228f49685396184bc75 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 13 Feb 2013 12:18:12 -0500 Subject: [PATCH 15/82] correct revision number variable name in viewerRes.rc --- indra/newview/res/viewerRes.rc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 5360842134..8587243791 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -135,8 +135,8 @@ TOOLNO CURSOR "llno.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_BUILD} - PRODUCTVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_BUILD} + FILEVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_REVISION} + PRODUCTVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_REVISION} FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -153,12 +153,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_BUILD}" + VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright � 2001, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_BUILD}" + VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" END END BLOCK "VarFileInfo" From e679b1cdfc288004dcbc59a47a606728b5ad6ff4 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 13 Feb 2013 12:29:28 -0500 Subject: [PATCH 16/82] fix unused return from fwrite --- indra/newview/llviewerstatsrecorder.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 91e485d01b..321684bf3f 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -187,6 +187,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << mObjectUpdateFailures << " update failures" << llendl; + U32 data_size; if (mObjectCacheFile == NULL) { mStartTime = LLTimer::getTotalSeconds(); @@ -216,7 +217,11 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "Texture Fetch bps\t" << "\n"; - fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); + data_size = data_msg.str().size(); + if (fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ) != data_size) + { + llwarns << "failed to write full headers to " << STATS_FILE_NAME << llendl; + } } else { @@ -249,7 +254,12 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "\t" << (mTextureFetchSize * 8 / delta_time) << "\n"; - fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); + data_size = data_msg.str().size(); + if (fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ) + { + llwarns << "failed to write full stats to " << STATS_FILE_NAME << llendl; + } + clearStats(); } From 20e64fc6db5de1e025ebd443b54350331b4f14cf Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 13 Feb 2013 13:08:03 -0500 Subject: [PATCH 17/82] fix fat-finger fix --- indra/newview/llviewerstatsrecorder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 321684bf3f..f9a725547f 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -255,7 +255,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "\n"; data_size = data_msg.str().size(); - if (fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ) + if (fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ) != data_size) { llwarns << "failed to write full stats to " << STATS_FILE_NAME << llendl; } From 365891e0fa480eebdadca4172ae30761bca8a432 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 14 Feb 2013 18:07:23 -0500 Subject: [PATCH 18/82] correct windows executable name --- indra/newview/viewer_manifest.py | 44 +++++--------------------------- 1 file changed, 7 insertions(+), 37 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3897db177f..a975a2b32f 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -241,13 +241,13 @@ class ViewerManifest(LLManifest): class WindowsManifest(ViewerManifest): def final_exe(self): - if self.default_channel(): - if self.default_grid(): - return "SecondLife.exe" - else: - return "SecondLifePreview.exe" - else: - return ''.join(self.channel().split()) + '.exe' + app_suffix="Test" + channel_type=self.channel_lowerword() + if channel_type == 'release' : + app_suffix='' + elif re.match('(beta|project) .*',channel_type) : + app_suffix=''.join(self.channel_unique().split()) + return "SecondLife"+app_suffix+".exe" def test_msvcrt_and_copy_action(self, src, dst): # This is used to test a dll manifest. @@ -295,26 +295,9 @@ class WindowsManifest(ViewerManifest): else: print "Doesn't exist:", src - ### DISABLED MANIFEST CHECKING for vs2010. we may need to reenable this - # shortly. If this hasn't been reenabled by the 2.9 viewer release then it - # should be deleted -brad - #def enable_crt_manifest_check(self): - # if self.is_packaging_viewer(): - # WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action - - #def enable_no_crt_manifest_check(self): - # if self.is_packaging_viewer(): - # WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action - - #def disable_manifest_check(self): - # if self.is_packaging_viewer(): - # del WindowsManifest.copy_action - def construct(self): super(WindowsManifest, self).construct() - #self.enable_crt_manifest_check() - if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) @@ -324,15 +307,11 @@ class WindowsManifest(ViewerManifest): 'llplugin', 'slplugin', self.args['configuration']), "slplugin.exe") - #self.disable_manifest_check() - self.path2basename("../viewer_components/updater/scripts/windows", "update_install.bat") # Get shared libs from the shared libs staging directory if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), dst=""): - #self.enable_crt_manifest_check() - # Get llcommon and deps. If missing assume static linkage and continue. try: self.path('llcommon.dll') @@ -344,8 +323,6 @@ class WindowsManifest(ViewerManifest): print err.message print "Skipping llcommon.dll (assuming llcommon was linked statically)" - #self.disable_manifest_check() - # Mesh 3rd party libs needed for auto LOD and collada reading try: if self.args['configuration'].lower() == 'debug': @@ -409,8 +386,6 @@ class WindowsManifest(ViewerManifest): self.path("featuretable.txt") self.path("featuretable_xp.txt") - #self.enable_no_crt_manifest_check() - # Media plugins - QuickTime if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"): self.path("media_plugin_quicktime.dll") @@ -490,15 +465,10 @@ class WindowsManifest(ViewerManifest): self.end_prefix() - #self.disable_manifest_check() - # pull in the crash logger and updater from other projects # tag:"crash-logger" here as a cue to the exporter self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], dst="win_crash_logger.exe") -# For CHOP-397, windows updater no longer used. -# self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'], -# dst="updater.exe") if not self.is_packaging_viewer(): self.package_file = "copied_deps" From 237a48721d9df6a8bbf8a3255bb80f348eb2322e Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 15 Feb 2013 09:29:09 -0500 Subject: [PATCH 19/82] clarify windows installer name --- indra/lib/python/indra/util/llmanifest.py | 4 ++-- indra/newview/viewer_manifest.py | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 25a1b95b9a..9cb830a2db 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -85,7 +85,7 @@ def get_default_platform(dummy): }[sys.platform] DEFAULT_SRCTREE = os.path.dirname(sys.argv[0]) -DEFAULT_CHANNEL = 'Second Life Test' +RELEASE_CHANNEL = 'Second Life Release' ARGUMENTS=[ dict(name='actions', @@ -269,7 +269,7 @@ class LLManifest(object): def default_grid(self): return self.args.get('grid', None) == '' def default_channel(self): - return self.args.get('channel', None) == DEFAULT_CHANNEL + return self.args.get('channel', None) == RELEASE_CHANNEL def construct(self): """ Meant to be overriden by LLManifest implementors with code that diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index a975a2b32f..ec5aca533f 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -539,6 +539,7 @@ class WindowsManifest(ViewerManifest): !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" """ % substitution_strings + subchannel_underscores = '_'.join(self.channel_unique().split()) if self.default_channel(): if self.default_grid(): # release viewer @@ -552,7 +553,7 @@ class WindowsManifest(ViewerManifest): Caption "Second Life" """ else: - # beta grid viewer + # alternate grid viewer installer_file = "Second_Life_%(version_dashes)s_(%(grid_caps)s)_Setup.exe" grid_vars_template = """ OutFile "%(installer_file)s" @@ -564,8 +565,8 @@ class WindowsManifest(ViewerManifest): Caption "Second Life %(grid)s ${VERSION}" """ else: - # some other channel on some grid - installer_file = "Second_Life_%(version_dashes)s_%(channel_oneword)s_Setup.exe" + # some other channel (grid name not used) + installer_file = "Second_Life_%(version_dashes)s_%(subchannel_underscores)s_Setup.exe" grid_vars_template = """ OutFile "%(installer_file)s" !define INSTFLAGS "%(flags)s" From 4925c27b0dada2b1939fa8473d6039938cfa15ba Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 15 Feb 2013 10:12:50 -0500 Subject: [PATCH 20/82] correct subchannel definition --- indra/newview/viewer_manifest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ec5aca533f..63db76ff90 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -531,6 +531,7 @@ class WindowsManifest(ViewerManifest): 'channel':self.channel(), 'channel_oneword':self.channel_oneword(), 'channel_unique':self.channel_unique(), + 'subchannel_underscores':'_'.join(self.channel_unique().split()) } version_vars = """ @@ -539,7 +540,6 @@ class WindowsManifest(ViewerManifest): !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" """ % substitution_strings - subchannel_underscores = '_'.join(self.channel_unique().split()) if self.default_channel(): if self.default_grid(): # release viewer From 510c476468132190578e65fe03bfb7f282fe6a60 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 20 Feb 2013 15:52:37 -0500 Subject: [PATCH 21/82] clarify how to set viewer_channel for different build types --- BuildParams | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/BuildParams b/BuildParams index 547a591310..7c77f6c186 100644 --- a/BuildParams +++ b/BuildParams @@ -21,6 +21,25 @@ email_status_this_is_os = true # Limit extent of codeticket updates to revisions after... codeticket_since = 3.3.0-release +################################################################ +#### Examples of how to set the viewer_channel #### +# +# To build a Release or Release candidate in build bingo: +# bingo.viewer_channel = "Second Life Release" +# +# To build a Beta for the 'Bingo' project in build bingo: +# bingo.viewer_channel = "Second Life Beta Bingo" +# +# To build a Project viewer for the 'Bingo' project in build bingo: +# bingo.viewer_channel = "Second Life Project Bingo" +# +# If left unset, viewer_channel defaults to 'Second Life Test', +# which is appropriate for individual developer builds. +# +# All Linden Lab builds (and only Linden Lab builds) +# should use a viewer_channel that begins with "Second Life" +################################################################ + # Report changes since... viewer-development.show_changes_since = last_sprint @@ -30,11 +49,6 @@ viewer-development.build_debug_release_separately = true # Notifications - to configure email notices, add a setting like this: # _.email = -# Example of how to build a Project Beta for the Bingo Project -#bingo-beta.viewer_channel = "Second Life Beta Bingo" -# Example of how to build a Project Integration build for the Bingo Project -#bingo-beta.viewer_channel = "Second Life Project Bingo" - viewer-release.viewer_channel = "Second Life Release" viewer-release.build_debug_release_separately = true viewer-release.build_viewer_update_version_manager = true From b0125b513c34e21f17fd8e99d5f76f48edaf5040 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 20 Feb 2013 15:53:17 -0500 Subject: [PATCH 22/82] add viewer channel to compile time feedback --- indra/cmake/BuildVersion.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index 7ee852bf72..c494355746 100644 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -33,7 +33,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n message("Revision not set, 'hg' not found (${MERCURIAL}), using ${VIEWER_VERSION_REVISION}") endif (DEFINED MERCURIAL) endif (DEFINED ENV{revision}) - message("Building Version ${VIEWER_SHORT_VERSION} ${VIEWER_VERSION_REVISION}") + message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") else ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'") endif ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) From 3b8092e31fa13512c9038bba05a129219cb02ea9 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 21 Feb 2013 13:19:39 -0500 Subject: [PATCH 23/82] add OS version string --- indra/llcommon/llsys.cpp | 109 ++++++++++++++++++++++++++++++++++++++- indra/llcommon/llsys.h | 3 ++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index c96f2191f3..d864821350 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -80,6 +80,7 @@ using namespace llsd; # include # include const char MEMINFO_FILE[] = "/proc/meminfo"; +# include #elif LL_SOLARIS # include # include @@ -176,7 +177,7 @@ bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number) #endif // LL_WINDOWS LLOSInfo::LLOSInfo() : - mMajorVer(0), mMinorVer(0), mBuild(0) + mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("") { #if LL_WINDOWS @@ -412,6 +413,102 @@ LLOSInfo::LLOSInfo() : mOSString = mOSStringSimple; } +#elif LL_LINUX + + struct utsname un; + if(uname(&un) != -1) + { + mOSStringSimple.append(un.sysname); + mOSStringSimple.append(" "); + mOSStringSimple.append(un.release); + + mOSString = mOSStringSimple; + mOSString.append(" "); + mOSString.append(un.version); + mOSString.append(" "); + mOSString.append(un.machine); + + // Simplify 'Simple' + std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0)); + if (ostype == "Linux") + { + // Only care about major and minor Linux versions, truncate at second '.' + std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0); + std::string::size_type idx2 = (idx1 != std::string::npos) ? mOSStringSimple.find_first_of(".", idx1+1) : std::string::npos; + std::string simple = mOSStringSimple.substr(0, idx2); + if (simple.length() > 0) + mOSStringSimple = simple; + } + } + else + { + mOSStringSimple.append("Unable to collect OS info"); + mOSString = mOSStringSimple; + } + + const char* OS_VERSION_MATCH_EXPRESSION[] = "([0-9]+)\.([0-9]+)(\.([0-9]+))?"; + boost::regex os_version_parse(OS_VERSION_MATCH_EXPRESSION); + boost::smatch matched; + + std::string glibc_version(gnu_get_libc_version()); + if ( regex_match_no_exc(glibc_version, matched, os_version_parse) ) + { + LL_INFOS("AppInit") << "Using glibc version '" << glibc_version << "' as OS version" << LL_ENDL; + + std::string version_value; + + if ( matched[1].matched ) // Major version + { + version_value.assign(matched[1].first, matched[1].second); + if (sscanf("%d", &mMajorVer) != 1) + { + LL_WARNS("AppInit") << "failed to parse major version '" << version_value "' as a number" << LL_ENDL; + } + } + else + { + LL_ERRS("AppInit") + << "OS version regex '" << OS_VERSION_MATCH_EXPRESSION + << "' returned true, but major version [1] did not match" + << LL_ENDL; + } + + if ( matched[2].matched ) // Minor version + { + version_value.assign(matched[2].first, matched[2].second); + if (sscanf("%d", &mMinorVer) != 1) + { + LL_ERRS("AppInit") << "failed to parse minor version '" << version_value "' as a number" << LL_ENDL; + } + } + else + { + LL_ERRS("AppInit") + << "OS version regex '" << OS_VERSION_MATCH_EXPRESSION + << "' returned true, but minor version [1] did not match" + << LL_ENDL; + } + + if ( matched[4].matched ) // Build version (optional) - note that [3] includes the '.' + { + version_value.assign(matched[4].first, matched[4].second); + if (sscanf("%d", &mBuild) != 1) + { + LL_ERRS("AppInit") << "failed to parse build version '" << version_value "' as a number" << LL_ENDL; + } + } + else + { + LL_INFOS("AppInit") + << "OS build version not provided; using zero" + << LL_ENDL; + } + } + else + { + LL_WARNS("AppInit") << "glibc version '" << glibc_version << "' cannot be parsed to three numbers; using all zeros" << LL_ENDL; + } + #else struct utsname un; @@ -444,8 +541,13 @@ LLOSInfo::LLOSInfo() : mOSStringSimple.append("Unable to collect OS info"); mOSString = mOSStringSimple; } + #endif + std::stringstream dotted_version_string; + dotted_version_string << mMajorVer << "." << mMinorVer << "." << mBuild; + mOSVersionString.append(dotted_version_string.str()); + } #ifndef LL_WINDOWS @@ -496,6 +598,11 @@ const std::string& LLOSInfo::getOSStringSimple() const return mOSStringSimple; } +const std::string& LLOSInfo::getOSVersionString() const +{ + return mOSVersionString; +} + const S32 STATUS_SIZE = 8192; //static diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 739e795d3a..cfed0fff17 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -49,6 +49,8 @@ public: const std::string& getOSString() const; const std::string& getOSStringSimple() const; + const std::string& getOSVersionString() const; + S32 mMajorVer; S32 mMinorVer; S32 mBuild; @@ -62,6 +64,7 @@ public: private: std::string mOSString; std::string mOSStringSimple; + std::string mOSVersionString; }; From cf40fc0447606fd3b435a32c5dec7b48565cae4c Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 21 Feb 2013 13:22:25 -0500 Subject: [PATCH 24/82] add menu bar background colors for new build/channel scheme --- indra/newview/llviewerwindow.cpp | 47 ++++++++++++++++---------- indra/newview/skins/default/colors.xml | 13 ++++++- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 48a69129eb..8c72421888 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2235,29 +2235,42 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid) // no l10n problem because channel is always an english string std::string channel = LLVersionInfo::getChannel(); - bool isProject = (channel.find("Project") != std::string::npos); + bool isProject = (channel.find("Project") != std::string::npos); // TBD - should be a regex + bool isBeta = (channel.find("Beta") != std::string::npos); // TBD - should be a regex + bool isTest = (channel.find("Test") != std::string::npos); // TBD - should be a regex // god more important than project, proj more important than grid - if(god_mode && LLGridManager::getInstance()->isInProductionGrid()) + if ( god_mode ) { - new_bg_color = LLUIColorTable::instance().getColor( "MenuBarGodBgColor" ); + if ( LLGridManager::getInstance()->isInProductionGrid() ) + { + new_bg_color = LLUIColorTable::instance().getColor( "MenuBarGodBgColor" ); + } + else + { + new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" ); + } } - else if(god_mode && !LLGridManager::getInstance()->isInProductionGrid()) - { - new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" ); - } - else if (!god_mode && isProject) + else if (isBeta) + { + new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBetaBgColor" ); + } + else if (isProject) { new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" ); - } - else if(!god_mode && !LLGridManager::getInstance()->isInProductionGrid()) - { - new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" ); - } - else - { - new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBgColor" ); - } + } + else if (isTest) + { + new_bg_color = LLUIColorTable::instance().getColor( "MenuBarTestBgColor" ); + } + else if(!LLGridManager::getInstance()->isInProductionGrid()) + { + new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" ); + } + else + { + new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBgColor" ); + } if(gMenuBarView) { diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 9bf2922033..02e2ad2ff7 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -98,6 +98,9 @@ + @@ -107,6 +110,9 @@ + @@ -823,10 +829,15 @@ + - + From cf1019859def2af4414def7991e95a9020b0688f Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 21 Feb 2013 16:47:52 -0500 Subject: [PATCH 25/82] add use of v1.1 update request protocol, with fallback to v1.0 --- indra/newview/CMakeLists.txt | 3 + indra/newview/app_settings/settings.xml | 11 ++ indra/newview/llappviewer.cpp | 20 ++- indra/newview/llhasheduniqueid.cpp | 54 ++++++++ indra/newview/llhasheduniqueid.h | 34 +++++ indra/newview/lllogininstance.cpp | 21 ++-- .../xui/en/panel_preferences_setup.xml | 13 ++ indra/newview/tests/lllogininstance_test.cpp | 19 ++- .../viewer_components/updater/CMakeLists.txt | 1 + .../updater/llupdatechecker.cpp | 119 ++++++++++++++---- .../updater/llupdatechecker.h | 49 ++++++-- .../updater/llupdatedownloader.cpp | 26 ++-- .../updater/llupdateinstaller.cpp | 2 +- .../updater/llupdaterservice.cpp | 77 +++++++----- .../updater/llupdaterservice.h | 14 ++- .../updater/tests/llupdaterservice_test.cpp | 18 ++- 16 files changed, 366 insertions(+), 115 deletions(-) create mode 100644 indra/newview/llhasheduniqueid.cpp create mode 100644 indra/newview/llhasheduniqueid.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e77d888466..19470102e3 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -82,6 +82,7 @@ include_directories( ${LIBS_PREBUILD_DIR}/include/hunspell ${OPENAL_LIB_INCLUDE_DIRS} ${LIBS_PREBUILT_DIR}/include/collada/1.4 + ${CMAKE_CURRENT_SOURCE_DIR} ) set(viewer_SOURCE_FILES @@ -278,6 +279,7 @@ set(viewer_SOURCE_FILES llgroupiconctrl.cpp llgrouplist.cpp llgroupmgr.cpp + llhasheduniqueid.cpp llhints.cpp llhomelocationresponder.cpp llhudeffect.cpp @@ -854,6 +856,7 @@ set(viewer_HEADER_FILES llgroupiconctrl.h llgrouplist.h llgroupmgr.h + llhasheduniqueid.h llhints.h llhomelocationresponder.h llhudeffect.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2e91d10cd3..5b73b075a4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12109,6 +12109,17 @@ Value 3 + UpdaterWillingToTest + + Comment + Allow upgrades to release candidate viewers with new features and fixes. + Persist + 1 + Type + Boolean + Value + 1 + UpdaterServiceCheckPeriod Comment diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 468a297c2d..ae593daf08 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2936,16 +2936,28 @@ void LLAppViewer::initUpdater() std::string url = gSavedSettings.getString("UpdaterServiceURL"); std::string channel = LLVersionInfo::getChannel(); std::string version = LLVersionInfo::getVersion(); - std::string protocol_version = gSavedSettings.getString("UpdaterServiceProtocolVersion"); std::string service_path = gSavedSettings.getString("UpdaterServicePath"); U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod"); + bool willing_to_test = gSavedSettings.getBOOL("UpdaterWillingToTest"); + unsigned char unique_id[MD5HEX_STR_SIZE]; + if ( ! llHashedUniqueID(unique_id) ) + { + if ( willing_to_test ) + { + LL_WARNS("UpdaterService") << "Unable to provide a unique id; overriding willing_to_test by sending testno" << LL_ENDL; + } + willing_to_test = false; + } mUpdater->setAppExitCallback(boost::bind(&LLAppViewer::forceQuit, this)); - mUpdater->initialize(protocol_version, - url, + mUpdater->initialize(url, service_path, channel, - version); + version, + getOSInfo().getOSVersionString(), + unique_id, + willing_to_test + ); mUpdater->setCheckPeriod(check_period); mUpdater->setBandwidthLimit((int)gSavedSettings.getF32("UpdaterMaximumBandwidth") * (1024/8)); gSavedSettings.getControl("UpdaterMaximumBandwidth")->getSignal()-> diff --git a/indra/newview/llhasheduniqueid.cpp b/indra/newview/llhasheduniqueid.cpp new file mode 100644 index 0000000000..5db5d22332 --- /dev/null +++ b/indra/newview/llhasheduniqueid.cpp @@ -0,0 +1,54 @@ +/** + * @file llhasheduniqueid.cpp + * @brief retrieves an obfuscated unique id for the system + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llhasheduniqueid.h" +#include "llviewernetwork.h" +#include "lluuid.h" +#include "llmachineid.h" + +bool llHashedUniqueID(unsigned char id[MD5HEX_STR_SIZE]) +{ + bool idIsUnique = true; + LLMD5 hashed_unique_id; + unsigned char unique_id[MAC_ADDRESS_BYTES]; + if ( LLUUID::getNodeID(unique_id) + || LLMachineID::getUniqueID(unique_id, sizeof(unique_id)) + ) + { + hashed_unique_id.update(unique_id, MAC_ADDRESS_BYTES); + hashed_unique_id.finalize(); + hashed_unique_id.hex_digest((char*)id); + } + else + { + idIsUnique = false; + memcpy(id,"00000000000000000000000000000000", MD5HEX_STR_SIZE); + llwarns << "Failed to get an id; cannot uniquely identify this machine." << llendl; + } + return idIsUnique; +} + diff --git a/indra/newview/llhasheduniqueid.h b/indra/newview/llhasheduniqueid.h new file mode 100644 index 0000000000..8ef706c1f3 --- /dev/null +++ b/indra/newview/llhasheduniqueid.h @@ -0,0 +1,34 @@ +/** + * @file llhasheduniqueid.h + * @brief retrieves obfuscated but unique id for the system + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ +#ifndef LL_LLHASHEDUNIQUEID_H +#define LL_LLHASHEDUNIQUEID_H +#include "llmd5.h" + +/// Get an obfuscated identifier for this system +bool llHashedUniqueID(unsigned char id[MD5HEX_STR_SIZE]); +///< @returns true if the id is considered valid (if false, the id is all zeros) + +#endif // LL_LLHASHEDUNIQUEID_H diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 419641d23c..12796ca262 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -30,7 +30,6 @@ // llcommon #include "llevents.h" -#include "llmd5.h" #include "stringize.h" // llmessage (!) @@ -40,6 +39,7 @@ #include "lllogin.h" // newview +#include "llhasheduniqueid.h" #include "llviewernetwork.h" #include "llviewercontrol.h" #include "llversioninfo.h" @@ -202,7 +202,7 @@ MandatoryUpdateMachine::MandatoryUpdateMachine(LLLoginInstance & loginInstance, void MandatoryUpdateMachine::start(void) { - llinfos << "starting manditory update machine" << llendl; + llinfos << "starting mandatory update machine" << llendl; if(mUpdaterService.isChecking()) { switch(mUpdaterService.getState()) { @@ -579,24 +579,17 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia // (re)initialize the request params with creds. LLSD request_params = user_credential->getLoginParams(); - char hashed_unique_id_string[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */ - LLMD5 hashed_unique_id; - unsigned char unique_id[MAC_ADDRESS_BYTES]; - if(LLUUID::getNodeID(unique_id) == 0) { - if(LLMachineID::getUniqueID(unique_id, sizeof(unique_id)) == 0) { - llerrs << "Failed to get an id; cannot uniquely identify this machine." << llendl; - } + unsigned char hashed_unique_id_string[MD5HEX_STR_SIZE]; + if ( ! llHashedUniqueID(hashed_unique_id_string) ) + { + llwarns << "Not providing a unique id in request params" << llendl; } - hashed_unique_id.update(unique_id, MAC_ADDRESS_BYTES); - hashed_unique_id.finalize(); - hashed_unique_id.hex_digest(hashed_unique_id_string); - request_params["start"] = construct_start_string(); request_params["skipoptional"] = mSkipOptionalUpdate; request_params["agree_to_tos"] = false; // Always false here. Set true in request_params["read_critical"] = false; // handleTOSResponse request_params["last_exec_event"] = mLastExecEvent; - request_params["mac"] = hashed_unique_id_string; + request_params["mac"] = (char*)hashed_unique_id_string; request_params["version"] = LLVersionInfo::getChannelAndVersion(); // Includes channel name request_params["channel"] = LLVersionInfo::getChannel(); request_params["id0"] = mSerialNumber; diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 4aeea8823e..2fb6a9fd40 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -232,6 +232,19 @@ name="Install_manual" value="0" /> + checkVersion(protocolVersion, hostUrl, servicePath, channel, version); + mImplementation->checkVersion(hostUrl, servicePath, channel, version, platform_version, uniqueid, willing_to_test); } @@ -74,12 +79,14 @@ void LLUpdateChecker::checkVersion(std::string const & protocolVersion, std::str //----------------------------------------------------------------------------- -const char * LLUpdateChecker::Implementation::sProtocolVersion = "v1.0"; +const char * LLUpdateChecker::Implementation::sLegacyProtocolVersion = "v1.0"; +const char * LLUpdateChecker::Implementation::sProtocolVersion = "v1.1"; LLUpdateChecker::Implementation::Implementation(LLUpdateChecker::Client & client): mClient(client), - mInProgress(false) + mInProgress(false), + mProtocol(sProtocolVersion) { ; // No op. } @@ -91,39 +98,86 @@ LLUpdateChecker::Implementation::~Implementation() } -void LLUpdateChecker::Implementation::checkVersion(std::string const & protocolVersion, std::string const & hostUrl, - std::string const & servicePath, std::string channel, std::string version) +void LLUpdateChecker::Implementation::checkVersion(std::string const & hostUrl, + std::string const & servicePath, + std::string const & channel, + std::string const & version, + std::string const & platform_version, + unsigned char uniqueid[MD5HEX_STR_SIZE], + bool willing_to_test) { llassert(!mInProgress); - if(protocolVersion != sProtocolVersion) throw CheckError("unsupported protocol"); - mInProgress = true; - mVersion = version; - std::string checkUrl = buildUrl(protocolVersion, hostUrl, servicePath, channel, version); - LL_INFOS("UpdateCheck") << "checking for updates at " << checkUrl << llendl; + + mHostUrl = hostUrl; + mServicePath = servicePath; + mChannel = channel; + mVersion = version; + mPlatformVersion = platform_version; + memcpy(mUniqueId, uniqueid, MD5HEX_STR_SIZE); + mWillingToTest = willing_to_test; + + mProtocol = sProtocolVersion; + + std::string checkUrl = buildUrl(hostUrl, servicePath, channel, version, platform_version, uniqueid, willing_to_test); + LL_INFOS("UpdaterService") << "checking for updates at " << checkUrl << LL_ENDL; mHttpClient.get(checkUrl, this); } void LLUpdateChecker::Implementation::completed(U32 status, - const std::string & reason, - const LLSD & content) + const std::string & reason, + const LLSD & content) { mInProgress = false; - if(status != 200) { - LL_WARNS("UpdateCheck") << "html error " << status << " (" << reason << ")" << llendl; - mClient.error(reason); - } else if(!content.asBoolean()) { - LL_INFOS("UpdateCheck") << "up to date" << llendl; + if(status != 200) + { + if (status == 404) + { + if (mProtocol == sProtocolVersion) + { + mProtocol = sLegacyProtocolVersion; + std::string retryUrl = buildUrl(mHostUrl, mServicePath, mChannel, mVersion, mPlatformVersion, mUniqueId, mWillingToTest); + + LL_WARNS("UpdaterService") + << "update response using " << sProtocolVersion + << " was 404... retry at " << retryUrl + << " with legacy protocol" + << LL_ENDL; + + mHttpClient.get(retryUrl, this); + } + else + { + LL_WARNS("UpdaterService") + << "update response using " << sLegacyProtocolVersion + << " was 404; request failed" + << LL_ENDL; + mClient.error(reason); + } + } + else + { + LL_WARNS("UpdaterService") << "response error " << status << " (" << reason << ")" << LL_ENDL; + mClient.error(reason); + } + } + else if(!content.asBoolean()) + { + LL_INFOS("UpdaterService") << "up to date" << LL_ENDL; mClient.upToDate(); - } else if(content["required"].asBoolean()) { - LL_INFOS("UpdateCheck") << "version invalid" << llendl; + } + else if(content["required"].asBoolean()) + { + LL_INFOS("UpdaterService") << "version invalid" << LL_ENDL; LLURI uri(content["url"].asString()); mClient.requiredUpdate(content["version"].asString(), uri, content["hash"].asString()); - } else { - LL_INFOS("UpdateCheck") << "newer version " << content["version"].asString() << " available" << llendl; + } + else + { + LL_INFOS("UpdaterService") << "newer version " << content["version"].asString() << " available" << LL_ENDL; LLURI uri(content["url"].asString()); mClient.optionalUpdate(content["version"].asString(), uri, content["hash"].asString()); } @@ -133,13 +187,18 @@ void LLUpdateChecker::Implementation::completed(U32 status, void LLUpdateChecker::Implementation::error(U32 status, const std::string & reason) { mInProgress = false; - LL_WARNS("UpdateCheck") << "update check failed; " << reason << llendl; + LL_WARNS("UpdaterService") << "update check failed; " << reason << LL_ENDL; mClient.error(reason); } -std::string LLUpdateChecker::Implementation::buildUrl(std::string const & protocolVersion, std::string const & hostUrl, - std::string const & servicePath, std::string channel, std::string version) +std::string LLUpdateChecker::Implementation::buildUrl(std::string const & hostUrl, + std::string const & servicePath, + std::string const & channel, + std::string const & version, + std::string const & platform_version, + unsigned char uniqueid[MD5HEX_STR_SIZE], + bool willing_to_test) { #ifdef LL_WINDOWS static const char * platform = "win"; @@ -162,9 +221,15 @@ std::string LLUpdateChecker::Implementation::buildUrl(std::string const & protoc LLSD path; path.append(servicePath); - path.append(protocolVersion); + path.append(mProtocol); path.append(channel); path.append(version); path.append(platform); + if (mProtocol != sLegacyProtocolVersion) + { + path.append(platform_version); + path.append(willing_to_test ? "testok" : "testno"); + path.append((char*)uniqueid); + } return LLURI::buildHTTP(hostUrl, path).asString(); } diff --git a/indra/viewer_components/updater/llupdatechecker.h b/indra/viewer_components/updater/llupdatechecker.h index 23f62a7c5e..b60f21549e 100644 --- a/indra/viewer_components/updater/llupdatechecker.h +++ b/indra/viewer_components/updater/llupdatechecker.h @@ -29,6 +29,7 @@ #include +#include "llmd5.h" #include "llhttpclient.h" // @@ -37,15 +38,19 @@ class LLUpdateChecker { public: class Client; - class Implementation: - - public LLHTTPClient::Responder + class Implementation: public LLHTTPClient::Responder { public: Implementation(Client & client); ~Implementation(); - void checkVersion(std::string const & protocolVersion, std::string const & hostUrl, - std::string const & servicePath, std::string channel, std::string version); + void checkVersion(std::string const & hostUrl, + std::string const & servicePath, + std::string const & channel, + std::string const & version, + std::string const & platform_version, + unsigned char uniqueid[MD5HEX_STR_SIZE], + bool willing_to_test + ); // Responder: virtual void completed(U32 status, @@ -54,15 +59,28 @@ public: virtual void error(U32 status, const std::string & reason); private: + static const char * sLegacyProtocolVersion; static const char * sProtocolVersion; - + const char* mProtocol; + Client & mClient; LLHTTPClient mHttpClient; - bool mInProgress; - std::string mVersion; - - std::string buildUrl(std::string const & protocolVersion, std::string const & hostUrl, - std::string const & servicePath, std::string channel, std::string version); + bool mInProgress; + std::string mVersion; + std::string mHostUrl; + std::string mServicePath; + std::string mChannel; + std::string mPlatformVersion; + unsigned char mUniqueId[MD5HEX_STR_SIZE]; + bool mWillingToTest; + + std::string buildUrl(std::string const & hostUrl, + std::string const & servicePath, + std::string const & channel, + std::string const & version, + std::string const & platform_version, + unsigned char uniqueid[MD5HEX_STR_SIZE], + bool willing_to_test); LOG_CLASS(LLUpdateChecker::Implementation); }; @@ -74,8 +92,13 @@ public: LLUpdateChecker(Client & client); // Check status of current app on the given host for the channel and version provided. - void checkVersion(std::string const & protocolVersion, std::string const & hostUrl, - std::string const & servicePath, std::string channel, std::string version); + void checkVersion(std::string const & hostUrl, + std::string const & servicePath, + std::string const & channel, + std::string const & version, + std::string const & platform_version, + unsigned char uniqueid[MD5HEX_STR_SIZE], + bool willing_to_test); private: LLPointer mImplementation; diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp index 75e455e3f6..001dd5ed16 100644 --- a/indra/viewer_components/updater/llupdatedownloader.cpp +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -301,7 +301,7 @@ void LLUpdateDownloader::Implementation::setBandwidthLimit(U64 bytesPerSecond) llassert(mCurl != 0); mBandwidthLimit = bytesPerSecond; CURLcode code = curl_easy_setopt(mCurl, CURLOPT_MAX_RECV_SPEED_LARGE, &mBandwidthLimit); - if(code != CURLE_OK) LL_WARNS("UpdateDownload") << + if(code != CURLE_OK) LL_WARNS("UpdaterService") << "unable to change dowload bandwidth" << LL_ENDL; } else { mBandwidthLimit = bytesPerSecond; @@ -322,13 +322,13 @@ size_t LLUpdateDownloader::Implementation::onHeader(void * buffer, size_t size) size_t lastDigitPos = header.find_last_of("0123456789"); std::string contentLength = header.substr(firstDigitPos, lastDigitPos - firstDigitPos + 1); size_t size = boost::lexical_cast(contentLength); - LL_INFOS("UpdateDownload") << "download size is " << size << LL_ENDL; + LL_INFOS("UpdaterService") << "download size is " << size << LL_ENDL; mDownloadData["size"] = LLSD(LLSD::Integer(size)); llofstream odataStream(mDownloadRecordPath); LLSDSerialize::toPrettyXML(mDownloadData, odataStream); } catch (std::exception const & e) { - LL_WARNS("UpdateDownload") << "unable to read content length (" + LL_WARNS("UpdaterService") << "unable to read content length (" << e.what() << ")" << LL_ENDL; } } else { @@ -368,7 +368,7 @@ int LLUpdateDownloader::Implementation::onProgress(double downloadSize, double b event["payload"] = payload; LLEventPumps::instance().obtain("mainlooprepeater").post(event); - LL_INFOS("UpdateDownload") << "progress event " << payload << LL_ENDL; + LL_INFOS("UpdaterService") << "progress event " << payload << LL_ENDL; } else { ; // Keep events to a reasonalbe number. } @@ -384,19 +384,19 @@ void LLUpdateDownloader::Implementation::run(void) if(code == CURLE_OK) { LLFile::remove(mDownloadRecordPath); if(validateDownload()) { - LL_INFOS("UpdateDownload") << "download successful" << LL_ENDL; + LL_INFOS("UpdaterService") << "download successful" << LL_ENDL; mClient.downloadComplete(mDownloadData); } else { - LL_INFOS("UpdateDownload") << "download failed hash check" << LL_ENDL; + LL_INFOS("UpdaterService") << "download failed hash check" << LL_ENDL; std::string filePath = mDownloadData["path"].asString(); if(filePath.size() != 0) LLFile::remove(filePath); mClient.downloadError("failed hash check"); } } else if(mCancelled && (code == CURLE_WRITE_ERROR)) { - LL_INFOS("UpdateDownload") << "download canceled by user" << LL_ENDL; + LL_INFOS("UpdaterService") << "download canceled by user" << LL_ENDL; // Do not call back client. } else { - LL_WARNS("UpdateDownload") << "download failed with error '" << + LL_WARNS("UpdaterService") << "download failed with error '" << curl_easy_strerror(code) << "'" << LL_ENDL; LLFile::remove(mDownloadRecordPath); if(mDownloadData.has("path")) LLFile::remove(mDownloadData["path"].asString()); @@ -446,7 +446,7 @@ void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & u void LLUpdateDownloader::Implementation::resumeDownloading(size_t startByte) { - LL_INFOS("UpdateDownload") << "resuming download from " << mDownloadData["url"].asString() + LL_INFOS("UpdaterService") << "resuming download from " << mDownloadData["url"].asString() << " at byte " << startByte << LL_ENDL; initializeCurlGet(mDownloadData["url"].asString(), false); @@ -476,9 +476,9 @@ void LLUpdateDownloader::Implementation::startDownloading(LLURI const & uri, std std::string filePath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, fileName); mDownloadData["path"] = filePath; - LL_INFOS("UpdateDownload") << "downloading " << filePath + LL_INFOS("UpdaterService") << "downloading " << filePath << " from " << uri.asString() << LL_ENDL; - LL_INFOS("UpdateDownload") << "hash of file is " << hash << LL_ENDL; + LL_INFOS("UpdaterService") << "hash of file is " << hash << LL_ENDL; llofstream dataStream(mDownloadRecordPath); LLSDSerialize::toPrettyXML(mDownloadData, dataStream); @@ -512,11 +512,11 @@ bool LLUpdateDownloader::Implementation::validateDownload(void) std::string hash = mDownloadData["hash"].asString(); if(hash.size() != 0) { - LL_INFOS("UpdateDownload") << "checking hash..." << LL_ENDL; + LL_INFOS("UpdaterService") << "checking hash..." << LL_ENDL; char digest[33]; LLMD5(fileStream).hex_digest(digest); if(hash != digest) { - LL_WARNS("UpdateDownload") << "download hash mismatch; expeted " << hash << + LL_WARNS("UpdaterService") << "download hash mismatch; expeted " << hash << " but download is " << digest << LL_ENDL; } return hash == digest; diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp index 2f87d59373..a0e2c0b362 100644 --- a/indra/viewer_components/updater/llupdateinstaller.cpp +++ b/indra/viewer_components/updater/llupdateinstaller.cpp @@ -75,7 +75,7 @@ int ll_install_update(std::string const & script, llassert(!"unpossible copy mode"); } - llinfos << "UpdateInstaller: installing " << updatePath << " using " << + LL_INFOS("Updater") << "UpdateInstaller: installing " << updatePath << " using " << actualScriptPath << LL_ENDL; LLProcess::Params params; diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index d783360f80..c6c89655d3 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -88,11 +88,14 @@ class LLUpdaterServiceImpl : { static const std::string sListenerName; - std::string mProtocolVersion; - std::string mUrl; - std::string mPath; - std::string mChannel; - std::string mVersion; + std::string mProtocolVersion; + std::string mUrl; + std::string mPath; + std::string mChannel; + std::string mVersion; + std::string mPlatformVersion; + unsigned char mUniqueId[MD5HEX_STR_SIZE]; + bool mWillingToTest; unsigned int mCheckPeriod; bool mIsChecking; @@ -112,11 +115,14 @@ public: LLUpdaterServiceImpl(); virtual ~LLUpdaterServiceImpl(); - void initialize(const std::string& protocol_version, - const std::string& url, - const std::string& path, - const std::string& channel, - const std::string& version); + void initialize(const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version, + const std::string& platform_version, + const unsigned char uniqueid[MD5HEX_STR_SIZE], + const bool& willing_to_test + ); void setCheckPeriod(unsigned int seconds); void setBandwidthLimit(U64 bytesPerSecond); @@ -174,11 +180,13 @@ LLUpdaterServiceImpl::~LLUpdaterServiceImpl() LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName); } -void LLUpdaterServiceImpl::initialize(const std::string& protocol_version, - const std::string& url, - const std::string& path, - const std::string& channel, - const std::string& version) +void LLUpdaterServiceImpl::initialize(const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version, + const std::string & platform_version, + const unsigned char uniqueid[MD5HEX_STR_SIZE], + const bool& willing_to_test) { if(mIsChecking || mIsDownloading) { @@ -186,11 +194,21 @@ void LLUpdaterServiceImpl::initialize(const std::string& protocol_version, "while updater is running."); } - mProtocolVersion = protocol_version; mUrl = url; mPath = path; mChannel = channel; mVersion = version; + mPlatformVersion = platform_version; + memcpy(mUniqueId, uniqueid, MD5HEX_STR_SIZE); + mWillingToTest = willing_to_test; + LL_DEBUGS("UpdaterService") + << "\n url: " << mUrl + << "\n path: " << mPath + << "\n channel: " << mChannel + << "\n version: " << mVersion + << "\n uniqueid: " << mUniqueId + << "\n willing: " << ( mWillingToTest ? "testok" : "testno" ) + << LL_ENDL; } void LLUpdaterServiceImpl::setCheckPeriod(unsigned int seconds) @@ -289,7 +307,7 @@ bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller) // the update. Do not install this update. if(!path.asString().empty()) { - llinfos << "ignoring update dowloaded by different client version" << llendl; + LL_INFOS("UpdaterService") << "ignoring update dowloaded by different client version" << LL_ENDL;; LLFile::remove(path.asString()); LLFile::remove(update_marker_path()); } @@ -317,7 +335,7 @@ bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller) { mAppExitCallback(); } else if(result != 0) { - llwarns << "failed to run update install script" << LL_ENDL; + LL_WARNS("UpdaterService") << "failed to run update install script" << LL_ENDL; } else { ; // No op. } @@ -352,7 +370,7 @@ bool LLUpdaterServiceImpl::checkForResume() else { // The viewer that started this download is not the same as this viewer; ignore. - llinfos << "ignoring partial download from different viewer version" << llendl; + LL_INFOS("UpdaterService") << "ignoring partial download from different viewer version" << LL_ENDL;; std::string path = download_info["path"].asString(); if(!path.empty()) LLFile::remove(path); LLFile::remove(download_marker_path); @@ -501,8 +519,8 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) if(stream.fail()) requiredValue = 0; } // TODO: notify the user. - llinfos << "found marker " << ll_install_failed_marker_path() << llendl; - llinfos << "last install attempt failed" << llendl; + LL_INFOS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL;; + LL_INFOS("UpdaterService") << "last install attempt failed" << LL_ENDL;; LLFile::remove(ll_install_failed_marker_path()); LLSD event; @@ -514,7 +532,7 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) } else { - mUpdateChecker.checkVersion(mProtocolVersion, mUrl, mPath, mChannel, mVersion); + mUpdateChecker.checkVersion(mUrl, mPath, mChannel, mVersion, mPlatformVersion, mUniqueId, mWillingToTest); setState(LLUpdaterService::CHECKING_FOR_UPDATE); } } @@ -559,13 +577,16 @@ LLUpdaterService::~LLUpdaterService() { } -void LLUpdaterService::initialize(const std::string& protocol_version, - const std::string& url, - const std::string& path, - const std::string& channel, - const std::string& version) +void LLUpdaterService::initialize(const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version, + const std::string& platform_version, + const unsigned char uniqueid[MD5HEX_STR_SIZE], + const bool& willing_to_test +) { - mImpl->initialize(protocol_version, url, path, channel, version); + mImpl->initialize(url, path, channel, version, platform_version, uniqueid, willing_to_test); } void LLUpdaterService::setCheckPeriod(unsigned int seconds) diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h index 450f19c1c6..48d3590f1b 100644 --- a/indra/viewer_components/updater/llupdaterservice.h +++ b/indra/viewer_components/updater/llupdaterservice.h @@ -28,6 +28,7 @@ #include #include +#include "llhasheduniqueid.h" class LLUpdaterServiceImpl; @@ -70,11 +71,14 @@ public: LLUpdaterService(); ~LLUpdaterService(); - void initialize(const std::string& protocol_version, - const std::string& url, - const std::string& path, - const std::string& channel, - const std::string& version); + void initialize(const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version, + const std::string& platform_version, + const unsigned char uniqueid[MD5HEX_STR_SIZE], + const bool& willing_to_test + ); void setCheckPeriod(unsigned int seconds); void setBandwidthLimit(U64 bytesPerSecond); diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index a49bc4161e..ddaaccc051 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -44,8 +44,13 @@ *****************************************************************************/ LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client) {} -void LLUpdateChecker::checkVersion(std::string const & protocolVersion, std::string const & hostUrl, - std::string const & servicePath, std::string channel, std::string version) +void LLUpdateChecker::checkVersion(std::string const & hostUrl, + std::string const & servicePath, + std::string const & channel, + std::string const & version, + std::string const & platform_version, + unsigned char uniqueid[MD5HEX_STR_SIZE], + bool willing_to_test) {} LLUpdateDownloader::LLUpdateDownloader(Client & ) {} void LLUpdateDownloader::download(LLURI const & , std::string const &, std::string const &, bool){} @@ -171,9 +176,11 @@ namespace tut bool got_usage_error = false; try { - updater.initialize("1.0",test_url, "update" ,test_channel, test_version); + unsigned char id1[MD5HEX_STR_SIZE] = "11111111111111111111111111111111"; + updater.initialize(test_url, "update" ,test_channel, test_version, "1.2.3", id1, true); updater.startChecking(); - updater.initialize("1.0", "other_url", "update", test_channel, test_version); + unsigned char id2[MD5HEX_STR_SIZE] = "22222222222222222222222222222222"; + updater.initialize("other_url", "update", test_channel, test_version, "4.5.6", id2, true); } catch(LLUpdaterService::UsageError) { @@ -187,7 +194,8 @@ namespace tut { DEBUG; LLUpdaterService updater; - updater.initialize("1.0", test_url, "update", test_channel, test_version); + unsigned char id[MD5HEX_STR_SIZE] = "33333333333333333333333333333333"; + updater.initialize(test_url, "update", test_channel, test_version, "7.8.9", id, true); updater.startChecking(); ensure(updater.isChecking()); updater.stopChecking(); From b3338955ba83f75511d7846ac3e0bd1a945705f4 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 22 Feb 2013 19:57:02 +0000 Subject: [PATCH 26/82] linux version number fixes --- indra/llcommon/llsys.cpp | 79 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index d864821350..57a6de9060 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -176,6 +176,39 @@ bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number) } #endif // LL_WINDOWS +// Wrap boost::regex_match() with a function that doesn't throw. +template +static bool regex_match_no_exc(const S& string, M& match, const R& regex) +{ + try + { + return boost::regex_match(string, match, regex); + } + catch (const std::runtime_error& e) + { + LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': " + << e.what() << ":\n'" << string << "'" << LL_ENDL; + return false; + } +} + +// Wrap boost::regex_search() with a function that doesn't throw. +template +static bool regex_search_no_exc(const S& string, M& match, const R& regex) +{ + try + { + return boost::regex_search(string, match, regex); + } + catch (const std::runtime_error& e) + { + LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': " + << e.what() << ":\n'" << string << "'" << LL_ENDL; + return false; + } +} + + LLOSInfo::LLOSInfo() : mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("") { @@ -446,7 +479,7 @@ LLOSInfo::LLOSInfo() : mOSString = mOSStringSimple; } - const char* OS_VERSION_MATCH_EXPRESSION[] = "([0-9]+)\.([0-9]+)(\.([0-9]+))?"; + const char OS_VERSION_MATCH_EXPRESSION[] = "([0-9]+)\\.([0-9]+)(\\.([0-9]+))?"; boost::regex os_version_parse(OS_VERSION_MATCH_EXPRESSION); boost::smatch matched; @@ -460,9 +493,9 @@ LLOSInfo::LLOSInfo() : if ( matched[1].matched ) // Major version { version_value.assign(matched[1].first, matched[1].second); - if (sscanf("%d", &mMajorVer) != 1) + if (sscanf(version_value.c_str(), "%d", &mMajorVer) != 1) { - LL_WARNS("AppInit") << "failed to parse major version '" << version_value "' as a number" << LL_ENDL; + LL_WARNS("AppInit") << "failed to parse major version '" << version_value << "' as a number" << LL_ENDL; } } else @@ -476,9 +509,9 @@ LLOSInfo::LLOSInfo() : if ( matched[2].matched ) // Minor version { version_value.assign(matched[2].first, matched[2].second); - if (sscanf("%d", &mMinorVer) != 1) + if (sscanf(version_value.c_str(), "%d", &mMinorVer) != 1) { - LL_ERRS("AppInit") << "failed to parse minor version '" << version_value "' as a number" << LL_ENDL; + LL_ERRS("AppInit") << "failed to parse minor version '" << version_value << "' as a number" << LL_ENDL; } } else @@ -492,9 +525,9 @@ LLOSInfo::LLOSInfo() : if ( matched[4].matched ) // Build version (optional) - note that [3] includes the '.' { version_value.assign(matched[4].first, matched[4].second); - if (sscanf("%d", &mBuild) != 1) + if (sscanf(version_value.c_str(), "%d", &mBuild) != 1) { - LL_ERRS("AppInit") << "failed to parse build version '" << version_value "' as a number" << LL_ENDL; + LL_ERRS("AppInit") << "failed to parse build version '" << version_value << "' as a number" << LL_ENDL; } } else @@ -794,38 +827,6 @@ private: LLSD mStats; }; -// Wrap boost::regex_match() with a function that doesn't throw. -template -static bool regex_match_no_exc(const S& string, M& match, const R& regex) -{ - try - { - return boost::regex_match(string, match, regex); - } - catch (const std::runtime_error& e) - { - LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': " - << e.what() << ":\n'" << string << "'" << LL_ENDL; - return false; - } -} - -// Wrap boost::regex_search() with a function that doesn't throw. -template -static bool regex_search_no_exc(const S& string, M& match, const R& regex) -{ - try - { - return boost::regex_search(string, match, regex); - } - catch (const std::runtime_error& e) - { - LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': " - << e.what() << ":\n'" << string << "'" << LL_ENDL; - return false; - } -} - LLMemoryInfo::LLMemoryInfo() { refresh(); From f76e7cce5f68df3a2fa7874dcb6b0b1cd60d4fa3 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 22 Feb 2013 21:06:38 -0500 Subject: [PATCH 27/82] MAINT-2328: Mac updater should not clear (part of) viewer cache. Remove the offending code. --- .../updater/scripts/darwin/update_install.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/indra/viewer_components/updater/scripts/darwin/update_install.py b/indra/viewer_components/updater/scripts/darwin/update_install.py index 3402f90a2a..25efc2b0bc 100755 --- a/indra/viewer_components/updater/scripts/darwin/update_install.py +++ b/indra/viewer_components/updater/scripts/darwin/update_install.py @@ -287,21 +287,6 @@ def main(dmgfile, markerfile, markertext, appdir=None): # let our previously-set sys.excepthook handle this raise type, value, traceback - status("Clearing cache...") - - # We don't know whether the previous viewer was old-style or - # new-style (Cocoa). Clear both kinds of caches. - for cachesubdir in "SecondLife", BUNDLE_IDENTIFIER: - wildcard = "~/Library/Caches/%s/*" % cachesubdir - log("rm " + wildcard) - for f in glob.glob(os.path.expanduser(wildcard)): - # Don't try to remove subdirs this way - if os.path.isfile(f): - try: - os.remove(f) - except Exception, err: - log("%s removing %s: %s" % (err.__class__.__name__, f, err)) - status("Cleaning up...") log("touch " + appdir) From fbb9bf89c045e96da00bfbc7f407758c87894e92 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 25 Feb 2013 16:26:40 -0500 Subject: [PATCH 28/82] MAINT-2155, DRTVWR-278: Make Mac updater honor app bundle name in .dmg. If you run "/Applications/Second Life Beta Materials.app", and the version manager directs you to update to a .dmg containing a release candidate whose app bundle name is "Second Life Viewer.app", update_install.py used to copy the contents of "Second Life Viewer.app" into "/Applications/Second Life Beta Materials.app". Changed it so that if the application bundle name differs, we leave the running app bundle alone, installing instead to the app bundle name from the .dmg. --- .../updater/scripts/darwin/update_install.py | 98 ++++++++++++++----- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/indra/viewer_components/updater/scripts/darwin/update_install.py b/indra/viewer_components/updater/scripts/darwin/update_install.py index 25efc2b0bc..2fc6fcdb29 100755 --- a/indra/viewer_components/updater/scripts/darwin/update_install.py +++ b/indra/viewer_components/updater/scripts/darwin/update_install.py @@ -139,7 +139,7 @@ def write_marker(markerfile, markertext): # **************************************************************************** # Main script logic # **************************************************************************** -def main(dmgfile, markerfile, markertext, appdir=None): +def main(dmgfile, markerfile, markertext): # Should we fail, we're supposed to write 'markertext' to 'markerfile'. # Wrap the fail() function so we do that. global fail @@ -179,18 +179,19 @@ def main(dmgfile, markerfile, markertext, appdir=None): # prepare for other cleanup with Janitor(LOGF) as janitor: - # Hopefully caller explicitly stated the viewer bundle to update. - # But if not, try to derive it from our own pathname. (The only - # trouble with that is that the old viewer might copy this script - # to a temp dir before running.) - if not appdir: - # Somewhat peculiarly, this script is currently packaged in - # Appname.app/Contents/MacOS with the viewer executable. But even if we - # decide to move it to Appname.app/Contents/Resources, we'll still find - # Appname.app two levels up from dirname(__file__). - appdir = os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir, os.pardir)) + # Try to derive the name of the running viewer app bundle from our + # own pathname. (Hopefully the old viewer won't copy this script + # to a temp dir before running!) + # Somewhat peculiarly, this script is currently packaged in + # Appname.app/Contents/MacOS with the viewer executable. But even + # if we decide to move it to Appname.app/Contents/Resources, we'll + # still find Appname.app two levels up from dirname(__file__). + appdir = os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir, os.pardir)) if not appdir.endswith(".app"): + # This can happen if either this script has been copied before + # being executed, or if it's in an unexpected place in the app + # bundle. fail(appdir + " is not an application directory") # We need to install into appdir's parent directory -- can we? @@ -260,15 +261,66 @@ def main(dmgfile, markerfile, markertext, appdir=None): # Here 'candidate' is the new viewer to install log("Found " + candidate) + + # This logic was changed to make Mac updates behave more like + # Windows. Most of the time, the user doesn't change the name of + # the app bundle on our .dmg installer (e.g. "Second Life Beta + # Viewer.app"). Most of the time, the version manager directs a + # given viewer to update to another .dmg containing an app bundle + # with THE SAME name. In that case, everything behaves as usual. + + # The case that was changed is when the version manager offers (or + # mandates) an update to a .dmg containing a different app bundle + # name. This can happen, for instance, to a user who's downloaded + # a "project beta" viewer, and the project subsequently publishes + # a Release Candidate viewer. Say the project beta's app bundle + # name is something like "Second Life Beta Neato.app". Anyone + # launching that viewer will be offered an update to the + # corresponding Release Candidate viewer -- which will be built as + # a release viewer, with app bundle name "Second Life Viewer.app". + + # On Windows, we run the NSIS installer, which will update/replace + # the embedded install directory name, e.g. Second Life Viewer. + # But the Mac installer used to locate the app bundle name in the + # mounted .dmg file, then ignore that name, copying its contents + # into the app bundle directory of the running viewer. That is, + # we'd install the Release Candidate from the .dmg's "Second + # Life.app" into "/Applications/Second Life Beta Neato.app". This + # is undesired behavior. + + # Instead, having found the app bundle name on the mounted .dmg, + # we try to install that app bundle name into the parent directory + # of the running app bundle. + + # Are we installing a different app bundle name? If so, call it + # out, both in the log and for the user -- this is an odd case. + # (Presumably they've already agreed to a similar notification in + # the viewer before the viewer launched this script, but still.) + bundlename = os.path.basename(candidate) + if os.path.basename(appdir) == bundlename: + # updating the running app bundle, which we KNOW exists + appexists = True + else: + # installing some other app bundle + newapp = os.path.join(installdir, bundlename) + appexists = os.path.exists(newapp) + message = "Note: %s %s %s" % \ + (appdir, "updating" if appexists else "installing new", newapp) + status(message) + # okay, we have no further need of the name of the running app + # bundle. + appdir = newapp + status("Preparing to copy files...") - # move old viewer to temp location in case copy from .dmg fails - aside = os.path.join(tempdir, os.path.basename(appdir)) - log("mv %r %r" % (appdir, aside)) - # Use shutil.move() instead of os.rename(). move() first tries - # os.rename(), but falls back to shutil.copytree() if the dest is - # on a different filesystem. - shutil.move(appdir, aside) + if appexists: + # move old viewer to temp location in case copy from .dmg fails + aside = os.path.join(tempdir, os.path.basename(appdir)) + log("mv %r %r" % (appdir, aside)) + # Use shutil.move() instead of os.rename(). move() first tries + # os.rename(), but falls back to shutil.copytree() if the dest is + # on a different filesystem. + shutil.move(appdir, aside) status("Copying files...") @@ -282,8 +334,9 @@ def main(dmgfile, markerfile, markertext, appdir=None): except Exception, err: # copy failed -- try to restore previous viewer before crumping type, value, traceback = sys.exc_info() - log("exception response: mv %r %r" % (aside, appdir)) - shutil.move(aside, appdir) + if appexists: + log("exception response: mv %r %r" % (aside, appdir)) + shutil.move(aside, appdir) # let our previously-set sys.excepthook handle this raise type, value, traceback @@ -316,6 +369,5 @@ if __name__ == "__main__": # We expect this script to be invoked with: # - the pathname to the .dmg we intend to install; # - the pathname to an update-error marker file to create on failure; - # - the content to write into the marker file; - # - optionally, the pathname of the Second Life viewer to update. + # - the content to write into the marker file. main(*sys.argv[1:]) From 7cc817846127d89da50f88fcc3cd1f38426b7155 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 25 Feb 2013 16:43:46 -0500 Subject: [PATCH 29/82] remove update protocol version from settings --- indra/newview/app_settings/settings.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5b73b075a4..45e77aded4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12153,17 +12153,6 @@ Value update - UpdaterServiceProtocolVersion - - Comment - The update protocol version to use. - Persist - 0 - Type - String - Value - v1.0 - UploadBakedTexOld Comment From 13fe905b24546dda39a88466517aa0c6b449fbd8 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 25 Feb 2013 16:44:31 -0500 Subject: [PATCH 30/82] disable willing-to-test for Test viewers --- indra/newview/llappviewer.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ae593daf08..6ec6f5489c 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2938,7 +2938,17 @@ void LLAppViewer::initUpdater() std::string version = LLVersionInfo::getVersion(); std::string service_path = gSavedSettings.getString("UpdaterServicePath"); U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod"); - bool willing_to_test = gSavedSettings.getBOOL("UpdaterWillingToTest"); + bool willing_to_test; + LL_DEBUGS("UpdaterService") << "channel " << channel << LL_ENDL; + if (channel.find("Test") != std::string::npos) // TBD - should be a regex + { + LL_INFOS("UpdaterService") << "Test build: overriding willing_to_test by sending testno" << LL_ENDL; + willing_to_test = false; + } + else + { + willing_to_test = gSavedSettings.getBOOL("UpdaterWillingToTest"); + } unsigned char unique_id[MD5HEX_STR_SIZE]; if ( ! llHashedUniqueID(unique_id) ) { From 49ed1a4e32013cda716998784338a01b12c663ef Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 27 Feb 2013 17:40:39 -0500 Subject: [PATCH 31/82] finish changes to update handling, including notices of channel changes --- indra/newview/llappviewer.cpp | 74 +++++++--- indra/newview/lllogininstance.cpp | 28 ++-- indra/newview/llviewerwindow.cpp | 13 +- .../skins/default/xui/en/notifications.xml | 66 ++++++++- .../updater/llupdatechecker.cpp | 23 +-- .../updater/llupdatechecker.h | 14 +- .../updater/llupdatedownloader.cpp | 135 +++++++++++++----- .../updater/llupdatedownloader.h | 2 + .../updater/llupdaterservice.cpp | 107 ++++++++------ .../updater/tests/llupdaterservice_test.cpp | 2 +- 10 files changed, 315 insertions(+), 149 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 6ec6f5489c..18314904a7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -121,6 +121,7 @@ #include #include #include +#include #if LL_WINDOWS @@ -2831,25 +2832,46 @@ namespace { std::string notification_name; void (*apply_callback)(LLSD const &, LLSD const &) = NULL; + /* Build up the notification name... + * it can be any of these, which are included here for the sake of grep: + * RequiredUpdateDownloadedDialog + * RequiredUpdateDownloadedVerboseDialog + * OtherChannelRequiredUpdateDownloadedDialog + * OtherChannelRequiredUpdateDownloadedVerbose + * DownloadBackgroundTip + * DownloadBackgroundDialog + * OtherChannelDownloadBackgroundTip + * OtherChannelDownloadBackgroundDialog + */ + { + LL_DEBUGS("UpdaterService") << "data = "; + std::ostringstream data_dump; + LLSDSerialize::toNotation(data, data_dump); + LL_CONT << data_dump.str() << LL_ENDL; + } + if(data["channel"].asString() != LLVersionInfo::getChannel()) + { + notification_name.append("OtherChannel"); + } if(data["required"].asBoolean()) { if(LLStartUp::getStartupState() <= STATE_LOGIN_WAIT) { // The user never saw the progress bar. apply_callback = &apply_update_ok_callback; - notification_name = "RequiredUpdateDownloadedVerboseDialog"; + notification_name += "RequiredUpdateDownloadedVerboseDialog"; } else if(LLStartUp::getStartupState() < STATE_WORLD_INIT) { // The user is logging in but blocked. apply_callback = &apply_update_ok_callback; - notification_name = "RequiredUpdateDownloadedDialog"; + notification_name += "RequiredUpdateDownloadedDialog"; } else { // The user is already logged in; treat like an optional update. apply_callback = &apply_update_callback; - notification_name = "DownloadBackgroundTip"; + notification_name += "DownloadBackgroundTip"; } } else @@ -2859,36 +2881,47 @@ namespace { { // CHOP-262 we need to use a different notification // method prior to login. - notification_name = "DownloadBackgroundDialog"; + notification_name += "DownloadBackgroundDialog"; } else { - notification_name = "DownloadBackgroundTip"; + notification_name += "DownloadBackgroundTip"; } } LLSD substitutions; substitutions["VERSION"] = data["version"]; - - // truncate version at the rightmost '.' - std::string version_short(data["version"]); - size_t short_length = version_short.rfind('.'); - if (short_length != std::string::npos) + std::string new_channel = data["channel"].asString(); + substitutions["NEW_CHANNEL"] = new_channel; + std::string info_url = data["info_url"].asString(); + if ( !info_url.empty() ) { - version_short.resize(short_length); + substitutions["INFO_URL"] = info_url; } + else + { + LL_WARNS("UpdaterService") << "no info url supplied - defaulting to hard coded release notes pattern" << LL_ENDL; - LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]"); - relnotes_url.setArg("[VERSION_SHORT]", version_short); + // truncate version at the rightmost '.' + std::string version_short(data["version"]); + size_t short_length = version_short.rfind('.'); + if (short_length != std::string::npos) + { + version_short.resize(short_length); + } - // *TODO thread the update service's response through to this point - std::string const & channel = LLVersionInfo::getChannel(); - boost::shared_ptr channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free); + LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]"); + relnotes_url.setArg("[VERSION_SHORT]", version_short); - relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get()); - relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL")); - substitutions["RELEASE_NOTES_FULL_URL"] = relnotes_url.getString(); + // *TODO thread the update service's response through to this point + std::string const & channel = LLVersionInfo::getChannel(); + boost::shared_ptr channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free); + relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get()); + relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL")); + substitutions["INFO_URL"] = relnotes_url.getString(); + } + LLNotificationsUtil::add(notification_name, substitutions, LLSD(), apply_callback); } @@ -2940,7 +2973,8 @@ void LLAppViewer::initUpdater() U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod"); bool willing_to_test; LL_DEBUGS("UpdaterService") << "channel " << channel << LL_ENDL; - if (channel.find("Test") != std::string::npos) // TBD - should be a regex + static const boost::regex is_test_channel("\\bTest$"); + if (boost::regex_search(channel, is_test_channel)) { LL_INFOS("UpdaterService") << "Test build: overriding willing_to_test by sending testno" << LL_ENDL; willing_to_test = false; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 12796ca262..b27a566c23 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -777,20 +777,20 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg) LLSD payload; payload["mandatory"] = mandatory; -/* - We're constructing one of the following 9 strings here: - "DownloadWindowsMandatory" - "DownloadWindowsReleaseForDownload" - "DownloadWindows" - "DownloadMacMandatory" - "DownloadMacReleaseForDownload" - "DownloadMac" - "DownloadLinuxMandatory" - "DownloadLinuxReleaseForDownload" - "DownloadLinux" - - I've called them out explicitly in this comment so that they can be grepped for. - */ + /* + * We're constructing one of the following 9 strings here: + * "DownloadWindowsMandatory" + * "DownloadWindowsReleaseForDownload" + * "DownloadWindows" + * "DownloadMacMandatory" + * "DownloadMacReleaseForDownload" + * "DownloadMac" + * "DownloadLinuxMandatory" + * "DownloadLinuxReleaseForDownload" + * "DownloadLinux" + * + * I've called them out explicitly in this comment so that they can be grepped for. + */ std::string notification_name = "Download"; #if LL_WINDOWS diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8c72421888..2d9c127b87 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "llagent.h" #include "llagentcamera.h" @@ -2235,9 +2236,9 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid) // no l10n problem because channel is always an english string std::string channel = LLVersionInfo::getChannel(); - bool isProject = (channel.find("Project") != std::string::npos); // TBD - should be a regex - bool isBeta = (channel.find("Beta") != std::string::npos); // TBD - should be a regex - bool isTest = (channel.find("Test") != std::string::npos); // TBD - should be a regex + static const boost::regex is_beta_channel("\\bBeta\\b"); + static const boost::regex is_project_channel("\\bProject\\b"); + static const boost::regex is_test_channel("\\bTest$"); // god more important than project, proj more important than grid if ( god_mode ) @@ -2251,15 +2252,15 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid) new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" ); } } - else if (isBeta) + else if (boost::regex_search(channel, is_beta_channel)) { new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBetaBgColor" ); } - else if (isProject) + else if (boost::regex_search(channel, is_project_channel)) { new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" ); } - else if (isTest) + else if (boost::regex_search(channel, is_test_channel)) { new_bg_color = LLUIColorTable::instance().getColor( "MenuBarTestBgColor" ); } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c8f5cbb2b0..2319729339 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3452,7 +3452,7 @@ or you can install it now. name="DownloadBackgroundTip" type="notify"> We have downloaded an update to your [APP_NAME] installation. -Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] +Version [VERSION] [[INFO_URL] Information about this update] confirm We have downloaded an update to your [APP_NAME] installation. -Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] +Version [VERSION] [[INFO_URL] Information about this update] confirm We have downloaded a required software update. -Version [VERSION] +Version [VERSION] [[INFO_URL] Information about this update] We must restart [APP_NAME] to install the update. confirm @@ -3492,6 +3492,66 @@ We must restart [APP_NAME] to install the update. name="RequiredUpdateDownloadedDialog" type="alertmodal"> We must restart [APP_NAME] to install the update. +[[INFO_URL] Information about this update] + confirm + + + + +We have downloaded an update to your [APP_NAME] installation. +Version [VERSION] +This experimental viewer has been replaced by a [NEW_CHANNEL] viewer; +see [[INFO_URL] for details about this update] + confirm + + + + +We have downloaded an update to your [APP_NAME] installation. +Version [VERSION] +This experimental viewer has been replaced by a [NEW_CHANNEL] viewer; +see [[INFO_URL] Information about this update] + confirm + + + + +We have downloaded a required software update. +Version [VERSION] +This experimental viewer has been replaced by a [NEW_CHANNEL] viewer; +see [[INFO_URL] Information about this update] + +We must restart [APP_NAME] to install the update. + confirm + + + + +We must restart [APP_NAME] to install the update. +This experimental viewer has been replaced by a [NEW_CHANNEL] viewer; +see [[INFO_URL] Information about this update] confirm download(uri, hash, updateVersion, required); + mImplementation->download(uri, hash, updateChannel, updateVersion, info_url, required); } @@ -222,18 +226,28 @@ void LLUpdateDownloader::Implementation::cancel(void) void LLUpdateDownloader::Implementation::download(LLURI const & uri, std::string const & hash, + std::string const & updateChannel, std::string const & updateVersion, + std::string const & info_url, bool required) -{ +{ if(isDownloading()) mClient.downloadError("download in progress"); mDownloadRecordPath = downloadMarkerPath(); mDownloadData = LLSD(); mDownloadData["required"] = required; + mDownloadData["update_channel"] = updateChannel; mDownloadData["update_version"] = updateVersion; - try { + if (!info_url.empty()) + { + mDownloadData["info_url"] = info_url; + } + try + { startDownloading(uri, hash); - } catch(DownloadError const & e) { + } + catch(DownloadError const & e) + { mClient.downloadError(e.what()); } } @@ -249,47 +263,65 @@ void LLUpdateDownloader::Implementation::resume(void) { mCancelled = false; - if(isDownloading()) { + if(isDownloading()) + { mClient.downloadError("download in progress"); } mDownloadRecordPath = downloadMarkerPath(); llifstream dataStream(mDownloadRecordPath); - if(!dataStream) { + if(!dataStream) + { mClient.downloadError("no download marker"); return; } LLSDSerialize::fromXMLDocument(mDownloadData, dataStream); - if(!mDownloadData.asBoolean()) { + if(!mDownloadData.asBoolean()) + { mClient.downloadError("no download information in marker"); return; } std::string filePath = mDownloadData["path"].asString(); - try { - if(LLFile::isfile(filePath)) { + try + { + if(LLFile::isfile(filePath)) + { llstat fileStatus; LLFile::stat(filePath, &fileStatus); - if(fileStatus.st_size != mDownloadData["size"].asInteger()) { + if(fileStatus.st_size != mDownloadData["size"].asInteger()) + { resumeDownloading(fileStatus.st_size); - } else if(!validateDownload()) { + } + else if(!validateDownload()) + { LLFile::remove(filePath); download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString(), + mDownloadData["update_channel"].asString(), mDownloadData["update_version"].asString(), + mDownloadData["info_url"].asString(), mDownloadData["required"].asBoolean()); - } else { + } + else + { mClient.downloadComplete(mDownloadData); } - } else { + } + else + { download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString(), + mDownloadData["update_channel"].asString(), mDownloadData["update_version"].asString(), + mDownloadData["info_url"].asString(), mDownloadData["required"].asBoolean()); } - } catch(DownloadError & e) { + } + catch(DownloadError & e) + { mClient.downloadError(e.what()); } } @@ -297,13 +329,18 @@ void LLUpdateDownloader::Implementation::resume(void) void LLUpdateDownloader::Implementation::setBandwidthLimit(U64 bytesPerSecond) { - if((mBandwidthLimit != bytesPerSecond) && isDownloading() && !mDownloadData["required"].asBoolean()) { + if((mBandwidthLimit != bytesPerSecond) && isDownloading() && !mDownloadData["required"].asBoolean()) + { llassert(mCurl != 0); mBandwidthLimit = bytesPerSecond; CURLcode code = curl_easy_setopt(mCurl, CURLOPT_MAX_RECV_SPEED_LARGE, &mBandwidthLimit); - if(code != CURLE_OK) LL_WARNS("UpdaterService") << - "unable to change dowload bandwidth" << LL_ENDL; - } else { + if(code != CURLE_OK) + { + LL_WARNS("UpdaterService") << "unable to change dowload bandwidth" << LL_ENDL; + } + } + else + { mBandwidthLimit = bytesPerSecond; } } @@ -381,29 +418,44 @@ void LLUpdateDownloader::Implementation::run(void) { CURLcode code = curl_easy_perform(mCurl); mDownloadStream.close(); - if(code == CURLE_OK) { + if(code == CURLE_OK) + { LLFile::remove(mDownloadRecordPath); - if(validateDownload()) { + if(validateDownload()) + { LL_INFOS("UpdaterService") << "download successful" << LL_ENDL; mClient.downloadComplete(mDownloadData); - } else { + } + else + { LL_INFOS("UpdaterService") << "download failed hash check" << LL_ENDL; std::string filePath = mDownloadData["path"].asString(); - if(filePath.size() != 0) LLFile::remove(filePath); + if(filePath.size() != 0) + { + LLFile::remove(filePath); + } mClient.downloadError("failed hash check"); } - } else if(mCancelled && (code == CURLE_WRITE_ERROR)) { + } + else if(mCancelled && (code == CURLE_WRITE_ERROR)) + { LL_INFOS("UpdaterService") << "download canceled by user" << LL_ENDL; // Do not call back client. - } else { + } + else + { LL_WARNS("UpdaterService") << "download failed with error '" << curl_easy_strerror(code) << "'" << LL_ENDL; LLFile::remove(mDownloadRecordPath); - if(mDownloadData.has("path")) LLFile::remove(mDownloadData["path"].asString()); + if(mDownloadData.has("path")) + { + LLFile::remove(mDownloadData["path"].asString()); + } mClient.downloadError("curl error"); } - if(mHeaderList) { + if(mHeaderList) + { curl_slist_free_all(mHeaderList); mHeaderList = 0; } @@ -421,13 +473,16 @@ void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & u curl_easy_reset(mCurl); } - if(mCurl == 0) throw DownloadError("failed to initialize curl"); - + if(mCurl == 0) + { + throw DownloadError("failed to initialize curl"); + } throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_NOSIGNAL, true)); throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_FOLLOWLOCATION, true)); throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_WRITEFUNCTION, &write_function)); throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_WRITEDATA, this)); - if(processHeader) { + if(processHeader) + { throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HEADERFUNCTION, &header_function)); throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HEADERDATA, this)); } @@ -456,7 +511,10 @@ void LLUpdateDownloader::Implementation::resumeDownloading(size_t startByte) boost::format rangeHeaderFormat("Range: bytes=%u-"); rangeHeaderFormat % startByte; mHeaderList = curl_slist_append(mHeaderList, rangeHeaderFormat.str().c_str()); - if(mHeaderList == 0) throw DownloadError("cannot add Range header"); + if(mHeaderList == 0) + { + throw DownloadError("cannot add Range header"); + } throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HTTPHEADER, mHeaderList)); mDownloadStream.open(mDownloadData["path"].asString(), @@ -508,19 +566,26 @@ bool LLUpdateDownloader::Implementation::validateDownload(void) { std::string filePath = mDownloadData["path"].asString(); llifstream fileStream(filePath, std::ios_base::in | std::ios_base::binary); - if(!fileStream) return false; + if(!fileStream) + { + return false; + } std::string hash = mDownloadData["hash"].asString(); - if(hash.size() != 0) { + if(hash.size() != 0) + { LL_INFOS("UpdaterService") << "checking hash..." << LL_ENDL; char digest[33]; LLMD5(fileStream).hex_digest(digest); - if(hash != digest) { - LL_WARNS("UpdaterService") << "download hash mismatch; expeted " << hash << + if(hash != digest) + { + LL_WARNS("UpdaterService") << "download hash mismatch; expected " << hash << " but download is " << digest << LL_ENDL; } return hash == digest; - } else { + } + else + { return true; // No hash check provided. } } diff --git a/indra/viewer_components/updater/llupdatedownloader.h b/indra/viewer_components/updater/llupdatedownloader.h index 0d635640cf..f759988f12 100644 --- a/indra/viewer_components/updater/llupdatedownloader.h +++ b/indra/viewer_components/updater/llupdatedownloader.h @@ -54,7 +54,9 @@ public: // Start a new download. void download(LLURI const & uri, std::string const & hash, + std::string const & updateChannel, std::string const & updateVersion, + std::string const & info_url, bool required=false); // Returns true if a download is in progress. diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index c6c89655d3..324b051b21 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -140,13 +140,9 @@ public: // LLUpdateChecker::Client: virtual void error(std::string const & message); - virtual void optionalUpdate(std::string const & newVersion, - LLURI const & uri, - std::string const & hash); - virtual void requiredUpdate(std::string const & newVersion, - LLURI const & uri, - std::string const & hash); - virtual void upToDate(void); + + // A successful response was received from the viewer version manager + virtual void response(LLSD const & content); // LLUpdateDownloader::Client void downloadComplete(LLSD const & data); @@ -155,6 +151,7 @@ public: bool onMainLoop(LLSD const & event); private: + std::string mNewChannel; std::string mNewVersion; void restartTimer(unsigned int seconds); @@ -334,9 +331,13 @@ bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller) if((result == 0) && mAppExitCallback) { mAppExitCallback(); - } else if(result != 0) { + } + else if(result != 0) + { LL_WARNS("UpdaterService") << "failed to run update install script" << LL_ENDL; - } else { + } + else + { ; // No op. } } @@ -364,6 +365,7 @@ bool LLUpdaterServiceImpl::checkForResume() { mIsDownloading = true; mNewVersion = download_info["update_version"].asString(); + mNewChannel = download_info["update_channel"].asString(); mUpdateDownloader.resume(); result = true; } @@ -372,7 +374,10 @@ bool LLUpdaterServiceImpl::checkForResume() // The viewer that started this download is not the same as this viewer; ignore. LL_INFOS("UpdaterService") << "ignoring partial download from different viewer version" << LL_ENDL;; std::string path = download_info["path"].asString(); - if(!path.empty()) LLFile::remove(path); + if(!path.empty()) + { + LLFile::remove(path); + } LLFile::remove(download_marker_path); } } @@ -389,36 +394,43 @@ void LLUpdaterServiceImpl::error(std::string const & message) } } -void LLUpdaterServiceImpl::optionalUpdate(std::string const & newVersion, - LLURI const & uri, - std::string const & hash) +// A successful response was received from the viewer version manager +void LLUpdaterServiceImpl::response(LLSD const & content) { - stopTimer(); - mNewVersion = newVersion; - mIsDownloading = true; - setState(LLUpdaterService::DOWNLOADING); - mUpdateDownloader.download(uri, hash, newVersion, false); -} - -void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion, - LLURI const & uri, - std::string const & hash) -{ - stopTimer(); - mNewVersion = newVersion; - mIsDownloading = true; - setState(LLUpdaterService::DOWNLOADING); - mUpdateDownloader.download(uri, hash, newVersion, true); -} - -void LLUpdaterServiceImpl::upToDate(void) -{ - if(mIsChecking) + if(!content.asBoolean()) // an empty response means "no update" { - restartTimer(mCheckPeriod); - } + LL_INFOS("UpdaterService") << "up to date" << LL_ENDL; + if(mIsChecking) + { + restartTimer(mCheckPeriod); + } - setState(LLUpdaterService::UP_TO_DATE); + setState(LLUpdaterService::UP_TO_DATE); + } + else + { + // there is an update available... + stopTimer(); + mNewChannel = content["channel"].asString(); + if (mNewChannel.empty()) + { + LL_INFOS("UpdaterService") << "no channel supplied, assuming current channel" << LL_ENDL; + mNewChannel = mChannel; + } + mNewVersion = content["version"].asString(); + mIsDownloading = true; + setState(LLUpdaterService::DOWNLOADING); + BOOL required = content["required"].asBoolean(); + LLURI url(content["url"].asString()); + std::string more_info = content["more_info"].asString(); + LL_DEBUGS("UpdaterService") + << "Starting download of " + << ( required ? "required" : "optional" ) << " update " + << "to channel '" << mNewChannel << "' version " << mNewVersion + << "more info '" << more_info << "'" + << LL_ENDL; + mUpdateDownloader.download(url, content["hash"].asString(), mNewChannel, mNewVersion, more_info, required); + } } void LLUpdaterServiceImpl::downloadComplete(LLSD const & data) @@ -436,9 +448,19 @@ void LLUpdaterServiceImpl::downloadComplete(LLSD const & data) payload["type"] = LLSD(LLUpdaterService::DOWNLOAD_COMPLETE); payload["required"] = data["required"]; payload["version"] = mNewVersion; + payload["channel"] = mNewChannel; + payload["info_url"] = data["info_url"]; event["payload"] = payload; + LL_DEBUGS("UpdaterService") + << "Download complete " + << ( data["required"].asBoolean() ? "required" : "optional" ) + << "channel " << mNewChannel + << "version " << mNewVersion + << "info " << data["info_url"].asString() + << LL_ENDL; + LLEventPumps::instance().obtain("mainlooprepeater").post(event); - + setState(LLUpdaterService::TERMINAL); } @@ -512,15 +534,18 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) // Check for failed install. if(LLFile::isfile(ll_install_failed_marker_path())) { + LL_DEBUGS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL;; int requiredValue = 0; { llifstream stream(ll_install_failed_marker_path()); stream >> requiredValue; - if(stream.fail()) requiredValue = 0; + if(stream.fail()) + { + requiredValue = 0; + } } // TODO: notify the user. - LL_INFOS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL;; - LL_INFOS("UpdaterService") << "last install attempt failed" << LL_ENDL;; + LL_WARNS("UpdaterService") << "last install attempt failed" << LL_ENDL;; LLFile::remove(ll_install_failed_marker_path()); LLSD event; diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index ddaaccc051..51b63dcb7b 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -53,7 +53,7 @@ void LLUpdateChecker::checkVersion(std::string const & hostUrl, bool willing_to_test) {} LLUpdateDownloader::LLUpdateDownloader(Client & ) {} -void LLUpdateDownloader::download(LLURI const & , std::string const &, std::string const &, bool){} +void LLUpdateDownloader::download(LLURI const & , std::string const &, std::string const &, std::string const &, std::string const &, bool){} class LLDir_Mock : public LLDir { From 65e4ea3e28446585e8a36db9b06edb457b3de7f4 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 28 Feb 2013 13:45:49 -0500 Subject: [PATCH 32/82] correct icon and app name recognition by channel --- indra/newview/viewer_manifest.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 63db76ff90..b3c0e650ec 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -176,18 +176,19 @@ class ViewerManifest(LLManifest): channel_type=self.channel_lowerword() if channel_type == 'release' : app_suffix='Viewer' - elif re.match('(beta|project) .*',channel_type) : + elif re.match('^(beta|project).*',channel_type) : app_suffix=self.channel_unique() return "Second Life "+app_suffix def icon_path(self): icon_path="icons/" channel_type=self.channel_lowerword() + print "Icon channel type '%s'" % channel_type if channel_type == 'release' : icon_path += channel_type - elif re.match('beta .*',channel_type) : + elif re.match('^beta.*',channel_type) : icon_path += 'beta' - elif re.match('project .*',channel_type) : + elif re.match('^project.*',channel_type) : icon_path += 'project' else : icon_path += 'test' @@ -245,7 +246,7 @@ class WindowsManifest(ViewerManifest): channel_type=self.channel_lowerword() if channel_type == 'release' : app_suffix='' - elif re.match('(beta|project) .*',channel_type) : + elif re.match('^(beta|project).*',channel_type) : app_suffix=''.join(self.channel_unique().split()) return "SecondLife"+app_suffix+".exe" From e0d8170e919a2669703be40d2cbb00163577d909 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 4 Mar 2013 13:33:23 -0500 Subject: [PATCH 33/82] import fix for python sys.path in integration tests --- indra/llcommon/tests/llleap_test.cpp | 9 +++------ indra/llcommon/tests/llsdserialize_test.cpp | 5 +---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index 9b755e9ca5..29060d4ef5 100644 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -122,13 +122,10 @@ namespace tut // finding indra/lib/python. Use our __FILE__, with // raw-string syntax to deal with Windows pathnames. "mydir = os.path.dirname(r'" << __FILE__ << "')\n" - "try:\n" - " from llbase import llsd\n" - "except ImportError:\n" // We expect mydir to be .../indra/llcommon/tests. - " sys.path.insert(0,\n" - " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n" - " from indra.base import llsd\n" + "sys.path.insert(0,\n" + " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n" + "from indra.base import llsd\n" "\n" "class ProtocolError(Exception):\n" " def __init__(self, msg, data):\n" diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index e625545763..4d436e8897 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -1523,10 +1523,7 @@ namespace tut "sys.path.insert(0,\n" " os.path.join(os.path.dirname(r'" __FILE__ "'),\n" " os.pardir, os.pardir, 'lib', 'python'))\n" - "try:\n" - " from llbase import llsd\n" - "except ImportError:\n" - " from indra.base import llsd\n") + "from indra.base import llsd\n") {} ~TestPythonCompatible() {} From 2d7e7e8e05c6c0c31b34d44df911a1a3b636ff4a Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 4 Mar 2013 13:38:40 -0500 Subject: [PATCH 34/82] force update of version number so that all packaging gets the correct number --- indra/newview/CMakeLists.txt | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 19470102e3..6ff05f0532 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1230,17 +1230,15 @@ set(viewer_HEADER_FILES source_group("CMake Rules" FILES ViewerInstall.cmake) -add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/VIEWER_VERSION.txt - COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - COMMENT Generating viewer_version.txt for manifest processing - ) -add_custom_target(generate_viewer_version ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt) +add_custom_target(generate_viewer_version ALL + COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + COMMENT Generating viewer_version.txt for manifest processing + ) set_source_files_properties( llversioninfo.cpp tests/llversioninfo_test.cpp PROPERTIES - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt # dummy dependency to force recompile every time + DEPENDS generate_viewer_version # dummy dependency to force recompile every time COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake ) @@ -1726,7 +1724,7 @@ if (WINDOWS) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + generate_viewer_version stage_third_party_libs ${COPY_INPUT_DEPENDENCIES} COMMENT "Performing viewer_manifest copy" @@ -1919,7 +1917,7 @@ if (LINUX) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + generate_viewer_version ${COPY_INPUT_DEPENDENCIES} ) @@ -1944,7 +1942,7 @@ if (LINUX) --source=${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + generate_viewer_version ${COPY_INPUT_DEPENDENCIES} COMMENT "Performing viewer_manifest copy" ) @@ -2002,7 +2000,7 @@ if (DARWIN) DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + generate_viewer_version ) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger) @@ -2036,7 +2034,7 @@ if (DARWIN) ${SIGNING_SETTING} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + generate_viewer_version ) endif (PACKAGE) endif (DARWIN) From 26325bab289d533df36cbac53c1e428d72e7cf85 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 5 Mar 2013 11:29:20 -0500 Subject: [PATCH 35/82] update minimum required version, and make it the same for all platforms --- indra/CMakeLists.txt | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index dde700c932..4771923871 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -3,14 +3,8 @@ # cmake_minimum_required should appear before any # other commands to guarantee full compatibility # with the version specified - -# The "cmake -E touch" command was released with 2.4.8. -cmake_minimum_required(VERSION 2.4.8 FATAL_ERROR) - -# This makes cmake 2.6 not complain about version 2.4 compatibility. -if (COMMAND cmake_policy) - cmake_policy(SET CMP0003 OLD) -endif (COMMAND cmake_policy) +## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly +cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR) set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING "The root project/makefile/solution name. Defaults to SecondLife.") @@ -21,13 +15,6 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(Variables) include(BuildVersion) -if (DARWIN) - # 2.6.4 fixes a Mac bug in get_target_property(... "SLPlugin" LOCATION): - # before that version it returns "pathname/SLPlugin", whereas the correct - # answer is "pathname/SLPlugin.app/Contents/MacOS/SLPlugin". - cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR) -endif (DARWIN) - if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type. One of: Debug Release RelWithDebInfo" FORCE) From 8a0363c3c70e6444a56fc7cbf1a1504371143e14 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 5 Mar 2013 16:44:58 -0500 Subject: [PATCH 36/82] correct Mac bundle identifier --- indra/newview/CMakeLists.txt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 6ff05f0532..002c826a30 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1966,7 +1966,7 @@ if (DARWIN) OUTPUT_NAME "${product}" MACOSX_BUNDLE_INFO_STRING "Second Life Viewer" MACOSX_BUNDLE_ICON_FILE "secondlife.icns" - MACOSX_BUNDLE_GUI_IDENTIFIER "Second Life" + MACOSX_BUNDLE_GUI_IDENTIFIER "com.secondlife.indra.viewer" MACOSX_BUNDLE_LONG_VERSION_STRING "${VIEWER_CHANNEL} ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" MACOSX_BUNDLE_BUNDLE_NAME "Second Life" MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}" @@ -1978,10 +1978,7 @@ if (DARWIN) "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Info.plist" ) - #configure_file( - # "${CMAKE_CURRENT_SOURCE_DIR}/English.lproj/InfoPlist.strings" - # "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Resources/English.lproj/InfoPlist.strings" - # ) + add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} From 1676dae754d19db28c9efafd90f38d0561fe3d17 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 5 Mar 2013 16:47:03 -0500 Subject: [PATCH 37/82] remove old hack for legacy mac updates (no system that needed that will run this version anyway) --- indra/viewer_components/updater/llupdatechecker.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp index 734747c811..10763b0adc 100644 --- a/indra/viewer_components/updater/llupdatechecker.cpp +++ b/indra/viewer_components/updater/llupdatechecker.cpp @@ -190,18 +190,7 @@ std::string LLUpdateChecker::Implementation::buildUrl(std::string const & hostUr #ifdef LL_WINDOWS static const char * platform = "win"; #elif LL_DARWIN - long versMin; - Gestalt(gestaltSystemVersionMinor, &versMin); - - static const char *platform; - if (versMin == 5) //OS 10.5 - { - platform = "mac_legacy"; - } - else - { - platform = "mac"; - } + static const char *platform = "mac"; #elif LL_LINUX static const char * platform = "lnx"; #else From 3fd781e3df4a1449d466cdccad1a9fbd9aab3158 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 5 Mar 2013 18:05:05 -0500 Subject: [PATCH 38/82] increment build number --- indra/edit-me-to-trigger-new-build.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 0f6a8b8a1d..861fd7df6f 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1 +1,2 @@ Wed Nov 7 00:25:19 UTC 2012 + From 5422a27992d641dd558a42fc282da6aceb5c9cd1 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 5 Mar 2013 22:36:32 -0500 Subject: [PATCH 39/82] increment build number for test beta --- indra/edit-me-to-trigger-new-build.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 861fd7df6f..3ec98d8670 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,2 +1,3 @@ Wed Nov 7 00:25:19 UTC 2012 + From ce73cc392c3f6e2a80c03e30a7dd975408e69f1c Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 6 Mar 2013 15:50:54 -0500 Subject: [PATCH 40/82] cosmetic logging fix --- indra/viewer_components/updater/llupdatechecker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp index 10763b0adc..bb171aec01 100644 --- a/indra/viewer_components/updater/llupdatechecker.cpp +++ b/indra/viewer_components/updater/llupdatechecker.cpp @@ -143,7 +143,7 @@ void LLUpdateChecker::Implementation::completed(U32 status, LL_WARNS("UpdaterService") << "update response using " << sProtocolVersion - << " was 404... retry with legacy protocol" << mProtocol + << " was 404... retry with legacy protocol " << mProtocol << "\n at " << retryUrl << LL_ENDL; From 1eabdf70fc61f7f1cff5fe2522e3e769d0e35db5 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 6 Mar 2013 16:39:41 -0500 Subject: [PATCH 41/82] tag merge of DRTVWR-278 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index ec469ece34..e453b6bc85 100644 --- a/.hgtags +++ b/.hgtags @@ -396,3 +396,4 @@ a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272 c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275 05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4 7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250 +e6b8a92acffd693cd1459e4212e3dff1050acf67 DRTVWR-278 From 4de02b061411a6647b364754f937de3cfd111810 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 6 Mar 2013 17:39:03 -0500 Subject: [PATCH 42/82] more cosmetic logging improvements --- indra/viewer_components/updater/llupdaterservice.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index c1e57122ee..cac6f191df 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -429,9 +429,9 @@ void LLUpdaterServiceImpl::response(LLSD const & content) std::string more_info = content["more_info"].asString(); LL_DEBUGS("UpdaterService") << "Starting download of " - << ( required ? "required" : "optional" ) << " update " - << "to channel '" << mNewChannel << "' version " << mNewVersion - << "more info '" << more_info << "'" + << ( required ? "required" : "optional" ) << " update" + << " to channel '" << mNewChannel << "' version " << mNewVersion + << " more info '" << more_info << "'" << LL_ENDL; mUpdateDownloader.download(url, content["hash"].asString(), mNewChannel, mNewVersion, more_info, required); } @@ -458,9 +458,9 @@ void LLUpdaterServiceImpl::downloadComplete(LLSD const & data) LL_DEBUGS("UpdaterService") << "Download complete " << ( data["required"].asBoolean() ? "required" : "optional" ) - << "channel " << mNewChannel - << "version " << mNewVersion - << "info " << data["info_url"].asString() + << " channel " << mNewChannel + << " version " << mNewVersion + << " info " << data["info_url"].asString() << LL_ENDL; LLEventPumps::instance().obtain("mainlooprepeater").post(event); From ae35b418b1a61e7fa22488ede9ea4e0e169b61b7 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 6 Mar 2013 23:17:47 -0500 Subject: [PATCH 43/82] force increment of build number for testing --- indra/edit-me-to-trigger-new-build.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 3ec98d8670..0f6a8b8a1d 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,3 +1 @@ Wed Nov 7 00:25:19 UTC 2012 - - From a659c9909d2d28920672a58031b7453b900c15ba Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 7 Mar 2013 07:03:50 -0500 Subject: [PATCH 44/82] force increment of build number for testing --- indra/edit-me-to-trigger-new-build.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 0f6a8b8a1d..861fd7df6f 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1 +1,2 @@ Wed Nov 7 00:25:19 UTC 2012 + From cce59647a99648af63c96168c36e85563da40a1a Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 7 Mar 2013 11:06:09 -0500 Subject: [PATCH 45/82] force increment of build number for beta test build --- indra/edit-me-to-trigger-new-build.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 861fd7df6f..3ec98d8670 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,2 +1,3 @@ Wed Nov 7 00:25:19 UTC 2012 + From 8f6d7e1f62ac2b5c00598ea22b0c5b019c61acef Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 8 Mar 2013 12:33:24 -0500 Subject: [PATCH 46/82] trigger build of second project viewer for testing --- indra/edit-me-to-trigger-new-build.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 3ec98d8670..f46c2dc144 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,3 +1,4 @@ Wed Nov 7 00:25:19 UTC 2012 + From ee99022c895977377f963b7dabc7f776a21a060b Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 8 Mar 2013 14:40:58 -0500 Subject: [PATCH 47/82] trigger build of second beta viewer for testing --- indra/edit-me-to-trigger-new-build.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index f46c2dc144..e003ed7788 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -2,3 +2,4 @@ Wed Nov 7 00:25:19 UTC 2012 + From 70ae613209bdc03f7ff45075e673e225447ec7a5 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 13 Mar 2013 14:04:50 -0400 Subject: [PATCH 48/82] remove obsolete debugging messages and commented out code --- build.sh | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/build.sh b/build.sh index 638ec33281..8fde4f3fab 100755 --- a/build.sh +++ b/build.sh @@ -65,7 +65,7 @@ pre_build() && [ -r "$master_message_template_checkout/message_template.msg" ] \ && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg" - check_for "Before 'autobuild configure'" ${build_dir}/packages/dictionaries + check_for "Confirm dictionaries are installed before 'autobuild configure'" ${build_dir}/packages/dictionaries "$AUTOBUILD" configure -c $variant -- \ -DPACKAGE:BOOL=ON \ @@ -75,8 +75,6 @@ pre_build() -DLL_TESTS:BOOL="$run_tests" \ -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url - check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries - end_section "Pre$variant" } @@ -109,7 +107,6 @@ build() if $build_viewer then begin_section "Viewer$variant" - check_for "Before 'autobuild build'" ${build_dir}/packages/dictionaries "$AUTOBUILD" build --no-configure -c $variant viewer_build_ok=$? @@ -122,8 +119,6 @@ build() else echo false >"$build_dir"/build_ok fi - check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries - fi } @@ -181,27 +176,11 @@ then fi # load autbuild provided shell functions and variables -# Merov: going back to the previous code that passes even if it fails catching a failure -# TODO: use the correct code here under and fix the llbase import in python code -#if "$AUTOBUILD" source_environment > source_environment -#then -# . source_environment -#else - # dump environment variables for debugging -# env|sort -# record_failure "autobuild source_environment failed" -# cat source_environment >&3 -# exit 1 -#fi eval "$("$AUTOBUILD" source_environment)" # dump environment variables for debugging env|sort -check_for "Before 'autobuild install'" ${build_dir}/packages/dictionaries - - -check_for "After 'autobuild install'" ${build_dir}/packages/dictionaries # Now run the build succeeded=true build_processes= From 8154621527171267af52a9534e541af1d6c07836 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 26 Mar 2013 18:01:20 -0400 Subject: [PATCH 49/82] log any error code and text received as an llsd body in a failure response --- .../updater/llupdatechecker.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp index bb171aec01..daa867e692 100644 --- a/indra/viewer_components/updater/llupdatechecker.cpp +++ b/indra/viewer_components/updater/llupdatechecker.cpp @@ -134,6 +134,17 @@ void LLUpdateChecker::Implementation::completed(U32 status, if(status != 200) { + std::string server_error; + if ( content.has("error_code") ) + { + server_error += content["error_code"].asString(); + } + if ( content.has("error_text") ) + { + server_error += server_error.empty() ? "" : ": "; + server_error += content["error_text"].asString(); + } + if (status == 404) { if (mProtocol == sProtocolVersion) @@ -143,7 +154,8 @@ void LLUpdateChecker::Implementation::completed(U32 status, LL_WARNS("UpdaterService") << "update response using " << sProtocolVersion - << " was 404... retry with legacy protocol " << mProtocol + << " was HTTP 404 (" << server_error + << "); retry with legacy protocol " << mProtocol << "\n at " << retryUrl << LL_ENDL; @@ -153,14 +165,18 @@ void LLUpdateChecker::Implementation::completed(U32 status, { LL_WARNS("UpdaterService") << "update response using " << sLegacyProtocolVersion - << " was 404; request failed" + << " was 404 (" << server_error + << "); request failed" << LL_ENDL; mClient.error(reason); } } else { - LL_WARNS("UpdaterService") << "response error " << status << " (" << reason << ")" << LL_ENDL; + LL_WARNS("UpdaterService") << "response error " << status + << " " << reason + << " (" << server_error << ")" + << LL_ENDL; mClient.error(reason); } } From e68ab0a563061d3d65a3f552a1f5856071bd230e Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 27 Mar 2013 13:18:52 -0400 Subject: [PATCH 50/82] add info logging of system id --- indra/newview/llhasheduniqueid.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llhasheduniqueid.cpp b/indra/newview/llhasheduniqueid.cpp index 5db5d22332..03192d3e61 100644 --- a/indra/newview/llhasheduniqueid.cpp +++ b/indra/newview/llhasheduniqueid.cpp @@ -42,12 +42,13 @@ bool llHashedUniqueID(unsigned char id[MD5HEX_STR_SIZE]) hashed_unique_id.update(unique_id, MAC_ADDRESS_BYTES); hashed_unique_id.finalize(); hashed_unique_id.hex_digest((char*)id); + LL_INFOS_ONCE("AppInit") << "System ID " << id << LL_ENDL; } else { idIsUnique = false; memcpy(id,"00000000000000000000000000000000", MD5HEX_STR_SIZE); - llwarns << "Failed to get an id; cannot uniquely identify this machine." << llendl; + LL_WARNS_ONCE("AppInit") << "Failed to get an id; cannot uniquely identify this machine." << LL_ENDL; } return idIsUnique; } From c17db85e73a91c145d6eebe36b3b05e2289deae0 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 27 Mar 2013 13:20:48 -0400 Subject: [PATCH 51/82] add platform and platform version to login request parameters for new version manager query --- indra/newview/llappviewer.cpp | 29 ++++++++++++------- indra/newview/llappviewer.h | 2 ++ indra/newview/lllogininstance.cpp | 9 ++++++ indra/newview/lllogininstance.h | 3 ++ indra/newview/tests/lllogininstance_test.cpp | 4 ++- .../updater/llupdatechecker.cpp | 20 +++++-------- .../updater/llupdatechecker.h | 4 +++ .../updater/llupdaterservice.cpp | 11 +++++-- .../updater/llupdaterservice.h | 1 + .../updater/tests/llupdaterservice_test.cpp | 7 +++-- 10 files changed, 59 insertions(+), 31 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 742c29cc88..47a0cb02e4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -271,6 +271,19 @@ BOOL gUseQuickTime = TRUE; eLastExecEvent gLastExecEvent = LAST_EXEC_NORMAL; +#if LL_WINDOWS +# define LL_PLATFORM_KEY "win" +#elif LL_DARWIN +# define LL_PLATFORM_KEY "mac" +#elif LL_LINUX +# define LL_PLATFORM_KEY "lnx" +#elif LL_SOLARIS +# define LL_PLATFORM_KEY "sol" +#else +# error "Unknown Platform" +#endif +const char* gPlatform = LL_PLATFORM_KEY; + LLSD gDebugInfo; U32 gFrameCount = 0; @@ -669,6 +682,7 @@ LLAppViewer::LLAppViewer() : gLoggedInTime.stop(); LLLoginInstance::instance().setUpdaterService(mUpdater.get()); + LLLoginInstance::instance().setPlatformInfo(gPlatform, getOSInfo().getOSVersionString()); } LLAppViewer::~LLAppViewer() @@ -3014,6 +3028,7 @@ void LLAppViewer::initUpdater() service_path, channel, version, + gPlatform, getOSInfo().getOSVersionString(), unique_id, willing_to_test @@ -5189,17 +5204,9 @@ void LLAppViewer::handleLoginComplete() void LLAppViewer::launchUpdater() { - LLSD query_map = LLSD::emptyMap(); - // *TODO place os string in a global constant -#if LL_WINDOWS - query_map["os"] = "win"; -#elif LL_DARWIN - query_map["os"] = "mac"; -#elif LL_LINUX - query_map["os"] = "lnx"; -#elif LL_SOLARIS - query_map["os"] = "sol"; -#endif + LLSD query_map = LLSD::emptyMap(); + query_map["os"] = gPlatform; + // *TODO change userserver to be grid on both viewer and sim, since // userserver no longer exists. query_map["userserver"] = LLGridManager::getInstance()->getGridId(); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7563d672e3..69056074e9 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -322,6 +322,8 @@ typedef enum extern eLastExecEvent gLastExecEvent; // llstartup +extern const char* gPlatform; + extern U32 gFrameCount; extern U32 gForegroundFrameCount; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index b27a566c23..a9b7342963 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -488,6 +488,13 @@ LLLoginInstance::LLLoginInstance() : mDispatcher.add("indeterminate", "", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1)); } +void LLLoginInstance::setPlatformInfo(const std::string platform, + const std::string platform_version) +{ + mPlatform = platform; + mPlatformVersion = platform_version; +} + LLLoginInstance::~LLLoginInstance() { } @@ -592,6 +599,8 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia request_params["mac"] = (char*)hashed_unique_id_string; request_params["version"] = LLVersionInfo::getChannelAndVersion(); // Includes channel name request_params["channel"] = LLVersionInfo::getChannel(); + request_params["platform"] = mPlatform; + request_params["platform_version"] = mPlatformVersion; request_params["id0"] = mSerialNumber; request_params["host_id"] = gSavedSettings.getString("HostID"); request_params["extended_errors"] = true; // request message_id and message_args diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 8b53431219..83191e50bd 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -66,6 +66,7 @@ public: void setSkipOptionalUpdate(bool state) { mSkipOptionalUpdate = state; } void setSerialNumber(const std::string& sn) { mSerialNumber = sn; } void setLastExecEvent(int lee) { mLastExecEvent = lee; } + void setPlatformInfo(const std::string platform, const std::string platform_version); void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; } @@ -99,6 +100,8 @@ private: F64 mTransferRate; std::string mSerialNumber; int mLastExecEvent; + std::string mPlatform; + std::string mPlatformVersion; UpdaterLauncherCallback mUpdaterLauncher; LLEventDispatcher mDispatcher; LLUpdaterService * mUpdaterService; diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index a86230488b..faf46f0984 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -73,7 +73,7 @@ void LLViewerWindow::setShowProgress(BOOL show) {} LLProgressView * LLViewerWindow::getProgressView(void) const { return 0; } LLViewerWindow* gViewerWindow; - + class LLLogin::Impl { }; @@ -212,6 +212,7 @@ void LLUpdaterService::initialize(const std::string& url, const std::string& path, const std::string& channel, const std::string& version, + const std::string& platform, const std::string& platform_version, const unsigned char uniqueid[MD5HEX_STR_SIZE], const bool& willing_to_test @@ -369,6 +370,7 @@ namespace tut accountCredential->setCredentialData(identifier, authenticator); logininstance->setNotificationsInterface(¬ifications); + logininstance->setPlatformInfo("win", "1.3.5"); } LLLoginInstance* logininstance; diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp index daa867e692..39f68ac0f5 100644 --- a/indra/viewer_components/updater/llupdatechecker.cpp +++ b/indra/viewer_components/updater/llupdatechecker.cpp @@ -66,11 +66,12 @@ void LLUpdateChecker::checkVersion(std::string const & hostUrl, std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test) { - mImplementation->checkVersion(hostUrl, servicePath, channel, version, platform_version, uniqueid, willing_to_test); + mImplementation->checkVersion(hostUrl, servicePath, channel, version, platform, platform_version, uniqueid, willing_to_test); } @@ -102,6 +103,7 @@ void LLUpdateChecker::Implementation::checkVersion(std::string const & hostUrl, std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test) @@ -114,13 +116,14 @@ void LLUpdateChecker::Implementation::checkVersion(std::string const & hostUrl, mServicePath = servicePath; mChannel = channel; mVersion = version; + mPlatform = platform; mPlatformVersion = platform_version; memcpy(mUniqueId, uniqueid, MD5HEX_STR_SIZE); mWillingToTest = willing_to_test; mProtocol = sProtocolVersion; - std::string checkUrl = buildUrl(hostUrl, servicePath, channel, version, platform_version, uniqueid, willing_to_test); + std::string checkUrl = buildUrl(hostUrl, servicePath, channel, version, platform, platform_version, uniqueid, willing_to_test); LL_INFOS("UpdaterService") << "checking for updates at " << checkUrl << LL_ENDL; mHttpClient.get(checkUrl, this); @@ -150,7 +153,7 @@ void LLUpdateChecker::Implementation::completed(U32 status, if (mProtocol == sProtocolVersion) { mProtocol = sLegacyProtocolVersion; - std::string retryUrl = buildUrl(mHostUrl, mServicePath, mChannel, mVersion, mPlatformVersion, mUniqueId, mWillingToTest); + std::string retryUrl = buildUrl(mHostUrl, mServicePath, mChannel, mVersion, mPlatform, mPlatformVersion, mUniqueId, mWillingToTest); LL_WARNS("UpdaterService") << "update response using " << sProtocolVersion @@ -199,20 +202,11 @@ std::string LLUpdateChecker::Implementation::buildUrl(std::string const & hostUr std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test) { -#ifdef LL_WINDOWS - static const char * platform = "win"; -#elif LL_DARWIN - static const char *platform = "mac"; -#elif LL_LINUX - static const char * platform = "lnx"; -#else -# error "unsupported platform" -#endif - LLSD path; path.append(servicePath); path.append(mProtocol); diff --git a/indra/viewer_components/updater/llupdatechecker.h b/indra/viewer_components/updater/llupdatechecker.h index 55806137d7..8e85587490 100644 --- a/indra/viewer_components/updater/llupdatechecker.h +++ b/indra/viewer_components/updater/llupdatechecker.h @@ -47,6 +47,7 @@ public: std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test @@ -70,6 +71,7 @@ public: std::string mHostUrl; std::string mServicePath; std::string mChannel; + std::string mPlatform; std::string mPlatformVersion; unsigned char mUniqueId[MD5HEX_STR_SIZE]; bool mWillingToTest; @@ -78,6 +80,7 @@ public: std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test); @@ -96,6 +99,7 @@ public: std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test); diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index cac6f191df..1bd9fa4fc0 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -97,6 +97,7 @@ class LLUpdaterServiceImpl : std::string mPath; std::string mChannel; std::string mVersion; + std::string mPlatform; std::string mPlatformVersion; unsigned char mUniqueId[MD5HEX_STR_SIZE]; bool mWillingToTest; @@ -123,6 +124,7 @@ public: const std::string& path, const std::string& channel, const std::string& version, + const std::string& platform, const std::string& platform_version, const unsigned char uniqueid[MD5HEX_STR_SIZE], const bool& willing_to_test @@ -185,7 +187,8 @@ void LLUpdaterServiceImpl::initialize(const std::string& url, const std::string& path, const std::string& channel, const std::string& version, - const std::string & platform_version, + const std::string& platform, + const std::string& platform_version, const unsigned char uniqueid[MD5HEX_STR_SIZE], const bool& willing_to_test) { @@ -199,6 +202,7 @@ void LLUpdaterServiceImpl::initialize(const std::string& url, mPath = path; mChannel = channel; mVersion = version; + mPlatform = platform; mPlatformVersion = platform_version; memcpy(mUniqueId, uniqueid, MD5HEX_STR_SIZE); mWillingToTest = willing_to_test; @@ -561,7 +565,7 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) } else { - mUpdateChecker.checkVersion(mUrl, mPath, mChannel, mVersion, mPlatformVersion, mUniqueId, mWillingToTest); + mUpdateChecker.checkVersion(mUrl, mPath, mChannel, mVersion, mPlatform, mPlatformVersion, mUniqueId, mWillingToTest); setState(LLUpdaterService::CHECKING_FOR_UPDATE); } } @@ -610,12 +614,13 @@ void LLUpdaterService::initialize(const std::string& url, const std::string& path, const std::string& channel, const std::string& version, + const std::string& platform, const std::string& platform_version, const unsigned char uniqueid[MD5HEX_STR_SIZE], const bool& willing_to_test ) { - mImpl->initialize(url, path, channel, version, platform_version, uniqueid, willing_to_test); + mImpl->initialize(url, path, channel, version, platform, platform_version, uniqueid, willing_to_test); } void LLUpdaterService::setCheckPeriod(unsigned int seconds) diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h index 48d3590f1b..982f99b861 100644 --- a/indra/viewer_components/updater/llupdaterservice.h +++ b/indra/viewer_components/updater/llupdaterservice.h @@ -75,6 +75,7 @@ public: const std::string& path, const std::string& channel, const std::string& version, + const std::string& platform, const std::string& platform_version, const unsigned char uniqueid[MD5HEX_STR_SIZE], const bool& willing_to_test diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index a7b8a74b61..4812272ebc 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -48,6 +48,7 @@ void LLUpdateChecker::checkVersion(std::string const & hostUrl, std::string const & servicePath, std::string const & channel, std::string const & version, + std::string const & platform, std::string const & platform_version, unsigned char uniqueid[MD5HEX_STR_SIZE], bool willing_to_test) @@ -178,10 +179,10 @@ namespace tut try { unsigned char id1[MD5HEX_STR_SIZE] = "11111111111111111111111111111111"; - updater.initialize(test_url, "update" ,test_channel, test_version, "1.2.3", id1, true); + updater.initialize(test_url, "update" ,test_channel, test_version, "win", "1.2.3", id1, true); updater.startChecking(); unsigned char id2[MD5HEX_STR_SIZE] = "22222222222222222222222222222222"; - updater.initialize("other_url", "update", test_channel, test_version, "4.5.6", id2, true); + updater.initialize("other_url", "update", test_channel, test_version, "win", "4.5.6", id2, true); } catch(LLUpdaterService::UsageError) { @@ -196,7 +197,7 @@ namespace tut DEBUG; LLUpdaterService updater; unsigned char id[MD5HEX_STR_SIZE] = "33333333333333333333333333333333"; - updater.initialize(test_url, "update", test_channel, test_version, "7.8.9", id, true); + updater.initialize(test_url, "update", test_channel, test_version, "win", "7.8.9", id, true); updater.startChecking(); ensure(updater.isChecking()); updater.stopChecking(); From f9ef7ba13a3ee008cb958c2852dff6c8f1073ee0 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 27 Mar 2013 15:06:25 -0400 Subject: [PATCH 52/82] change login to pass only the version instead of channel+version in the version parameter (channel is passed separately) --- indra/newview/lllogininstance.cpp | 2 +- indra/newview/tests/lllogininstance_test.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index a9b7342963..71c07d6381 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -597,7 +597,7 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia request_params["read_critical"] = false; // handleTOSResponse request_params["last_exec_event"] = mLastExecEvent; request_params["mac"] = (char*)hashed_unique_id_string; - request_params["version"] = LLVersionInfo::getChannelAndVersion(); // Includes channel name + request_params["version"] = LLVersionInfo::getVersion(); request_params["channel"] = LLVersionInfo::getChannel(); request_params["platform"] = mPlatform; request_params["platform_version"] = mPlatformVersion; diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index faf46f0984..f038112fd0 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -50,7 +50,7 @@ const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid"); const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno"); const std::string VIEWERLOGIN_CHANNEL("invalid_channel"); -const std::string VIEWERLOGIN_VERSION_CHANNEL("invalid_version"); +const std::string VIEWERLOGIN_VERSION("invalid_version"); // Link seams. @@ -183,7 +183,7 @@ void LLUIColorTable::saveUserSettings(void)const {} //----------------------------------------------------------------------------- #include "../llversioninfo.h" -const std::string &LLVersionInfo::getChannelAndVersion() { return VIEWERLOGIN_VERSION_CHANNEL; } +const std::string &LLVersionInfo::getVersion() { return VIEWERLOGIN_VERSION; } const std::string &LLVersionInfo::getChannel() { return VIEWERLOGIN_CHANNEL; } //----------------------------------------------------------------------------- From 060a76daa695e8619db48bf940ea3997668702d0 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Wed, 31 Oct 2012 21:22:52 -0400 Subject: [PATCH 53/82] storm-1850: ensure that last exec event reports apply only to the same version --- indra/newview/llappviewer.cpp | 165 +++++++++++++++++++++++++--------- indra/newview/llappviewer.h | 6 +- 2 files changed, 129 insertions(+), 42 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 47a0cb02e4..e3a2fae7ef 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -338,7 +338,7 @@ BOOL gLogoutInProgress = FALSE; //////////////////////////////////////////////////////////// // Internal globals... that should be removed. static std::string gArgs; - +const int MAX_MARKER_LENGTH = 1024; const std::string MARKER_FILE_NAME("SecondLife.exec_marker"); const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker"); const std::string LLERROR_MARKER_FILE_NAME("SecondLife.llerror_marker"); @@ -652,7 +652,7 @@ LLTextureFetch* LLAppViewer::sTextureFetch = NULL; LLAppViewer::LLAppViewer() : mMarkerFile(), - mLogoutMarkerFile(NULL), + mLogoutMarkerFile(), mReportedCrash(false), mNumSessions(0), mPurgeCache(false), @@ -3290,8 +3290,8 @@ void LLAppViewer::writeSystemInfo() } // Dump some debugging info - LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") - << " version " << LLVersionInfo::getShortVersion() << LL_ENDL; + LL_INFOS("SystemInfo") << "Application: " << LLTrans::getString("APP_NAME") << LL_ENDL; + LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::getChannelAndVersion() << LL_ENDL; // Dump the local time and time zone time_t now; @@ -3417,22 +3417,27 @@ void LLAppViewer::handleViewerCrash() //we're already in a crash situation if (gDirUtilp) { - std::string crash_file_name; - if(gLLErrorActivated) crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME); - else crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME); - llinfos << "Creating crash marker file " << crash_file_name << llendl; + std::string crash_file_name = ( gLLErrorActivated ) + ? gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME) + : gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME); + LL_INFOS("MarkerFile") << "Creating crash marker file " << crash_file_name << LL_ENDL; LLAPRFile crash_file ; crash_file.open(crash_file_name, LL_APR_W); if (crash_file.getFileHandle()) { LL_INFOS("MarkerFile") << "Created crash marker file " << crash_file_name << LL_ENDL; + recordMarkerVersion(crash_file); } else { LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_file_name << LL_ENDL; } } + else + { + LL_WARNS("MarkerFile") << "No gDirUtilp with which to create error marker file name" << LL_ENDL; + } if (gMessageSystem && gDirUtilp) { @@ -3484,7 +3489,7 @@ bool LLAppViewer::anotherInstanceRunning() // If the file is currently locked, that means another process is already running. std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME); - LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL; + LL_DEBUGS("MarkerFile") << "Checking marker file '"<< marker_file << "' for lock..." << LL_ENDL; //Freeze case checks if (LLAPRFile::isExist(marker_file, NULL, LL_APR_RB)) @@ -3510,6 +3515,46 @@ bool LLAppViewer::anotherInstanceRunning() return false; } +// static +void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file) +{ + std::string marker_version(LLVersionInfo::getChannelAndVersion()); + if ( marker_version.length() > MAX_MARKER_LENGTH ) + { + LL_WARNS_ONCE("MarkerFile") << "Version length ("<< marker_version.length()<< ") greater than maximum: marker matching may be incorrect" << LL_ENDL; + } + + // record the viewer version in the marker file + marker_file.write(marker_version.data(), marker_version.length()); +} + +bool LLAppViewer::markerIsSameVersion(const std::string& marker_name) const +{ + bool sameVersion = false; + + std::string my_version(LLVersionInfo::getChannelAndVersion()); + char marker_version[MAX_MARKER_LENGTH]; + S32 marker_version_length; + + LLAPRFile marker_file; + marker_file.open(marker_name, LL_APR_RB); + if (marker_file.getFileHandle()) + { + marker_version_length = marker_file.read(marker_version, sizeof(marker_version)); + LL_DEBUGS("MarkerFile") << "Compare markers: "; + std::string marker_string(marker_version, marker_version_length); + LL_CONT << "\n mine '" << my_version << "'" + << "\n marker '" << marker_string << "'" + << LL_ENDL; + if ( 0 == my_version.compare( 0, my_version.length(), marker_version, 0, marker_version_length ) ) + { + sameVersion = true; + } + marker_file.close(); + } + return sameVersion; +} + void LLAppViewer::initMarkerFile() { //First, check for the existence of other files. @@ -3532,27 +3577,55 @@ void LLAppViewer::initMarkerFile() if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning()) { - gLastExecEvent = LAST_EXEC_FROZE; - LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL; + if ( markerIsSameVersion(mMarkerFileName) ) + { + LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found" << LL_ENDL; + gLastExecEvent = LAST_EXEC_FROZE; + } + else + { + LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL; + } } if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB)) { - gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; - LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + if (markerIsSameVersion(logout_marker_file)) + { + gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; + LL_INFOS("MarkerFile") << "Logout crashed '"<< logout_marker_file << "', setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + } + else + { + LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "' found, but versions did not match" << LL_ENDL; + } LLAPRFile::remove(logout_marker_file); } if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB)) { - if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; - else gLastExecEvent = LAST_EXEC_LLERROR_CRASH; - LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + if (markerIsSameVersion(llerror_marker_file)) + { + gLastExecEvent = ( gLastExecEvent == LAST_EXEC_LOGOUT_FROZE ) + ? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_LLERROR_CRASH; + LL_INFOS("MarkerFile") << "Last exec LLError '"<< llerror_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + } + else + { + LL_INFOS("MarkerFile") << "Last exec LLError marker '"<< llerror_marker_file << "' found, but versions did not match" << LL_ENDL; + } LLAPRFile::remove(llerror_marker_file); } if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB)) { - if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; - else gLastExecEvent = LAST_EXEC_OTHER_CRASH; - LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + if (markerIsSameVersion(error_marker_file)) + { + gLastExecEvent = (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) + ? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_OTHER_CRASH; + LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + } + else + { + LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; + } LLAPRFile::remove(error_marker_file); } @@ -3568,35 +3641,48 @@ void LLAppViewer::initMarkerFile() if (s == APR_SUCCESS && mMarkerFile.getFileHandle()) { - LL_DEBUGS("MarkerFile") << "Marker file created." << LL_ENDL; + LL_DEBUGS("MarkerFile") << "Marker file '"<< mMarkerFileName << "' created." << LL_ENDL; + if (APR_SUCCESS == apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE)) + { + recordMarkerVersion(mMarkerFile); + LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL; + } + else + { + LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; + } } else { - LL_INFOS("MarkerFile") << "Failed to create marker file." << LL_ENDL; - return; + LL_INFOS("MarkerFile") << "Failed to create marker file '"<< mMarkerFileName << "'." << LL_ENDL; } - if (apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) - { - mMarkerFile.close() ; - LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; - return; - } - - LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL; } void LLAppViewer::removeMarkerFile(bool leave_logout_marker) { - LL_DEBUGS("MarkerFile") << "removeMarkerFile()" << LL_ENDL; + LL_DEBUGS("MarkerFile") << "removeMarkerFile("<getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME); LLAPRFile outfile ; - outfile.open(mLogoutMarkerFileName, LL_APR_W); - mLogoutMarkerFile = outfile.getFileHandle() ; - if (mLogoutMarkerFile) + mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_W); + if (mLogoutMarkerFile.getFileHandle()) { - llinfos << "Created logout marker file " << mLogoutMarkerFileName << llendl; - apr_file_close(mLogoutMarkerFile); + LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << mLogoutMarkerFileName << LL_ENDL; + recordMarkerVersion(outfile); } else { - llwarns << "Cannot create logout marker file " << mLogoutMarkerFileName << llendl; + LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL; } } } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 69056074e9..c8fb023150 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -217,7 +217,9 @@ private: bool anotherInstanceRunning(); void initMarkerFile(); - + static void recordMarkerVersion(LLAPRFile& marker_file); + bool markerIsSameVersion(const std::string& marker_name) const; + void idle(); void idleShutdown(); // update avatar SLID and display name caches @@ -237,7 +239,7 @@ private: LLAPRFile mMarkerFile; // A file created to indicate the app is running. std::string mLogoutMarkerFileName; - apr_file_t* mLogoutMarkerFile; // A file created to indicate the app is running. + LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running. LLOSInfo mSysOSInfo; From 54e2d2b000f36b35ab5ab53cf3aeee922e54fbe3 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 21 Feb 2013 01:13:24 -0500 Subject: [PATCH 54/82] MAINT-2389: Change viewer to Boost package without ucontext.h. In autobuild.xml, specify today's build of the Boost package that includes the Boost.Context library, and whose boost::dcoroutines library uses Boost.Context exclusively instead of its previous context-switching underpinnings (source of the ucontext.h dependency). Add BOOST_CONTEXT_LIBRARY to Boost.cmake and Copy3rdPartyLibs.cmake. Link it with the viewer and with the lllogin.cpp test executable. Track new Boost package convention that our (early, unofficial) Boost.Coroutine library is now accessed as boost/dcoroutine/etc.h and boost::dcoroutines::etc. Remove #include from llviewerprecompiledheaders.h and lllogin.cpp: old rule that Boost.Coroutine header must be #included before anything else that might use ucontext.h is gone now that we no longer depend on ucontext.h. In fact remove -D_XOPEN_SOURCE in 00-Common.cmake because that was inserted specifically to work around a known problem with the ucontext.h facilities. --- autobuild.xml | 12 ++--- indra/cmake/00-Common.cmake | 7 +-- indra/cmake/Boost.cmake | 54 ++++++++++++++------ indra/cmake/Copy3rdPartyLibs.cmake | 5 +- indra/llcommon/llcoros.cpp | 2 +- indra/llcommon/llcoros.h | 6 +-- indra/llcommon/lleventcoro.h | 16 +++--- indra/llcommon/tests/lleventcoro_test.cpp | 12 ++--- indra/newview/CMakeLists.txt | 1 + indra/newview/llviewerprecompiledheaders.h | 2 - indra/viewer_components/login/CMakeLists.txt | 5 ++ indra/viewer_components/login/lllogin.cpp | 1 - 12 files changed, 72 insertions(+), 51 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 11c2da52dc..5df49d5a39 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -186,9 +186,9 @@ archive hash - ac37d0038c91b0672fa31a02731f0eac + d935c41632303f704bda003a463d929a url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/268347/arch/Darwin/installer/boost-1.52.0-darwin-20121218.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270616/arch/Darwin/installer/boost-1.52.0-darwin-20130220.tar.bz2 name darwin @@ -198,9 +198,9 @@ archive hash - 146ed8a8c2ef8ab3f0a6c4f214fc5c22 + 45c5f3440f2f0c36ba9f79f66f4a2e5c url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/268347/arch/Linux/installer/boost-1.52.0-linux-20121218.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270616/arch/Linux/installer/boost-1.52.0-linux-20130221.tar.bz2 name linux @@ -210,9 +210,9 @@ archive hash - 3ea60f17d986b7e8a3351298734bdca4 + b004df5ef67142a2d1efb1d60d7e2da0 url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/268347/arch/CYGWIN/installer/boost-1.52.0-windows-20121218.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270616/arch/CYGWIN/installer/boost-1.52.0-windows-20130220.tar.bz2 name windows diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 452fd5f356..084ba7ea98 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -192,12 +192,7 @@ endif (LINUX) if (DARWIN) - # NOTE (per http://lists.apple.com/archives/darwin-dev/2008/Jan/msg00232.html): - # > Why the bus error? What am I doing wrong? - # This is a known issue where getcontext(3) is writing past the end of the - # ucontext_t struct when _XOPEN_SOURCE is not defined (rdar://problem/5578699 ). - # As a workaround, define _XOPEN_SOURCE before including ucontext.h. - add_definitions(-DLL_DARWIN=1 -D_XOPEN_SOURCE) + add_definitions(-DLL_DARWIN=1) set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") set(DARWIN_extra_cstar_flags "-mlong-branch -g") diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index 1acb2bbbfd..cff762e1f0 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -7,11 +7,12 @@ set(Boost_FIND_REQUIRED ON) if (STANDALONE) include(FindBoost) + set(BOOST_CONTEXT_LIBRARY boost_context-mt) + set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) set(BOOST_REGEX_LIBRARY boost_regex-mt) set(BOOST_SIGNALS_LIBRARY boost_signals-mt) set(BOOST_SYSTEM_LIBRARY boost_system-mt) - set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt) set(BOOST_THREAD_LIBRARY boost_thread-mt) else (STANDALONE) use_prebuilt_binary(boost) @@ -20,6 +21,12 @@ else (STANDALONE) if (WINDOWS) if(MSVC80) + set(BOOST_CONTEXT_LIBRARY + optimized libboost_context-vc80-mt-${BOOST_VERSION} + debug libboost_context-vc80-mt-gd-${BOOST_VERSION}) + set(BOOST_FILESYSTEM_LIBRARY + optimized libboost_filesystem-vc80-mt-${BOOST_VERSION} + debug libboost_filesystem-vc80-mt-gd-${BOOST_VERSION}) set(BOOST_PROGRAM_OPTIONS_LIBRARY optimized libboost_program_options-vc80-mt-${BOOST_VERSION} debug libboost_program_options-vc80-mt-gd-${BOOST_VERSION}) @@ -32,59 +39,74 @@ else (STANDALONE) set(BOOST_SYSTEM_LIBRARY optimized libboost_system-vc80-mt-${BOOST_VERSION} debug libboost_system-vc80-mt-gd-${BOOST_VERSION}) - set(BOOST_FILESYSTEM_LIBRARY - optimized libboost_filesystem-vc80-mt-${BOOST_VERSION} - debug libboost_filesystem-vc80-mt-gd-${BOOST_VERSION}) + set(BOOST_THREAD_LIBRARY + optimized libboost_thread-vc80-mt-${BOOST_VERSION} + debug libboost_thread-vc80-mt-gd-${BOOST_VERSION}) else(MSVC80) # MSVC 10.0 config + set(BOOST_CONTEXT_LIBRARY + optimized libboost_context-mt + debug libboost_context-mt-gd) + set(BOOST_FILESYSTEM_LIBRARY + optimized libboost_filesystem-mt + debug libboost_filesystem-mt-gd) set(BOOST_PROGRAM_OPTIONS_LIBRARY optimized libboost_program_options-mt debug libboost_program_options-mt-gd) set(BOOST_REGEX_LIBRARY optimized libboost_regex-mt debug libboost_regex-mt-gd) + set(BOOST_SIGNALS_LIBRARY + optimized libboost_signals-mt + debug libboost_signals-mt-gd) set(BOOST_SYSTEM_LIBRARY optimized libboost_system-mt debug libboost_system-mt-gd) - set(BOOST_FILESYSTEM_LIBRARY - optimized libboost_filesystem-mt - debug libboost_filesystem-mt-gd) set(BOOST_THREAD_LIBRARY optimized libboost_thread-mt debug libboost_thread-mt-gd) endif (MSVC80) elseif (LINUX) + set(BOOST_CONTEXT_LIBRARY + optimized boost_context-mt + debug boost_context-mt-d) + set(BOOST_FILESYSTEM_LIBRARY + optimized boost_filesystem-mt + debug boost_filesystem-mt-d) set(BOOST_PROGRAM_OPTIONS_LIBRARY optimized boost_program_options-mt debug boost_program_options-mt-d) set(BOOST_REGEX_LIBRARY optimized boost_regex-mt debug boost_regex-mt-d) + set(BOOST_SIGNALS_LIBRARY + optimized boost_signals-mt + debug boost_signals-mt-d) set(BOOST_SYSTEM_LIBRARY optimized boost_system-mt debug boost_system-mt-d) - set(BOOST_FILESYSTEM_LIBRARY - optimized boost_filesystem-mt - debug boost_filesystem-mt-d) set(BOOST_THREAD_LIBRARY optimized boost_thread-mt debug boost_thread-mt-d) elseif (DARWIN) - set(BOOST_PROGRAM_OPTIONS_LIBRARY - optimized boost_program_options-mt - debug boost_program_options-mt-d) + set(BOOST_CONTEXT_LIBRARY + optimized boost_context-mt + debug boost_context-mt-d) + set(BOOST_FILESYSTEM_LIBRARY + optimized boost_filesystem-mt + debug boost_filesystem-mt-d) set(BOOST_PROGRAM_OPTIONS_LIBRARY optimized boost_program_options-mt debug boost_program_options-mt-d) set(BOOST_REGEX_LIBRARY optimized boost_regex-mt debug boost_regex-mt-d) + set(BOOST_SIGNALS_LIBRARY + optimized boost_signals-mt + debug boost_signals-mt-d) set(BOOST_SYSTEM_LIBRARY optimized boost_system-mt debug boost_system-mt-d) - set(BOOST_FILESYSTEM_LIBRARY - optimized boost_filesystem-mt - debug boost_filesystem-mt-d) set(BOOST_THREAD_LIBRARY optimized boost_thread-mt debug boost_thread-mt-d) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index c32e357da3..8457cf5359 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -254,12 +254,13 @@ elseif(LINUX) libapr-1.so.0 libaprutil-1.so.0 libatk-1.0.so + libboost_context-mt.so.${BOOST_VERSION}.0 + libboost_filesystem-mt.so.${BOOST_VERSION}.0 libboost_program_options-mt.so.${BOOST_VERSION}.0 libboost_regex-mt.so.${BOOST_VERSION}.0 - libboost_thread-mt.so.${BOOST_VERSION}.0 - libboost_filesystem-mt.so.${BOOST_VERSION}.0 libboost_signals-mt.so.${BOOST_VERSION}.0 libboost_system-mt.so.${BOOST_VERSION}.0 + libboost_thread-mt.so.${BOOST_VERSION}.0 libbreakpad_client.so.0 libcollada14dom.so libcrypto.so.1.0.0 diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 0b5829eb7e..9122704306 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -115,7 +115,7 @@ std::string LLCoros::getNameByID(const void* self_id) const // passed to us comes. for (CoroMap::const_iterator mi(mCoros.begin()), mend(mCoros.end()); mi != mend; ++mi) { - namespace coro_private = boost::coroutines::detail; + namespace coro_private = boost::dcoroutines::detail; if (static_cast(coro_private::coroutine_accessor::get_impl(const_cast(*mi->second)).get()) == self_id) { diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index d75f28ec1a..03df406b68 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -29,7 +29,7 @@ #if ! defined(LL_LLCOROS_H) #define LL_LLCOROS_H -#include +#include #include "llsingleton.h" #include #include @@ -78,8 +78,8 @@ class LL_COMMON_API LLCoros: public LLSingleton { public: - /// Canonical boost::coroutines::coroutine signature we use - typedef boost::coroutines::coroutine coro; + /// Canonical boost::dcoroutines::coroutine signature we use + typedef boost::dcoroutines::coroutine coro; /// Canonical 'self' type typedef coro::self self; diff --git a/indra/llcommon/lleventcoro.h b/indra/llcommon/lleventcoro.h index 88a5e6ec74..a42af63b65 100644 --- a/indra/llcommon/lleventcoro.h +++ b/indra/llcommon/lleventcoro.h @@ -29,8 +29,8 @@ #if ! defined(LL_LLEVENTCORO_H) #define LL_LLEVENTCORO_H -#include -#include +#include +#include #include #include #include @@ -206,13 +206,13 @@ LLSD postAndWait(SELF& self, const LLSD& event, const LLEventPumpOrPumpName& req const LLEventPumpOrPumpName& replyPump, const LLSD& replyPumpNamePath=LLSD()) { // declare the future - boost::coroutines::future future(self); + boost::dcoroutines::future future(self); // make a callback that will assign a value to the future, and listen on // the specified LLEventPump with that callback std::string listenerName(LLEventDetail::listenerNameForCoro(self)); LLTempBoundListener connection( replyPump.getPump().listen(listenerName, - voidlistener(boost::coroutines::make_callback(future)))); + voidlistener(boost::dcoroutines::make_callback(future)))); // skip the "post" part if requestPump is default-constructed if (requestPump) { @@ -257,7 +257,7 @@ namespace LLEventDetail * This helper is specifically for the two-pump version of waitForEventOn(). * We use a single future object, but we want to listen on two pumps with it. * Since we must still adapt from (the callable constructed by) - * boost::coroutines::make_callback() (void return) to provide an event + * boost::dcoroutines::make_callback() (void return) to provide an event * listener (bool return), we've adapted LLVoidListener for the purpose. The * basic idea is that we construct a distinct instance of WaitForEventOnHelper * -- binding different instance data -- for each of the pumps. Then, when a @@ -331,16 +331,16 @@ LLEventWithID postAndWait2(SELF& self, const LLSD& event, const LLSD& replyPump1NamePath=LLSD()) { // declare the future - boost::coroutines::future future(self); + boost::dcoroutines::future future(self); // either callback will assign a value to this future; listen on // each specified LLEventPump with a callback std::string name(LLEventDetail::listenerNameForCoro(self)); LLTempBoundListener connection0( replyPump0.getPump().listen(name + "a", - LLEventDetail::wfeoh(boost::coroutines::make_callback(future), 0))); + LLEventDetail::wfeoh(boost::dcoroutines::make_callback(future), 0))); LLTempBoundListener connection1( replyPump1.getPump().listen(name + "b", - LLEventDetail::wfeoh(boost::coroutines::make_callback(future), 1))); + LLEventDetail::wfeoh(boost::dcoroutines::make_callback(future), 1))); // skip the "post" part if requestPump is default-constructed if (requestPump) { diff --git a/indra/llcommon/tests/lleventcoro_test.cpp b/indra/llcommon/tests/lleventcoro_test.cpp index 901ba35b2f..8d12529613 100644 --- a/indra/llcommon/tests/lleventcoro_test.cpp +++ b/indra/llcommon/tests/lleventcoro_test.cpp @@ -64,10 +64,10 @@ // Boost.Coroutine #include is the *first* #include of the platform header. // That means that client code must generally #include Boost.Coroutine headers // before anything else. -#include +#include // Normally, lleventcoro.h obviates future.hpp. We only include this because // we implement a "by hand" test of future functionality. -#include +#include #include #include @@ -87,7 +87,7 @@ /***************************************************************************** * from the banana.cpp example program borrowed for test<1>() *****************************************************************************/ -namespace coroutines = boost::coroutines; +namespace coroutines = boost::dcoroutines; using coroutines::coroutine; template @@ -122,7 +122,7 @@ typedef coroutine match_coroutine_type; * Test helpers *****************************************************************************/ // I suspect this will be typical of coroutines used in Linden software -typedef boost::coroutines::coroutine coroutine_type; +typedef boost::dcoroutines::coroutine coroutine_type; /// Simulate an event API whose response is immediate: sent on receipt of the /// initial request, rather than after some delay. This is the case that @@ -173,10 +173,10 @@ namespace tut // ... do whatever preliminary stuff must happen ... // declare the future - boost::coroutines::future future(self); + boost::dcoroutines::future future(self); // tell the future what to wait for LLTempBoundListener connection( - LLEventPumps::instance().obtain("source").listen("coro", voidlistener(boost::coroutines::make_callback(future)))); + LLEventPumps::instance().obtain("source").listen("coro", voidlistener(boost::dcoroutines::make_callback(future)))); ensure("Not yet", ! future); // attempting to dereference ("resolve") the future causes the calling // coroutine to wait for it diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e93d73ad0e..fe7ceaeba6 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1823,6 +1823,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${viewer_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} + ${BOOST_CONTEXT_LIBRARY} ${DBUSGLIB_LIBRARIES} ${OPENGL_LIBRARIES} ${FMODWRAPPER_LIBRARY} # must come after LLAudio diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index 0316f79973..a565005f30 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -33,8 +33,6 @@ // in viewer. // It is used to precompile headers for improved build speed. -#include - #include "linden_common.h" // Work around stupid Microsoft STL warning diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index 7720619df3..28b87bf663 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -46,6 +46,11 @@ if(LL_TESTS) SET(lllogin_TEST_SOURCE_FILES lllogin.cpp ) + set_source_files_properties( + lllogin.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_CONTEXT_LIBRARY}" + ) LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") endif(LL_TESTS) diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index bdcb068200..3357ad812d 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -23,7 +23,6 @@ * $/LicenseInfo$ */ -#include #include "linden_common.h" #include "llsd.h" #include "llsdutil.h" From d8ce2ec0a019049b84239f5a0e3a34514b88d247 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 21 Feb 2013 18:57:24 -0500 Subject: [PATCH 55/82] MAINT-2389: Tell CMake viewer_components/login depends on Boost.Context This addresses a Linux link failure due to the Linux linker making a single left-to-right pass through libraries. --- indra/viewer_components/login/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index 28b87bf663..1139fecd16 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -9,6 +9,7 @@ endif(LL_TESTS) include(LLCommon) include(LLMath) include(LLXML) +include(Boost) include_directories( ${LLCOMMON_INCLUDE_DIRS} @@ -40,6 +41,7 @@ target_link_libraries(lllogin ${LLCOMMON_LIBRARIES} ${LLMATH_LIBRARIES} ${LLXML_LIBRARIES} + ${BOOST_CONTEXT_LIBRARY} ) if(LL_TESTS) From 27b01e94dd7e98415fa8ec645c37f9291f60df0b Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 21 Feb 2013 19:51:33 -0500 Subject: [PATCH 56/82] MAINT-2389: pick up new Boost build to eliminate gcc 4.1 warnings --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 5df49d5a39..4b05f5c05c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -186,9 +186,9 @@ archive hash - d935c41632303f704bda003a463d929a + 06dd7af75e1eb179aed54fd58d8688af url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270616/arch/Darwin/installer/boost-1.52.0-darwin-20130220.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270698/arch/Darwin/installer/boost-1.52.0-darwin-20130221.tar.bz2 name darwin @@ -198,9 +198,9 @@ archive hash - 45c5f3440f2f0c36ba9f79f66f4a2e5c + 50c8b50b7cced52cc5656fb44e9b12cf url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270616/arch/Linux/installer/boost-1.52.0-linux-20130221.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270698/arch/Linux/installer/boost-1.52.0-linux-20130222.tar.bz2 name linux @@ -210,9 +210,9 @@ archive hash - b004df5ef67142a2d1efb1d60d7e2da0 + 742fc9675b033df7f9c6f215ff250f6c url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270616/arch/CYGWIN/installer/boost-1.52.0-windows-20130220.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/270698/arch/CYGWIN/installer/boost-1.52.0-windows-20130221.tar.bz2 name windows From 73a2d11d4ef3d118fb1a04dd76fc3abed1ebfffa Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 25 Feb 2013 12:49:08 -0500 Subject: [PATCH 57/82] MAINT-2389: add libboost_context-m5.so.* to Linux package. Irritating how many different places we have to touch to add a library... --- indra/newview/viewer_manifest.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e7108141ee..4c95c70854 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1067,12 +1067,13 @@ class Linux_i686Manifest(LinuxManifest): self.path("libaprutil-1.so") self.path("libaprutil-1.so.0") self.path("libaprutil-1.so.0.4.1") + self.path("libboost_context-mt.so.*") + self.path("libboost_filesystem-mt.so.*") self.path("libboost_program_options-mt.so.*") self.path("libboost_regex-mt.so.*") - self.path("libboost_thread-mt.so.*") - self.path("libboost_filesystem-mt.so.*") self.path("libboost_signals-mt.so.*") self.path("libboost_system-mt.so.*") + self.path("libboost_thread-mt.so.*") self.path("libbreakpad_client.so.0.0.0") self.path("libbreakpad_client.so.0") self.path("libbreakpad_client.so") From ce0dbbd8a543a32e033eb15888259151ca113539 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 2 Apr 2013 12:57:09 -0400 Subject: [PATCH 58/82] Add reporting of last_exec_duration (and clean up logic around multiple instances) --- indra/newview/llappviewer.cpp | 109 +++++++++++++++++------------- indra/newview/llappviewer.h | 3 +- indra/newview/lllogininstance.cpp | 1 + indra/newview/lllogininstance.h | 2 + indra/newview/llstartup.cpp | 2 + 5 files changed, 70 insertions(+), 47 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e3a2fae7ef..effe7b7490 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -270,6 +270,7 @@ BOOL gShowObjectUpdates = FALSE; BOOL gUseQuickTime = TRUE; eLastExecEvent gLastExecEvent = LAST_EXEC_NORMAL; +S32 gLastExecDuration = -1; // (<0 indicates unknown) #if LL_WINDOWS # define LL_PLATFORM_KEY "win" @@ -340,6 +341,7 @@ BOOL gLogoutInProgress = FALSE; static std::string gArgs; const int MAX_MARKER_LENGTH = 1024; const std::string MARKER_FILE_NAME("SecondLife.exec_marker"); +const std::string START_MARKER_FILE_NAME("SecondLife.start_marker"); const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker"); const std::string LLERROR_MARKER_FILE_NAME("SecondLife.llerror_marker"); const std::string LOGOUT_MARKER_FILE_NAME("SecondLife.logout_marker"); @@ -2112,7 +2114,7 @@ void errorCallback(const std::string &error_string) LLError::crashAndLoop(error_string); } -bool LLAppViewer::initLogging() +void LLAppViewer::initLogging() { // // Set up logging defaults for the viewer @@ -2126,17 +2128,46 @@ bool LLAppViewer::initLogging() "SecondLife.old"); LLFile::remove(old_log_file); - // Rename current log file to ".old" + // Get name of the log file std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log"); + /* + * Before touching any log files, compute the duration of the last run + * by comparing the ctime of the previous start marker file with the ctime + * of the last log file. + */ + std::string start_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, START_MARKER_FILE_NAME); + llstat start_marker_stat; + llstat log_file_stat; + if ( 0 == LLFile::stat(start_marker_file_name, &start_marker_stat) + && 0 == LLFile::stat(log_file, &log_file_stat) + ) + { + int elapsed_seconds = log_file_stat.st_ctime - start_marker_stat.st_ctime; + // only report a last run time if the last viewer was the same version + // because this stat will be counted against this version + gLastExecDuration = markerIsSameVersion(start_marker_file_name) ? elapsed_seconds : -1; + } + else + { + // at least one of the LLFile::stat calls failed, so we can't compute the run time + gLastExecDuration = -1; // unknown + } + + // Create a new start marker file for comparison with log file time for the next run + LLAPRFile start_marker_file ; + start_marker_file.open(start_marker_file_name, LL_APR_W); + if (start_marker_file.getFileHandle()) + { + recordMarkerVersion(start_marker_file); + start_marker_file.close(); + } + + // Rename current log file to ".old" LLFile::rename(log_file, old_log_file); // Set the log file to SecondLife.log - LLError::logToFile(log_file); - - // *FIX:Mani no error handling here! - return true; } bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, @@ -2711,51 +2742,37 @@ bool LLAppViewer::initConfiguration() } } - if (!gSavedSettings.getBOOL("AllowMultipleViewers")) + // + // Check for another instance of the app running + // + mSecondInstance = anotherInstanceRunning(); + if (mSecondInstance && !gSavedSettings.getBOOL("AllowMultipleViewers")) { - // - // Check for another instance of the app running - // + std::ostringstream msg; + msg << LLTrans::getString("MBAlreadyRunning"); + OSMessageBox( + msg.str(), + LLStringUtil::null, + OSMB_OK); + return false; + } - mSecondInstance = anotherInstanceRunning(); - - if (mSecondInstance) - { - std::ostringstream msg; - msg << LLTrans::getString("MBAlreadyRunning"); - OSMessageBox( - msg.str(), - LLStringUtil::null, - OSMB_OK); - return false; - } - - initMarkerFile(); + initMarkerFile(); - checkForCrash(); - } + if (mSecondInstance) + { + // This is the second instance of SL. Turn off voice support, + // but make sure the setting is *not* persisted. + LLControlVariable* disable_voice = gSavedSettings.getControl("CmdLineDisableVoice"); + if(disable_voice) + { + const BOOL DO_NOT_PERSIST = FALSE; + disable_voice->setValue(LLSD(TRUE), DO_NOT_PERSIST); + } + } else { - mSecondInstance = anotherInstanceRunning(); - - if (mSecondInstance) - { - // This is the second instance of SL. Turn off voice support, - // but make sure the setting is *not* persisted. - LLControlVariable* disable_voice = gSavedSettings.getControl("CmdLineDisableVoice"); - if(disable_voice) - { - const BOOL DO_NOT_PERSIST = FALSE; - disable_voice->setValue(LLSD(TRUE), DO_NOT_PERSIST); - } - } - - initMarkerFile(); - - if(!mSecondInstance) - { - checkForCrash(); - } + checkForCrash(); } // NextLoginLocation is set from the command line option diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index c8fb023150..84cfcf6922 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -183,7 +183,7 @@ public: protected: virtual bool initWindow(); // Initialize the viewer's window. - virtual bool initLogging(); // Initialize log files, logging system, return false on failure. + virtual void initLogging(); // Initialize log files, logging system virtual void initConsole() {}; // Initialize OS level debugging console. virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit. virtual bool initSLURLHandler(); @@ -323,6 +323,7 @@ typedef enum } eLastExecEvent; extern eLastExecEvent gLastExecEvent; // llstartup +extern S32 gLastExecDuration; ///< the duration of the previous run in seconds (<0 indicates unknown) extern const char* gPlatform; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 71c07d6381..977c50682f 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -596,6 +596,7 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia request_params["agree_to_tos"] = false; // Always false here. Set true in request_params["read_critical"] = false; // handleTOSResponse request_params["last_exec_event"] = mLastExecEvent; + request_params["last_exec_duration"] = mLastExecDuration; request_params["mac"] = (char*)hashed_unique_id_string; request_params["version"] = LLVersionInfo::getVersion(); request_params["channel"] = LLVersionInfo::getChannel(); diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 83191e50bd..b0247da7c8 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -66,6 +66,7 @@ public: void setSkipOptionalUpdate(bool state) { mSkipOptionalUpdate = state; } void setSerialNumber(const std::string& sn) { mSerialNumber = sn; } void setLastExecEvent(int lee) { mLastExecEvent = lee; } + void setLastExecDuration(S32 duration) { mLastExecDuration = duration; } void setPlatformInfo(const std::string platform, const std::string platform_version); void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; } @@ -100,6 +101,7 @@ private: F64 mTransferRate; std::string mSerialNumber; int mLastExecEvent; + S32 mLastExecDuration; std::string mPlatform; std::string mPlatformVersion; UpdaterLauncherCallback mUpdaterLauncher; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 37e6ded986..f52aedda9f 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -26,6 +26,7 @@ #include "llviewerprecompiledheaders.h" +#include "llappviewer.h" #include "llstartup.h" #if LL_WINDOWS @@ -1043,6 +1044,7 @@ bool idle_startup() login->setSerialNumber(LLAppViewer::instance()->getSerialNumber()); login->setLastExecEvent(gLastExecEvent); + login->setLastExecDuration(gLastExecDuration); login->setUpdaterLauncher(boost::bind(&LLAppViewer::launchUpdater, LLAppViewer::instance())); // This call to LLLoginInstance::connect() starts the From e20099155378fd10f7997e36ae8ef150c8c5ad91 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 2 Apr 2013 15:01:25 -0400 Subject: [PATCH 59/82] change initLogging virtual functions to void (returns were ignored anyway) --- indra/newview/llappviewerlinux.cpp | 4 ++-- indra/newview/llappviewerlinux.h | 2 +- indra/newview/llappviewerwin32.cpp | 4 ++-- indra/newview/llappviewerwin32.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 8695652168..5f98fd0a34 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -440,7 +440,7 @@ bool LLAppViewerLinux::beingDebugged() #endif } -bool LLAppViewerLinux::initLogging() +void LLAppViewerLinux::initLogging() { // Remove the last stack trace, if any // This file is no longer created, since the move to Google Breakpad @@ -449,7 +449,7 @@ bool LLAppViewerLinux::initLogging() gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); LLFile::remove(old_stack_file); - return LLAppViewer::initLogging(); + LLAppViewer::initLogging(); } bool LLAppViewerLinux::initParseCommandLine(LLCommandLineParser& clp) diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h index 58e5160180..b30977acb3 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -63,7 +63,7 @@ protected: virtual bool restoreErrorTrap(); virtual void handleCrashReporting(bool reportFreeze); - virtual bool initLogging(); + virtual void initLogging(); virtual bool initParseCommandLine(LLCommandLineParser& clp); virtual bool initSLURLHandler(); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 8326be433e..786ceb453c 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -509,9 +509,9 @@ bool LLAppViewerWin32::cleanup() return result; } -bool LLAppViewerWin32::initLogging() +void LLAppViewerWin32::initLogging() { - return LLAppViewer::initLogging(); + LLAppViewer::initLogging(); } void LLAppViewerWin32::initConsole() diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 67594aea48..d95174dd1d 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -44,7 +44,7 @@ public: virtual bool cleanup(); protected: - virtual bool initLogging(); // Override to clean stack_trace info. + virtual void initLogging(); // Override to clean stack_trace info. virtual void initConsole(); // Initialize OS level debugging console. virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware. virtual bool initParseCommandLine(LLCommandLineParser& clp); From c822d0ec9f5897dcef3a090913aa1fc0e2a74265 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 25 Apr 2013 17:03:49 -0400 Subject: [PATCH 60/82] increment viewer version number to 3.5.2 (in new file) --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index d5c0c99142..87ce492908 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.5.1 +3.5.2 From 2ef8fc41e74b6949e02a7715b2b8399094ebd3ea Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Thu, 25 Apr 2013 18:47:28 -0400 Subject: [PATCH 61/82] Added tag 3.5.2-beta1 for changeset 106f19cc011a --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 99d32fd069..0b94d2d0a6 100755 --- a/.hgtags +++ b/.hgtags @@ -444,3 +444,4 @@ adc360e6bf21390d2665380951d85937cd29a604 3.5.0-release 4b7fa963b80e2056ab648f83a4d61310b3cedb3d DRTVWR-314 65ae89aeb7ea674a555e439e963f17949322ac94 3.5.1-beta3 c2b1066514308dff1eeb91162392dfe08bf1c0fe DRTVWR-309 +106f19cc011aafdfc9a6d12b641fe8db6e9735a7 3.5.2-beta1 From ca7de31a6c5031bb928d283362e96bb63e37ce85 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 29 Apr 2013 14:34:29 -0400 Subject: [PATCH 62/82] MAINT-2613: remove duplicate entry for "DisablePrecacheDelayAfterTeleporting", and fix a few other llsd validity problems --- indra/newview/app_settings/settings.xml | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3281d347a7..02fada3761 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11194,7 +11194,7 @@ Type F32 Value - 0.0 + 0.0 TextureFetchUpdateSkipLowPriority @@ -12833,6 +12833,7 @@ Type LLSD Value + VFSOldSize @@ -13459,7 +13460,7 @@ Type F32 Value - -1.0 + -1.0 ForcePeriodicRenderingTime @@ -13470,7 +13471,7 @@ Type F32 Value - -1.0 + -1.0 ZoomDirect @@ -14501,16 +14502,5 @@ Value 7000 - DisablePrecacheDelayAfterTeleporting - - Comment - Disables the artificial delay in the viewer that precaches some incoming assets - Persist - 0 - Type - Boolean - Value - 0 - From 2bcc75470dc8a6833a0d75ee7aa6205a67eb1564 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Tue, 30 Apr 2013 14:19:34 -0400 Subject: [PATCH 63/82] Override default channel from buildscripts project --- BuildParams | 1 + 1 file changed, 1 insertion(+) diff --git a/BuildParams b/BuildParams index b91d3d2a80..a4b361261f 100755 --- a/BuildParams +++ b/BuildParams @@ -44,6 +44,7 @@ Linux.cxx_version = /usr/bin/g++-4.6 # All Linden Lab builds (and only Linden Lab builds) # should use a viewer_channel that begins with "Second Life" ################################################################ +viewer_channel = "Second Life Test" # Report changes since... viewer-development.show_changes_since = last_sprint From 5d50e2d02d7e7c63b47df1b5208ff759987068b1 Mon Sep 17 00:00:00 2001 From: callum_linden Date: Tue, 30 Apr 2013 11:27:08 -0700 Subject: [PATCH 64/82] MAINT-2640 Fix for Wrong name of the checkbox Pathfinding view/test floater. --- .../skins/default/xui/en/floater_pathfinding_console.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml index 79f2027c31..2629313069 100755 --- a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml @@ -152,7 +152,7 @@ Date: Tue, 30 Apr 2013 16:04:41 -0700 Subject: [PATCH 65/82] MAINT-2646 Viewer should neither grant nor display prompts for unimplemented LSL permissions * Add the newer run time permissions to the viewer * Filter requested permissions by those the viewer knows about * Show a dialog indicating unknown permissions were requested and a new viewer will be needed to grant them. reviewed with Simon and Soft --- indra/lscript/lscript_byteformat.h | 8 +++ indra/newview/app_settings/keywords.ini | 3 + indra/newview/llviewermessage.cpp | 64 ++++++++++++------- .../skins/default/xui/en/notifications.xml | 23 ++++++- .../newview/skins/default/xui/en/strings.xml | 7 +- 5 files changed, 79 insertions(+), 26 deletions(-) diff --git a/indra/lscript/lscript_byteformat.h b/indra/lscript/lscript_byteformat.h index a294def734..54031aaf05 100644 --- a/indra/lscript/lscript_byteformat.h +++ b/indra/lscript/lscript_byteformat.h @@ -530,6 +530,10 @@ typedef enum e_lscript_runtime_permissions SCRIPT_PERMISSION_TRACK_CAMERA, SCRIPT_PERMISSION_CONTROL_CAMERA, SCRIPT_PERMISSION_TELEPORT, + SCRIPT_PERMISSION_EXPERIENCE, + SCRIPT_PERMISSION_SILENT_ESTATE_MANAGEMENT, + SCRIPT_PERMISSION_OVERRIDE_ANIMATIONS, + SCRIPT_PERMISSION_RETURN_OBJECTS, SCRIPT_PERMISSION_EOF } LSCRIPTRunTimePermissions; @@ -547,6 +551,10 @@ const U32 LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_EOF] = (0x1 << 10),// SCRIPT_PERMISSION_TRACK_CAMERA (0x1 << 11),// SCRIPT_PERMISSION_CONTROL_CAMERA (0x1 << 12),// SCRIPT_PERMISSION_TELEPORT + (0x1 << 13),// SCRIPT_PERMISSION_EXPERIENCE, + (0x1 << 14),// SCRIPT_PERMISSION_SILENT_ESTATE_MANAGEMENT, + (0x1 << 15),// SCRIPT_PERMISSION_OVERRIDE_ANIMATIONS, + (0x1 << 16),// SCRIPT_PERMISSION_RETURN_OBJECTS, }; // http_request string constants diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 6120f22ba4..f0d8b77afd 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -92,6 +92,9 @@ PERMISSION_CHANGE_LINKS Passed to llRequestPermissions library function to req PERMISSION_TRACK_CAMERA Passed to llRequestPermissions library function to request permission to track agent's camera PERMISSION_CONTROL_CAMERA Passed to llRequestPermissions library function to request permission to change agent's camera PERMISSION_TELEPORT Passed to llRequestPermissions library function to request permission to teleport agent +SCRIPT_PERMISSION_SILENT_ESTATE_MANAGEMENT Passed to llRequestPermissions library function to request permission to silently modify estate access lists +PERMISSION_OVERRIDE_ANIMATIONS Passed to llRequestPermissions library function to request permission to override animations on agent +PERMISSION_RETURN_OBJECTS Passed to llRequestPermissions library function to request permission to return objects DEBUG_CHANNEL Chat channel reserved for debug and error messages from scripts PUBLIC_CHANNEL Chat channel that broadcasts to all nearby users diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 3c0d6189ac..4efe345141 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -163,7 +163,11 @@ const std::string SCRIPT_QUESTIONS[SCRIPT_PERMISSION_EOF] = "ChangePermissions", "TrackYourCamera", "ControlYourCamera", - "TeleportYourAgent" + "TeleportYourAgent", + "JoinAnExperience", + "SilentlyManageEstateAccess", + "OverrideYourAnimations", + "ScriptReturnObjects" }; const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = @@ -179,7 +183,11 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = FALSE, // ChangePermissions FALSE, // TrackYourCamera, FALSE, // ControlYourCamera - FALSE // TeleportYourAgent + FALSE, // TeleportYourAgent + FALSE, // JoinAnExperience + FALSE, // SilentlyManageEstateAccess + FALSE, // OverrideYourAnimations + FALSE, // ScriptReturnObjects }; bool friendship_offer_callback(const LLSD& notification, const LLSD& response) @@ -6424,7 +6432,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data) LLSD args; args["OBJECTNAME"] = object_name; args["NAME"] = LLCacheName::cleanFullName(owner_name); - + S32 known_questions = 0; BOOL has_not_only_debit = questions ^ LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_DEBIT]; // check the received permission flags against each permission for (S32 i = 0; i < SCRIPT_PERMISSION_EOF; i++) @@ -6432,7 +6440,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data) if (questions & LSCRIPTRunTimePermissionBits[i]) { count++; - + known_questions |= LSCRIPTRunTimePermissionBits[i]; // check whether permission question should cause special caution dialog caution |= (SCRIPT_QUESTION_IS_CAUTION[i]); @@ -6442,32 +6450,40 @@ void process_script_question(LLMessageSystem *msg, void **user_data) script_question += " " + LLTrans::getString(SCRIPT_QUESTIONS[i]) + "\n"; } } + args["QUESTIONS"] = script_question; - LLSD payload; - payload["task_id"] = taskid; - payload["item_id"] = itemid; - payload["sender"] = sender.getIPandPort(); - payload["questions"] = questions; - payload["object_name"] = object_name; - payload["owner_name"] = owner_name; - - // check whether cautions are even enabled or not - if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) + if (known_questions != questions) + { // This is in addition to the normal dialog. + LLNotificationsUtil::add("UnknownScriptQuestion",args); + } + + if (known_questions) { - if (caution) + LLSD payload; + payload["task_id"] = taskid; + payload["item_id"] = itemid; + payload["sender"] = sender.getIPandPort(); + payload["questions"] = known_questions; + payload["object_name"] = object_name; + payload["owner_name"] = owner_name; + + // check whether cautions are even enabled or not + if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) { - args["FOOTERTEXT"] = (count > 1) ? LLTrans::getString("AdditionalPermissionsRequestHeader") + "\n\n" + script_question : ""; + if (caution) + { + args["FOOTERTEXT"] = (count > 1) ? LLTrans::getString("AdditionalPermissionsRequestHeader") + "\n\n" + script_question : ""; + } + // display the caution permissions prompt + LLNotificationsUtil::add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload); + } + else + { + // fall back to default behavior if cautions are entirely disabled + LLNotificationsUtil::add("ScriptQuestion", args, payload); } - // display the caution permissions prompt - LLNotificationsUtil::add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload); } - else - { - // fall back to default behavior if cautions are entirely disabled - LLNotificationsUtil::add("ScriptQuestion", args, payload); - } - } } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 105bef7321..1f39ec041e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6863,8 +6863,29 @@ Do not allow access if you do not fully understand why it wants access to your a [FOOTERTEXT] + + + '<nolink>[OBJECTNAME]</nolink>', an object owned by '[NAME]', requested an unknown script runtime permission. - confirm +
    +