I iJddlmZddlZddlZddlZddlZddlZddl Zddl m Z ddl m Z ddlmZmZddlmZmZmZddlmZddlmZmZmZmZmZmZmZej>j@Z ej>jBZ!ejDe#Z$ejJd Z&ejJd Z'ejJd ejPZ)dd Z*Gd deZ+ejXe+y)) annotationsN)replace)Any) BadCommandInstallationError) HiddenText display_pathhide_url) make_command)AuthInfoRemoteNotFoundErrorRemoteNotValidError RevOptionsVersionControl(find_path_to_project_root_from_repo_rootvcsz(^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|SN)bool HASH_REGEXmatch)shas [/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.pylooks_like_hashr:s    % &&ceZdZdZdZdZdZdZdZe ddZ e dfd Z dd Z dd Ze d d Ze d!d Ze d"d Ze d#dZe d$dZ d%dZ d& d%dZ d& d%dZe d'dZe d(dZe d)dZe d*d+dZe d dZe d,fd Ze d&d-dZe d fd Ze d.dZxZ S)/Gitgitz.gitclone)zgit+httpz git+httpszgit+sshzgit+gitzgit+file)GIT_DIR GIT_WORK_TREEHEADc|gSrrevs rget_base_rev_argszGit.get_base_rev_argsNs u rctjjdr!|jdi}d|d<d|d<||d<t||i|S)N PIP_NO_INPUT extra_environ0GIT_TERMINAL_PROMPTzssh -oBatchMode=yesGIT_SSH_COMMAND)osenvirongetsuper run_command)clsargskwargsr* __class__s rr2zGit.run_commandRsX ::>>. )"JJ;M36M/ 0/DM+ ,&3F? #w"D3F33rc|jt|\}}|jsy|j||jsyt |j ||jd}| S)NFr)get_url_rev_optionsr r&is_commit_id_equalrget_revision_sha)selfurldest_ rev_optionsis_tag_or_branchs ris_immutable_rev_checkoutzGit.is_immutable_rev_checkout[si11(3-@;&&t[__=  5 5dKOO LQ OP###rc|jdgddd}tj|}|stj d|yt |j dt |j d fS) Nversionz git versionFT) command_desc show_stdout stdout_onlyzCan't parse git version: %sr$)r2GIT_VERSION_REGEXrloggerwarningintgroup)r;rCrs rget_git_versionzGit.get_git_versionisq"" K& #  "''0 NN8' BEKKN#SQ%899rcgd}|j|ddd|}|j}|jdr|tddSy)zl Return the current branch, or None if HEAD isn't at a branch (e.g. detached HEAD). )z symbolic-ref-qr"rGFTextra_ok_returncodesrErFcwdz refs/heads/N)r2strip startswithlen)r3locationr4outputrefs rget_current_branchzGit.get_current_branchvsZ. !% ! lln >>- (s=)+, ,rc|jd|g|ddd}i}|jjdD]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-refFTignore)rTrErF on_returncode   rH)maxsplitzunexpected show-ref line: zrefs/remotes/origin/z refs/tags/)r2rUsplitrstrip ValueErrorr0) r3r=r&rYrefslineref_sharef_name branch_reftag_refrs rr:zGit.get_revision_shas  " ! LLN((. %D;;t$D H$(JJsQJ$?! %DN %,C51 se$hhz" ?; hhwU|! H!#=dX!FGG Hs B%%B=cf|jdryt|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_fetchs2 >>' "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.fetchrPrT FETCH_HEADr%) arg_revr:make_newrrrJinfornr2r to_args get_revision)r3r=r<r?r&r is_branchs rresolve_revisionzGit.resolve_revisions!!--dC8Y ?%..s3K!+9CRVXK s# KKL    s+   $[-@-@-B C  t6!**3/ rc0|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 %--rcd|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||jst 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)rHrz--filter=blob:nonerpzRev options %s, branch_name %scheckoutrPrrzorigin/z-bz--trackzResolved %s to commit %s verbosity) to_displayrJrvr rNr2r r&rzgetattrdebugr9rwr[rxruupdate_submodules) r;r=r<r?r rev_displayflagsrpcmd_args track_branchrs r fetch_newz Git.fetch_news",,.  (#{L%1E !^E/E    !W ,   (       \'EEE3EE F ??//c;GK!+}dCK LL9; T"..t[__E+"#++- H $$X4$8((.+=") 6    t 4##D)C%..s3K .[__E ty9rc|jtdd||g}|dkr|jdtdg||j}|j|||j ||y)Nconfigzremote.origin.urlrrrrPrr)r2r appendrwrr;r=r<r?r extra_flagsrs rswitchz Git.switchPs  #6 <   >   t $ P[P+:M:M:OP t, ty9rcbg}|dkr|jd|jdk\r|jddg||n|jdg|||j|||}t ddg||j }|j|||j || y) NrrP)rG rqz--tagsrrresetz--hardr)rrNr2rzr rwrrs rupdatez Git.updatefs >   t $    !V +   gx>+>D  I   g4 4$  ?++D#{C         !   t, ty9rc"|jgdddd|}|j} |d}|D]}|j ds|}n|j dd }|j |jS#t$rtwxYw) z Return URL of the first remote encountered. Raises RemoteNotFoundError if the repository does not have a remote url configured. )rz --get-regexpzremote\..*\.urlrQFTrRrzremote.origin.url rarG)r2 splitlines IndexErrorr rVrc_git_remote_to_pip_urlrU)r3rXstdoutremotes found_remoteremoter<s rget_remote_urlzGit.get_remote_urls :!% ! ##% &"1:L F  !56%    %a())#))+66 &% % &s A>>Bctjd|r|Stjj |r#t j |jStj|}|r|jdSt|)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.pathexistspathlibPurePathas_uri SCP_REGEXexpandr)r< scp_matchs rrzGit._git_remote_to_pip_urlsq" 88Is #J 77>># ##C(//1 1OOC( ##$45 5!#&&rcZ |jdddd|zg|dy#t$rYywxYw)zU Check if rev is a commit that is available in the local repository. rev-parserPz--verifyzsha^F)rTlog_failed_cmdT)r2r)r3rXr&s rrmzGit.has_commitsG  OOdJ =$  !  s  **cX|d}|jd|gdd|}|jS)Nr"rFTrErFrT)r2rU)r3rXr& current_revs rrxzGit.get_revisionsA ;Coo #  &   ""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. rz --git-dirFTrz..)r2rUr.risabsjoinabspathr)r3rXgit_dir repo_roots rget_subdirectoryzGit.get_subdirectorys// + & " %'  ww}}W%ggll8W5GGGOOBGGLL$$?@ 7)LLrct|\}}}}}|jdr|dt|jd }|tj j |jddjdz}|jddz} |d| t|| d||||fz}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://) urlsplitendswithrWlstripurllibrequest url2pathnamerfind urlunsplitr1get_url_rev_and_auth) r3r<schemenetlocrqueryfragmentinitial_slashesnewpath after_plusr& user_passr6s rrzGit.get_url_rev_and_auths*19 -eX ??6 ""#;c$++c*:&;%;s"C Ci++h+C"''">s"C CiC""rcgd}|dkr|jdtjjtjj |dsy|j ||y)N) submodulerz--initz --recursiverrPz .gitmodulesrr)rr.rrrr2)r3rXrargvs rrzGit.update_submodulessS? > KK ww~~bggll8]CD     rct||}|r|S |jddg|dddd}tjj|jdS#t$rtj d|Yyt $rYywxYw) Nrz--show-toplevelFTraise)rTrErFr^rzKcould not determine if %s is under git control because git is not availablez ) r1get_repository_rootr2rrJrrr.rnormpathrd)r3rXlocrr6s rrzGit.get_repository_rootsg)(3 J /0! %$  A"ww 011  LL/     sAB >B B cy)zEIn either https or ssh form, requirements must be prefixed with git+.Tr$)repo_urls rshould_add_vcs_url_prefixzGit.should_add_vcs_url_prefix5sr)r&strreturnz list[str])r4rr5rrr)r<rr=rrr)rztuple[int, ...])rXrr str | None)r=rr&rrztuple[str | None, bool])r=rr&rrr)r=rr<rr?rrr)r=rr|rrr) r=rr<rr?rrrLrNone)r)rXrrr)r<rrr)rXrr&rrrr)rXrr&rrr)r<rrz tuple[str, str | None, AuthInfo])rXrrrLrr)rrrr)!__name__ __module__ __qualname__r|dirname repo_nameschemes unset_environdefault_arg_rev staticmethodr' classmethodr2rArNr[r:rnrzr9rrrrrrmrxrrrrr __classcell__)r6s@rrr>s3 DGIG1MO44 $ :0++Z,++'+6@+ ++Z . .=:=:(=:7A=:NQ=: =:H ::: :  :  :6 ::: :  :  :<77:''<   # #MM"##<    220rr)rrrr)- __future__rloggingos.pathr.rr urllib.parserurllib.request dataclassesrtypingrpip._internal.exceptionsrrpip._internal.utils.miscrr r pip._internal.utils.subprocessr pip._internal.vcs.versioncontrolr r rrrrrparserr getLoggerrrJcompilerIrVERBOSErrrregisterr$rrrs" BGG7 <<  \\ $ $    8 $BJJ RZZ+ ,  BJJ  JJ  'z.zz  Sr