B
    b<                 @   s2  d Z ddlZddlZddlZddlZddlmZ ddlZddlZddl	Z
ddlZ
dd Zdd ZG dd	 d	Zdag Zg Ze Zdadadad
d Zdd Zdd Zdd ZeeedZddiZtfddZd'ddZd(ddZead)ddZ dd Z!G d d! d!Z"d"d# Z#d$d% Z$e%d&kr.e$  e&d dS )*zAUtility script to dump information from SCons signature database.    N)whichdbc          	   C   sP   | dd  dkrdS yt | d d dS Q R X W n tk
rF   Y nX t| S )Niz.dblitezSCons.dbliterb)openIOErrorr   )filename r   7lib/python3.7/site-packages/SCons/Utilities/sconsign.py
my_whichdb+   s    r	   c             C   sl   ddl }d| krL| d}t| d| }|| |d d |j\}}}n|| \}}}|| |||S )zImport database module.

    This was used if the module was *not* SCons.dblite, to allow
    for programmatic importing.  It is no longer used, in favor of
    importlib.import_module, and will be removed eventually.
    r   N.   )imprfind	my_importfind_module__path__load_module)Zmnamer   iparentfppathnameZdescriptionr   r   r   r   6   s    
"r   c               @   s    e Zd ZdZdd Zdd ZdS )Flaggerr   c             C   s   || j |< d| _d S )Nr   )__dict__default_value)selfitemvaluer   r   r   __setitem__K   s    
zFlagger.__setitem__c             C   s   | j || jS )N)r   getr   )r   r   r   r   r   __getitem__O   s    zFlagger.__getitem__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   H   s   r   c             C   s2   yt d| }W n tk
r(   d}Y nX t|S )z
    Stringify an entry that doesn't have an explicit mapping.

    Args:
        entry:  entry
        name: field name

    Returns: str

    zentry.N)evalAttributeErrorstr)entrynamevalr   r   r   default_mapper\   s
    
r(   c             C   s2   y| j }| j}W n tk
r$   dS X d||f S )z
    Stringify an action entry and signature.

    Args:
        entry: action entry
        second argument is not used

    Returns: str

    Nz%s [%s])bactbactsigr#   )r%   _r)   r*   r   r   r   
map_actionn   s    
r,   c             C   sJ   y
| j }W n tk
r"   d}Y nX tr>|r>dt| d S t|S dS )z
    Stringify a timestamp entry.

    Args:
        entry: timestamp entry
        second argument is not used

    Returns: str

    N')	timestampr#   ReadabletimeZctimer$   )r%   r+   r.   r   r   r   map_timestamp   s    

r1   c             C   s   y(| j | j | j }| j| j | j }W n tk
r<   dS X t|t|krrtd7 ad}|	t|t|g}ng }|dd t
||D 7 }|sdS d|S )zw
    Stringify an implicit entry.

    Args:
        entry:
        second argument is not used

    Returns: str

    Nr   z0Warning: missing information, {} ids but {} sigsc             S   s   g | ]\}}t ||d qS )z        )nodeinfo_string).0ZbkidZbkidsigr   r   r   
<listcomp>   s   zmap_bkids.<locals>.<listcomp>z	
        )ZbsourcesZbdependsZ	bimplicitZbsourcesigsZbdependsigsZbimplicitsigsr#   lenWarnsformatzipjoin)r%   r+   bkidsZbkidsigsmsgresultr   r   r   	map_bkids   s    r=   )actionr.   r:   implicitr:   c             C   sB   t |  sd S t| | }t|t}||| }|r>| d | }|S )Nz: )Print_Flagsmap_namer   	map_fieldr(   )r&   r%   verboseZ	fieldnameZmapperr'   r   r   r   field   s    
rD    c          	   C   s   |  }y|jdg }W n  tk
r8   t| }Y nX g }x,|D ]$}|dt|t||f  qDW d| kr|t| } | d d| d S )z
    This just formats the dictionary, which we would normally use str()
    to do, except that we want the keys sorted for deterministic output.
    Z_version_idz%s: %s
z: {z, })	__getstate__
field_listr#   sortedkeysappendreprr   r9   )r&   ninfoprefixdrK   valueskeyr   r   r   nodeinfo_raw   s    
$rS   c                sv   y
 j }W n tk
r"   g }Y nX d| kr4t| } | d gdd  fdd|D D  }trhd| }nd}||S )NrF   :c             S   s   g | ]}|r|qS r   r   )r3   fr   r   r   r4      s    z#nodeinfo_cooked.<locals>.<listcomp>c                s   g | ]}t | tqS r   )rD   Verbose)r3   x)rN   r   r   r4      s    z
     )rI   r#   rM   rV   r9   )r&   rN   rO   rI   outlistsepr   )rN   r   nodeinfo_cooked   s    


r[   c             C   sZ   t d|d}|r(trtd td|  t d|d}|rVtrJtd|  ntd|  d S )Nr?   r   z    implicit:z        r>   z    action: )rD   rV   print)r&   r%   rO   rY   Zoutactr   r   r   
printfield   s    r]   c          	   C   s   t rxt D ]}y| | }W n, tk
rF   d||f }tj| Y q
X y
|j}W n  tk
rr   t|d  Y nX tt||j t	||j
 q
W nfxdt|  D ]T}| | }y
|j W n  tk
r   t|d  Y nX tt||j t	||j
 qW d S )Nz sconsign: no entry `%s' in `%s'
