1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
Ë
ñúhÈJãóì—ddlmZddlZddlZddlZddlZddlZddl    Zddl
m Z ddl m Z ddlmZmZddlmZmZmZddlmZddlmZmZmZmZmZmZmZej>j@Z ej>jBZ!ejDe#«Z$ejJd    «Z&ejJd
«Z'ejJd ejP«Z)dd „Z*Gd „de«Z+ejXe+«y)é)Ú annotationsN)Úreplace)ÚAny)Ú
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[^:]*)
    $có>—ttj|««S©N)ÚboolÚ
HASH_REGEXÚmatch)Úshas úHH:\Change_password\venv_build\Lib\site-packages\pip/_internal/vcs/git.pyÚlooks_like_hashr:s€Ü ”
× Ñ  Ó%Ó &Ð&ócóÔ‡—eZdZdZdZdZdZdZdZe    dd„«Z
e dˆfd„ «Z dd    „Z dd
„Ze d d „«Ze d!d „«Ze d"d „«Ze                                 d#d„«Ze d$d„«Z                                        d%d„Z    d&                                    d%d„Z    d&                                    d%d„Ze d'd„«Ze    d(d„«Ze d)d„«Ze d*d+d„«Ze d d„«Ze d,ˆfd„ «Ze d&d-d„«Ze d ˆfd„ «Ze    d.d„«ZˆxZ S)/ÚGitÚgitz.gitÚclone)zgit+httpz    git+httpszgit+sshzgit+gitzgit+file)ÚGIT_DIRÚ GIT_WORK_TREEÚHEADcó—|gSr©©Úrevs rÚget_base_rev_argszGit.get_base_rev_argsNs    €àˆuˆ rc󢕗tjjd«r!|jdi«}d|d<d|d<||d<t‰||i|¤ŽS)NÚ PIP_NO_INPUTÚ extra_environÚ0ÚGIT_TERMINAL_PROMPTzssh -oBatchMode=yesÚGIT_SSH_COMMAND)ÚosÚenvironÚgetÚsuperÚ run_command)ÚclsÚargsÚkwargsr*Ú    __class__s    €rr2zGit.run_commandRsXø€ä :‰:>‰>˜.Ô )Ø"ŸJ™J ¸Ó;ˆMØ36ˆMÐ/Ñ 0Ø/DˆMÐ+Ñ ,Ø&3ˆF?Ñ #܉wÑ" DÐ3¨FÑ3Ð3rcóæ—|jt|««\}}|jsy|j||j«syt    |j ||j«d«}| S)NFr)Úget_url_rev_optionsr
r&Úis_commit_id_equalrÚget_revision_sha)ÚselfÚurlÚdestÚ_Ú rev_optionsÚis_tag_or_branchs      rÚis_immutable_rev_checkoutzGit.is_immutable_rev_checkout[si€Ø×1Ñ1´(¸3³-Ó@‰ˆˆ;ØŠØØ×&Ñ& t¨[¯_©_Ô=ðô  × 5Ñ 5°d¸K¿O¹OÓ LÈQÑ OÓPÐØ#Ð#Ð#rcóò—|jdgddd¬«}tj|«}|stj    d|«yt |j d««t |j d    ««fS)
NÚversionz git versionFT)Ú command_descÚ show_stdoutÚ stdout_onlyzCan't parse git version: %sr$éé)r2ÚGIT_VERSION_REGEXrÚloggerÚwarningÚintÚgroup)r;rCrs   rÚget_git_versionzGit.get_git_versionisq€Ø×"Ñ"Ø ˆKØ&ØØð    #ó
ˆô "×'Ñ'¨Ó0ˆÙÜ N‰NÐ8¸'Ô BØÜE—K‘K “NÓ#¤S¨¯©°Q«Ó%8Ð9Ð9rcó–—gd¢}|j|ddd|¬«}|j«}|jd«r|td«dSy)zl
        Return the current branch, or None if HEAD isn't at a branch
        (e.g. detached HEAD).
        )z symbolic-refú-qr"©rGFT©Úextra_ok_returncodesrErFÚcwdz refs/heads/N)r2ÚstripÚ
startswithÚlen)r3Úlocationr4ÚoutputÚrefs     rÚget_current_branchzGit.get_current_branchvsZ€ò.ˆØ—‘Ø Ø!%ØØØð !ó
ˆðl‰l‹nˆà >‰>˜-Ô (Ø”s˜=Ó)Ð+Ð,Ð ,àrcó€—|jd|g|ddd¬«}i}|j«jd«D]2}|jd«}|sŒ    |jdd    ¬
«\}}|||<Œ4d |›}d |›}    |j |«}
|
|
dfS|j |    «}
|
dfS#t$rt    d |›«‚wxYw)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)rTrErFÚ on_returncodeú
ú ú rH)Úmaxsplitzunexpected show-ref line: zrefs/remotes/origin/z
refs/tags/)r2rUÚsplitÚrstripÚ
ValueErrorr0) r3r=r&rYÚrefsÚlineÚref_shaÚref_nameÚ
branch_refÚtag_refrs            rr:zGit.get_revision_shas€ð—‘Ø ˜Ð ØØØØ"ð !ó
ˆðˆð—L‘L“N×(Ñ(¨Ó.ò     %ˆDØ—;‘;˜tÓ$ˆDÙØð HØ$(§J¡J¨s¸Q JÓ$?Ñ!˜ð %ˆDŠNð     %ð,¨C¨5Ð1ˆ
ؘs˜eÐ$ˆàh‰hzÓ"ˆØ ˆ?ؘ;Ð àh‰hwÓˆàUˆ|Ðøô!ò Hô!Ð#=¸d¸XÐ!FÓGÐGð Hús ÁB%Â%B=cóf—|jd«ryt|«sy|j||«ryy)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)rVrÚ
has_commit)r3r=r&s   rÚ _should_fetchzGit._should_fetch½s2€ð >‰>˜'Ô "àä˜sÔ#àà >‰>˜$ Ô $ààrc    ó¨—|j}|€J‚|j||«\}}|$|j|«}t||r|nd¬«}|St    |«st
j d|«|j||«s|S|jtdd||j««|¬«|j|d¬«}|j|«}|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.
        N)Ú branch_namez:Did not find branch or tag '%s', assuming revision or ref.ÚfetchrP©rTÚ
