o
    8)i)                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ejdZdZed ZdZed Zd5ddZ	d6d7ddZd ejd!d8d%d&Zd9d*d+Zd:d.d/Zd;d0d1Zd<d3d4ZdS )=    )annotationsN)get_close_matches)Any)Mapping)canonicalize_name   )_config)_log)version)load_toml_or_inline_mapZ	overridesZSETUPTOOLS_SCM_PRETEND_VERSIONz_FOR_{name}ZSETUPTOOLS_SCM_PRETEND_METADATAprefixstr	dist_nameenvMapping[str, str]returnlist[tuple[str, str]]c           	   	   C  s~   t |}g }| D ]2\}}|| r<|t| d }zt | dd}||kr1|||f W q
 ty;   Y q
w q
|S )a  Search environment variables with a given prefix for potential dist name matches.

    Args:
        prefix: The environment variable prefix (e.g., "SETUPTOOLS_SCM_PRETEND_VERSION_FOR_")
        dist_name: The original dist name to match against
        env: Environment dictionary to search in

    Returns:
        List of (env_var_name, env_var_value) tuples for potential matches
    N_-)r   items
startswithlenlowerreplaceappend	Exception)	r   r   r   canonical_dist_namematchesenv_varvaluesuffixZnormalized_suffix r!   T/home/app/PyTorch/.pytorch/lib/python3.10/site-packages/setuptools_scm/_overrides.py_search_env_vars_with_prefix   s   
r#   333333?expected_suffix	thresholdfloat	list[str]c                   sV   g }|D ]}| r|td }|| qt |d|d} fdd|D S )a  Find environment variables with similar suffixes that might be typos.

    Args:
        prefix: The environment variable prefix
        expected_suffix: The expected suffix (canonicalized dist name in env var format)
        env: Environment dictionary to search in
        threshold: Similarity threshold for matches (0.0 to 1.0)

    Returns:
        List of environment variable names that are close matches
    N   )ncutoffc                   s    g | ]}| kr | qS r!   r!   ).0matchr%   r   r!   r"   
<listcomp>R   s     z/_find_close_env_var_matches.<locals>.<listcomp>)r   r   r   r   )r   r%   r   r&   
candidatesr   r    close_matchesr!   r.   r"   _find_close_env_var_matches9   s   

r2   ZSETUPTOOLS_SCM)toolr   r3   name
str | Nonec                 C  s   | |  d| }|durxt|}|dd }|  d| d| }| |}|dur/|S |  d| d}	t|	||}
|
rg|
d \}}td||| t|
dkredd	 |
dd D }td
|| |S t|	||}|rxtd|||| |S )a  Read a named environment variable, with fallback search for dist-specific variants.

    This function first tries the standard normalized environment variable name.
    If that's not found and a dist_name is provided, it searches for alternative
    normalizations and warns about potential issues.

    Args:
        tool: The tool prefix (default: "SETUPTOOLS_SCM")
        name: The environment variable name component
        dist_name: The distribution name for dist-specific variables
        env: Environment dictionary to search in (defaults to os.environ)

    Returns:
        The environment variable value if found, None otherwise
    r   Nr   Z_FOR_r   zsFound environment variable '%s' for dist name '%s', but expected '%s'. Consider using the standard normalized name.r   c                 S  s   g | ]\}}|qS r!   r!   )r,   varr   r!   r!   r"   r/      s    z"read_named_env.<locals>.<listcomp>zAMultiple alternative environment variables found: %s. Using '%s'.zmEnvironment variable '%s' not found for dist name '%s' (canonicalized as '%s'). Did you mean one of these? %s)	getr   r   upperr#   logwarningr   r2   )r3   r4   r   r   Zgeneric_valr   Zenv_var_dist_nameZexpected_env_varvalr   Zalternative_matchesr   r   Z
