
}_V0                 @   s   d  Z  d d l m Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m	 Z
 d d l m Z d d l m Z m Z m Z m Z m Z d d g Z e j e  Z Gd	 d
   d
 e  Z e   Z Gd d   d e  Z d d   Z d S)z)Handles all VCS (version control) support    )absolute_importN)parse)
BadCommand)display_path
backup_dircall_subprocessrmtreeask_path_existsvcsget_src_requirementc                   s   e  Z d  Z i  Z d d d d d d g Z   f d d   Z d	 d
   Z e d d    Z e d d    Z	 e d d    Z
 d d   Z d d d d  Z d d   Z d d   Z d d   Z   S)
VcsSupportsshgithgbzrsftpsvnc                sO   t  j j |  j  t t  d d   r8 t  j j |  j  t t |   j   d  S)Nuses_fragment)	urllib_parseuses_netlocextendschemesgetattrr   superr   __init__)self)	__class__ //tmp/pip-build-3_sjtvrs/pip/pip/vcs/__init__.pyr      s    zVcsSupport.__init__c             C   s   |  j  j   S)N)	_registry__iter__)r   r   r   r   r    $   s    zVcsSupport.__iter__c             C   s   t  |  j j    S)N)listr   values)r   r   r   r   backends'   s    zVcsSupport.backendsc             C   s   d d   |  j  D S)Nc             S   s   g  |  ] } | j   q Sr   )dirname).0backendr   r   r   
<listcomp>-   s   	 z'VcsSupport.dirnames.<locals>.<listcomp>)r#   )r   r   r   r   dirnames+   s    zVcsSupport.dirnamesc             C   s.   g  } x! |  j  D] } | j | j  q W| S)N)r#   r   r   )r   r   r&   r   r   r   all_schemes/   s    zVcsSupport.all_schemesc             C   s_   t  | d  s& t j d | j  d  S| j |  j k r[ | |  j | j <t j d | j  d  S)NnamezCannot register VCS %szRegistered VCS backend: %s)hasattrloggerwarning__name__r*   r   debug)r   clsr   r   r   register6   s    zVcsSupport.registerNc             C   sR   | |  j  k r |  j  | =n2 | |  j  j   k rA |  j  | j =n t j d  d  S)Nz0Cannot unregister because no class or name given)r   r"   r*   r,   r-   )r   r0   r*   r   r   r   
unregister>   s
    zVcsSupport.unregisterc             C   sJ   xC |  j  j   D]2 } | j |  r t j d | | j  | j Sq Wd S)z
        Return the name of the version control backend if found at given
        location, e.g. vcs.get_backend_name('/path/to/vcs/checkout')
        zDetermine that %s uses VCS: %sN)r   r"   controls_locationr,   r/   r*   )r   locationvc_typer   r   r   get_backend_nameF   s    	zVcsSupport.get_backend_namec             C   s*   | j    } | |  j k r& |  j | Sd  S)N)lowerr   )r   r*   r   r   r   get_backendR   s    zVcsSupport.get_backendc             C   s&   |  j  |  } | r" |  j |  Sd  S)N)r6   r8   )r   r4   r5   r   r   r   get_backend_from_locationW   s    z$VcsSupport.get_backend_from_location)r.   
__module____qualname__r   r   r   r    propertyr#   r(   r)   r1   r2   r6   r8   r9   r   r   )r   r   r      s   	r   c                   s'  e  Z d  Z d Z d Z f  Z d   f d d  Z d d   Z d d   Z d	 d
   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d d& d d d d' d(  Z e d) d*    Z   S)+VersionControl Nc                s&   | |  _  t t |   j | |   d  S)N)urlr   r=   r   )r   r?   argskwargs)r   r   r   r   g   s    	zVersionControl.__init__c             C   s1   t  j j |  \ } } | j t  j j  p0 | S)zy
           posix absolute paths start with os.path.sep,
           win32 ones start with drive (like c:\folder)
        )ospath
splitdrive
startswithsep)r   repodrivetailr   r   r   _is_local_repositoryk   s    z#VersionControl._is_local_repositoryc             C   s   | j  d d  S)N/_)replace)r   surnamer   r   r   translate_egg_surnameu   s    z$VersionControl.translate_egg_surnamec             C   s
   t   d S)z
        Export the repository at the url to the destination location
        i.e. only download the files, without vcs informations
        N)NotImplementedError)r   r4   r   r   r   exporty   s    zVersionControl.exportc       	      C   s   d } d |  j  k s( t | |  j    |  j  j d d  d } t j |  \ } } } } } d } d | k r | j d d  \ } } t j | | | | d f  } | | f S)zm
        Returns the correct repository URL and revision by parsing the given
        repository URL
        zvSorry, '%s' is a malformed VCS url. The format is <vcs>+<protocol>://<url>, e.g. svn+http://myrepo/svn/MyApp#egg=MyApp+   N@r>   )r?   AssertionErrorsplitr   urlsplitrsplit
