B
    bS6                 @   st   d Z ddlZddlZddlZddlZddlZddlZyddlZW n ek
rT   Y nX G dd dej	Z
dd ZdS )zSCons interactive mode.     Nc               @   s   e Zd ZdZddddddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"SConsInteractiveCmda  
build [TARGETS]         Build the specified TARGETS and their dependencies. 'b' is a synonym.
clean [TARGETS]         Clean (remove) the specified TARGETS and their dependencies.  'c' is a synonym.
exit                    Exit SCons interactive mode.
help [COMMAND]          Prints help for the specified COMMAND.  'h' and '?' are synonyms.
shell [COMMANDLINE]     Execute COMMANDLINE in a subshell.  'sh' and '!' are synonyms.
version                 Prints SCons version information.
buildZcleanhelpshell)bchZsconsZshc             K   sJ   t j|  x | D ]\}}t| || qW tjdkr@d| _nd| _d S )Nwin32ZCOMSPECZSHELL)cmdCmd__init__itemssetattrsysplatformshell_variable)selfkwkeyval r   7lib/python3.7/site-packages/SCons/Script/Interactive.pyr   s   s    
zSConsInteractiveCmd.__init__c             C   s   t d|d   d S )Nz*** Unknown command: %sr   )print)r   argvr   r   r   default}   s    zSConsInteractiveCmd.defaultc             C   s   |  }|st| j |  S || _|d dkrBd|dd   }n|d dkr^d|dd   }tjdkrt|dd}t|}| j	
|d |d |d< |d s| |S yt| d	|d  }W n tk
r   | |S X ||S d S )
Nr   !zshell    ?zhelp \z\\do_)stripr   ZlastcmdZ	emptylineossepreplaceshlexsplitsynonymsgetr   getattrAttributeError)r   liner   funcr   r   r   onecmd   s(    



zSConsInteractiveCmd.onecmdc             C   sZ  ddl }ddl}ddl}t| j}| jj|dd |d\}}||j_	|rV||j_
n|jj|j_
|jj| j||| j}|sdS g }x|D ]}|| d  qW || |jjd i }|fdd}	|fdd	}
x<|D ]4}|jj||	|
d
}| }x|r| }q W qW x.| D ]"}|  ||jj d|_q"W |jjd dS )z        build [TARGETS]         Build the specified TARGETS and their
                                dependencies.  'b' is a synonym.
        r   Nr   )valuesz+scons: Clearing cached node information ...c                s&   |fdd  fdd| j ddD S )Nc             S   s   | |kS )Nr   )node
seen_nodesr   r   r   	is_unseen   s    zLSConsInteractiveCmd.do_build.<locals>.get_unseen_children.<locals>.is_unseenc                s   g | ]} |r|qS r   r   ).0Zchild)r0   r   r   
<listcomp>   s    zMSConsInteractiveCmd.do_build.<locals>.get_unseen_children.<locals>.<listcomp>r   )scan)Zchildren)r.   parentr/   r   )r0   r   get_unseen_children   s    z9SConsInteractiveCmd.do_build.<locals>.get_unseen_childrenc             S   sB   d|| < y
| j }W n tk
r&   d S X | }|| kr>d||< d S )Nr   )rfiler)   )r.   r4   r/   Zrfile_methodr6   r   r   r   add_to_seen_nodes   s    
z7SConsInteractiveCmd.do_build.<locals>.add_to_seen_nodes)Z	kids_funcZ	eval_funcz&scons: done clearing node information.)Z
SCons.NodeZSCons.SConsignZSCons.Script.Maincopydeepcopyoptionsparser
parse_argsZScriptZCOMMAND_LINE_TARGETSZBUILD_TARGETSZ_build_plus_defaultZMainZ_build_targetsfs
target_topextendZalter_targetsZprogress_displayZNodeZWalkerZget_nextkeysclearZ	set_stateZno_stateZimplicit)r   r   ZSConsr:   targetsZnodesxnr/   r5   r7   r.   Zwalkerr   r   r   do_build   sF    



zSConsInteractiveCmd.do_buildc             C   s   |  ddg|dd  S )z        clean [TARGETS]         Clean (remove) the specified TARGETS
                                and their dependencies.  'c' is a synonym.
        r   z--cleanr   N)rE   )r   r   r   r   r   do_clean  s    zSConsInteractiveCmd.do_cleanc             C   s   t   | | d S )N)r   do_exit)r   r   r   r   r   do_EOF  s    zSConsInteractiveCmd.do_EOFc             C   s   yt | d| }W nh tk
rz   yt | d| }W n tk
rL   d }Y nX | |}|rvtj|d  tj  Y n,X | | }|rtj|d  tj  d S )NZhelp_r   
)r(   r)   _doc_to_helpr   stdoutwriteflushZstrip_initial_spaces)r   argr+   docr   r   r   _do_one_help  s    

z SConsInteractiveCmd._do_one_helpc             C   s   |j }|d krdS | |S )N )__doc___strip_initial_spaces)r   objrO   r   r   r   rJ   +  s    z SConsInteractiveCmd._doc_to_helpc             C   sD   | d}td|d d}|fdd}tt||}d|S )NrI   z *r   c             S   s(   | d t | |kr$| t |d  } | S )N)len)lspacesr   r   r   strip_spaces4  s    z?SConsInteractiveCmd._strip_initial_spaces.<locals>.strip_spaces)r%   rematchgrouplistmapjoin)r   slinesrW   rX   r   r   r   rS   1  s
    
z)SConsInteractiveCmd._strip_initial_spacesc             C   s   t d dS )zE        exit                    Exit SCons interactive mode.
        r   N)r   exit)r   r   r   r   r   rG   ;  s    zSConsInteractiveCmd.do_exitc             C   s^   |dd r0xL|dd D ]}|  |rP qW n*| | j}|rZtj|d  tj  dS )z        help [COMMAND]          Prints help for the specified COMMAND.  'h'
                                and '?' are synonyms.
        r   NrI   )rP   rJ   	__class__r   rK   rL   rM   )r   r   rN   rO   r   r   r   do_helpA  s    
zSConsInteractiveCmd.do_helpc          
   C   s   ddl }|dd }|s$tj| j }y|j|tjdkd}W n< tk
rx } ztj	d|d |j
f  W dd}~X Y n
X |  dS )z        shell [COMMANDLINE]     Execute COMMANDLINE in a subshell.  'sh' and
                                '!' are synonyms.
        r   Nr   r	   )r   zscons: %s: %s
)
subprocessr!   environr   Popenr   r   EnvironmentErrorstderrrL   strerrorwait)r   r   rd   per   r   r   do_shellR  s    ,zSConsInteractiveCmd.do_shellc             C   s   t j| jjd  dS )zJ        version                 Prints SCons version information.
        rI   N)r   rK   rL   r;   version)r   r   r   r   r   
do_versionf  s    zSConsInteractiveCmd.do_versionN)__name__
__module____qualname__rR   r&   r   r   r,   rE   rF   rH   rP   rJ   rS   rG   rc   rm   ro   r   r   r   r   r   `   s&   	
u
r   c             C   s    t d| ||||d}|  d S )Nz	scons>>> )promptr=   r;   r:   rB   r>   )r   Zcmdloop)r=   r;   r:   rB   r>   r   r   r   r   interactl  s    rt   )rR   r
   r8   r!   rY   r$   r   readlineImportErrorr   r   rt   r   r   r   r   <module>   s   <  