3
LYV0                 @   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G d	d
 d
eZe ZG d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Zdd Zdd Zdd Z  ZS )
VcsSupportsshgithgbzrsftpsvnc                s:   t jj| j tt dd r(t jj| j tt| j  d S )Nuses_fragment)	urllib_parseuses_netlocextendschemesgetattrr   superr   __init__)self)	__class__ c/private/var/folders/7d/20zwc49s3kn54d3vgq8bd4640000gn/T/pip-build-an2lx5zf/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S r   )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   sF   t |dstjd|j d S |j| jkrB|| 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   s<   || j kr| j |= n$|| j j kr.| 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   s8   x2| j j D ]$}|j|rtjd||j |jS qW d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| S d S )N)lowerr   )r   r*   r   r   r   get_backendR   s    
zVcsSupport.get_backendc             C   s   | j |}|r| j|S d S )N)r6   r8   )r   r4   r5   r   r   r   get_backend_from_locationW   s    

z$VcsSupport.get_backend_from_location)NN)r.   
__module____qualname__r   r   r   r    propertyr#   r(   r)   r1   r2   r6   r8   r9   __classcell__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(Zed)d* Z  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   s"   t jj|\}}|jt jjp |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   sz   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netlocrD   queryfragrevr   r   r   get_url_rev   s    zVersionControl.get_url_revc             C   s4   |j dj| j s td| | j|| j|fS )zA
        Returns (url, revision), where both are strings
        rL   zBad directory: %s)rstripendswithr$   rV   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.
        rL   )r   unquoterb   )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.
        )rh   )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)rQ   )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)rQ   )r   rl   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)rQ   )r   rl   rn   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)rQ   )r   rl   rn   r   r   r   check_version   s    zVersionControl.check_versionc       
      C   s  d}d}t jj|rd}t jjt jj|| jr| j|}| j||rtjd| j	j
 t|| | j||stjdt|| j	| | j|| qtjd qtjd| j| j	t|| d}ntjd|| j| j	 d}|rtjd| j| td|d  |d }|dkr2tjd| j	t||| | j||| n~|d	kr>nr|d
krftjdt| t| d}nJ|dkrt|}	tjdt||	 tj||	 d}n|dkrt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   rT   zSwitching %s %s to %s%szDeleting %szBacking up %s to %sars   rt   ru   rv   )rr   ry   rt   ru   rv   )rw   rz   )rC   rD   existsjoinr$   rd   rk   r,   r/   	repo_nametitler   rq   inforp   r-   r*   r	   ro   r   r   shutilmovesysexit)
r   rl   r@   rn   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)rC   rD   r|   r   rm   )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)rQ   )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)rQ   )r   r4   r   r   r   rd   )  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)rQ   )r   r4   r   r   r   re   0  s    zVersionControl.get_revisionTraisec       	      C   sf   | j g| }yt|||||||S  tk
r` } z$|jtjkrNtd| j  n W Y dd}~X nX d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   s0   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*   rC   rD   r}   r|   )r0   r4   rD   r   r   r   r3   N  s    z VersionControl.controls_location)N)TNr   NNN)r.   r:   r;   r*   r$   r   r   rK   rP   rR   ra   rf   rh   rk   rm   ro   rp   rq   r   r   r   rd   re   r   classmethodr3   r=   r   r   )r   r   r>   a   s2   
U		   
r>   c             C   sZ   t j|}|rFy| j| |S  tk
rD   tjd||j | j S X t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   loggingrC   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 {