kghHddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z m Z mZddlmZmZddlmZmZmZddlmZddlmZmZmZmZmZmZmZej j!Z!ej j"Z"ej#e$Z%ej&dZ'ej&d Z(ej&d ej)Z*d e+d e,fd Z-GddeZ.ej/e.dS)N)replace)AnyListOptionalTuple) 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 u/builddir/build/BUILD/imunify360-venv-2.6.0/opt/imunify360/venv/lib/python3.11/site-packages/pip/_internal/vcs/git.pylooks_like_hashr8s    %% & &&c XeZdZdZdZdZdZdZdZe de de e fd Z e d ed ede ffd Zd e de defdZdeedffdZe de dee fdZe de de deee effdZe de de defdZe de d ededefdZe de dee defdZde d edededdf dZde d ededdfdZde d ededdfdZe de de fdZ e d e de fd Z!e de de defd!Z"e d)de dee de fd"Z#e de dee fd#Z$e d e dee ee e%fffd$ Z&e de ddfd%Z'e de dee ffd& Z(e d'e defd(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_argsLs u rargskwargsctjdr%|di}d|d<d|d<||d<tj|i|S)N PIP_NO_INPUT extra_environ0GIT_TERMINAL_PROMPTzssh -oBatchMode=yesGIT_SSH_COMMAND)osenvirongetsuper run_command)clsr+r,r/ __class__s rr7zGit.run_commandPsh :>>. ) ) 4"JJ;;M36M/ 0/DM+ ,&3F? #"uww"D3F333rurldestc|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_checkoutYs11(3--@@; 5&&t[_== 5  5 5dKO L LQ OPP###r.c0|dgddd}t|}|std|dSt |dt |d fS) Nversionz git versionFT) command_desc show_stdout stdout_onlyzCan't parse git version: %sr()r7GIT_VERSION_REGEXrloggerwarningintgroup)r@rFrs rget_git_versionzGit.get_git_versiongs"" K& #   "''00  NN8' B B B2EKKNN##SQ%8%899rlocationcgd}||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%rJFTextra_ok_returncodesrHrIcwdz refs/heads/N)r7strip startswithlen)r8rRr+outputrefs rget_current_branchzGit.get_current_branchtsw.-- !% !  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)rXrHrI on_returncode   rK)maxsplitzunexpected show-ref line: zrefs/remotes/origin/z refs/tags/)r7rYsplitrstrip ValueErrorr5) r8r;r&r\refslineref_sharef_name branch_reftag_refrs rr?zGit.get_revision_shas6  " !  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)rZr has_commit)r8r;r&s r _should_fetchzGit._should_fetchsR >>' " " 4s## 5 >>$ $ $ 5trrBc |j}|J|||\}}|,||}t||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. N) branch_namez:Did not find branch or tag '%s', assuming revision or ref.fetchrTrX FETCH_HEADr)) arg_revr?make_newrrrMrNrqr7r to_args get_revision)r8r;r:rBr&r is_branchs rresolve_revisionzGit.resolve_revisions(!--dC88Y ?%..s33K!+9zGit.is_commit_id_equals* 5%%--r verbosityNc|}td||t||dkrd}n |dkrd}nd}|dkr&|t dd g|||Rn$|t dg|||R|jr||||}t|d d}t d |||V| ||js:t d d | }|||ng| ||kr#d|} d d|d| g}|||n*||} || }td||j||dS)NzCloning %s%s to %sr)z--quietrJr()z --verbosez --progress)rKr"z--filter=blob:nonerszRev options %s, branch_name %scheckoutrTruzorigin/z-bz--trackzResolved %s to commit %s) to_displayrMinfor rQr7r r&r|getattrdebugr>ryr^rzrxupdate_submodules) r@r;r:rBr rev_displayflagsrscmd_args track_branchrs r fetch_newz Git.fetch_newsW",,..  (#{L>%1EE !^^EE/E    ! !W , ,   (          \'EEE3EEEE F F F ? 4//c;GGK!+}dCCK LL9; T T T"..t[_EE9+"#++--  H $$X4$888((..+== 766    t 444##D))C%..s33K .[_EEE t$$$$$rc|tdd||tdd|}|||||dS)Nconfigzremote.origin.urlrurrT)r7r ryrr@r;r:rBrs rswitchz Git.switchNs  #6 < <     D+2E2E2G2GHH t,,, t$$$$$rcj|dkr|gd|n|ddg|||||}tddd|}|||||dS)N)rJ )rtrTz--tagsrurtrTresetz--hard)rQr7r|r ryrrs rupdatez Git.updateXs    ! !V + +   666D  A A A A   gt_$  7 7 7++D#{CC 49L9L9N9NOO t,,, t$$$$$rc`|gdddd|}|} |d}n#t$rtwxYw|D]}|dr|}n|dd }||S) z Return URL of the first remote encountered. Raises RemoteNotFoundError if the repository does not have a remote url configured. )rz --get-regexpzremote\..*\.urlrUFTrVrzremote.origin.url rdrJ)r7 splitlines IndexErrorrrZrf_git_remote_to_pip_urlrY)r8rRstdoutremotes found_remoteremoter:s rget_remote_urlzGit.get_remote_urlfs : : :!% !  ##%% &"1:LL & & &% % &  F  !566 %    %%a())#))++666s ;A c:tjd|r|Stj|r&t j|St|}|r| dSt|)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) rerr3pathexistspathlibPurePathas_uri SCP_REGEXexpandr)r: scp_matchs rrzGit._git_remote_to_pip_urls" 8Is # # J 7>>#   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-parserTz--verifyzsha^F)rXlog_failed_cmdT)r7r )r8rRr&s rrpzGit.has_commitsc  OOdJ =$    4!   55 s # 11ch|d}|d|gdd|}|S)Nr%rFTrHrIrX)r7rY)r8rRr& current_revs rrzzGit.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..)r7rYr3risabsjoinabspathr)r8rRgit_dir repo_roots rget_subdirectoryzGit.get_subdirectorys// + & "  %''  w}}W%% 6gll8W55GGOOBGLL$$?$?@@ 7)LLLrct|\}}}}}|dr|dt|d }|tj|dddz}|ddz} |d| t|| d||||fz}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/\+rJz://zfile:zgit+z git+ssh://zssh://) urlsplitendswithr[lstripurllibrequest url2pathnamerfind urlunsplitr6get_url_rev_and_auth) r8r:schemenetlocrqueryfragmentinitial_slashesnewpath after_plusr& user_passr9s rrzGit.get_url_rev_and_authso19 -eX ??6 " " "#;c$++c*:*:&;&;%;#;">s"C"C Ci++h++CC"'''">">s"C"C CiC""rctjtj|dsdS|gd|dS)Nz .gitmodules) submodulerz--initz --recursiverTru)r3rrrr7)r8rRs rrzGit.update_submoduless^w~~bgll8]CCDD  F  B B B      rc`t|}|r|S |ddg|dddd}n8#t$rtd|YdSt $rYdSwxYwtj | dS) Nrz--show-toplevelFTraise)rXrHrIrarzKcould not determine if %s is under git control because git is not availablez ) r6get_repository_rootr7rrMrr r3rnormpathrg)r8rRlocrr9s 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__r}dirname repo_nameschemes unset_environdefault_arg_rev staticmethodstrrr* classmethodrr7rrDrrOrQrr^r?rqr rr|r>rrrrrrprzrrrrrr __classcell__)r9s@rr r <s DGIG1MOstCy\44s4s44444[4 $S $ $ $ $ $ $ :sCx : : : :#(3-[0+C+c+eHSM4rs ------------BBBBBBBBGGGGGGGGGG777777 <  \ $   8 $ $BJ RZ+ , ,  BJ  J   ''''''YYYYY.YYYx  Sr