other_varsr1   r!   r!   r"   read_named_envU   sH   
	r<   config_config.Configurationdict[str, Any] | Nonec              
   C  s   t d| j td| jd}|rRz(t|}h d}t| | }|r4t d|| |D ]}|| q,|p7dW S  t	yQ } zt 
d| W Y d}~dS d}~ww dS )a  read overridden metadata from the environment

    tries ``SETUPTOOLS_SCM_PRETEND_METADATA``
    and ``SETUPTOOLS_SCM_PRETEND_METADATA_FOR_$UPPERCASE_DIST_NAME``

    Returns a dictionary with metadata field overrides like:
    {"node": "g1337beef", "distance": 4}
    dist name: %sZPRETEND_METADATAr4   r   >   preformatteddirtytagdistancebranchtime	node_datenodezEInvalid metadata fields in pretend metadata: %s. Valid fields are: %sNz$Failed to parse pretend metadata: %s)r9   debugr   r<   r   setkeysr:   popr   error)r=   	pretendedmetadata_overridesZvalid_fieldsZinvalid_fieldsfielder!   r!   r"   _read_pretended_metadata_for   s,   

rS   scm_versionversion.ScmVersion | Nonec              	   C  s4  t |}|s| S | du rtd dS td| ddlm} ddlm} tdftdftdf|d	f|d
ftt	dfdftt	dfdfd}| }|
 D ]C\}}||v r||| \}	}
t||	spJ | d|
 dt	|j d|tj|fi ||i}qK|dkrtj||d}qKtd| qK|j|u sJ d|S )a  Apply metadata overrides to a ScmVersion object.

    This function reads pretend metadata from environment variables and applies
    the overrides to the given ScmVersion. TOML type coercion is used so values
    should be provided in their correct types (int, bool, datetime, etc.).

    Args:
        scm_version: The ScmVersion to apply overrides to, or None
        config: Configuration object

    Returns:
        Modified ScmVersion with overrides applied, or None
    NzrPRETEND_METADATA specified but no base version found. Metadata overrides cannot be applied without a base version.zApplying metadata overrides: %sr   )date)datetimeintboolrV   rW   zstr or None)rE   rC   rB   rH   rG   rI   rF   z	 must be z, got z: rD   )rD   z(Unknown field '%s' in metadata overridesz2Config must be preserved during metadata overrides)rS   r9   r:   inforW   rV   rX   rY   r   typer   
isinstance__name__dataclassesr   r=   )rT   r=   rP   rV   rW   Zfield_specsresultrQ   r   expected_type	type_namer!   r!   r"   _apply_metadata_overrides   s@   rb   c                 C  s4   t d| j td| jd}|rtj|d| dS dS )zread a a overridden version from the environment

    tries ``SETUPTOOLS_SCM_PRETEND_VERSION``
    and ``SETUPTOOLS_SCM_PRETEND_VERSION_FOR_$UPPERCASE_DIST_NAME``
    r@   ZPRETEND_VERSIONrA   T)rD   rB   r=   N)r9   rJ   r   r<   r
   meta)r=   rO   r!   r!   r"   _read_pretended_version_for  s
   rd   dict[str, Any]c                 C  s   t d| d}t|S )NZ	OVERRIDESrA   )r<   r   )r   datar!   r!   r"   read_toml_overrides(  s   rg   )r   r   r   r   r   r   r   r   )r$   )
r   r   r%   r   r   r   r&   r'   r   r(   )
r3   r   r4   r   r   r5   r   r   r   r5   )r=   r>   r   r?   )rT   rU   r=   r>   r   rU   )r=   r>   r   rU   )r   r5   r   re   )
__future__r   r^   osdifflibr   typingr   r   Zpackaging.utilsr    r   r	   r
   Z_integration.tomlr   r9   getChildZPRETEND_KEYZPRETEND_KEY_NAMEDZPRETEND_METADATA_KEYZPRETEND_METADATA_KEY_NAMEDr#   r2   environr<   rS   rb   rd   rg   r!   r!   r!   r"   <module>   s4    
!
K
1
E