From 629d6bf612a3191f6197faa97c7e0da97a36ba2a Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Fri, 1 Mar 2019 13:25:36 +0000 Subject: [PATCH] Allow variables to come from shell commands --- python3/vimspector/debug_session.py | 6 ++++-- python3/vimspector/utils.py | 31 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/python3/vimspector/debug_session.py b/python3/vimspector/debug_session.py index 8743341..b6d2068 100644 --- a/python3/vimspector/debug_session.py +++ b/python3/vimspector/debug_session.py @@ -158,8 +158,10 @@ class DebugSession( object ): 'dollar': '$', # HACK 'workspaceRoot': self._workspace_root } - self._variables.update( adapter.get( 'variables', {} ) ) - self._variables.update( configuration.get( 'variables', {} ) ) + self._variables.update( + utils.ParseVariables( adapter.get( 'variables', {} ) ) ) + self._variables.update( + utils.ParseVariables( configuration.get( 'variables', {} ) ) ) self._variables.update( launch_variables ) utils.ExpandReferencesInDict( configuration, self._variables ) diff --git a/python3/vimspector/utils.py b/python3/vimspector/utils.py index f13f349..e8c7a16 100644 --- a/python3/vimspector/utils.py +++ b/python3/vimspector/utils.py @@ -328,6 +328,37 @@ def ExpandReferencesInDict( obj, mapping, **kwargs ): obj[ k ] = expand_refs_in_object( obj[ k ] ) +def ParseVariables( variables ): + new_variables = {} + for n,v in variables.items(): + if isinstance( v, dict ): + if 'shell' in v: + import subprocess + import shlex + + new_v = v.copy() + # Bit of a hack. Allows environment variables to be used. + ExpandReferencesInDict( new_v, {} ) + + env = os.environ.copy() + env.update( new_v.get( 'env' ) or {} ) + cmd = new_v[ 'shell' ] + if not isinstance( cmd, list ): + cmd = shlex.split( cmd ) + + new_variables[ n ] = subprocess.check_output( + cmd, + cwd = new_v.get( 'cwd' ) or os.getcwd(), + env = env ).decode( 'utf-8' ).strip() + else: + raise ValueError( + "Unsupported variable defn {}: Missing 'shell'".format( n ) ) + else: + new_variables[ n ] = v + + return new_variables + + def DisplayBaloon( is_term, display ): if not is_term: display = '\n'.join( display )