
(h                 @   s   d  d l  m Z d  d l j j Z d  d l Z d  d l Z d  d l Z d  d l	 Z	 d  d l
 m Z m Z d d l m Z d  d l Z e Z d d d  Z Gd	 d
   d
 e e j  Z d S)    )logN)sixordered_set   )sdist_add_defaults c             c   s@   x9 t  j d  D]( } x | j   |   D] } | Vq) Wq Wd S)z%Find all files under revision controlzsetuptools.file_findersN)pkg_resourcesiter_entry_pointsload)dirnameepitem r   >/tmp/pip-build-kmztzv_d/setuptools/setuptools/command/sdist.pywalk_revctrl   s    r   c                   s  e  Z d  Z d Z d8 d d d d f d9 g Z i  Z d d d d g Z e d d   e D  Z d d   Z	 d d   Z
 d d   Z d d   Z e e j d d     Z d d   Z e j d: k  p d; e j k o d< k  n p d= e j k o d> k  n Z e re Z   f d$ d%   Z d& d'   Z d( d)   Z d* d+   Z   f d, d-   Z d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7   Z   S)?sdistz=Smart sdist that finds anything supported by revision controlformats=N6formats for source distribution (comma-separated list)z	keep-tempkz1keep the distribution tree around after creating zarchive file(s)	dist-dir=dFdirectory to put the source distribution archive(s) in [default: dist]r   z.rstz.txtz.mdc             c   s   |  ] } d  j  |  Vq d S)z	README{0}N)format).0extr   r   r   	<genexpr>)   s    zsdist.<genexpr>c             C   s   |  j  d  |  j d  } | j |  _ |  j j t j j | j d   |  j   x! |  j	   D] } |  j  |  qa W|  j
   t |  j d g   } x9 |  j D]. } d d | f } | | k r | j |  q Wd  S)Negg_infozSOURCES.txt
dist_filesr   r   )run_commandget_finalized_commandfilelistappendospathjoinr   check_readmeget_sub_commandsmake_distributiongetattrdistributionZarchive_files)selfZei_cmdcmd_namer   filedatar   r   r   run+   s    "

