)rYr&r0rPs r'__repr__zRevOptions.__repr__s&dmm001|1EEr)c^|j|jjS|jSrL)r0rYdefault_arg_revr`s r'arg_revzRevOptions.arg_revs% 88 ==00 0xxr)cg}|j}|||jj|z }||jz }|S)z< Return the VCS-specific command arguments. )rdrYget_base_rev_argsr\)rPargsr0s r'to_argszRevOptions.to_argssCll ? DMM33C8 8D  r)c<|jsyd|jdS)Nz (to revision )r0r`s r' to_displayzRevOptions.to_displaysxxz++r)cP|jj||jS)z Make a copy of the current instance, but with a new rev. Args: rev: the name of the revision for the new object. r\)rYmake_rev_optionsr\)rPr0s r'make_newzRevOptions.make_news"}}--cdoo-NNr))returnrR)rrrZ)rrr)r0rRrrrW)rErFrG__doc____annotations__r0rlistr\r]rapropertyrdrhrmrqrHr)r'rWrWps\#"C#D9J 9"K"F , Or)rWceZdZUiZded<gdZdfd ZddZeddZ eddZ eddZ dd Z dd Z dd Zdd Zdd ZxZS) VcsSupportzdict[str, VersionControl] _registry)sshgithgbzrsftpsvnctjjj|jt |yrL)r!r" uses_netlocextendschemesrMrN)rPrQs r'rNzVcsSupport.__init__s,    '' 5 r)c6|jjSrL)ry__iter__r`s r'rzVcsSupport.__iter__s~~&&((r)cHt|jjSrL)ruryvaluesr`s r'backendszVcsSupport.backendssDNN))+,,r)cT|jDcgc]}|jc}Scc}wrL)rr9)rPbackends r'dirnameszVcsSupport.dirnamess/3}}=G===s%cbg}|jD]}|j|j|SrL)rrr)rPrrs r'r%zVcsSupport.all_schemess/}} ,G NN7?? + ,r)c t|ds!tjd|jy|j|j vr?||j |j<tj d|jyy)Nr&zCannot register VCS %szRegistered VCS backend: %s)hasattrr:r;rEr&rydebug)rPclss r'registerzVcsSupport.registers^sF# NN3S\\ B  884>> )'*uDNN388 $ LL5sxx @ *r)c<||jvr|j|=yyrL)ryrPr&s r' unregisterzVcsSupport.unregisters 4>> !t$ "r)ci}|jjD]<}|j|}|stj d||j |||<>|syt |t}||S)zv Return a VersionControl object if a repository of that type is found at the given directory. zDetermine that %s uses VCS: %sN)key)ryrget_repository_rootr:rr&maxlen)rPr> vcs_backends vcs_backend repo_pathinner_most_repo_paths r'get_backend_for_dirzVcsSupport.get_backend_for_dirs  >>002 2K#77AI LL98[EUEU V&1L #  2 #>002 #K,,,"" #r)cX|j}|jj|S)r)lowerrygetrs r' get_backendzVcsSupport.get_backends$zz|~~!!$''r))rrNone)rrz Iterator[str])rrzlist[VersionControl])rr list[str])rrXrrr)r&rRrrr)r>rRrrVersionControl | None)r$rRrrr)r&rRrrr)rErFrGryrtrrNrrvrrr%rrrrrrSrTs@r'rxrxss+-I(-8G )-->> A%2.(r)rxcXeZdZUdZdZdZdZded<dZded<dZ ded<e d"d Z e d#d Z e d$d Z e d%d Zed&d Zd'dZe d( d)dZe d*dZe d+dZe d,dZed-dZd.dZed/dZe d0dZ d1dZ d2 d1dZ d2 d1dZe d3dZd4dZd5dZe d6dZ e d6dZ!e d7 d8dZ"e d9d Z#e d#d!Z$y):VersionControlrjrHztuple[str, ...]r unset_environNrZrcc\|jj|jd S)z Return whether the vcs prefix (e.g. "git+") should be added to a repository's remote url when used in a requirement. :)r startswithr&)r remote_urls r'should_add_vcs_url_prefixz(VersionControl.should_add_vcs_url_prefixs+ ##%00CHH:Q@@@r)cy)z Return the path to Python project root, relative to the repo root. Return None if the project root is in the repo root. NrHrr>s r'get_subdirectoryzVersionControl.get_subdirectory s r)c$|j|S)zR Return the revision string that should be used in a requirement. ) get_revision)rrepo_dirs r'get_requirement_revisionz'VersionControl.get_requirement_revisions ))r)c|j|}|j|r|jd|}|j|}|j |}t ||||}|S)aC Return the requirement string to use to redownload the files currently at the given repository directory. Args: project_name: the (unescaped) project name. The return value has a form similar to the following: {repository_url}@{revision}#egg={project_name} +)r2)get_remote_urlrr&rrr5)rrr1r/revisionr2r4s r'get_src_requirementz"VersionControl.get_src_requirementsl%%h/  ( ( 2((1XJ/H//9%%h/&x+://, e.g. svn+http://myrepo/svn/MyApp#egg=MyAppNr-zThe URL zm has an empty revision (after @) which is not supported. Include a revision after @ or remove @ from the URL.rj) r!r"r# ValueErrorsplitrrsplitr urlunsplit) rrOr$rr8queryfrag user_passr0s r'get_url_rev_and_authz#VersionControl.get_url_rev_and_authus-3LL,A,A#,F)eT f #!==  c1%a(33FFC  $; C+ID#'sg&00 ll%%vvtUB&GHC""r)cgS)zM Return the RevOptions "extra arguments" to use in obtain(). rH)usernamepasswords r' make_rev_argszVersionControl.make_rev_argss  r)c|j|j\}}}|\}}d}| t|}|j||}|j ||} t || fS)zq Return the URL and RevOptions object to use in obtain(), as a tuple (url, rev_options). Nro)rsecretrrrpr) rPrO secret_urlr0rrsecret_passwordrr\ rev_optionss r'get_url_rev_optionsz"VersionControl.get_url_rev_optionssu &*%>%>szz%J" C$-!/&*  &!/2H''(; ++CJ+G  #[00r)c^tjj|jdS)zi Normalize a URL for comparison by unquoting it and removing any trailing slash. /)r!r"unquoterstrip)rOs r' normalize_urlzVersionControl.normalize_urls$ ||##C(//44r)cH|j||j|k(S)zV Compare two repo URLs for identity, ignoring incidental differences. )r)rurl1url2s r' compare_urlszVersionControl.compare_urlss%   &#*;*;D*AAAr)ct)a Fetch a revision from a repository, in the case that this is the first fetch from the repository. Args: dest: the directory to fetch the repository to. rev_options: a RevOptions object. verbosity: verbosity level. rrPrrOr verbositys r' fetch_newzVersionControl.fetch_news "!r)ct)z} Switch the repo at ``dest`` to point to ``URL``. Args: rev_options: a RevOptions object. rrs r'switchzVersionControl.switch "!r)ct)z Update an already-existing repo to the given ``rev_options``. Args: rev_options: a RevOptions object. rrs r'updatezVersionControl.updaterr)ct)z Return whether the id of the current commit equals the given name. Args: dest: the repository directory. name: a string name. r)rrr&s r'is_commit_id_equalz!VersionControl.is_commit_id_equals "!r)c|j|\}}tjj|s|j ||||y|j }|j |r|j|}|j||jrtjd|jjt|||j||j sAtj#dt||j||j%||||ytj#dytj'd|j(|jt||d}n.tj'd||j(|jd }tj'd |j(|t+d |d |d }|dk(rt-j.d|dk(r@tj'dt|t1||j ||||y|dk(rWt3|} tj'dt|| t5j6|| |j ||||y|dk(rBtj#d|jt||||j9||||yy)a/ Install or update in editable mode the package represented by this VersionControl object. :param dest: the repository directory in which to install or update. :param url: the repository URL starting with a vcs prefix. :param verbosity: verbosity level. )rNz)%s in %s exists, and has correct URL (%s)zUpdating %s %s%sz$Skipping because already up-to-date.z%s %s in %s exists with URL %s)z%(s)witch, (i)gnore, (w)ipe, (b)ackup )siwbz0Directory %s already exists, and is not a %s %s.)z(i)gnore, (w)ipe, (b)ackup )rrrz+The plan is to install the %s repository %sz What to do? rrarz Deleting %srzBacking up %s to %srzSwitching %s %s to %s%s)rr7r8existsrrmis_repository_directoryrrrr:r repo_nametitlerrr0inforr;r&rsysexitrrshutilmover) rPrrOrr rev_display existing_urlpromptresponsedest_dirs r'obtainzVersionControl.obtainsz 33C8[ww~~d# NN4kYN G !,,.  ' ' -..t4L  szz: ?NN((* &  ..t[__EKK*$T*#  KKc;)KLKK FG NN0 T"  UF NNB   FF 9 II  #]6!9+#>q J s? HHRL s? NN=,t*< = 4L NN4kYN G  s?!$'H NN0,t2Dh O KKh ' NN4kYN G  s? KK)T"   KKc;)K D r)ctjj|r t||j |||y)z Clean up current location and download the url repository (and vcs infos) into location :param url: the repository URL starting with a vcs prefix. :param verbosity: verbosity level. )rOrN)r7r8rrr)rPr>rOrs r'unpackzVersionControl.unpackHs. 77>>( # 8  H# ;r)ct)z Return the url used at location Raises RemoteNotFoundError if the repository does not have a remote url configured. rrs r'rzVersionControl.get_remote_urlTrr)ct)zR Return the current commit id of the files at the given location. rrs r'rzVersionControl.get_revision^s "!r)c tt|jg|}| t|} t||||||||j|| |  S#t $rt d|jdt$r't d|jd|jdt$rt d|jdwxYw)z Run a VCS subcommand This is simply a wrapper around call_subprocess that adds the VCS command name, and checks that the VCS is available ) on_returncodeextra_ok_returncodes command_desc extra_environrspinnerlog_failed_cmd stdout_onlyzCannot find command z - invalid PATHz - do you have z installed and in your PATH?zNo permission to execute z - install it locally, globally (ask admin), or check your PATH. See possible solutions at https://pip.pypa.io/en/latest/reference/pip_freeze/#fixing-permission-denied.) rr&rrrNotADirectoryErrorr FileNotFoundErrorPermissionError) rcmd show_stdoutcwdrrrrrrrs r' run_commandzVersionControl.run_commandes&388*c*  .s3L" "+%9)+!//-'  " Q3CHH<OP P  &sxxl/88,:<   +CHH<8-.  s AA2B7ctjd||j|jtj j tj j||jS)zL Return whether a directory path is a repository directory. zChecking in %s for %s (%s)...)r:rr9r&r7r8rjoin)rr8s r'rz&VersionControl.is_repository_directorysE  4dCKKRww~~bggll4=>>r)c*|j|r|Sy)ay Return the "root" (top-level) directory controlled by the vcs, or `None` if the directory is not in any. It is meant to be overridden to implement smarter detection mechanisms for specific vcs. This can do more than is_repository_directory() alone. For example, the Git override checks that Git is actually available. N)rrs r'rz"VersionControl.get_repository_roots  & &x 0Or))rrRrrr)r>rRrrrZ)rrRrrrR)rrRr1rRrrrR)r0rRrrr)rOrRrrRrrrr)r0rZr\zCommandArgs | NonerrrW)rrRrrr)rrRr$rRrrz)tuple[str, tuple[str | None, str | None]])rOrRrrz tuple[str, str | None, AuthInfo])rrZrzHiddenText | Nonerrr)rOrrrztuple[HiddenText, RevOptions])rOrRrrrR)rrRrrRrrr) rrRrOrrrWrintrrr)r)rrRr&rZrrr)rrRrOrrr%rrr)r>rRrOrrr%rrr)r>rRrrrR) TNraiseNNNNTF)rzlist[str] | CommandArgsrrr rZrz"Literal['raise', 'warn', 'ignore']rzIterable[int] | NonerrZrzMapping[str, Any] | NonerzSpinnerInterface | NonerrrrrrrR)r8rRrrr)%rErFrGr&r9rrrtrrc classmethodrrrr staticmethodrfrrprrrrrrrrrrrrrrrr!rrrHr)r'rrs DGI!G_!%'M?'"&OZ&AA** ."" FJ A A1C A  A A;;$$"%$ 2$$(##: 155BB " "( "7A "NQ "  "& " " " "  "  "( " " " "  "  """WEr <"""" !rRr?rRrrrZ)8rs __future__rloggingr7rr urllib.parser!collections.abcrrr dataclassesrrtypingr r r pip._internal.cli.spinnersr pip._internal.exceptionsr rpip._internal.utils.miscrrrrrrrrpip._internal.utils.subprocessrrrr__all__ getLoggerrEr:tuplerRAuthInfor(r5rB ExceptionrDrJrWrxrrrHr)r'r8s5/" 77( 8B    '   8 $ # - .HFJ+.8B$00!00: ) )  $3O3O3OlM(M(`l{{r)