U
    Y$d                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZ e	dZ
e	dZdddd	d
dZdddddZddddddZdddddZdS )    )annotationsN)
WheelError)	WheelFilez6^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))\.dist-info$s   Build: (\d\w*)$strz
str | None)	directorydest_dirbuild_numberc              	     s   fddt  D }t|dkr4td  n|sFtd  |d }t|d}d}t j |d	}t	|d
(}t
| \}	}|	std|W 5 Q R X |dk	r|n|}|dk	r"|r|d| 7 }||kr"t	|d4}| }
t|
|}
|d |  ||
 W 5 Q R X t|	}t j|| d| d}t|d&}td| dddd |  W 5 Q R X td dS )aB  Repack a previously unpacked wheel directory into a new wheel file.

    The .dist-info/WHEEL file must contain one or more tags so that the target
    wheel file name can be determined.

    :param directory: The unpacked wheel directory
    :param dest_dir: Destination directory (defaults to the current directory)
    c                   s0   g | ](}t jt j |rt|r|qS  )ospathisdirjoinDIST_INFO_REmatch).0fnr   r	   2/tmp/pip-unpacked-wheel-jecr7hgc/wheel/cli/pack.py
<listcomp>   s    
zpack.<locals>.<listcomp>   z)Multiple .dist-info directories found in z#No .dist-info directories found in r   ZnameverNZWHEELrbzCNo tags present in {}/WHEEL; cannot determine target wheel filename-zrb+z.whlwzRepacking wheel as z... T)endflushOK)r
   listdirlenr   r   r   groupr   r   open	read_tagsreadformatset_build_numberseektruncatewritecompute_tagliner   printZwrite_files)r   r   r   Zdist_info_dirsdist_info_dirZname_versionexisting_build_numberZwheel_file_pathftagswheel_file_contentZtagline
wheel_pathZwfr	   r   r   pack   sH    





r0   bytesztuple[list[str], str | None])	input_strreturnc                 C  sj   g }d}|   D ]P}|dr>||dd  d q|dr|dd  d}q||fS )zRead tags from a string.

    :param input_str: A string containing one or more tags, separated by spaces
    :return: A list of tags and a list of build tags
    Ns   Tag:     r   asciis   Build: )
splitlines
startswithappendsplitrstripdecode)r2   r-   r+   liner	   r	   r   r!   L   s    
 
r!   )r.   r   r3   c                 C  s6   |rd|  dnd}t|| \} }|s2| |7 } | S )zCompute a build tag and add/replace/remove as necessary.

    :param wheel_file_content: The contents of .dist-info/WHEEL
    :param build_number: The build tags present in .dist-info/WHEEL
    :return: The (modified) contents of .dist-info/WHEEL
    zBuild: %s
r5       )encodeBUILD_NUM_REsubn)r.   r   replacementZnum_replacedr	   r	   r   r$   ^   s     r$   z	list[str])r-   r3   c                 C  sX   t dd | D }t dd | D }t dd | D }dd|d|d|gS )zcCompute a tagline from a list of tags.

    :param tags: A list of tags
    :return: A tagline
    c                 S  s   h | ]}| d d qS )r   r   r9   r   tagr	   r	   r   	<setcomp>y   s     z"compute_tagline.<locals>.<setcomp>c                 S  s   h | ]}| d d qS )r   r   rB   rC   r	   r	   r   rE   z   s     c                 S  s   h | ]}| d d qS )r      rB   rC   r	   r	   r   rE   {   s     r   .)sortedr   )r-   ZimplsZabivers	platformsr	   r	   r   r(   s   s    r(   )
__future__r   os.pathr
   reZ	wheel.clir   Zwheel.wheelfiler   compiler   r?   r0   r!   r$   r(   r	   r	   r	   r   <module>   s   

?