Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Black Dragon Viewer
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Package Registry
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
NiranV
Black Dragon Viewer
Commits
80236bb6
Commit
80236bb6
authored
Oct 16, 2019
by
Oz Linden
Browse files
Options
Browse Files
Download
Plain Diff
merge 6.3.2-release
parents
33821bd5
d89130c3
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
133 additions
and
112 deletions
+133
-112
autobuild.xml
autobuild.xml
+8
-8
indra/cmake/Copy3rdPartyLibs.cmake
indra/cmake/Copy3rdPartyLibs.cmake
+28
-33
indra/lib/python/indra/util/llmanifest.py
indra/lib/python/indra/util/llmanifest.py
+55
-9
indra/newview/llvoicevivox.cpp
indra/newview/llvoicevivox.cpp
+14
-0
indra/newview/viewer_manifest.py
indra/newview/viewer_manifest.py
+28
-62
No files found.
autobuild.xml
View file @
80236bb6
...
...
@@ -2918,7 +2918,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>
license
</key>
<string>
Mixed
</string>
<key>
license_file
</key>
<string>
LICENSES/
slvoice
.txt
</string>
<string>
LICENSES/
vivox_licenses
.txt
</string>
<key>
name
</key>
<string>
slvoice
</string>
<key>
platforms
</key>
...
...
@@ -2940,9 +2940,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>
archive
</key>
<map>
<key>
hash
</key>
<string>
a605ec940768c878527d3b8f2ff61288
</string>
<string>
f824d586ab5de6edd14ef6828e9e4b66
</string>
<key>
url
</key>
<string>
http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/
21421/157284/slvoice-4.9.0002.30313.517593-darwin64-517593
.tar.bz2
</string>
<string>
http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/
44719/395040/slvoice-4.10.0000.32327.5fc3fe7c.531581-darwin64-531581
.tar.bz2
</string>
</map>
<key>
name
</key>
<string>
darwin64
</string>
...
...
@@ -2976,9 +2976,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>
archive
</key>
<map>
<key>
hash
</key>
<string>
5a78539626b5f23522d0b466247f48b4
</string>
<string>
1941c17c81905f23b4928288bcf719fb
</string>
<key>
url
</key>
<string>
http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/
21422/157291/slvoice-4.9.0002.30313.517593-windows-517593
.tar.bz2
</string>
<string>
http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/
44720/395047/slvoice-4.10.0000.32327.5fc3fe7c.531581-windows-531581
.tar.bz2
</string>
</map>
<key>
name
</key>
<string>
windows
</string>
...
...
@@ -2988,16 +2988,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>
archive
</key>
<map>
<key>
hash
</key>
<string>
1f8e09c053c00d9dc44ea74568e63dc1
</string>
<string>
baa6cdc8e8762d5519996ed9faa0bf3f
</string>
<key>
url
</key>
<string>
http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/
21423/157298/slvoice-4.9.0002.30313.517593-windows64-517593
.tar.bz2
</string>
<string>
http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/
44721/395056/slvoice-4.10.0000.32327.5fc3fe7c.531581-windows64-531581
.tar.bz2
</string>
</map>
<key>
name
</key>
<string>
windows64
</string>
</map>
</map>
<key>
version
</key>
<string>
4.
9.0002.30313.517593
</string>
<string>
4.
10.0000.32327.5fc3fe7c.531581
</string>
</map>
<key>
tut
</key>
<map>
...
...
indra/cmake/Copy3rdPartyLibs.cmake
View file @
80236bb6
...
...
@@ -17,17 +17,16 @@ if(WINDOWS)
#*******************************
# VIVOX - *NOTE: no debug version
set
(
vivox_src_dir
"
${
ARCH_PREBUILT_DIRS_RELEASE
}
"
)
set
(
vivox_files
SLVoice.exe
)
set
(
vivox_lib_dir
"
${
ARCH_PREBUILT_DIRS_RELEASE
}
"
)
set
(
slvoice_src_dir
"
${
ARCH_PREBUILT_BIN_RELEASE
}
"
)
set
(
slvoice_files SLVoice.exe
)
if
(
ADDRESS_SIZE EQUAL 64
)
list
(
APPEND vivox_
file
s
list
(
APPEND vivox_
lib
s
vivoxsdk_x64.dll
ortp_x64.dll
)
else
(
ADDRESS_SIZE EQUAL 64
)
list
(
APPEND vivox_
file
s
list
(
APPEND vivox_
lib
s
vivoxsdk.dll
ortp.dll
)
...
...
@@ -169,11 +168,10 @@ elseif(DARWIN)
set
(
SHARED_LIB_STAGING_DIR_RELWITHDEBINFO
"
${
SHARED_LIB_STAGING_DIR
}
/RelWithDebInfo/Resources"
)
set
(
SHARED_LIB_STAGING_DIR_RELEASE
"
${
SHARED_LIB_STAGING_DIR
}
/Release/Resources"
)
set
(
vivox_
src
_dir
"
${
ARCH_PREBUILT_DIRS_RELEASE
}
"
)
set
(
vivox_files
SLVoice
set
(
vivox_
lib
_dir
"
${
ARCH_PREBUILT_DIRS_RELEASE
}
"
)
set
(
slvoice_files SLVoice
)
set
(
vivox_libs
libortp.dylib
libvivoxplatform.dylib
libvivoxsdk.dylib
)
set
(
debug_src_dir
"
${
ARCH_PREBUILT_DIRS_DEBUG
}
"
)
...
...
@@ -206,15 +204,15 @@ elseif(LINUX)
set
(
SHARED_LIB_STAGING_DIR_RELWITHDEBINFO
"
${
SHARED_LIB_STAGING_DIR
}
"
)
set
(
SHARED_LIB_STAGING_DIR_RELEASE
"
${
SHARED_LIB_STAGING_DIR
}
"
)
set
(
vivox_
src
_dir
"
${
ARCH_PREBUILT_DIRS_RELEASE
}
"
)
set
(
vivox_
file
s
set
(
vivox_
lib
_dir
"
${
ARCH_PREBUILT_DIRS_RELEASE
}
"
)
set
(
vivox_
lib
s
libsndfile.so.1
libortp.so
libvivoxoal.so.1
libvivoxplatform.so
libvivoxsdk.so
SLVoice
)
)
set
(
slvoice_files SLVoice
)
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
# or ARCH_PREBUILT_DIRS
set
(
debug_src_dir
"
${
ARCH_PREBUILT_DIRS_DEBUG
}
"
)
...
...
@@ -251,8 +249,8 @@ elseif(LINUX)
else
(
WINDOWS
)
message
(
STATUS
"WARNING: unrecognized platform for staging 3rd party libs, skipping..."
)
set
(
vivox_
src
_dir
"
${
CMAKE_SOURCE_DIR
}
/newview/vivox-runtime/i686-linux"
)
set
(
vivox_
file
s
""
)
set
(
vivox_
lib
_dir
"
${
CMAKE_SOURCE_DIR
}
/newview/vivox-runtime/i686-linux"
)
set
(
vivox_
lib
s
""
)
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
# or ARCH_PREBUILT_DIRS
set
(
debug_src_dir
"
${
CMAKE_SOURCE_DIR
}
/../libraries/i686-linux/lib/debug"
)
...
...
@@ -275,39 +273,36 @@ endif(WINDOWS)
################################################################
copy_if_different
(
${
vivox_
src
_dir
}
${
vivox_
lib
_dir
}
"
${
SHARED_LIB_STAGING_DIR_DEBUG
}
"
out_targets
${
vivox_
file
s
}
${
vivox_
lib
s
}
)
set
(
third_party_targets
${
third_party_targets
}
${
out_targets
}
)
copy_if_different
(
${
vivox_src_dir
}
${
slvoice_src_dir
}
"
${
SHARED_LIB_STAGING_DIR_RELEASE
}
"
out_targets
${
slvoice_files
}
)
copy_if_different
(
${
vivox_lib_dir
}
"
${
SHARED_LIB_STAGING_DIR_RELEASE
}
"
out_targets
${
vivox_
file
s
}
${
vivox_
lib
s
}
)
set
(
third_party_targets
${
third_party_targets
}
${
out_targets
}
)
copy_if_different
(
${
vivox_
src
_dir
}
${
vivox_
lib
_dir
}
"
${
SHARED_LIB_STAGING_DIR_RELWITHDEBINFO
}
"
out_targets
${
vivox_
file
s
}
${
vivox_
lib
s
}
)
set
(
third_party_targets
${
third_party_targets
}
${
out_targets
}
)
#copy_if_different(
# ${debug_src_dir}
# "${SHARED_LIB_STAGING_DIR_DEBUG}"
# out_targets
# ${debug_files}
# )
#set(third_party_targets ${third_party_targets} ${out_targets})
copy_if_different
(
${
release_src_dir
}
"
${
SHARED_LIB_STAGING_DIR_RELEASE
}
"
...
...
indra/lib/python/indra/util/llmanifest.py
View file @
80236bb6
...
...
@@ -27,6 +27,7 @@
$/LicenseInfo$
"""
from
collections
import
namedtuple
,
defaultdict
import
commands
import
errno
import
filecmp
...
...
@@ -312,6 +313,8 @@ def __init__(cls, name, bases, dct):
if
match
:
cls
.
manifests
[
match
.
group
(
1
).
lower
()]
=
cls
MissingFile
=
namedtuple
(
"MissingFile"
,
(
"pattern"
,
"tried"
))
class
LLManifest
(
object
):
__metaclass__
=
LLManifestRegistry
manifests
=
{}
...
...
@@ -333,7 +336,8 @@ def __init__(self, args):
self
.
dst_prefix
=
[
args
[
'dest'
]]
self
.
created_paths
=
[]
self
.
package_name
=
"Unknown"
self
.
missing
=
[]
def
default_channel
(
self
):
return
self
.
args
.
get
(
'channel'
,
None
)
==
RELEASE_CHANNEL
...
...
@@ -592,6 +596,40 @@ def copy_action(self, src, dst):
def
package_action
(
self
,
src
,
dst
):
pass
def
finish
(
self
):
"""
generic finish, always called before the ${action}_finish() methods
"""
# Collecting MissingFile instances in self.missing, and checking that
# here, is intended to minimize the number of (potentially lengthy)
# build cycles a developer must run in order to fix missing-files
# errors. The manifest processing is necessarily the last step in a
# build, and if we only caught a single missing file error per run,
# the developer would need to run a build for each additional missing-
# file error until all were resolved. This way permits the developer
# to resolve them all at once.
if
self
.
missing
:
print
'*'
*
72
print
"Missing files:"
# Instead of just dumping each missing file and all the places we
# looked for it, group by common sets of places we looked. Use a
# set to store the 'tried' directories, to avoid mismatches due to
# reordering -- but since we intend to use the set of 'tried'
# directories as a dict key, it must be a frozenset.
organize
=
defaultdict
(
set
)
for
missingfile
in
self
.
missing
:
organize
[
frozenset
(
missingfile
.
tried
)].
add
(
missingfile
.
pattern
)
# Now dump all the patterns sought in each group of 'tried'
# directories.
for
tried
,
patterns
in
organize
.
items
():
print
" Could not find in:"
for
dir
in
sorted
(
tried
):
print
" %s"
%
dir
for
pattern
in
sorted
(
patterns
):
print
" %s"
%
pattern
print
'*'
*
72
raise
MissingError
(
'%s patterns could not be found'
%
len
(
self
.
missing
))
def
copy_finish
(
self
):
pass
...
...
@@ -825,17 +863,23 @@ def try_path(src):
return
count
try_prefixes
=
[
self
.
get_src_prefix
(),
self
.
get_artwork_prefix
(),
self
.
get_build_prefix
()]
tried
=
[]
count
=
0
while
not
count
and
try_prefixes
:
pfx
=
try_prefixes
.
pop
(
0
)
for
pfx
in
try_prefixes
:
try
:
count
=
try_path
(
os
.
path
.
join
(
pfx
,
src
))
except
MissingError
:
tried
.
append
(
pfx
)
if
not
try_prefixes
:
# no more prefixes left to try
print
"unable to find '%s'; looked in:
\n
%s"
%
(
src
,
'
\n
'
.
join
(
tried
))
# if we produce MissingError, just try the next prefix
continue
# If we actually found nonzero files, stop looking
if
count
:
break
else
:
# no more prefixes left to try
print
(
"
\n
unable to find '%s'; looked in:
\n
%s"
%
(
src
,
'
\n
'
.
join
(
try_prefixes
)))
self
.
missing
.
append
(
MissingFile
(
pattern
=
src
,
tried
=
try_prefixes
))
# At this point 'count' might never have been successfully
# assigned! Even if it was, though, we can be sure it is 0.
return
0
print
"%d files"
%
count
# Let caller check whether we processed as many files as expected. In
...
...
@@ -846,6 +890,8 @@ def do(self, *actions):
self
.
actions
=
actions
self
.
construct
()
# perform finish actions
# generic finish first
self
.
finish
()
for
action
in
self
.
actions
:
methodname
=
action
+
"_finish"
method
=
getattr
(
self
,
methodname
,
None
)
...
...
indra/newview/llvoicevivox.cpp
View file @
80236bb6
...
...
@@ -824,6 +824,20 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
params
.
args
.
add
(
"-lf"
);
params
.
args
.
add
(
log_folder
);
// set log file basename and .log
params
.
args
.
add
(
"-lp"
);
params
.
args
.
add
(
"SLVoice"
);
params
.
args
.
add
(
"-ls"
);
params
.
args
.
add
(
".log"
);
// rotate any existing log
std
::
string
new_log
=
gDirUtilp
->
getExpandedFilename
(
LL_PATH_LOGS
,
"SLVoice.log"
);
std
::
string
old_log
=
gDirUtilp
->
getExpandedFilename
(
LL_PATH_LOGS
,
"SLVoice.old"
);
if
(
gDirUtilp
->
fileExists
(
new_log
))
{
LLFile
::
rename
(
new_log
,
old_log
);
}
std
::
string
shutdown_timeout
=
gSavedSettings
.
getString
(
"VivoxShutdownTimeout"
);
if
(
!
shutdown_timeout
.
empty
())
{
...
...
indra/newview/viewer_manifest.py
View file @
80236bb6
...
...
@@ -46,7 +46,7 @@
# Put it FIRST because some of our build hosts have an ancient install of
# indra.util.llmanifest under their system Python!
sys
.
path
.
insert
(
0
,
os
.
path
.
join
(
viewer_dir
,
os
.
pardir
,
"lib"
,
"python"
))
from
indra.util.llmanifest
import
LLManifest
,
main
,
path_ancestors
,
CHANNEL_VENDOR_BASE
,
RELEASE_CHANNEL
,
ManifestError
from
indra.util.llmanifest
import
LLManifest
,
main
,
path_ancestors
,
CHANNEL_VENDOR_BASE
,
RELEASE_CHANNEL
,
ManifestError
,
MissingError
from
llbase
import
llsd
class
ViewerManifest
(
LLManifest
):
...
...
@@ -145,13 +145,10 @@ def construct(self):
with
self
.
prefix
(
src_dst
=
"skins"
):
# include the entire textures directory recursively
with
self
.
prefix
(
src_dst
=
"*/textures"
):
self
.
path
(
"*/*.tga"
)
self
.
path
(
"*/*.j2c"
)
self
.
path
(
"*/*.jpg"
)
self
.
path
(
"*/*.png"
)
self
.
path
(
"*.tga"
)
self
.
path
(
"*.j2c"
)
self
.
path
(
"*.jpg"
)
self
.
path
(
"*.png"
)
self
.
path
(
"textures.xml"
)
self
.
path
(
"*/xui/*/*.xml"
)
...
...
@@ -171,14 +168,6 @@ def construct(self):
self
.
path
(
"*/*/*.gif"
)
# local_assets dir (for pre-cached textures)
with
self
.
prefix
(
src_dst
=
"local_assets"
):
self
.
path
(
"*.j2c"
)
self
.
path
(
"*.tga"
)
# File in the newview/ directory
self
.
path
(
"gpu_table.txt"
)
#build_data.json. Standard with exception handling is fine. If we can't open a new file for writing, we have worse problems
#platform is computed above with other arg parsing
build_data_dict
=
{
"Type"
:
"viewer"
,
"Version"
:
'.'
.
join
(
self
.
args
[
'version'
]),
...
...
@@ -517,17 +506,6 @@ def construct(self):
with
self
.
prefix
(
src
=
os
.
path
.
join
(
self
.
args
[
'build'
],
os
.
pardir
,
'sharedlibs'
,
self
.
args
[
'configuration'
])):
# Get llcommon and deps. If missing assume static linkage and continue.
try
:
self
.
path
(
'llcommon.dll'
)
self
.
path
(
'libapr-1.dll'
)
self
.
path
(
'libaprutil-1.dll'
)
self
.
path
(
'libapriconv-1.dll'
)
except
RuntimeError
as
err
:
print
err
.
message
print
"Skipping llcommon.dll (assuming llcommon was linked statically)"
# Mesh 3rd party libs needed for auto LOD and collada reading
try
:
self
.
path
(
"glod.dll"
)
...
...
@@ -552,24 +530,21 @@ def construct(self):
if
self
.
args
[
'configuration'
].
lower
()
==
'debug'
:
self
.
path
(
"msvcr120d.dll"
)
self
.
path
(
"msvcp120d.dll"
)
self
.
path
(
"msvcr100d.dll"
)
self
.
path
(
"msvcp100d.dll"
)
else
:
self
.
path
(
"msvcr120.dll"
)
self
.
path
(
"msvcp120.dll"
)
self
.
path
(
"msvcr100.dll"
)
self
.
path
(
"msvcp100.dll"
)
# Vivox runtimes
self
.
path
(
"SLVoice.exe"
)
# SLVoice executable
with
self
.
prefix
(
src
=
os
.
path
.
join
(
pkgdir
,
'bin'
,
'release'
)):
self
.
path
(
"SLVoice.exe"
)
# Vivox libraries
if
(
self
.
address_size
==
64
):
self
.
path
(
"vivoxsdk_x64.dll"
)
self
.
path
(
"ortp_x64.dll"
)
else
:
self
.
path
(
"vivoxsdk.dll"
)
self
.
path
(
"ortp.dll"
)
self
.
path
(
"libsndfile-1.dll"
)
self
.
path
(
"vivoxoal.dll"
)
# Security
self
.
path
(
"ssleay32.dll"
)
...
...
@@ -592,15 +567,6 @@ def construct(self):
self
.
path
(
"BugSplat.dll"
)
self
.
path
(
"BugSplatRc.dll"
)
# For google-perftools tcmalloc allocator.
try
:
if
self
.
args
[
'configuration'
].
lower
()
==
'debug'
:
self
.
path
(
'libtcmalloc_minimal-debug.dll'
)
else
:
self
.
path
(
'libtcmalloc_minimal.dll'
)
except
:
print
"Skipping libtcmalloc_minimal.dll"
self
.
path
(
src
=
"licenses-win32.txt"
,
dst
=
"licenses.txt"
)
self
.
path
(
"featuretable.txt"
)
...
...
@@ -990,7 +956,7 @@ def construct(self):
with
self
.
prefix
(
src
=
relpkgdir
,
dst
=
""
):
self
.
path
(
"libndofdev.dylib"
)
self
.
path
(
"libhunspell-1.3.
0.dylib
"
)
self
.
path
(
"libhunspell-1.3.
a
"
)
with
self
.
prefix
(
src_dst
=
"cursors_mac"
):
self
.
path
(
"*.tif"
)
...
...
@@ -1037,11 +1003,15 @@ def path_optional(src, dst):
# (source, dest) pair to self.file_list for every expanded
# file processed. Remember its size before the call.
oldlen
=
len
(
self
.
file_list
)
self
.
path
(
src
,
dst
)
# The dest appended to self.file_list has been prepended
# with self.get_dst_prefix(). Strip it off again.
added
=
[
os
.
path
.
relpath
(
d
,
self
.
get_dst_prefix
())
for
s
,
d
in
self
.
file_list
[
oldlen
:]]
try
:
self
.
path
(
src
,
dst
)
# The dest appended to self.file_list has been prepended
# with self.get_dst_prefix(). Strip it off again.
added
=
[
os
.
path
.
relpath
(
d
,
self
.
get_dst_prefix
())
for
s
,
d
in
self
.
file_list
[
oldlen
:]]
except
MissingError
as
err
:
print
>>
sys
.
stderr
,
"Warning: "
+
err
.
msg
added
=
[]
if
not
added
:
print
"Skipping %s"
%
dst
return
added
...
...
@@ -1051,18 +1021,10 @@ def path_optional(src, dst):
# symlink from sub-app/Contents/Resources to the real .dylib.
# Need to get the llcommon dll from any of the build directories as well.
libfile_parent
=
self
.
get_dst_prefix
()
libfile
=
"libllcommon.dylib"
dylibs
=
path_optional
(
self
.
find_existing_file
(
os
.
path
.
join
(
os
.
pardir
,
"llcommon"
,
self
.
args
[
'configuration'
],
libfile
),
os
.
path
.
join
(
relpkgdir
,
libfile
)),
dst
=
libfile
)
dylibs
=
[]
for
libfile
in
(
"libapr-1.0.dylib"
,
"libaprutil-1.0.dylib"
,
"libcollada14dom.dylib"
,
"libexpat.1.dylib"
,
"libexception_handler.dylib"
,
"libGLOD.dylib"
,
...
...
@@ -1073,14 +1035,14 @@ def path_optional(src, dst):
):
dylibs
+=
path_optional
(
os
.
path
.
join
(
relpkgdir
,
libfile
),
libfile
)
# SLVoice and vivox lols, no symlinks needed
# SLVoice executable
with
self
.
prefix
(
src
=
os
.
path
.
join
(
pkgdir
,
'bin'
,
'release'
)):
self
.
path
(
"SLVoice"
)
# Vivox libraries
for
libfile
in
(
'libortp.dylib'
,
'libsndfile.dylib'
,
'libvivoxoal.dylib'
,
'libvivoxsdk.dylib'
,
'libvivoxplatform.dylib'
,
'SLVoice'
,
):
self
.
path2basename
(
relpkgdir
,
libfile
)
...
...
@@ -1575,7 +1537,6 @@ def construct(self):
self
.
path
(
"libsndfile.so.1"
)
#self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
self
.
path
(
"libvivoxsdk.so"
)
self
.
path
(
"libvivoxplatform.so"
)
self
.
strip_binaries
()
...
...
@@ -1596,4 +1557,9 @@ def construct(self):
dict
(
name
=
'bugsplat'
,
description
=
"""BugSplat database to which to post crashes,
if BugSplat crash reporting is desired"""
,
default
=
''
),
]
main
(
extra
=
extra_arguments
)
try
:
main
(
extra
=
extra_arguments
)
except
(
ManifestError
,
MissingError
)
as
err
:
sys
.
exit
(
"
\n
viewer_manifest.py failed: "
+
err
.
msg
)
except
:
raise
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment