B
    ,d3                 @   s  d dl Z d dlZd dlZd dlZd dlmZ dejks:td dlZd dl	m
Z d dlZd dlmZ d dlmZ dZdejeZG d	d
 d
eZe Zddde_dd Zeed dZdd Zdd Zdd fddZdd Zdd Z dd Z!dd dfd d!Z"d"defd#defd$d%ed&fd'ded(dfd)d*e d+fd,d*e d-fd.ded/dfd0d1e!fd2d3ed4fd5d6e"d7dd8fd9d:e"d;fd<d=e"d>fd?d@e"dAefgZ#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dS )R    N)	find_specpydevd)pydevd_runpy)log)apiz2<filename> | -m <module> | -c <code> | --pid <pid>a0  debugpy {0}
See https://aka.ms/debugpy for documentation.

Usage: debugpy --listen | --connect
               [<host>:]<port>
               [--wait-for-client]
               [--configure-<name> <value>]...
               [--log-to <path>] [--log-to-stderr]
               {1}
               [<arg>]...
c               @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
dS )OptionsNF)__name__
__module____qualname__modeaddresslog_tolog_to_stderrtargettarget_kindwait_for_clientadapter_access_token r   r   _/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/debugpy/server/cli.pyr   *   s   r   noneT)ZqtZ
subProcessc                s    fdd}|S )Nc                sH    | }d k	r&|k r&t dd k	rD|krDt d|S )Nzmust be >= {0}zmust be < {0})
ValueErrorformat)sn)parserstartstopr   r   parse:   s    zin_range.<locals>.parser   )r   r   r   r   r   )r   r   r   r   in_range9   s    r   c             C   s   t ttjd td d S )N)filer   )printHELPsysstderrexit)switchitr   r   r   print_help_and_exitH   s    r'   c             C   s   t tj td d S )Nr   )r    debugpy__version__r"   r$   )r%   r&   r   r   r   print_version_and_exitM   s    
r*   c             C   s   | S )Nr   )xr   r   r   <lambda>R       r,   c                s    fdd}|S )Nc                s    t |}tt| d S )N)nextsetattroptions)argr&   value)r   varnamer   r   doS   s    zset_arg.<locals>.dor   )r3   r   r4   r   )r   r3   r   set_argR   s    r5   c                s    fdd}|S )Nc                s   t t  d S )N)r/   r0   )r1   r&   )r2   r3   r   r   r4   [   s    zset_const.<locals>.dor   )r3   r2   r4   r   )r2   r3   r   	set_constZ   s    r6   c                s    fdd}|S )Nc                s   t jd k	rtdt|}|d\}}}|s6d}|}yt|}W n tk
rZ   d}Y nX d|  krpdk szn td t _||ft _d S )Nz---listen and --connect are mutually exclusive:z	127.0.0.1r   i   zinvalid port number)r0   r   r   r.   	partitionint	Exceptionr   )r1   r&   r2   hostsepport)r   r   r   r4   b   s    

zset_address.<locals>.dor   )r   r4   r   )r   r   set_addressa   s    r?   c             C   s   d}|  |st| t|d  }t|}|tjkrBtd|ttj| }y(|t	krnddd|
  }n||}W n& tk
r   td||jY nX |tj|< d S )Nz--configure-zunknown property {0!r}TF)truefalsez{0!r} must be a {1})
startswithAssertionErrorlenr.   r0   configr   r   typeboollowerr;   r   )r1   r&   prefixnamer2   expected_typer   r   r   
set_configy   s    
rL   c             C   s   | S )Nr   )r+   r   r   r   r,      r-   Fc                s    fdd}|S )Nc                s    t _r| nt|}t|try|t }W nP tk
r   y|d}W n, tk
r   dd l	}||
d}Y nX Y nX |t _d S )Nzutf-8r   F)r0   r   r.   
isinstancebytesdecoder"   getfilesystemencodingUnicodeDecodeErrorlocalegetpreferredencodingr   )r1   r&   r   rR   )kindr   
positionalr   r   r4      s    
zset_target.<locals>.dor   )rT   r   rU   r4   r   )rT   r   rU   r   
set_target   s    rV   z-(\?|h|-help)z-(V|-version)z--log-toz<path>r   z--log-to-stderrr   z--listenz	<address>listenz	--connectconnectz--wait-for-clientr   z--configure-.+z<value>z--adapter-access-tokenz<token>r    z
<filename>r   )rU   z-mz<module>modulez-cz<code>codez--pidz<pid>pidc              c   s0   x*t tjdkr*tjd } tjd= | V  qW d S )N      )rD   r"   argv)r2   r   r   r   consume_argv   s    
r`   c           
   C   s  t  } t }xyt|}W n  tk
r<   tdt Y nX |}|dsPd}x4tD ] \}}}t	d| d |rVP qVW td| || krtd| n
| 
| y||| W nd tk
r   |d k	sttd||Y n6 tk
r } ztd	|||W d d }~X Y nX tjd k	rP qW tjd kr>td
tjd k	r^tjdkr^tdtjdkrztjrztdtjd k	sttjd k	sttjd k	std S )Nzmissing target: -rY   z^(z)$zunrecognized switch zduplicate switch z{0}: missing {1}zinvalid {0} {1}: {2}z(either --listen or --connect is requiredrX   z)--adapter-access-token requires --connectr\   z(--pid does not support --wait-for-client)setr`   r.   StopIterationr   TARGETrB   switchesrematchaddrC   r   r;   r0   r   r   r   r   r   r   )seenr&   r1   r%   patternplaceholderactionexcr   r   r   
parse_argv   sF    