FETCH_HEADr%) Úarg_revr:Úmake_newrrrJÚinfornr2r Úto_argsÚ get_revision)r3r=r<r?r&rÚ    is_branchs       rÚresolve_revisionzGit.resolve_revisionÔsë€ð×!Ñ!ˆðˆÐˆà×-Ñ-¨d°CÓ8‰ˆˆYà ˆ?Ø%×.Ñ.¨sÓ3ˆKÜ! +Á9¹CÐRVÔXˆKàÐ ô˜sÔ#Ü K‰KØLØô ð
× Ñ   sÔ+ØÐ ð     ‰Ü ˜ $¨¨[×-@Ñ-@Ó-BÓ CØð    ô    
ð
×јt¨ÐÓ6ˆØ!×*Ñ*¨3Ó/ˆ àÐrcó0—|sy|j|«|k(S)z§
        Return whether the current commit hash equals the given name.
 
        Args:
          dest: the repository directory.
          name: a string name.
        F)rx)r3r=Únames   rr9zGit.is_commit_id_equals €ñàà×Ñ Ó%¨Ñ-Ð-rcód—|j«}tjd||t|««|dkrd}n
|dk(rd}nd}|j    «dk\r!|j t dd    g|¢|‘|‘­Ž«n|j t dg|¢|‘|‘­Ž«|jr¸|j|||«}t|d
d«}tjd ||«|€K|j||j«s…t d d |j««}|j ||¬«nV|j|«|k7rBd|›}    d d|d|    g}|j ||¬«n"|j|«}
|j|
«}tjd||j«|j!||¬«y)NzCloning %s%s to %sr)z--quietrGr$)z    --verbosez
--progress)rHérz--filter=blob:nonerpzRev options %s, branch_name %sÚcheckoutrPrrzorigin/z-bz--trackzResolved %s to commit %s©Ú    verbosity)Ú
to_displayrJrvr    rNr2r r&rzÚgetattrÚdebugr9rwr[rxruÚupdate_submodules) r;r=r<r?rÚ rev_displayÚflagsrpÚcmd_argsÚ track_branchrs            rÚ    fetch_newz Git.fetch_newsÕ€ð"×,Ñ,Ó.ˆ ܏ ‰ Ð(¨#¨{¼LÈÓ<NÔOØ ˜Š>Ø%1‰EØ ˜!Š^؉Eà/ˆEØ × Ñ Ó ! WÒ ,ð × Ñ ÜØØ(ððððð    ð
ò õ ð × Ñ œ\¨'ÐE°EÐE¸3ÐEÀÒEÔ Fà ?Š?à×/Ñ/°°c¸;ÓGˆKÜ! +¨}¸dÓCˆKÜ L‰LÐ9¸;È Ô TØÐ"ð×.Ñ.¨t°[·_±_ÔEÜ+Ø"ØØ#×+Ñ+Ó-ó Hð
×$Ñ$ X°4Ð$Õ8Ø×(Ñ(¨Ó.°+Ò=ð")¨¨ Ð6 àØØØØ ð ð× Ñ  ¨tРÕ4à×#Ñ# DÓ)ˆCØ%×.Ñ.¨sÓ3ˆKä ‰ Ð.°°[·_±_ÔEð     ×јt¨yÐÕ9rcóô—|jtdd|«|¬«g}|dkr|jd«tdg|¢|j«‘­Ž}|j||¬«|j    ||¬«y)NÚconfigzremote.origin.urlrrrrPrr€)r2r Úappendrwr…©r;r=r<r?rÚ extra_flagsrˆs       rÚswitchz
Git.switchPs†€ð     ×ÑÜ ˜Ð#6¸Ó <Øð    ô    
ð
ˆ à ˜Š>Ø × Ñ ˜tÔ $ä 
ÐP¨[ÐP¸+×:MÑ:MÓ:OÒPˆØ ×ј tÐÔ,à ×јt¨yÐÕ9rcób—g}|dkr|jd«|j«dk\r|jddg|¢|¬«n|jdg|¢|¬«|j|||«}t    ddg|¢|j «‘­Ž}|j||¬«|j ||¬    «y)
NrrP)rGé    rqz--tagsrrÚresetz--hardr€)rrNr2rzr rwr…rŽs       rÚupdatez
Git.updatefsҀðˆ à ˜Š>Ø × Ñ ˜tÔ $ð × Ñ Ó ! VÒ +à × Ñ ˜g xÐ>°+Ð>ÀDÐ Õ Ià × Ñ ˜gÐ4¨ Ð4¸$Ð Ô ?à×+Ñ+¨D°#°{ÓCˆ ÜØ Ø ð
ðð
ð × Ñ Ó !ò    
ˆð      ×ј tÐÔ,à ×јt¨yÐÕ9rcó"—|jgd¢ddd|¬«}|j«}    |d}|D]}|j    d«sŒ|}n|j d«d    }|j |j««S#t$rt‚wxYw)
        Return URL of the first remote encountered.
 
        Raises RemoteNotFoundError if the repository does not have a remote
        url configured.
        )rŒz --get-regexpzremote\..*\.urlrQFTrRrzremote.origin.url rarG)r2Ú
