"JdEddlZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z mZddlmZmZmZddlmZddlmZmZmZmZmZmZmZejjZejjZej e!Z"ej#dZ$ej#dZ%ej#d ej&Z'd e(d e)fd Z*Gd deZ+ej,e+dS)N)ListOptionalTuple) 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[^:]*) $shareturncPtt|SN)bool HASH_REGEXmatch)rs H/opt/alt/python311/lib/python3.11/site-packages/pip/_internal/vcs/git.pylooks_like_hashr7s    %% & &&c ,eZdZdZdZdZdZdZdZe de de e fd Z d e d e de fd Zdeed ffdZede dee fdZed e de deee e ffdZed e de de fdZed e d ededefdZed e dee de fdZd e d ededdfdZd e d ededdfdZd e d ededdfdZede de fdZe d e de fdZede de de fdZ ed%de dee de fdZ!ede dee fdZ"ed e dee ee e#fffd Z$ede ddfd!Z%ede dee ffd" Z&e d#e de fd$Z'xZ(S)&Gitgitz.gitclone)zgit+httpz git+httpszgit+sshzgit+gitzgit+file)GIT_DIR GIT_WORK_TREEHEADrevrc|gSrr$s rget_base_rev_argszGit.get_base_rev_argsKs u rurldestc|t|\}}|jsdS|||jsdSt |||jd}| S)NFr)get_url_rev_optionsr r$is_commit_id_equalrget_revision_sha)selfr)r*_ rev_optionsis_tag_or_branchs ris_immutable_rev_checkoutzGit.is_immutable_rev_checkoutOs11(3--@@; 5&&t[_== 5  5 5dKO L LQ OPP###r.c|dgdd}t|}|std|dSt d|DS)NversionFT) show_stdout stdout_onlyzCan't parse git version: %sr&c34K|]}t|VdSr)int).0cs r z&Git.get_git_version..cs(44SVV444444r) run_commandGIT_VERSION_REGEXrloggerwarningtuplegroups)r/r5rs rget_git_versionzGit.get_git_version]sx""I;Et"TT!''00  NN8' B B B244U\\^^444444rlocationcgd}||ddd|}|}|dr|tddSdS)zl Return the current branch, or None if HEAD isn't at a branch (e.g. detached HEAD). )z symbolic-ref-qr#FTextra_ok_returncodesr6r7cwdz refs/heads/N)r=strip startswithlen)clsrDargsoutputrefs rget_current_branchzGit.get_current_branchesw.-- !% !  llnn >>- ( ( -s=))++, ,trc|d|g|ddd}i}|dD][}|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-refFTignore)rKr6r7 on_returncode   )maxsplitzunexpected show-ref line: zrefs/remotes/origin/z refs/tags/)r=rLsplitrstrip ValueErrorget) rOr*r$rQrefslineref_sharef_name branch_reftag_refrs rr.zGit.get_revision_sha~s6  " !  LLNN((.. % %D;;t$$D  H$(JJsQJ$?$?! H H H!!Fd!F!FGGG H %DNN1C11 $s$$hhz"" ?; hhwU|s !A<<Bc|drdSt|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_fetchsR >>' " " 4s## 5 >>$ $ $ 5trr1c |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.fetchrFrK FETCH_HEADr') arg_revr.make_new branch_namerr?r@rhr=r to_args get_revision)rOr*r)r1r$r is_branchs rresolve_revisionzGit.resolve_revisions! --dC88Y ?%..s33K-6&@ccDK # s##  NNL      s++    $[-@-@-B-B C C    t66!**3// rnamec<|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_equals* 5%%--rNc |}td||t||dkr'|t ddd||n%|t dd|||jr||||}t|dd}t d|||V| ||js:t dd| }||| ng| ||kr#d |}dd |d |g}||| n*||}||}td ||j||dS)NzCloning %s%s to %s)rZr z--filter=blob:nonerFrozRev options %s, branch_name %scheckoutrkzorigin/z-bz--trackzResolved %s to commit %s) to_displayr?infor rCr=r r$rsgetattrdebugr-rprSrqrnupdate_submodules) r/r*r)r1 rev_displayrocmd_args track_branchrs r fetch_newz Git.fetch_news !,,..  (#{L>#   2#C((//11 1OOC((  6##$455 5!#&&&rch |dddd|zg|ddS#t$rYdSwxYw)zU Check if rev is a commit that is available in the local repository. rev-parserFz--verifyzsha^F)rKlog_failed_cmdT)r=r)rOrDr$s rrgzGit.has_commitsc  OOdJ =$    4!   55 s # 11ch|d}|d|gdd|}|S)Nr#rFTr6r7rK)r=rL)rOrDr$ current_revs rrqzGit.get_revisionsI ;Coo #  &    """rct|ddgdd|}tj|s tj||}tjtj|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..)r=rLrrisabsjoinabspathr)rOrDgit_dir repo_roots rget_subdirectoryzGit.get_subdirectorys// + & "  %''  w}}W%% 6gll8W55GGOOBGLL$$?$?@@ 7)LLLrct|\}}}}}|dr|dt|d }|tj|dddz}|ddz} |d| t|| d||||fz}d|vrR|dd }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://zgit+z git+ssh://zssh://) urlsplitendswithrNlstripurllibrequest url2pathnamereplacefind urlunsplitsuperget_url_rev_and_auth) rOr)schemenetlocrqueryfragmentinitial_slashesnewpath after_plusr$ user_pass __class__s rrzGit.get_url_rev_and_auths^19 -eX ??6 " " "#;c$++c*:*:&;&;%;#;">s"C"C Ci++h++CC"'''">">s"C"C CiC""rctjtj|dsdS|gd|dS)Nz .gitmodules) submodulerz--initz --recursiverFrk)rrrrr=)rOrDs rr}zGit.update_submoduless^w~~bgll8]CCDD  F  B B B      rc`t|}|r|S |ddg|dddd}n8#t$rtd|YdSt $rYdSwxYwtj | dS) Nrz--show-toplevelFTraise)rKr6r7rVrzKcould not determine if %s is under git control because git is not availablez ) rget_repository_rootr=rr?r|rrrnormpathr])rOrDlocrrs rrzGit.get_repository_rootsgg))(33  J /0! %$  AA    LL/    44    44 w 0 0111sA%A;. A;:A;repo_urlcdS)zEIn either https or ssh form, requirements must be prefixed with git+.Tr&)rs rshould_add_vcs_url_prefixzGit.should_add_vcs_url_prefixs trr))__name__ __module__ __qualname__rtdirname repo_nameschemes unset_environdefault_arg_rev staticmethodstrrr(rr3rr9rC classmethodrrSr.rhrrrsr-rrrrrrgrqrr rr}rr __classcell__)rs@rrr;s[ DGIG1MOstCy\ $S $ $ $ $ $ $5sCx5555#(3-[0+C+c+eHSM4rVERBOSErrrrrregisterr&rrrs ((((((((((BBBBBBBBGGGGGGGGGG777777 <  \ $   8 $ $BJ RZ+ , ,  BJ  J   ''''''CCCCC.CCCL  Sr