$
rn   c             C   sz   | t jd< tdt j ttj tjdkr<t	tj
 n,tjdkrZtjtj
tjd ntttjtjrvt  d S )Nr   zsys.argv after patching: {0!r}rW   rX   )Zaccess_token)r"   r_   r   debugr(   	configurer0   rE   r   rW   r   rX   r   rC   reprr   )argv_0r   r   r   start_debugging   s    


rs   c              C   sj   t j} t|  tj| r6tj| }tjd| nt	
d|  t	d t	d|  tj| dd d S )Nr   zNot a file: {0!r}zPre-launch environment:zRunning file {0!r}__main__)Zrun_name)r0   r   rs   ospathisfiledirnamer"   insertr   ro   describe_environmentinforunpyZrun_path)r   dirr   r   r   run_file
  s    
r~   c              C   s   t jdtd t jd } yttj}|d k	r6|j} W n t	k
rV   t
d Y nX t|  t
d t
dtj y
tj}W n. tk
r   t
d tjtjdd Y nX |tjdd	 d S )
Nr   rY   z*Error determining module path for sys.argvzPre-launch environment:zRunning module {0!r}zArunpy._run_module_as_main is missing, falling back to run_module.T)Z	alter_sys)Z
alter_argv)r"   rv   ry   strr_   r   r0   r   originr;   r   Zswallow_exceptionrs   rz   r{   r|   Z_run_module_as_mainAttributeErrorwarning
run_module)rr   specZrun_module_as_mainr   r   r   r     s"    





r   c              C   sZ   t jdtd ttjtdtd} ttd t	d t
dtj t| i  d S )Nr   rY   z<string>execz-czPre-launch environment:zRunning code:

{0})r"   rv   ry   r   compiler0   r   rs   r   rz   r{   eval)r[   r   r   r   run_code@  s    
r   c           	   C   sZ  t j} td|  dd }tjtjj	}tj
|s:t||}t jt jt jt jt jd}|t|}d}|ddddj||d	}td
|dd ddddht|@ rtdtjtjtj	d}tj
|sttj| y6dd l}td|  |j| |dttddd W n" tk
rH   td|  Y nX td|  d S )Nz!Attaching to process with PID={0}c             S   s   | d k	rt t| dS d S )Nzutf-8)list	bytearrayencode)r   r   r   r   r,   Q  r-   zattach_to_pid.<locals>.<lambda>)r   r   r   r   r   a9  
import codecs;
import json;
import sys;

decode = lambda s: codecs.utf_8_decode(bytearray(s))[0] if s is not None else None;

script_dir = decode({script_dir});
setup = json.loads(decode({setup}));

sys.path.insert(0, script_dir);
import attach_pid_injected;
del sys.path[0];

attach_pid_injected.attach(setup);
rY   
)
script_dirsetupzCode to be injected: 
{0};z;
"'zOInjected code should not contain any single quotes, double quotes, or newlines.Zpydevd_attach_to_processr   z,Injecting code into process with PID={0} ...TZ DEBUGPY_ATTACH_BY_PID_DEBUG_INFO0)Zconnect_debugger_tracingZshow_debug_infoz#Code injection into PID={0} failed:z&Code injection into PID={0} completed.) r0   r   r   r{   ru   rv   rx   r(   server__file__existsrC   r   r   r   r   r   jsondumpsreplacer   rb   joinr   r"   appendadd_code_to_python_processZrun_python_coder:   getenvr;   reraise_exception)r\   r   r   r   Zpython_codeZpydevd_attach_to_process_pathr   r   r   r   attach_to_pidM  sD    

r   c           
   C   s   t tj} y
t  W nN tk
rb } z0ttttd t| tjd t	d W d d }~X Y nX t
jd k	rztt
j t
jrttj t  ttd| tj yttttdt
j }|  W n4 tk
r } ztjd|jdd W d d }~X Y nX d S )	Nz
Error: )r   r]   z=sys.argv before parsing: {0!r}
         after parsing:  {1!r})r   rZ   r[   r\   z%Debuggee exited via SystemExit: {0!r}ro   )level)r   r"   r_   rn   r;   r    r   r!   r#   r$   r0   r   r(   r   r   Zensure_loggingr   r{   r~   r   r   r   r   
SystemExitr   r[   )Zoriginal_argvrm   runr   r   r   main  s2    

"

r   ),r   ru   rf   r"   importlib.utilr   modulesrC   r   Z_pydevd_bundler   r|   r(   Zdebugpy.commonr   Zdebugpy.serverr   rd   r   r)   r!   objectr   r0   rE   r   r:   r\   r'   r*   r5   r6   r?   rL   rV   re   r`   rn   rs   r~   r   r   r   r   r   r   r   r   <module>   s\   
/!E