diff options
| -rw-r--r-- | .hgtags | 122 | ||||
| -rw-r--r-- | indra/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | indra/linux_updater/CMakeLists.txt | 51 | ||||
| -rw-r--r-- | indra/linux_updater/linux_updater.cpp | 926 | ||||
| -rw-r--r-- | indra/llcommon/llversionviewer.h | 2 | ||||
| -rw-r--r-- | indra/llcorehttp/_httpoprequest.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/newview/llfloatertexturefetchdebugger.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/lltexturefetch.cpp | 54 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.h | 2 | ||||
| -rw-r--r-- | indra/newview/viewer_manifest.py | 14 | ||||
| -rw-r--r-- | indra/viewer_components/updater/scripts/linux/update_install | 219 | 
12 files changed, 320 insertions, 1085 deletions
| @@ -72,35 +72,35 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release  461c8c65b5c799ddfe365422f9be9c0095d91e7d 2.6.0-beta1-tip  9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2  9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2 +42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release +42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release  c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1  c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start  c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1 +c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release +c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release  56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start  d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1  d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1 -42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release -42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release -c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release -c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release +214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release +214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release  52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py  ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start  d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1  d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1  0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2  0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2 +8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release +8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release  3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work -214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release -214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release  7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1  7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1 -8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release -8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release  800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start  bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1  bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1 -5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start  dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release  dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release +5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start  beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1  beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1  be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release @@ -119,50 +119,50 @@ e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start  9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start  e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1  e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1 -6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start  fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release  fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release  fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release  fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release +6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start  6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start  be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1  be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1 +057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release +057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release  19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start  09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1  09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1 +6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release +6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release  e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1  e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start  e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1 -057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release -057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release -6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release -6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release +493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release +493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release  502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start  2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1  2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1 -493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release -493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release -54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start -ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start  29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release  29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release  4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix  4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix +54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start +ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start  599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1  599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1 +fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release +fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release  6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start  b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1  b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1 -fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release -fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release +1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release +1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release  82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start  364fd63517fbacbbcb9129d096187171ba8c9e48 3.0.1-beta1  364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1  f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start  42784bf50fa01974bada2a1af3892ee09c93fcda 3.0.2-beta1  42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1 -1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release -1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release  e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2  e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2  b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start @@ -170,9 +170,9 @@ b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start  6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1  61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2  61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2 -586907287be581817b2422b5137971b22d54ea48 3.0.4-start  0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release  0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release +586907287be581817b2422b5137971b22d54ea48 3.0.4-start  92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start  c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start  2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1 @@ -193,11 +193,11 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1  c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start  9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1  9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1 +a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release +a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release  40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start  523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1  523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1 -a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release -a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release  80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start  3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1  3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start @@ -248,57 +248,67 @@ bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156  6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148  2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155  24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153 +a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159 +9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157  5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160  f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1  f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144 -2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164 +089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161  600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162 +c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163 +2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164  80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165  fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2  af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169  4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3  6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release -a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159 -9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157 -089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161 -c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163  b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171  050e48759337249130f684b4a21080b683f61732 DRTVWR-168  09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170  f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158  f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1 +005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167  bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173  cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174  82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2  57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176  eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177  a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3 +888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175  4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180  5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183  6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4  9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184  ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5  28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release -005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167 -888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175  a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182  1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1 -9ee9387789701d597130f879d9011a4958753862 DRTVWR-189 +81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186  47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190 +cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181 +c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188 +9ee9387789701d597130f879d9011a4958753862 DRTVWR-189  421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192 +4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191  33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195  e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193 +78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194  7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196  ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198  507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197  b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2  37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200  182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3 +248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203  6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199  7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2  7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201  84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4 +de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202  573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5 +34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag +6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205 +7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206  8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207  351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3  af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212 @@ -309,6 +319,7 @@ ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215  97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release  5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1  b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a +b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219  2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220  0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221  e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3 @@ -333,36 +344,31 @@ baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236  b2f21e3442542283a80e7eaebae9f833e5a927b6 DRTVWR-237  3f9be82de642d468c5fc272cb9d96b46b5498402 3.4.1-beta12  e59ffd3fe0838ae6b09b242a6e9df71761b88f41 3.4.1-release -81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186 -cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181 -c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188 -4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191 -78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194 -248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203 -de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202 -34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag -6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205 -7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206 -b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219  32896d5e920ca9a29256ff3b747c2e99752aa5ae DRTVWR-217  704bbae7b182a1f2811a47a054e680522966f54a 3.4.2-beta1 +d799593b53ed733862e9a13871e318e886469377 DRTVWR-208 +e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223  288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216  e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2 +93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240  0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242  710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3 -e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243 -73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4 -16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release -d799593b53ed733862e9a13871e318e886469377 DRTVWR-208 -e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223 -93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240  2aa72e3372a83dece4df9cf72fb1e7c34f90b5e3 DRTVWR-209  f7bedce18ad52283e6072814db23318907261487 DRTVWR-238  7b64c96fbcadf360bd2feaae19d330166b70877c DRTVWR-210 +e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243 +73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4 +16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release  5e4e4128b256525bafc07a62e35ae8527aaa9c9d DRTVWR-241  f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232  4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245  94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1 +4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229 +f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246 +39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247 +7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249 +f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230 +b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255  965b9a35e260c0f53be1a25f0db7abc8a67eaf47 DRTVWR-252  bb10adc4f76cf0067fca7075146f00cdc0740e9d DRTVWR-251  ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253 @@ -371,31 +377,25 @@ ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253  44e764a6ac9e672a4f3bce821a4b6a218590c374 DRTVWR-258  c23d734065ed593b2413385aecd8366d8e0ee96b DRTVWR-257  452ce96d4046dc05a3ecaecc203e2cc8ddd72e76 DRTVWR-259 +9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260  daca610d840625b5bebb966a57cb49581852c417 DRTVWR-265  9afbdc4e24cc04feacfb2b7a10b78a64f780901a DRTVWR-266  73280db02501f5ad041fc18b1eba68e73a81996c DRTVWR-267  870e2d79e0063fda87187f17bbc2747766733194 3.4.3-beta3  0a2ca6546b499239afeb66d17b2fadbcdbe36ab1 3.4.3-release -4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229 -f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246 -39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247 -7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249 -f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230 -b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255 -9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260  84fbaf2d4141bd161731430e760949dc787ca206 DRTVWR-244  083d2d36b5bb1c54fc3dd7caac0e7ac381a9cef0 3.4.4-beta1 +391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268  b634dec987c16e8c9c938e11e52591d9ead8fa9b DRTVWR-270  cd39255bd23330fd30c04105f2811e941d8524fe 3.4.4-beta2  2c4011bbc2b15b82198fd8b51f3a9fe765a08c4d DRTVWR-271  2f8a3ef687bc55828abcb17ac1ad7cde70536d7e 3.4.4-beta3  35cfd4cf5b895fa776592f2e630e330be7f0604e DRTVWR-273 +a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272 +37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269  c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275  05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4  e1bb1ae7d8b12faeb37933a737c199cc9b9f89cc 3.4.4-release -391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268 -a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272 -37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269  7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250  b9ff9730daa53a541925300cbd02bb14575a5705 DRTVWR-277  af6b711a97073431953b55ee808aaa09900c27e5 DRTVWR-276 @@ -405,5 +405,7 @@ c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280  5df4802bec93c8d0a509946d826bb4c50c5442ec DRTVWR-281  7c1c33ba4cfd2d15ca51cc1ac440eca551331a4a DRTVWR-283  6b9c7dbebef793230d64e1b452577c8b142d4143 3.4.5-beta2 +37947e4f771f001b551581bf7cd0051c3153beed DRTVWR-282 +6482cceb91cda68b799f3e6cdc66d33bf123547a DRTVWR-284  ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286  2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287 diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 24c98bfada..001bb4b935 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -82,8 +82,7 @@ if (VIEWER)    if (LINUX)      add_subdirectory(${VIEWER_PREFIX}linux_crash_logger) -    add_subdirectory(${VIEWER_PREFIX}linux_updater) -    add_dependencies(viewer linux-crash-logger-strip-target linux-updater) +    add_dependencies(viewer linux-crash-logger-strip-target)    elseif (DARWIN)      add_subdirectory(${VIEWER_PREFIX}mac_crash_logger)      add_subdirectory(${VIEWER_PREFIX}mac_updater) diff --git a/indra/linux_updater/CMakeLists.txt b/indra/linux_updater/CMakeLists.txt deleted file mode 100644 index 4377a6333c..0000000000 --- a/indra/linux_updater/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -# -*- cmake -*- - -project(linux_updater) - -include(00-Common) -include(CURL) -include(CARes) -include(OpenSSL) -include(UI) -include(LLCommon) -include(LLVFS) -include(LLXML) -include(LLUI) -include(Linking) - -include_directories( -    ${LLCOMMON_INCLUDE_DIRS} -    ${LLVFS_INCLUDE_DIRS} -    ${LLXML_INCLUDE_DIRS} -    ${LLUI_INCLUDE_DIRS} -    ${CURL_INCLUDE_DIRS} -    ${CARES_INCLUDE_DIRS} -    ${OPENSSL_INCLUDE_DIRS} -    ${UI_INCLUDE_DIRS} -    ) - -set(linux_updater_SOURCE_FILES linux_updater.cpp) - -set(linux_updater_HEADER_FILES CMakeLists.txt) - -set_source_files_properties(${linux_updater_HEADER_FILES} -                            PROPERTIES HEADER_FILES_ONLY TRUE) - -list(APPEND linux_updater_SOURCE_FILES ${linux_updater_HEADER_FILES}) - -add_executable(linux-updater ${linux_updater_SOURCE_FILES}) - -target_link_libraries(linux-updater -    ${CURL_LIBRARIES} -    ${CARES_LIBRARIES} -    ${OPENSSL_LIBRARIES} -    ${CRYPTO_LIBRARIES} -    ${UI_LIBRARIES} -    ${LLXML_LIBRARIES} -    ${LLUI_LIBRARIES} -    ${LLVFS_LIBRARIES} -    ${LLCOMMON_LIBRARIES} -    ) - -add_custom_target(linux-updater-target ALL -                  DEPENDS linux-updater) diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp deleted file mode 100644 index 991dfd9dce..0000000000 --- a/indra/linux_updater/linux_updater.cpp +++ /dev/null @@ -1,926 +0,0 @@ -/** - * @file linux_updater.cpp - * @author Kyle Ambroff <ambroff@lindenlab.com>, Tofu Linden - * @brief Viewer update program for unix platforms that support GTK+ - * - * $LicenseInfo:firstyear=2008&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 <unistd.h> -#include <signal.h> -#include <errno.h> - -#include "linden_common.h" -#include "llerrorcontrol.h" -#include "llfile.h" -#include "lldir.h" -#include "lldiriterator.h" - -/*==========================================================================*| -// IQA-490: Use of LLTrans -- by this program at least -- appears to be buggy. -// With it, the 3.3.2 beta 1 linux-updater.bin crashes; without it seems stable. -#include "llxmlnode.h" -#include "lltrans.h" -|*==========================================================================*/ - -static class LLTrans -{ -public: -	LLTrans(); -	static std::string getString(const std::string& key); - -private: -	std::string _getString(const std::string& key) const; - -	typedef std::map<std::string, std::string> MessageMap; -	MessageMap mMessages; -} sLLTransInstance; - -#include <curl/curl.h> -#include <map> -#include <boost/foreach.hpp> - -extern "C" { -#include <gtk/gtk.h> -} - -const guint UPDATE_PROGRESS_TIMEOUT = 100; -const guint UPDATE_PROGRESS_TEXT_TIMEOUT = 1000; -const guint ROTATE_IMAGE_TIMEOUT = 8000; - -typedef struct _updater_app_state { -	std::string app_name; -	std::string url; -	std::string file; -	std::string image_dir; -	std::string dest_dir; -	std::string strings_dirs; -	std::string strings_file; - -	LLDirIterator *image_dir_iter; - -	GtkWidget *window; -	GtkWidget *progress_bar; -	GtkWidget *image; - -	double progress_value; -	bool activity_mode; - -	guint image_rotation_timeout_id; -	guint progress_update_timeout_id; -	guint update_progress_text_timeout_id; - -	bool failure; -} UpdaterAppState; - -// List of entries from strings.xml to always replace -static std::set<std::string> default_trans_args; -void init_default_trans_args() -{ -        default_trans_args.insert("SECOND_LIFE"); // World -        default_trans_args.insert("APP_NAME"); -        default_trans_args.insert("SECOND_LIFE_GRID"); -        default_trans_args.insert("SUPPORT_SITE"); -} - -bool translate_init(std::string comma_delim_path_list, -		    std::string base_xml_name) -{ -	return true; -/*==========================================================================*| -	init_default_trans_args(); - -	// extract paths string vector from comma-delimited flat string -	std::vector<std::string> paths; -	LLStringUtil::getTokens(comma_delim_path_list, paths, ","); // split over ',' - -	for(std::vector<std::string>::iterator it = paths.begin(), end_it = paths.end(); -		it != end_it; -		++it) -	{ -		(*it) = gDirUtilp->findSkinnedFilename(*it, base_xml_name); -	} - -	// suck the translation xml files into memory -	LLXMLNodePtr root; -	bool success = LLXMLNode::getLayeredXMLNode(root, paths); -	if (!success) -	{ -		// couldn't load string table XML -		return false; -	} -	else -	{ -		// get those strings out of the XML -		LLTrans::parseStrings(root, default_trans_args); -		return true; -	} -|*==========================================================================*/ -} - - -void updater_app_ui_init(void); -void updater_app_quit(UpdaterAppState *app_state); -void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state); -std::string next_image_filename(std::string& image_path, LLDirIterator& iter); -void display_error(GtkWidget *parent, std::string title, std::string message); -BOOL install_package(std::string package_file, std::string destination); -BOOL spawn_viewer(UpdaterAppState *app_state); - -extern "C" { -	void on_window_closed(GtkWidget *sender, GdkEvent *event, gpointer state); -	gpointer worker_thread_cb(gpointer *data); -	int download_progress_cb(gpointer data, double t, double d, double utotal, double ulnow); -	gboolean rotate_image_cb(gpointer data); -	gboolean progress_update_timeout(gpointer data); -	gboolean update_progress_text_timeout(gpointer data); -} - -void updater_app_ui_init(UpdaterAppState *app_state) -{ -	GtkWidget *vbox; -	GtkWidget *summary_label; -	GtkWidget *description_label; -	GtkWidget *frame; - -	llassert(app_state != NULL); - -	// set up window and main container -	std::string window_title = LLTrans::getString("UpdaterWindowTitle"); -	app_state->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); -	gtk_window_set_title(GTK_WINDOW(app_state->window), -			     window_title.c_str()); -	gtk_window_set_resizable(GTK_WINDOW(app_state->window), FALSE); -	gtk_window_set_position(GTK_WINDOW(app_state->window), -				GTK_WIN_POS_CENTER_ALWAYS); - -	gtk_container_set_border_width(GTK_CONTAINER(app_state->window), 12); -	g_signal_connect(G_OBJECT(app_state->window), "delete-event", -			 G_CALLBACK(on_window_closed), app_state); - -	vbox = gtk_vbox_new(FALSE, 6); -	gtk_container_add(GTK_CONTAINER(app_state->window), vbox); - -	// set top label -	std::ostringstream label_ostr; -	label_ostr << "<big><b>" -		   << LLTrans::getString("UpdaterNowUpdating") -		   << "</b></big>"; - -	summary_label = gtk_label_new(NULL); -	gtk_label_set_use_markup(GTK_LABEL(summary_label), TRUE); -	gtk_label_set_markup(GTK_LABEL(summary_label), -			     label_ostr.str().c_str()); -	gtk_misc_set_alignment(GTK_MISC(summary_label), 0, 0.5); -	gtk_box_pack_start(GTK_BOX(vbox), summary_label, FALSE, FALSE, 0); - -	// create the description label -	description_label = gtk_label_new(LLTrans::getString("UpdaterUpdatingDescriptive").c_str()); -	gtk_label_set_line_wrap(GTK_LABEL(description_label), TRUE); -	gtk_misc_set_alignment(GTK_MISC(description_label), 0, 0.5); -	gtk_box_pack_start(GTK_BOX(vbox), description_label, FALSE, FALSE, 0); - -	// If an image path has been set, load the background images -	if (!app_state->image_dir.empty()) { -		frame = gtk_frame_new(NULL); -		gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); -		gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); - -		// load the first image -		app_state->image = gtk_image_new_from_file -			(next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str()); -		gtk_widget_set_size_request(app_state->image, 340, 310); -		gtk_container_add(GTK_CONTAINER(frame), app_state->image); - -		// rotate the images every 5 seconds -		app_state->image_rotation_timeout_id = g_timeout_add -			(ROTATE_IMAGE_TIMEOUT, rotate_image_cb, app_state); -	} - -	// set up progress bar, and update it roughly every 1/10 of a second -	app_state->progress_bar = gtk_progress_bar_new(); -	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(app_state->progress_bar), -				  LLTrans::getString("UpdaterProgressBarTextWithEllipses").c_str()); -	gtk_box_pack_start(GTK_BOX(vbox), -			   app_state->progress_bar, FALSE, TRUE, 0); -	app_state->progress_update_timeout_id = g_timeout_add -		(UPDATE_PROGRESS_TIMEOUT, progress_update_timeout, app_state); -	app_state->update_progress_text_timeout_id = g_timeout_add -		(UPDATE_PROGRESS_TEXT_TIMEOUT, update_progress_text_timeout, app_state); - -	gtk_widget_show_all(app_state->window); -} - -gboolean rotate_image_cb(gpointer data) -{ -	UpdaterAppState *app_state; -	std::string filename; - -	llassert(data != NULL); -	app_state = (UpdaterAppState *) data; - -	filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter); - -	gdk_threads_enter(); -	gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str()); -	gdk_threads_leave(); - -	return TRUE; -} - -std::string next_image_filename(std::string& image_path, LLDirIterator& iter) -{ -	std::string image_filename; -	iter.next(image_filename); -	return gDirUtilp->add(image_path, image_filename); -} - -void on_window_closed(GtkWidget *sender, GdkEvent* event, gpointer data) -{ -	UpdaterAppState *app_state; - -	llassert(data != NULL); -	app_state = (UpdaterAppState *) data; - -	updater_app_quit(app_state); -} - -void updater_app_quit(UpdaterAppState *app_state) -{ -	if (app_state != NULL) -	{ -		g_source_remove(app_state->progress_update_timeout_id); - -		if (!app_state->image_dir.empty()) -		{ -			g_source_remove(app_state->image_rotation_timeout_id); -		} -	} - -	gtk_main_quit(); -} - -void display_error(GtkWidget *parent, std::string title, std::string message) -{ -	GtkWidget *dialog; - -	dialog = gtk_message_dialog_new(GTK_WINDOW(parent), -					GTK_DIALOG_DESTROY_WITH_PARENT, -					GTK_MESSAGE_ERROR, -					GTK_BUTTONS_OK, -					"%s", message.c_str()); -	gtk_window_set_title(GTK_WINDOW(dialog), title.c_str()); -	gtk_dialog_run(GTK_DIALOG(dialog)); -	gtk_widget_destroy(dialog); -} - -gpointer worker_thread_cb(gpointer data) -{ -	UpdaterAppState *app_state; -	CURL *curl; -	CURLcode result; -	FILE *package_file; -	GError *error = NULL; -	int fd; - -	//g_return_val_if_fail (data != NULL, NULL); -	app_state = (UpdaterAppState *) data; - -	try { - -		if(!app_state->url.empty()) -		{ -			char* tmp_local_filename = NULL; -			// create temporary file to store the package. -			fd = g_file_open_tmp -				("secondlife-update-XXXXXX", &tmp_local_filename, &error); -			if (error != NULL) -			{ -				llerrs << "Unable to create temporary file: " -					   << error->message -					   << llendl; - -				g_error_free(error); -				throw 0; -			} - -			if(tmp_local_filename != NULL) -			{ -				app_state->file = tmp_local_filename; -				g_free(tmp_local_filename); -			} - -			package_file = fdopen(fd, "wb"); -			if (package_file == NULL) -			{ -				llerrs << "Failed to create temporary file: " -					   << app_state->file.c_str() -					   << llendl; - -				gdk_threads_enter(); -				display_error(app_state->window, -							  LLTrans::getString("UpdaterFailDownloadTitle"), -							  LLTrans::getString("UpdaterFailUpdateDescriptive")); -				gdk_threads_leave(); -				throw 0; -			} - -			// initialize curl and start downloading the package -			llinfos << "Downloading package: " << app_state->url << llendl; - -			curl = curl_easy_init(); -			if (curl == NULL) -			{ -				llerrs << "Failed to initialize libcurl" << llendl; - -				gdk_threads_enter(); -				display_error(app_state->window, -							  LLTrans::getString("UpdaterFailDownloadTitle"), -							  LLTrans::getString("UpdaterFailUpdateDescriptive")); -				gdk_threads_leave(); -				throw 0; -			} - -			curl_easy_setopt(curl, CURLOPT_URL, app_state->url.c_str()); -			curl_easy_setopt(curl, CURLOPT_NOSIGNAL, TRUE); -			curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE); -			curl_easy_setopt(curl, CURLOPT_WRITEDATA, package_file); -			curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); -			curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, -							 &download_progress_cb); -			curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, app_state); - -			result = curl_easy_perform(curl); -			fclose(package_file); -			curl_easy_cleanup(curl); - -			if (result) -			{ -				llerrs << "Failed to download update: " -					   << app_state->url -					   << llendl; - -				gdk_threads_enter(); -				display_error(app_state->window, -							  LLTrans::getString("UpdaterFailDownloadTitle"), -							  LLTrans::getString("UpdaterFailUpdateDescriptive")); -				gdk_threads_leave(); - -				throw 0; -			} -		} - -		// now pulse the progres bar back and forth while the package is -		// being unpacked -		gdk_threads_enter(); -		std::string installing_msg = LLTrans::getString("UpdaterNowInstalling"); -		gtk_progress_bar_set_text( -			GTK_PROGRESS_BAR(app_state->progress_bar), -			installing_msg.c_str()); -		app_state->activity_mode = TRUE; -		gdk_threads_leave(); - -		// *TODO: if the destination is not writable, terminate this -		// thread and show file chooser? -		if (!install_package(app_state->file.c_str(), app_state->dest_dir)) -		{ -			llwarns << "Failed to install package to destination: " -				<< app_state->dest_dir -				<< llendl; - -			gdk_threads_enter(); -			display_error(app_state->window, -						  LLTrans::getString("UpdaterFailInstallTitle"), -						  LLTrans::getString("UpdaterFailUpdateDescriptive")); -			//"Failed to update " + app_state->app_name, -			gdk_threads_leave(); -			throw 0; -		} - -		// try to spawn the new viewer -		if (!spawn_viewer(app_state)) -		{ -			llwarns << "Viewer was not installed properly in : " -				<< app_state->dest_dir -				<< llendl; - -			gdk_threads_enter(); -			display_error(app_state->window, -						  LLTrans::getString("UpdaterFailStartTitle"), -						  LLTrans::getString("UpdaterFailUpdateDescriptive")); -			gdk_threads_leave(); -			throw 0; -		} -	} -	catch (...) -	{ -		app_state->failure = TRUE; -	} - -	gdk_threads_enter(); -	updater_app_quit(app_state); -	gdk_threads_leave(); - -	return NULL; -} - - -gboolean less_anal_gspawnsync(gchar **argv, -			      gchar **stderr_output, -			      gint *child_exit_status, -			      GError **spawn_error) -{ -	// store current SIGCHLD handler if there is one, replace with default -	// handler to make glib happy -	struct sigaction sigchld_backup; -	struct sigaction sigchld_appease_glib; -	sigchld_appease_glib.sa_handler = SIG_DFL; -	sigemptyset(&sigchld_appease_glib.sa_mask); -	sigchld_appease_glib.sa_flags = 0; -	sigaction(SIGCHLD, &sigchld_appease_glib, &sigchld_backup); - -	gboolean rtn = g_spawn_sync(NULL, -				    argv, -				    NULL, -				    (GSpawnFlags) (G_SPAWN_STDOUT_TO_DEV_NULL), -				    NULL, -				    NULL, -				    NULL, -				    stderr_output, -				    child_exit_status, -				    spawn_error); - -	// restore SIGCHLD handler -	sigaction(SIGCHLD, &sigchld_backup, NULL); - -	return rtn; -} - - -// perform a rename, or perform a (prompted) root rename if that fails -int -rename_with_sudo_fallback(const std::string& filename, const std::string& newname) -{ -	int rtncode = ::rename(filename.c_str(), newname.c_str()); -	lldebugs << "rename result is: " << rtncode << " / " << errno << llendl; -	if (rtncode && (EACCES == errno || EPERM == errno || EXDEV == errno)) -	{ -		llinfos << "Permission problem in rename, or moving between different mount points.  Retrying as a mv under a sudo." << llendl; -		// failed due to permissions, try again as a gksudo or kdesu mv wrapper hack -		char *sudo_cmd = NULL; -		sudo_cmd = g_find_program_in_path("gksudo"); -		if (!sudo_cmd) -		{ -			sudo_cmd = g_find_program_in_path("kdesu"); -		} -		if (sudo_cmd) -		{ -			char *mv_cmd = NULL; -			mv_cmd = g_find_program_in_path("mv"); -			if (mv_cmd) -			{ -				char *src_string_copy = g_strdup(filename.c_str()); -				char *dst_string_copy = g_strdup(newname.c_str()); -				char* argv[] = -					{ -						sudo_cmd, -						mv_cmd, -						src_string_copy, -						dst_string_copy, -						NULL -					}; - -				gchar *stderr_output = NULL; -				gint child_exit_status = 0; -				GError *spawn_error = NULL; -				if (!less_anal_gspawnsync(argv, &stderr_output, -							  &child_exit_status, &spawn_error)) -				{ -					llwarns << "Failed to spawn child process: " -						<< spawn_error->message -						<< llendl; -				} -				else if (child_exit_status) -				{ -					llwarns << "mv command failed: " -						<< (stderr_output ? stderr_output : "(no reason given)") -						<< llendl; -				} -				else -				{ -					// everything looks good, clear the error code -					rtncode = 0; -				} - -				g_free(src_string_copy); -				g_free(dst_string_copy); -				if (spawn_error) g_error_free(spawn_error); -			} -		} -	} -	return rtncode; -} - -gboolean install_package(std::string package_file, std::string destination) -{ -	char *tar_cmd = NULL; -	std::ostringstream command; - -	// Find the absolute path to the 'tar' command. -	tar_cmd = g_find_program_in_path("tar"); -	if (!tar_cmd) -	{ -		llerrs << "`tar' was not found in $PATH" << llendl; -		return FALSE; -	} -	llinfos << "Found tar command: " << tar_cmd << llendl; - -	// Unpack the tarball in a temporary place first, then move it to -	// its final destination -	std::string tmp_dest_dir = gDirUtilp->getTempFilename(); -	if (LLFile::mkdir(tmp_dest_dir, 0744)) -	{ -		llerrs << "Failed to create directory: " -		       << destination -		       << llendl; - -		return FALSE; -	} - -	char *package_file_string_copy = g_strdup(package_file.c_str()); -	char *tmp_dest_dir_string_copy = g_strdup(tmp_dest_dir.c_str()); -	gchar *argv[8] = { -		tar_cmd, -		const_cast<gchar*>("--strip"), const_cast<gchar*>("1"), -		const_cast<gchar*>("-xjf"), -		package_file_string_copy, -		const_cast<gchar*>("-C"), tmp_dest_dir_string_copy, -		NULL, -	}; - -	llinfos << "Untarring package: " << package_file << llendl; - -	// store current SIGCHLD handler if there is one, replace with default -	// handler to make glib happy -	struct sigaction sigchld_backup; -	struct sigaction sigchld_appease_glib; -	sigchld_appease_glib.sa_handler = SIG_DFL; -	sigemptyset(&sigchld_appease_glib.sa_mask); -	sigchld_appease_glib.sa_flags = 0; -	sigaction(SIGCHLD, &sigchld_appease_glib, &sigchld_backup); - -	gchar *stderr_output = NULL; -	gint child_exit_status = 0; -	GError *untar_error = NULL; -	if (!less_anal_gspawnsync(argv, &stderr_output, -				  &child_exit_status, &untar_error)) -	{ -		llwarns << "Failed to spawn child process: " -			<< untar_error->message -			<< llendl; -		return FALSE; -	} - -	if (child_exit_status) -	{ -	 	llwarns << "Untar command failed: " -			<< (stderr_output ? stderr_output : "(no reason given)") -			<< llendl; -		return FALSE; -	} - -	g_free(tar_cmd); -	g_free(package_file_string_copy); -	g_free(tmp_dest_dir_string_copy); -	g_free(stderr_output); -	if (untar_error) g_error_free(untar_error); - -	// move the existing package out of the way if it exists -	if (gDirUtilp->fileExists(destination)) -	{ -		std::string backup_dir = destination + ".backup"; -		int oldcounter = 1; -		while (gDirUtilp->fileExists(backup_dir)) -		{ -			// find a foo.backup.N folder name that isn't taken yet -			backup_dir = destination + ".backup." + llformat("%d", oldcounter); -			++oldcounter; -		} - -		if (rename_with_sudo_fallback(destination, backup_dir)) -		{ -			llwarns << "Failed to move directory: '" -				<< destination << "' -> '" << backup_dir -				<< llendl; -			return FALSE; -		} -	} - -	// The package has been unpacked in a staging directory, now we just -	// need to move it to its destination. -	if (rename_with_sudo_fallback(tmp_dest_dir, destination)) -	{ -		llwarns << "Failed to move installation to the destination: " -			<< destination -			<< llendl; -		return FALSE; -	} - -	// \0/ Success! -	return TRUE; -} - -gboolean progress_update_timeout(gpointer data) -{ -	UpdaterAppState *app_state; - -	llassert(data != NULL); - -	app_state = (UpdaterAppState *) data; - -	gdk_threads_enter(); -	if (app_state->activity_mode) -	{ -		gtk_progress_bar_pulse -			(GTK_PROGRESS_BAR(app_state->progress_bar)); -	} -	else -	{ -		gtk_progress_set_value(GTK_PROGRESS(app_state->progress_bar), -				       app_state->progress_value); -	} -	gdk_threads_leave(); - -	return TRUE; -} - -gboolean update_progress_text_timeout(gpointer data) -{ -	UpdaterAppState *app_state; - -	llassert(data != NULL); -	app_state = (UpdaterAppState *) data; - -	if (app_state->activity_mode == TRUE) -	{ -		// We no longer need this timeout, it will be removed. -		return FALSE; -	} - -	if (!app_state->progress_value) -	{ -		return TRUE; -	} - -	std::string progress_text = llformat((LLTrans::getString("UpdaterProgressBarText")+" (%.0f%%)").c_str(), app_state->progress_value); - -	gdk_threads_enter(); -	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(app_state->progress_bar), -				  progress_text.c_str()); -	gdk_threads_leave(); - -	return TRUE; -} - -int download_progress_cb(gpointer data, -			 double t, -			 double d, -			 double utotal, -			 double ulnow) -{ -	UpdaterAppState *app_state; - -	llassert(data != NULL); -	app_state = (UpdaterAppState *) data; - -	if (t <= 0.0) -	{ -		app_state->progress_value = 0; -	} -	else -	{ -		app_state->progress_value = d * 100.0 / t; -	} -	return 0; -} - -BOOL spawn_viewer(UpdaterAppState *app_state) -{ -	llassert(app_state != NULL); - -	std::string cmd = app_state->dest_dir + "/secondlife"; -	GError *error = NULL; - -	// We want to spawn the Viewer on the same display as the updater app -	gboolean success = gdk_spawn_command_line_on_screen -		(gtk_widget_get_screen(app_state->window), cmd.c_str(), &error); - -	if (!success) -	{ -		llwarns << "Failed to launch viewer: " << error->message -			<< llendl; -	} - -	if (error) g_error_free(error); - -	return success; -} - -void show_usage_and_exit() -{ -	std::cout << "Usage: linux-updater <--url URL | --file FILE> --name NAME --dest PATH --stringsdir PATH1,PATH2 --stringsfile FILE" -		  << "[--image-dir PATH]" -		  << std::endl; -	exit(1); -} - -void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state) -{ -	int i; - -	for (i = 1; i < argc; i++) -	{ -		if ((!strcmp(argv[i], "--url")) && (++i < argc)) -		{ -			app_state->url = argv[i]; -		} -		else if ((!strcmp(argv[i], "--file")) && (++i < argc)) -		{ -			app_state->file = argv[i]; -		} -		else if ((!strcmp(argv[i], "--name")) && (++i < argc)) -		{ -			app_state->app_name = argv[i]; -		} -		else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc)) -		{ -			app_state->image_dir = argv[i]; -			app_state->image_dir_iter = new LLDirIterator(argv[i], "*.jpg"); -		} -		else if ((!strcmp(argv[i], "--dest")) && (++i < argc)) -		{ -			app_state->dest_dir = argv[i]; -		} -		else if ((!strcmp(argv[i], "--stringsdir")) && (++i < argc)) -		{ -			app_state->strings_dirs = argv[i]; -		} -		else if ((!strcmp(argv[i], "--stringsfile")) && (++i < argc)) -		{ -			app_state->strings_file = argv[i]; -		} -		else -		{ -			// show usage, an invalid option was given. -			show_usage_and_exit(); -		} -	} - -	if (app_state->app_name.empty() -	    || (app_state->url.empty() && app_state->file.empty()) -	    || app_state->dest_dir.empty()) -	{ -		show_usage_and_exit(); -	} - -	app_state->progress_value = 0.0; -	app_state->activity_mode = FALSE; -	app_state->failure = FALSE; - -	translate_init(app_state->strings_dirs, app_state->strings_file); -} - -int main(int argc, char **argv) -{ -	UpdaterAppState* app_state = new UpdaterAppState; -	GThread *worker_thread; - -	parse_args_and_init(argc, argv, app_state); - -	// Initialize logger, and rename old log file -	gDirUtilp->initAppDirs("SecondLife"); -	LLError::initForApplication -		(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); -	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, old_log_file); -	LLError::logToFile(log_file); - -	// initialize gthreads and gtk+ -	if (!g_thread_supported()) -	{ -		g_thread_init(NULL); -		gdk_threads_init(); -	} - -	gtk_init(&argc, &argv); - -	// create UI -	updater_app_ui_init(app_state); - -	//llinfos << "SAMPLE TRANSLATION IS: " << LLTrans::getString("LoginInProgress") << llendl; - -	// create download thread -	worker_thread = g_thread_create -		(GThreadFunc(worker_thread_cb), app_state, FALSE, NULL); - -	gdk_threads_enter(); -	gtk_main(); -	gdk_threads_leave(); - -	// Delete the file only if created from url download. -	if(!app_state->url.empty() && !app_state->file.empty()) -	{ -		if (gDirUtilp->fileExists(app_state->file)) -		{ -			LLFile::remove(app_state->file); -		} -	} - -	bool success = !app_state->failure; -	delete app_state->image_dir_iter; -	delete app_state; -	return success ? 0 : 1; -} - -/***************************************************************************** -*   Dummy LLTrans implementation (IQA-490) -*****************************************************************************/ -static LLTrans sStaticStrings; - -// lookup -std::string LLTrans::_getString(const std::string& key) const -{ -	MessageMap::const_iterator found = mMessages.find(key); -	if (found != mMessages.end()) -	{ -		return found->second; -	} -	LL_WARNS("linux_updater") << "No message for key '" << key -							  << "' -- add to LLTrans::LLTrans() in linux_updater.cpp" -							  << LL_ENDL; -	return key; -} - -// static lookup -std::string LLTrans::getString(const std::string& key) -{ -    return sLLTransInstance._getString(key); -} - -// initialization -LLTrans::LLTrans() -{ -	typedef std::pair<const char*, const char*> Pair; -	static const Pair data[] = -	{ -		Pair("UpdaterFailDownloadTitle", -			 "Failed to download update"), -		Pair("UpdaterFailInstallTitle", -			 "Failed to install update"), -		Pair("UpdaterFailStartTitle", -			 "Failed to start viewer"), -		Pair("UpdaterFailUpdateDescriptive", -			 "An error occurred while updating Second Life. " -			 "Please download the latest version from www.secondlife.com."), -		Pair("UpdaterNowInstalling", -			 "Installing Second Life..."), -		Pair("UpdaterNowUpdating", -			 "Now updating Second Life..."), -		Pair("UpdaterProgressBarText", -			 "Downloading update"), -		Pair("UpdaterProgressBarTextWithEllipses", -			 "Downloading update..."), -		Pair("UpdaterUpdatingDescriptive", -			 "Your Second Life Viewer is being updated to the latest release. " -			 "This may take some time, so please be patient."), -		Pair("UpdaterWindowTitle", -			 "Second Life Update") -	}; - -	BOOST_FOREACH(Pair pair, data) -	{ -		mMessages[pair.first] = pair.second; -	} -} diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 39f9de3bc2..6a5ff314e4 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@  const S32 LL_VERSION_MAJOR = 3;  const S32 LL_VERSION_MINOR = 4; -const S32 LL_VERSION_PATCH = 5; +const S32 LL_VERSION_PATCH = 6;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 7db19b1841..51a8eaf998 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -580,8 +580,13 @@ size_t HttpOpRequest::readCallback(void * data, size_t size, size_t nmemb, void  	const size_t body_size(op->mReqBody->size());  	if (body_size <= op->mCurlBodyPos)  	{ -		LL_WARNS("HttpCore") << "Request body position beyond body size.  Aborting request." -							 << LL_ENDL; +		if (body_size < op->mCurlBodyPos) +		{ +			// Warn but continue if the read position moves beyond end-of-body +			// for some reason. +			LL_WARNS("HttpCore") << "Request body position beyond body size.  Truncating request body." +								 << LL_ENDL; +		}  		return 0;  	} diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b569808a06..e93d73ad0e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1867,7 +1867,6 @@ if (LINUX)    set(COPY_INPUT_DEPENDENCIES      ${VIEWER_BINARY_NAME}      linux-crash-logger -    linux-updater      SLPlugin      media_plugin_webkit      media_plugin_gstreamer010 diff --git a/indra/newview/llfloatertexturefetchdebugger.cpp b/indra/newview/llfloatertexturefetchdebugger.cpp index 9157389187..9a23d99802 100644 --- a/indra/newview/llfloatertexturefetchdebugger.cpp +++ b/indra/newview/llfloatertexturefetchdebugger.cpp @@ -4,7 +4,7 @@   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2012, 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 diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 41bfbae86e..7de66b139f 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -3689,13 +3689,14 @@ public:  		if (status)  		{ -			LL_WARNS("Texture") << "Successfully delivered asset metrics to grid." -								<< LL_ENDL; +			LL_DEBUGS("Texture") << "Successfully delivered asset metrics to grid." +								 << LL_ENDL;  		}  		else  		{ -			LL_WARNS("Texture") << "Error delivering asset metrics to grid.  Reason:  " -								<< status.toString() << LL_ENDL; +			LL_WARNS("Texture") << "Error delivering asset metrics to grid.  Status:  " +								<< status.toHex() +								<< ", Reason:  " << status.toString() << LL_ENDL;  		}  	}  }; // end class AssetReportHandler @@ -3895,11 +3896,15 @@ private:  LLTextureFetchDebugger::LLTextureFetchDebugger(LLTextureFetch* fetcher, LLTextureCache* cache, LLImageDecodeThread* imagedecodethread) : +	LLCore::HttpHandler(),  	mFetcher(fetcher),  	mTextureCache(cache),  	mImageDecodeThread(imagedecodethread),  	mHttpHeaders(NULL), -	mHttpPolicyClass(fetcher->getPolicyClass()) +	mHttpPolicyClass(fetcher->getPolicyClass()), +	mNbCurlCompleted(0), +	mTempIndex(0), +	mHistoryListIndex(0)  {  	init();  } @@ -3925,6 +3930,7 @@ void LLTextureFetchDebugger::init()  	mDecodingTime = -1.f;  	mHTTPTime = -1.f;  	mGLCreationTime = -1.f; +  	mTotalFetchingTime = 0.f;  	mRefetchVisCacheTime = -1.f;  	mRefetchVisHTTPTime = -1.f; @@ -3951,6 +3957,9 @@ void LLTextureFetchDebugger::init()  	mFreezeHistory = FALSE;  	mStopDebug = FALSE;  	mClearHistory = FALSE; +	mRefetchNonVis = FALSE; +	 +	mNbCurlRequests = 0;  	if (! mHttpHeaders)  	{ @@ -4024,7 +4033,8 @@ bool LLTextureFetchDebugger::processStartDebug(F32 max_time)  		S32 pending = 0;  		pending += LLAppViewer::getTextureCache()->update(1);   		pending += LLAppViewer::getImageDecodeThread()->update(1);  -		pending += LLAppViewer::getTextureFetch()->update(1);  +		// pending += LLAppViewer::getTextureFetch()->update(1);  // This causes infinite recursion in some cases +		pending += mNbCurlRequests;  		if(!pending)  		{  			break; @@ -4314,7 +4324,6 @@ void LLTextureFetchDebugger::debugHTTP()  	{  		mFetchingHistory[i].mCurlState = FetchEntry::CURL_NOT_DONE;  		mFetchingHistory[i].mCurlReceivedSize = 0; -		mFetchingHistory[i].mHTTPFailCount = 0;  		mFetchingHistory[i].mFormattedImage = NULL;  	}  	mNbCurlRequests = 0; @@ -4338,8 +4347,6 @@ S32 LLTextureFetchDebugger::fillCurlQueue()  	S32 size = mFetchingHistory.size();  	for (S32 i = 0 ; i < size ; i++)  	{		 -		mNbCurlRequests++; -  		if (mFetchingHistory[i].mCurlState != FetchEntry::CURL_NOT_DONE)  		{  			continue; @@ -4365,15 +4372,22 @@ S32 LLTextureFetchDebugger::fillCurlQueue()  			mFetchingHistory[i].mHttpHandle = handle;  			mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;  			mNbCurlRequests++; -			// Hack -			if (mNbCurlRequests == HTTP_REQUESTS_IN_QUEUE_HIGH_WATER)	// emulate normal pipeline +			if (mNbCurlRequests >= HTTP_REQUESTS_IN_QUEUE_HIGH_WATER)	// emulate normal pipeline  			{  				break;  			}  		}  		else   		{ -			break; +			// Failed to queue request, log it and mark it done. +			LLCore::HttpStatus status(mFetcher->getHttpRequest().getStatus()); + +			LL_WARNS("Texture") << "Couldn't issue HTTP request in debugger for texture " +								<< mFetchingHistory[i].mID +								<< ", status: " << status.toHex() +								<< " reason:  " << status.toString() +								<< LL_ENDL; +			mFetchingHistory[i].mCurlState = FetchEntry::CURL_DONE;  		}  	}  	//llinfos << "Fetch Debugger : Having " << mNbCurlRequests << " requests through the curl thread." << llendl; @@ -4727,14 +4741,13 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon  	LLCore::HttpStatus status(response->getStatus());  	mNbCurlRequests--; +	mNbCurlCompleted++; +	fetch.mCurlState = FetchEntry::CURL_DONE;  	if (status)  	{  		const bool partial(par_status == status);  		LLCore::BufferArray * ba(response->getBody());	// *Not* holding reference to body -		fetch.mCurlState = FetchEntry::CURL_DONE; -		mNbCurlCompleted++; -  		S32 data_size = ba ? ba->size() : 0;  		fetch.mCurlReceivedSize += data_size;  		//llinfos << "Fetch Debugger : got results for " << fetch.mID << ", data_size = " << data_size << ", received = " << fetch.mCurlReceivedSize << ", requested = " << fetch.mRequestedSize << ", partial = " << partial << llendl; @@ -4766,17 +4779,6 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon  		llinfos << "Fetch Debugger : CURL GET FAILED,  ID = " << fetch.mID  				<< ", status: " << status.toHex()  				<< " reason:  " << status.toString() << llendl; -		fetch.mHTTPFailCount++; -		if(fetch.mHTTPFailCount < 5) -		{ -			// Fetch will have to be redone -			fetch.mCurlState = FetchEntry::CURL_NOT_DONE; -		} -		else //skip -		{ -			fetch.mCurlState = FetchEntry::CURL_DONE; -			mNbCurlCompleted++; -		}  	}  } diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 1e58ba35d4..5ea3c14e1a 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -451,7 +451,6 @@ private:  		LLPointer<LLImageRaw> mRawImage;  		e_curl_state mCurlState;  		S32 mCurlReceivedSize; -		S32 mHTTPFailCount;  		LLCore::HttpHandle mHttpHandle;  		FetchEntry() : @@ -467,7 +466,6 @@ private:  			mFetchedSize(f_size),  			mDecodedSize(d_size),  			mNeedsAux(false), -			mHTTPFailCount(0),  			mHttpHandle(LLCORE_HTTP_HANDLE_INVALID)  			{}  	}; diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ea75d4f4f6..e7108141ee 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -968,7 +968,6 @@ class LinuxManifest(ViewerManifest):          if self.prefix(src="", dst="bin"):              self.path("secondlife-bin","do-not-directly-run-secondlife-bin")              self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") -            self.path("../linux_updater/linux-updater", "linux-updater.bin")              self.path2basename("../llplugin/slplugin", "SLPlugin")              self.path2basename("../viewer_components/updater/scripts/linux", "update_install")              self.end_prefix("bin") @@ -1017,9 +1016,7 @@ class LinuxManifest(ViewerManifest):              else:                  installer_name += '_' + self.channel_oneword().upper() -        if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): -            print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" -            self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure +        self.strip_binaries()          # Fix access permissions          self.run_command(""" @@ -1054,6 +1051,11 @@ class LinuxManifest(ViewerManifest):                  'dst': self.get_dst_prefix(),                  'inst': self.build_path_of(installer_name)}) +    def strip_binaries(self): +        if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): +            print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" +            self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure +  class Linux_i686Manifest(LinuxManifest):      def construct(self):          super(Linux_i686Manifest, self).construct() @@ -1139,9 +1141,7 @@ class Linux_i686Manifest(LinuxManifest):                      self.path("libvivoxplatform.so")                      self.end_prefix("lib") -            if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): -                    print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" -                    self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure +            self.strip_binaries()  class Linux_x86_64Manifest(LinuxManifest): diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install index e0505a9f72..a9df9042fd 100644 --- a/indra/viewer_components/updater/scripts/linux/update_install +++ b/indra/viewer_components/updater/scripts/linux/update_install @@ -1,10 +1,217 @@  #! /bin/bash -INSTALL_DIR=$(cd "$(dirname "$0")/.." ; pwd) -export LD_LIBRARY_PATH="$INSTALL_DIR/lib" -bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml" -if [ $? -ne 0 ] -   then echo $3 >> "$2" +# @file   update_install +# @author Nat Goodspeed +# @date   2013-01-09 +# @brief  Update the containing Second Life application bundle to the version in +#         the specified tarball. +#  +#         This bash implementation is derived from the previous linux-updater.bin +#         application. +#  +# $LicenseInfo:firstyear=2013&license=viewerlgpl$ +# Copyright (c) 2013, Linden Research, Inc. +# $/LicenseInfo$ + +# **************************************************************************** +#   script parameters +# **************************************************************************** +tarball="$1"                        # the file to install +markerfile="$2"                     # create this file on failure +mandatory="$3"                      # what to write to markerfile on failure + +# **************************************************************************** +#   helper functions +# **************************************************************************** +# empty array +cleanups=() + +# add a cleanup action to execute on exit +function cleanup { +    # wacky bash syntax for appending to array +    cleanups[${#cleanups[*]}]="$*" +} + +# called implicitly on exit +function onexit { +    for action in "${cleanups[@]}" +    do # don't quote, support actions consisting of multiple words +       $action +    done +} +trap 'onexit' EXIT + +# write to log file +function log { +    # our log file will be open as stderr -- but until we set up that +    # redirection, logging to stderr is better than nothing +    echo "$*" 1>&2 +} + +# We display status by leaving one background xmessage process running. This +# is the pid of that process. +statuspid="" + +function clear_message { +    [ -n "$statuspid" ] && kill $statuspid +    statuspid="" +} + +# make sure we remove any message box we might have put up +cleanup clear_message + +# can we use zenity, or must we fall back to xmessage? +zenpath="$(which zenity)" +if [ -n "$zenpath" ] +then # zenity on PATH and is executable +     # display a message box and continue +     function status { +         # clear any previous message +         clear_message +         # put up a new zenity box and capture its pid +         "$zenpath" --info --title "Second Life Viewer Updater" \ +                    --width=320 --height=120 --text="$*" & +         statuspid=$! +     } + +     # display an error box and wait for user +     function errorbox { +         "$zenpath" --error --title "Second Life Viewer Updater" \ +                    --width=320 --height=120 --text="$*" +     } + +else # no zenity, use xmessage instead +     # display a message box and continue +     function status { +         # clear any previous message +         clear_message +         # put up a new xmessage and capture its pid +         xmessage -buttons OK:2 -center "$*" & +         statuspid=$! +     } + +     # display an error box and wait for user +     function errorbox { +         xmessage -buttons OK:2 -center "$*" +     } +fi + +# display an error box and terminate +function fail { +    # Log the message +    log "$@" +    # tell subsequent viewer things went south +    echo "$mandatory" > "$markerfile" +    # add boilerplate +    errorbox "An error occurred while updating Second Life: +$* +Please download the latest viewer from www.secondlife.com." +    exit 1 +} + +# Find a graphical sudo program and define mysudo function. On error, $? is +# nonzero; output is in $err instead of being written to stdout/stderr. +gksudo="$(which gksudo)" +kdesu="$(which kdesu)" +if [ -n "$gksudo" ] +then function mysudo { +         # gksudo allows you to specify description +         err="$("$gksudo" --description "Second Life Viewer Updater" "$@" 2>&1)" +     } +elif [ -n "$kdesu" ] +then function mysudo { +         err="$("$kdesu" "$@" 2>&1)" +     } +else # couldn't find either one, just try it anyway +     function mysudo { +         err="$("$@" 2>&1)" +     }  fi -rm -f "$1" +# Move directories, using mysudo if we think it necessary. On error, $? is +# nonzero; output is in $err instead of being written to stdout/stderr. +function sudo_mv { +    # If we have write permission to both parent directories, shouldn't need +    # sudo. +    if [ -w "$(dirname "$1")" -a -w "$(dirname "$2")" ] +    then err="$(mv "$@" 2>&1)" +    else # use available sudo program; mysudo sets $? and $err +         mysudo mv "$@" +    fi +} + +# **************************************************************************** +#   main script logic +# **************************************************************************** +mydir="$(dirname "$0")" +# We happen to know that the viewer specifies a marker-file pathname within +# the logs directory. +logsdir="$(dirname "$markerfile")" +logname="$logsdir/updater.log" + +# move aside old updater.log; we're about to create a new one +[ -f "$logname" ] && mv "$logname" "$logname.old" + +# Set up redirections for this script such that stderr is logged. (But first +# move the previous stderr to file descriptor 3.) +exec 3>&2- 2> "$logname" + +# Rather than setting up a special pipeline to timestamp every line of stderr, +# produce header lines into log file indicating timestamp and the arguments +# with which we were invoked. +date 1>&2 +log "$0 $*" + +# Log every command we execute, along with any stderr it might produce +set -x + +status 'Installing Second Life...' + +# Creating tempdir under /tmp means it's possible that tempdir is on a +# different filesystem than INSTALL_DIR. One is tempted to create tempdir on a +# path derived from `dirname INSTALL_DIR` -- but it seems modern 'mv' can +# handle moving across filesystems?? +tempdir="$(mktemp -d)" +tempinstall="$tempdir/install" +# capture the actual error message, if any +err="$(mkdir -p "$tempinstall" 2>&1)" || fail "$err" +cleanup rm -rf "$tempdir" + +# If we already knew the name of the tarball's top-level directory, we could +# just move that when all was said and done. Since we don't, untarring to the +# 'install' subdir with --strip 1 effectively renames that top-level +# directory. +# untar failures tend to be voluminous -- don't even try to capture, just log +tar --strip 1 -xjf "$tarball" -C "$tempinstall" || fail "Untar command failed" + +INSTALL_DIR="$(cd "$mydir/.." ; pwd)" + +# Considering we're launched from a subdirectory of INSTALL_DIR, would be +# surprising if it did NOT already exist... +if [ -e "$INSTALL_DIR" ] +then backup="$INSTALL_DIR.backup" +     backupn=1 +     while [ -e "$backup" ] +     do backup="$INSTALL_DIR.backup.$backupn" +        ((backupn += 1)) +     done +     # on error, fail with actual error message from sudo_mv: permissions, +     # cross-filesystem mv, ...? +     sudo_mv "$INSTALL_DIR" "$backup" || fail "$err" +fi +# We unpacked the tarball into tempinstall. Move that. +if ! sudo_mv "$tempinstall" "$INSTALL_DIR" +then # If we failed to move the temp install to INSTALL_DIR, try to restore +     # INSTALL_DIR from backup. Save $err because next sudo_mv will trash it! +     realerr="$err" +     sudo_mv "$backup" "$INSTALL_DIR" +     fail "$realerr" +fi + +# Removing the tarball here, rather than with a 'cleanup' action, means we +# only remove it if we succeeded. +rm -f "$tarball" + +# Launch the updated viewer. Restore original stderr from file descriptor 3, +# though -- otherwise updater.log gets cluttered with the viewer log! +"$INSTALL_DIR/secondlife" 2>&3- & | 
