a
    Te                     @  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
2}t
| \}	}|	std|W d   n1 s0    Y  |dur|n|}|durL|r|d| 7 }||krLt	|d>}| }
t|
|}
|d |  ||
 W d   n1 sB0    Y  t|	}t j|| d| d}t|d0}td| dddd |  W d   n1 s0    Y  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	   -lib/python3.9/site-packages/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flushZ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_dirsZdist_info_dirZname_versionexisting_build_numberZwheel_file_pathftagswheel_file_contentZtaglineZ
wheel_pathZwfr	   r   r   pack   sH    

"



**r-   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)r/   r+   r)   liner	   r	   r   r    L   s    
 
r    )r,   r   r0   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
r2       )encodeBUILD_NUM_REsubn)r,   r   ZreplacementZnum_replacedr	   r	   r   r#   ^   s    r#   z	list[str])r+   r0   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   r6   r   tagr	   r	   r   	<setcomp>y   r:   z"compute_tagline.<locals>.<setcomp>c                 S  s   h | ]}| d d qS )r   r   r>   r?   r	   r	   r   rA   z   r:   c                 S  s   h | ]}| d d qS )r      r>   r?   r	   r	   r   rA   {   r:   r   .)sortedr   )r+   ZimplsZabiversZ	platformsr	   r	   r   r'   s   s    r'   )Z
__future__r   os.pathr
   reZ	wheel.clir   Zwheel.wheelfiler   compiler   r<   r-   r    r#   r'   r	   r	   r	   r   <module>   s   

?