splitlinesÚ
IndexErrorr rVrcÚ_git_remote_to_pip_urlrU)r3rXÚstdoutÚremotesÚ found_remoteÚremoter<s       rÚget_remote_urlzGit.get_remote_url„s±€ð—‘Ú :Ø!%ØØØð !ó
ˆð×#Ñ#Ó%ˆð    &Ø" 1™:ˆLðò    ˆFØ× Ñ Ð!5Õ6Ø% Ùð    ð× Ñ  Ó% aÑ(ˆØ×)Ñ)¨#¯)©)«+Ó6Ð6øôò    &Ü%Ð %ð    &ús ªA>Á>Bcó—tjd|«r|Stjj    |«r#t j |«j«Stj|«}|r|jd«St|«‚)a8
        Convert a remote url from what git uses to what pip accepts.
 
        There are 3 legal forms **url** may take:
 
            1. A fully qualified url: ssh://git@example.com/foo/bar.git
            2. A local project.git folder: /path/to/bare/repository.git
            3. SCP shorthand for form 1: git@example.com:foo/bar.git
 
        Form 1 is output as-is. Form 2 must be converted to URI and form 3 must
        be converted to form 1.
 
        See the corresponding test test_git_remote_url_to_pip() for examples of
        sample inputs/outputs.
        z\w+://z ssh://\1\2/\3) Úrerr.ÚpathÚexistsÚpathlibÚPurePathÚas_uriÚ    SCP_REGEXÚexpandr)r<Ú    scp_matchs  rr˜zGit._git_remote_to_pip_url¢sq€ô" 8‰8I˜sÔ #àˆJÜ 7‰7>‰>˜#Ô ô×#Ñ# CÓ(×/Ñ/Ó1Ð 1Ü—O‘O CÓ(ˆ    Ù à×#Ñ#Ð$4Ó5Ð 5ä! #Ó&Ð&rcóZ—    |jdddd|zg|d¬«y#t$rYywxYw)zU
        Check if rev is a commit that is available in the local repository.
        ú    rev-parserPz--verifyzsha^F)rTÚlog_failed_cmdT)r2r)r3rXr&s   rrmzGit.has_commitÁsG€ð
        Ø O‰Oؘd J°¸± Ð=ØØ$ð ô ðøô!ò    Ùð    ús ‚ž    *©*cóX—|€d}|jd|gdd|¬«}|j«S)Nr"r©FT©rErFrT)r2rU)r3rXr&Ú current_revs    rrxzGit.get_revisionÑsA€à ˆ;؈CØ—o‘oØ ˜#Ð ØØØð    &ó