rT   )Print_EntriesKeyErrorsysstderrwriterN   r#   r\   r2   r]   ZbinforJ   rK   )entrieslocationr&   r%   errrN   r   r   r   printentries   s*    


rf   c               @   s(   e Zd Zdd Zdd Zedd ZdS )Do_SConsignDBc             C   s   || _ || _d S )N)dbm_namedbm)r   rh   ri   r   r   r   __init__  s    zDo_SConsignDB.__init__c       
      C   s  y| j |d}W nX ttfk
r } z|}y| j tj|d d}W nn ttfk
r   yt|d W d Q R X W n* ttfk
r } z|}W d d }~X Y nX tj	d|  d S X W d d }~X Y n t
k
r    Y n tjk
r   tj	d| j|f  d S  tk
rl } zBtj	d| j||f  t \}}}|jdkr\tj	d d S d }~X Y nX trxtD ]R}y|| }W n2 tk
r   d	|td f }	tj	|	 Y nX | || qzW n(x&t| D ]}| |||  qW d S )
Nrr   r   zsconsign: %s
z*sconsign: ignoring invalid `%s' file `%s'
z.sconsign: ignoring invalid `%s' file `%s': %s

ValueErrorzunrecognized pickle protocol.
zsconsign: no dir `%s' in `%s'
)ri   r   r   OSErrorospathsplitextr`   ra   rb   KeyboardInterruptpickleUnpicklingErrorrh   	Exceptionexc_infor   Print_Directoriesr_   argsrf   rJ   rK   )
r   fnameZdbeZprint_eexc_typer+   dirr'   re   r   r   r   __call__!  sJ    
zDo_SConsignDB.__call__c             C   sR   yt d|  d  W n( tk
r<   t d|   d  Y nX tt||  d S )Nz=== rT   )r\   	TypeErrordecoderf   rr   loads)r{   r'   r   r   r   rf   \  s
    zDo_SConsignDB.printentriesN)r   r    r!   rj   r|   staticmethodrf   r   r   r   r   rg     s   ;rg   c             C   s   yt | d}ytj|}W nv tk
r4    Y nb tjk
r\   d|  }tj	| d S  t
k
r } zd| |f }tj	| d S d }~X Y nX t|jtd  W d Q R X W n6 ttfk
r } ztj	d|  d S d }~X Y nX d S )Nr   z/sconsign: ignoring invalid .sconsign file `%s'
z3sconsign: ignoring invalid .sconsign file `%s': %s
r   zsconsign: %s
)r   SConsZSConsignZDirrq   rr   rs   r`   ra   rb   rt   rf   rc   rw   r   rm   )r&   r   sconsignre   ry   r   r   r   Do_SConsignDire  s$    r   c        
      C   s  d} y:t  tjdd  ddddddd	d
ddddddg\}aW nJ t jk
r } z*tjt|d  t|  t	d W d d }~X Y nX x|D ]|\}}|dkrdt
d< q|dkrdt
d< q|dkrt| q|dkrt| q|dkrdd d}|||}|ry0|dkr&t|}ndd l}|j}d|j_W n8 tk
rv   tjd|  t|  t	d Y nX t||antaq|dkrt|  t	d q|dkrdt
d< q|dkrtaq|d krdaq|d!krdt
d< q|d"krdt
d< q|d#krdaqW tr4xtD ]}t| q W nts@d$gaxptD ]h}t|}|rdd%i}	|dkrvt|}ndd l}|j}d|j_t|	|||| nt| qFW trtd&t  d S )'Na  Usage: sconsign [OPTIONS] [FILE ...]

Options:
  -a, --act, --action         Print build action information.
  -c, --csig                  Print content signature information.
  -d DIR, --dir=DIR           Print only info about DIR.
  -e ENTRY, --entry=ENTRY     Print only info about ENTRY.
  -f FORMAT, --format=FORMAT  FILE is in the specified FORMAT.
  -h, --help                  Print this message and exit.
  -i, --implicit              Print implicit dependency information.
  -r, --readable              Print timestamps in human-readable form.
  --raw                       Print raw Python object representations.
  -s, --size                  Print file sizes.
  -t, --timestamp             Print timestamp information.
  -v, --verbose               Verbose, describe each field.
r   zacd:e:f:hirstvZactr>   Zcsigzdir=zentry=zformat=helpr?   rawreadablesizer.   rC   rF      )z-az--actz--action)z-cz--csig)z-dz--dir)z-ez--entry)z-fz--formatzSCons.dblite)dbliter   r   Fz#sconsign: illegal file format `%s'
)z-hz--help)z-iz
--implicit)z--raw)z-rz
--readable)z-sz--size)z-tz--timestamp)z-vz	--verbosez.sconsign.dbliter   z1NOTE: there were %d warnings, please check output)getoptr`   argvrw   ZGetoptErrorra   rb   r$   r\   exitr@   rv   rL   r^   r   	importlibimport_moduleZSCons.dbliter   ZIGNORE_CORRUPT_DBFILESImportErrorrg   Do_Callr   rS   r2   r/   rV   r	   r6   )
ZhelpstrZoptsre   oaZ
Module_Maprh   ri   r   Z
Map_Moduler   r   r   main{  s    
















r   __main__)rE   )rE   )rE   )'__doc__r   r   rn   r`   ri   r   r0   rr   ZSCons.compatr   ZSCons.SConsignr	   r   r   r   rv   r^   r@   rV   r/   r6   r(   r,   r1   r=   rB   rA   rD   rS   r[   r2   r]   rf   rg   r   r   r   r   r   r   r   r   <module>   sN   !


I