z	sdist.runc             C   s   t  j j |   |  j   d  S)N)origr   initialize_options_default_to_gztar)r*   r   r   r   r0   >   s    zsdist.initialize_optionsc             C   s#   t  j d k r d  Sd g |  _ d  S)N      r   betar   gztar)r2   r3   r   zbetar   )sysversion_infoformats)r*   r   r   r   r1   C   s    zsdist._default_to_gztarc          	   C   s(   |  j     t j j |   Wd QRXd S)z%
        Workaround for #516
        N)_remove_os_linkr/   r   r'   )r*   r   r   r   r'   I   s    zsdist.make_distributionc              c   sq   Gd d   d  }  t  t d |   } y
 t ` Wn t k
 rC Yn Xz	 d VWd | |  k	 rl t t d |  Xd S)zG
        In a context, remove and restore os.link if it exists
        c               @   s   e  Z d  Z d S)z&sdist._remove_os_link.<locals>.NoValueN)__name__
__module____qualname__r   r   r   r   NoValueW   s   r=   linkN)r(   r"   r>   	Exceptionsetattr)r=   Zorig_valr   r   r   r9   P   s    
	zsdist._remove_os_linkc             C   s\   y t  j j |   WnA t k
 rW t j   \ } } } | j j j d j	     Yn Xd  S)Ntemplate)
r/   r   read_templater?   r6   exc_infotb_nexttb_framef_localsclose)r*   _tbr   r   r   Z__read_template_hacke   s    zsdist.__read_template_hack      r2   r   r      c                sL   t  j r t j |   n t   j   t j j d  rH |  j j	 d  d  S)Nzpyproject.toml)
r   PY2r   _add_defaults_optionalsuperr"   r#   isfiler    r!   )r*   )	__class__r   r   rN   |   s
    	zsdist._add_defaults_optionalc             C   sN   |  j  j   rJ |  j d  } |  j j | j    |  j |  j |   d S)zgetting python filesbuild_pyN)r)   has_pure_modulesr   r    extendZget_source_files_add_data_files_safe_data_files)r*   rR   r   r   r   _add_defaults_python   s    zsdist._add_defaults_pythonc             C   s   |  j  j r f  S| j S)z
        Extracting data_files from build_py is known to cause
        infinite recursion errors when `include_package_data`
        is enabled, so suppress it in that case.
        )r)   Zinclude_package_data
data_files)r*   rR   r   r   r   rV      s    zsdist._safe_data_filesc             C   s!   |  j  j d d   | D  d S)zA
        Add data files as found in build_py.data_files.
        c             s   s=   |  ]3 \ } } } } | D] } t  j j | |  Vq q d  S)N)r"   r#   r$   )r   rH   src_dir	filenamesnamer   r   r   r      s   z(sdist._add_data_files.<locals>.<genexpr>N)r    rT   )r*   rX   r   r   r   rU      s    		zsdist._add_data_filesc                sP   y* t  j r t j |   n t   j   Wn t k
 rK t j d  Yn Xd  S)Nz&data_files contains unexpected objects)r   rM   r   _add_defaults_data_filesrO   	TypeErrorr   warn)r*   )rQ   r   r   r\      s    	zsdist._add_defaults_data_filesc             C   sK   xD |  j  D] } t j j |  r
 d  Sq
 W|  j d d j |  j    d  S)Nz,standard file not found: should have one of z, )READMESr"   r#   existsr^   r$   )r*   fr   r   r   r%      s    zsdist.check_readmec             C   s   t  j j |  | |  t j j | d  } t t d  ri t j j |  ri t j |  |  j	 d |  |  j
 d  j |  d  S)Nz	setup.cfgr>   r   )r/   r   make_release_treer"   r#   r$   hasattrr`   unlink	copy_filer   Zsave_version_info)r*   base_dirfilesdestr   r   r   rb      s    !zsdist.make_release_treec          	   C   sT   t  j j |  j  s d St j |  j d   } | j   } Wd  QRX| d j   k S)NFrbz+# file GENERATED by distutils, do NOT edit
)r"   r#   rP   manifestioopenreadlineencode)r*   fp
first_liner   r   r   _manifest_is_not_generated   s    z sdist._manifest_is_not_generatedc             C   s   t  j d |  j  t |  j d  } x | D] } t j sw y | j d  } Wn& t k
 rv t  j d |  w, Yn X| j	   } | j
 d  s, | r q, |  j j |  q, W| j   d S)zRead the manifest file (named by 'self.manifest') and use it to
        fill in 'self.filelist', the list of files to include in the source
        distribution.
        zreading manifest file '%s'ri   zUTF-8z"%r not UTF-8 decodable -- skipping#N)r   inforj   rl   r   rM   decodeUnicodeDecodeErrorr^   strip
startswithr    r!   rG   )r*   rj   liner   r   r   read_manifest   s    	zsdist.read_manifestc             C   s   t  j   } |  j j d  } | j d d  \ } } | d k rR t j d  n | j |  y | j |  j j	 j
  Wn t k
 r t j d  Yn Xx= | D]5 } t j j |  s t j d |  | j |  q W|  j j |  d S)zvChecks if license_file' or 'license_files' is configured and adds any
        valid paths to 'self.filelist'.
        metadatalicense_fileNz''license_file' option was not specifiedz,warning: 'license_files' option is malformedz8warning: Failed to find the configured license file '%s')NN)r   Z
OrderedSetr)   get_option_dictgetr   debugaddupdaterz   Zlicense_filesr]   r^   r"   r#   r`   remover    rT   )r*   rg   optsrH   r{   ra   r   r   r   check_license   s"    zsdist.check_license)r   Nr   )r   r   r   )rJ   rK   rJ   )r2   r   )r2   r   rL   )r2   rJ   )r2   rJ   r   ) r:   r;   r<   __doc__user_optionsnegative_optZREADME_EXTENSIONStupler_   r.   r0   r1   r'   staticmethod
contextlibcontextmanagerr9   Z_sdist__read_template_hackr6   r7   Zhas_leaky_handlerB   rN   rW   rV   rU   r\   r%   rb   rq   ry   r   r   r   )rQ   r   r      sB     	

	

r   )	distutilsr   Zdistutils.command.sdistcommandr   r/   r"   r6   rk   r   Zsetuptools.externr   r   Z
py36compatr   r   listZ_default_revctrlr   r   r   r   r   <module>   s   