urlunsplit)	r   error_messager?   schemenetlocrC   queryfragrevr   r   r   get_url_rev   s    "zVersionControl.get_url_revc             C   sH   | j  d  j |  j  s, t d |   |  j |  |  j |  f S)zA
        Returns (url, revision), where both are strings
        rK   zBad directory: %s)rstripendswithr$   rU   get_urlget_revision)r   r4   r   r   r   get_info   s    zVersionControl.get_infoc             C   s   t  j |  j d  S)zi
        Normalize a URL for comparison by unquoting it and removing any
        trailing slash.
        rK   )r   unquotera   )r   r?   r   r   r   normalize_url   s    zVersionControl.normalize_urlc             C   s   |  j  |  |  j  |  k S)zV
        Compare two repo URLs for identity, ignoring incidental differences.
        )rg   )r   url1url2r   r   r   compare_urls   s    zVersionControl.compare_urlsc             C   s
   t   d S)zx
        Called when installing or updating an editable package, takes the
        source path of the checkout.
        N)rP   )r   destr   r   r   obtain   s    zVersionControl.obtainc             C   s
   t   d S)zB
        Switch the repo at ``dest`` to point to ``URL``.
        N)rP   )r   rk   r?   rev_optionsr   r   r   switch   s    zVersionControl.switchc             C   s
   t   d S)zO
        Update an already-existing repo to the given ``rev_options``.
        N)rP   )r   rk   rm   r   r   r   update   s    zVersionControl.updatec             C   s
   t   d S)zp
        Return True if the version is identical to what exists and
        doesn't need to be updated.
        N)rP   )r   rk   rm   r   r   r   check_version   s    zVersionControl.check_versionc       
      C   sX  d } d } t  j j |  r2d } t  j j t  j j | |  j   r|  j |  } |  j | |  r t j d |  j	 j
   t |  |  |  j | |  s t j d t |  |  j	 |  |  j | |  qt j d  q2t j d |  j |  j	 t |  |  d } n" t j d | |  j |  j	  d } | rTt j d |  j |  t d | d | d  } | d k rt j d |  j	 t |  | |  |  j | | |  n | d	 k rn | d
 k rt j d t |   t |  d } nc | d k r;t |  }	 t j d t |  |	  t j | |	  d } n | d k rTt j d  | S)z
        Prepare a location to receive a checkout/clone.

        Return True if the location is ready for (and requires) a
        checkout/clone, False otherwise.
        TFz)%s in %s exists, and has correct URL (%s)zUpdating %s %s%sz$Skipping because already up-to-date.z%s %s in %s exists with URL %s%(s)witch, (i)gnore, (w)ipe, (b)ackup siwbz0Directory %s already exists, and is not a %s %s.(i)gnore, (w)ipe, (b)ackup z+The plan is to install the %s repository %szWhat to do?  %sr   rS   zSwitching %s %s to %s%szDeleting %szBacking up %s to %sarr   rs   rt   ru   )rq   rx   rs   rt   ru   )rv   ry   )rB   rC   existsjoinr$   rc   rj   r,   r/   	repo_nametitler   rp   inforo   r-   r*   r	   rn   r   r   shutilmovesysexit)
r   rk   r?   rm   rev_displaycheckoutpromptexisting_urlresponsedest_dirr   r   r   check_destination   s    $		
	 	
	
		z VersionControl.check_destinationc             C   s-   t  j j |  r t |  |  j |  d S)zq
        Clean up current location and download the url repository
        (and vcs infos) into location
        N)rB   rC   r{   r   rl   )r   r4   r   r   r   unpack  s    
zVersionControl.unpackc             C   s
   t   d S)z
        Return a string representing the requirement needed to
        redownload the files currently present in location, something
        like:
          {repository_url}@{revision}#egg={project_name}-{version_identifier}
        N)rP   )r   distr4   r   r   r   r      s    z"VersionControl.get_src_requirementc             C   s
   t   d S)z_
        Return the url used at location
        Used in get_info or check_destination
        N)rP   )r   r4   r   r   r   rc   )  s    zVersionControl.get_urlc             C   s
   t   d S)z_
        Return the current revision of the files at location
        Used in get_info
        N)rP   )r   r4   r   r   r   rd   0  s    zVersionControl.get_revisionTraisec       	      C   s   |  j  g | } y  t | | | | | | |  SWnP t k
 r } z0 | j t j k rm t d |  j    n   WYd d } ~ Xn Xd S)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
        zCannot find command %rN)r*   r   OSErrorerrnoENOENTr   )	r   cmdshow_stdoutcwdon_returncodecommand_descextra_environspinnerer   r   r   run_command7  s    	zVersionControl.run_commandc             C   sD   t  j d | |  j |  j  t j j | |  j  } t j j |  S)z
        Check if a location is controlled by the vcs.
        It is meant to be overridden to implement smarter detection
        mechanisms for specific vcs.
        zChecking in %s for %s (%s)...)r,   r/   r$   r*   rB   rC   r|   r{   )r0   r4   rC   r   r   r   r3   N  s    	z VersionControl.controls_location)r.   r:   r;   r*   r$   r   r   rJ   rO   rQ   r`   re   rg   rj   rl   rn   ro   rp   r   r   r   rc   rd   r   classmethodr3   r   r   )r   r   r=   a   s2   
U		r=   c             C   s{   t  j |  } | ra y |   j |  |  SWn2 t k
 r` t j d | | j  |  j   SYn Xt j d |  |  j   S)NzPcannot determine version of editable source in %s (%s command not found in path)ztcannot determine version of editable source in %s (is not SVN checkout, Git clone, Mercurial clone or Bazaar branch))r
   r9   r   r   r,   r-   r*   as_requirement)r   r4   version_controlr   r   r   r   [  s    
)__doc__
__future__r   r   loggingrB   r   r   Zpip._vendor.six.moves.urllibr   r   pip.exceptionsr   	pip.utilsr   r   r   r   r	   __all__	getLoggerr.   r,   objectr   r
   r=   r   r   r   r   r   <module>   s   (G	