ˆ ð × Ñ Ó"Ð"rcó\—|jddgdd|¬«j«}tjj    |«s tjj ||«}tjj tjj |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..)r2rUr.r ÚisabsÚjoinÚabspathr)r3rXÚgit_dirÚ    repo_roots    rÚget_subdirectoryzGit.get_subdirectoryÝsˆ€ð—/‘/Ø ˜+Ð &ØØØð    "ó
÷
‰%‹'ð     ô w‰w}‰}˜WÔ%Ü—g‘g—l‘l 8¨WÓ5ˆGÜ—G‘G—O‘O¤B§G¡G§L¡L°¸$Ó$?Ó@ˆ    Ü7¸À)ÓLÐLrcó•—t|«\}}}}}|jd«rŒ|dt|jd«« }|tj
j |«jdd«jd«z}|jd«dz}    |d|    t||    d||||f«z}d|vr>d|vsJ‚|jd    d
«}t‰ |-|«\}}
} |jd d «}nt‰ |-|«\}}
} ||
| 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ú/ú\ú+rGz://zfile:zgit+z
git+ssh://zssh://Ú) ÚurlsplitÚendswithrWÚlstripÚurllibÚrequestÚ url2pathnamerÚfindÚ
urlunsplitr1Úget_url_rev_and_auth) r3r<ÚschemeÚnetlocr ÚqueryÚfragmentÚinitial_slashesÚnewpathÚ
after_plusr&Ú    user_passr6s             €rrÃzGit.get_url_rev_and_authïs*ø€ô19¸³ Ñ-ˆ˜˜e XØ ?‰?˜6Ô "Ø"Ð#;¤c¨$¯+©+°cÓ*:Ó&;Ð%;Ð<ˆOØ%¬¯©×(CÑ(CÀDÓ(I×(QÑ(Qؐcó)ç‰fS‹kñˆGð Ÿ™ SÓ)¨AÑ-ˆJؘ˜*Ð%¬
ؘ
˜ Ð$ f¨g°u¸hÐGó)ñˆCð ˜Ñ Ø #Ñ%Ð %Ð%Ø—+‘+˜f lÓ3ˆCÜ"'¡'Ñ">¸sÓ"CÑ ˆCiØ—+‘+˜h¨Ó+‰Cä"'¡'Ñ">¸sÓ"CÑ ˆCiàC˜Ð"Ð"rcóڗgd¢}|dkr|jd«tjjtjj    |d««sy|j ||¬«y)N)Ú    submoduler”z--initz --recursiverrPz .gitmodulesrr)rr.r r¡r°r2)r3rXrÚargvs    rr…zGit.update_submodulessS€â?ˆà ˜Š>Ø K‰K˜Ô äw‰w~‰~œbŸg™gŸl™l¨8°]ÓCÔDØ Ø ‰Ø Øð    õ    
rcó•—t‰||«}|r|S    |jddg|dddd¬«}tjj|jd««S#t$rtj d|«Yyt $rYywxYw)    Nr©z--show-toplevelFTÚraise)rTrErFr^rªzKcould not determine if %s is under git control because git is not availablez
) r1Úget_repository_rootr2rrJr„rr.r Únormpathrd)r3rXÚlocÚrr6s    €rrÑzGit.get_repository_rootsŸø€ä‰gÑ)¨(Ó3ˆÙ ؈Jð    Ø—‘ØÐ/Ð0ØØ!Ø Ø%Ø$ð  óˆAô"w‰w×Ñ §¡¨Ó 0Ó1Ð1øôò    Ü L‰Lð/àô ñ
Ü ò    Ùð    ús–AÁB    Á>B    ÂB    có—y)zEIn either https or ssh form, requirements must be prefixed with git+.Tr$)Úrepo_urls rÚshould_add_vcs_url_prefixzGit.should_add_vcs_url_prefix5s€ðr)r&ÚstrÚreturnz    list[str])r4rr5rrÙrØ)r<rØr=rØrÙr)rÙztuple[int, ...])rXrØrÙú
str | None)r=rØr&rØrÙztuple[str | None, bool])r=rØr&rØrÙr)r=rØr<rr?rrÙr)r=rØr|rÚrÙr)
r=rØr<rr?rrrLrÙÚNone)r)rXrØrÙrØ)r<rØrÙrØ)rXrØr&rØrÙrr)rXrØr&rÚrÙrØ)r<rØrÙz tuple[str, str | None, AuthInfo])rXrØrrLrÙrÛ)rÖrØrÙr)!Ú__name__Ú
__module__Ú __qualname__r|ÚdirnameÚ    repo_nameÚschemesÚ unset_environÚdefault_arg_revÚ staticmethodr'Ú classmethodr2rArNr[r:rnrzr9rŠrr”rr˜rmrxr´rÃr…rÑr×Ú __classcell__)r6s@rrr>s3ø„Ø €DØ€GØ€Ið€Gð1€MØ€Oàòóððô4óð4ó $ó :ðòóðð0ò+óð+ðZòóðð,ð+Øð+Ø'ð+Ø6@ð+à    ò+óð+ðZò .óð .ð=:Øð=:Ø(ð=:Ø7Að=:ØNQð=:à     ó=:ðHð :àð:ðð:ð ð    :ð
ð :ð
ó :ð6ð :àð:ðð:ð ð    :ð
ð :ð
ó :ð<ò7óð7ð:ò'óð'ð<ò óð ðó    #óð    #ðòMóðMð"ô#óð#ð<ó 
óð 
ðô2óð2ð0òóôrr)rrØrÙr)-Ú
__future__rÚloggingÚos.pathr.r¢rŸÚ urllib.parser¾Úurllib.requestÚ dataclassesrÚtypingrÚpip._internal.exceptionsrrÚpip._internal.utils.miscrr    r
Úpip._internal.utils.subprocessr Ú pip._internal.vcs.versioncontrolr r rrrrrÚparser»rÂÚ    getLoggerrÜrJÚcompilerIrÚVERBOSEr¥rrÚregisterr$rrú<module>r÷sÞðÝ"ãÛÛÛ    ÛÛÝÝçBßGÑGÝ7÷÷ñð <‰<×  Ñ  €Ø \‰\× $Ñ $€
ð
ˆ×    Ñ    ˜8Ó    $€ðB—J‘Jð óÐðˆRZ‰ZÐ+Ó ,€
ð ˆBJ‰Jð        ð‡JJó €    ó'ôzˆ.ôzðz €‡  ˆSÕr