@@ -250,6 +250,29 @@ def launch_request(self, request):
250250 if self .session .id != 1 or len (servers .connections ()):
251251 raise request .cant_handle ('"attach" expected' )
252252
253+ debug_options = set (request ("debugOptions" , json .array (unicode )))
254+
255+ # Handling of properties that can also be specified as legacy "debugOptions" flags.
256+ # If property is explicitly set to false, but the flag is in "debugOptions", treat
257+ # it as an error. Returns None if the property wasn't explicitly set either way.
258+ def property_or_debug_option (prop_name , flag_name ):
259+ assert prop_name [0 ].islower () and flag_name [0 ].isupper ()
260+
261+ value = request (prop_name , bool , optional = True )
262+ if value == ():
263+ value = None
264+
265+ if flag_name in debug_options :
266+ if value is False :
267+ raise request .isnt_valid (
268+ '{0!j}:false and "debugOptions":[{1!j}] are mutually exclusive' ,
269+ prop_name ,
270+ flag_name ,
271+ )
272+ value = True
273+
274+ return value
275+
253276 # Launcher doesn't use the command line at all, but we pass the arguments so
254277 # that they show up in the terminal if we're using "runInTerminal".
255278 if "program" in request :
@@ -277,8 +300,12 @@ def launch_request(self, request):
277300 )
278301 console_title = request ("consoleTitle" , json .default ("Python Debug Console" ))
279302
303+ sudo = bool (property_or_debug_option ("sudo" , "Sudo" ))
304+ if sudo and sys .platform == "win32" :
305+ raise request .cant_handle ('"sudo":true is not supported on Windows.' )
306+
280307 servers .serve ()
281- launchers .spawn_debuggee (self .session , request , args , console , console_title )
308+ launchers .spawn_debuggee (self .session , request , args , console , console_title , sudo )
282309
283310 @_start_message_handler
284311 def attach_request (self , request ):
0 commit comments