� ��^i�E���ddlZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z mZddlmZmZmZddlmZddlmZmZmZmZmZmZmZejjZejjZej e!��Z"ej#d��Z$ej#d��Z%ej#d ej&��Z'd e(d e)fd �Z*Gd �de��Z+ej,e+��dS)�N)�List�Optional�Tuple)� BadCommand�InstallationError)� HiddenText� display_path�hide_url)� make_command)�AuthInfo�RemoteNotFoundError�RemoteNotValidError� RevOptions�VersionControl�(find_path_to_project_root_from_repo_root�vcsz(^git version (\d+)\.(\d+)(?:\.(\d+))?.*$z^[a-fA-F0-9]{40}$a/^ # Optional user, e.g. 'git@' (\w+@)? # Server, e.g. 'github.com'. ([^/:]+): # The server-side path. e.g. 'user/project.git'. Must start with an # alphanumeric character so as not to be confusable with a Windows paths # like 'C:/foo/bar' or 'C:\foo\bar'. (\w[^:]*) $�sha�returnc�P�tt�|����S�N)�bool� HASH_REGEX�match)rs ��/builddir/build/BUILDROOT/alt-python311-pip-21.3.1-4.el8.x86_64/opt/alt/python311/lib/python3.11/site-packages/pip/_internal/vcs/git.py�looks_like_hashr7s�� � � � ��%�%� &� &�&�c �,��eZdZdZdZdZdZdZdZe de de e fd ���Z d e d e de fd �Zdeed ffd�Zede dee fd���Zed e de deee e ffd���Zed e de de fd���Zed e d ededefd���Zed e dee de fd���Zd e d ededdfd�Zd e d ededdfd�Zd e d ededdfd�Zede de fd���Ze d e de fd���Zede de de fd���Z ed%de dee de fd���Z!ede dee fd���Z"ed e dee ee e#ff�fd � ��Z$ede ddfd!���Z%ede dee f�fd"� ��Z&e d#e de fd$���Z'�xZ(S)&�Git�gitz.git�clone)zgit+httpz git+httpszgit+sshzgit+gitzgit+file)�GIT_DIR� GIT_WORK_TREE�HEAD�revrc��|gSr��r$s r�get_base_rev_argszGit.get_base_rev_argsKs ���u� r�url�destc���|�t|����\}}|jsdS|�||j��sdSt |�||j��d��}| S)NFr)�get_url_rev_optionsr r$�is_commit_id_equalr�get_revision_sha)�selfr)r*�_� rev_options�is_tag_or_branchs r�is_immutable_rev_checkoutzGit.is_immutable_rev_checkoutOs���1�1�(�3�-�-�@�@���;��� ��5��&�&�t�[�_�=�=� ��5� �� 5� 5�d�K�O� L� L�Q� O�P�P��#�#�#r.c���|�dgdd���}t�|��}|st�d|��dSt d�|���D����S)N�versionFT)� show_stdout� stdout_onlyzCan't parse git version: %sr&c3�4K�|]}t|��V��dSr)�int)�.0�cs r� z&Git.get_git_version..cs(����4�4��S��V�V�4�4�4�4�4�4r)� run_command�GIT_VERSION_REGEXr�logger�warning�tuple�groups)r/r5rs r�get_git_versionzGit.get_git_version]sx���"�"�I�;�E�t�"�T�T��!�'�'��0�0��� � �N�N�8�'� B� B� B��2��4�4�U�\�\�^�^�4�4�4�4�4�4r�locationc���gd�}|�|ddd|���}|���}|�d��r|td��d�SdS)zl Return the current branch, or None if HEAD isn't at a branch (e.g. detached HEAD). )z symbolic-ref�-qr#��FT��extra_ok_returncodesr6r7�cwdz refs/heads/N)r=�strip� startswith�len)�clsrD�args�output�refs r�get_current_branchzGit.get_current_branchesw��.�-�-����� �!%���� !� � ���l�l�n�n�� �>�>�-� (� (� -��s�=�)�)�+�+�,� ,��trc���|�d|g|ddd���}i}|����d��D][}|�d��}|s� |�dd � ��\}}n #t$rt d |�����wxYw|||<�\d |��}d |��} |�|��} | �| dfS|�| ��} | dfS)z� Return (sha_or_none, is_branch), where sha_or_none is a commit hash if the revision names a remote branch or tag, otherwise None. Args: dest: the repository directory. rev: the revision name. zshow-refFT�ignore)rKr6r7� on_returncode� � � �)�maxsplitzunexpected show-ref line: zrefs/remotes/origin/z refs/tags/)r=rL�split�rstrip� ValueError�get) rOr*r$rQ�refs�line�ref_sha�ref_name� branch_ref�tag_refrs rr.zGit.get_revision_sha~s6����� �� ����"� !� � �����L�L�N�N�(�(��.�.� %� %�D��;�;�t�$�$�D�� �� H�$(�J�J�s�Q�J�$?�$?�!������ H� H� H�!�!F�d�!F�!F�G�G�G� H���� %�D��N�N�1�C�1�1� �$�s�$�$���h�h�z�"�"�� �?���;� ��h�h�w�����U�|�s �!A<�<Bc��|�d��rdSt|��sdS|�||��rdSdS)a$ Return true if rev is a ref or is a commit that we don't have locally. Branches and tags are not considered in this method because they are assumed to be always available locally (which is a normal outcome of ``git clone`` and ``git fetch --tags``). zrefs/TF)rMr� has_commit)rOr*r$s r� _should_fetchzGit._should_fetch�sR�� �>�>�'� "� "� ��4��s�#�#� ��5� �>�>�$�� $� $� ��5��trr1c ���|j}|�J�|�||��\}}|�"|�|��}|r|nd|_|St |��st �d|��|�||��s|S|�tdd||� ����|���|� |d���}|�|��}|S)z� Resolve a revision to a new RevOptions object with the SHA1 of the branch, tag, or ref if found. Args: rev_options: a RevOptions object. Nz:Did not find branch or tag '%s', assuming revision or ref.�fetchrF�rK� FETCH_HEADr') �arg_revr.�make_new� branch_namerr?r@rhr=r �to_args� get_revision)rOr*r)r1r$r� is_branchs r�resolve_revisionzGit.resolve_revision�s���!�������-�-�d�C�8�8���Y� �?�%�.�.�s�3�3�K�-6�&@�c�c�D�K� #�� ��s�#�#� � �N�N�L�� � � � � � ��s�+�+� �� � ��� ��$��[�-@�-@�-B�-B� C� C�� � � � � ���t���6�6��!�*�*�3�/�/� ��r�namec�<�|sdS|�|��|kS)z� Return whether the current commit hash equals the given name. Args: dest: the repository directory. name: a string name. F)rq)rOr*rts rr-zGit.is_commit_id_equal�s*��� ��5�����%�%��-�-rNc ���|���}t�d||t|����|���dkr'|�t ddd||����n%|�t dd||����|jr�|�|||��}t|dd��}t� d||��|�V|� ||j��s:t dd|� ����}|�||� ��ng|� |��|kr#d |��}dd |d |g}|�||� ��n*|�|��}|�|��}t�d ||j��|�|��dS)NzCloning %s%s to %s)rZ�r z--filter=blob:nonerFrozRev options %s, branch_name %s�checkoutrkzorigin/z-bz--trackzResolved %s to commit %s)� to_displayr?�infor rCr=r r$rs�getattr�debugr-rprSrqrn�update_submodules) r/r*r)r1� rev_displayro�cmd_args� track_branchrs r� fetch_newz Git.fetch_news ��!�,�,�.�.� �� � �(�#�{�L���>�#� � � 2��#�C�(�(�/�/�1�1� 1��O�O�C�(�(� � � 6��#�#�$4�5�5� 5�!�#�&�&�&rc�h� |�dddd|zg|d���dS#t$rYdSwxYw)zU Check if rev is a commit that is available in the local repository. � rev-parserFz--verifyzsha^F)rK�log_failed_cmdT)r=r)rOrDr$s rrgzGit.has_commit�sc�� � �O�O��d�J��� �=��$� � � � ��4��!� � � ��5�5� ���s �#� 1�1c�h�|�d}|�d|gdd|���}|���S)Nr#r�FT�r6r7rK)r=rL)rOrDr$� current_revs rrqzGit.get_revision�sI�� �;��C��o�o� �#� ���� &� � � � � � �"�"�"rc�t�|�ddgdd|������}tj�|��s tj�||��}tj�tj�|d����}t||��S)z� Return the path to Python project root, relative to the repo root. Return None if the project root is in the repo root. r�z --git-dirFTr�z..)r=rLr�r��isabs�join�abspathr)rOrD�git_dir� repo_roots r�get_subdirectoryzGit.get_subdirectory�s����/�/� �+� &���� "� � � �%�'�'� � �w�}�}�W�%�%� 6��g�l�l�8�W�5�5�G��G�O�O�B�G�L�L��$�$?�$?�@�@� �7��)�L�L�Lrc����t|��\}}}}}|�d��r�|dt|�d���� �}|tj�|���dd���d��z}|�d��dz} |d| �t|| d�||||f��z}d|vrXd|vsJ�|�d d ��}t��� |��\}} } |�d d ��}n%t��� |��\}} } || | fS) a9 Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. That's required because although they use SSH they sometimes don't work with a ssh:// scheme (e.g. GitHub). But we need a scheme for parsing. Hence we remove it again afterwards and return it as a stub. �fileN�/�\�+rHz://zfile:zgit+z git+ssh://zssh://�) �urlsplit�endswithrN�lstrip�urllib�request� url2pathname�replace�find� urlunsplit�super�get_url_rev_and_auth) rOr)�scheme�netlocr��query�fragment�initial_slashes�newpath� after_plusr$� user_pass� __class__s �rr�zGit.get_url_rev_and_auth�so���19�� � �-����e�X� �?�?�6� "� "� �"�#;�c�$�+�+�c�*:�*:�&;�&;�%;�#;�<�O�%���(C�(C�D�(I�(I�(Q�(Q��c�)�)��f�S�k�k��G� ���S�)�)�A�-�J���*��%� �� � � �$�f�g�u�h�G�)�)��C� �� � ��#�%�%�%�%��+�+�f�l�3�3�C�"'�'�'�">�">�s�"C�"C� �C��i��+�+�h��+�+�C�C�"'�'�'�">�">�s�"C�"C� �C��i��C��"�"rc��tj�tj�|d����sdS|�gd�|���dS)Nz .gitmodules)� submoduler�z--initz --recursiverFrk)r�r�r�r�r=)rOrDs rr}zGit.update_submodules�s^���w�~�~�b�g�l�l�8�]�C�C�D�D� � �F� ��� B� B� B�� � � � � � rc�`��t���|��}|r|S |�ddg|dddd���}n8#t$rt�d|��YdSt $rYdSwxYwtj� |� d����S) Nr�z--show-toplevelFT�raise)rKr6r7rVr�zKcould not determine if %s is under git control because git is not availablez ) r��get_repository_rootr=rr?r|rr�r��normpathr])rOrD�loc�rr�s �rr�zGit.get_repository_root�s�����g�g�)�)�(�3�3�� � ��J� �����/�0��!� �%�$�  ���A�A��� � � � �L�L�/�� � � � �4�4� � � � ��4�4� �����w������� 0� 0�1�1�1s�A�%A;�. A;�:A;�repo_urlc��dS)zEIn either https or ssh form, requirements must be prefixed with git+.Tr&)r�s r�should_add_vcs_url_prefixzGit.should_add_vcs_url_prefix�s ���trr))�__name__� __module__� __qualname__rt�dirname� repo_name�schemes� unset_environ�default_arg_rev� staticmethod�strrr(rr3rr9rC� classmethodrrSr.rhrrrsr-r�r�r�r�r�rgrqr�r r�r}r�r�� __classcell__)r�s@rrr;s[������� �D��G��I��G�1�M��O���s��t�C�y�����\�� $�S� $�� $�� $� $� $� $�5��s�C�x��5�5�5�5���#��(�3�-�����[��0�+�C�+�c�+�e�H�S�M�4�r�VERBOSEr�r�rrr�registerr&rr�r�s��������������� � � � ���������(�(�(�(�(�(�(�(�(�(�B�B�B�B�B�B�B�B�G�G�G�G�G�G�G�G�G�G�7�7�7�7�7�7������������������� �<� �� �\� $� � �� �8� $� $���B�J� �����R�Z�+� ,� ,� � �B�J�  ��J� � � �'��'��'�'�'�'�C�C�C�C�C�.�C�C�C�L �� �S�����r