U
    xÊ¹jª  ã                   @   s<   d dl Z d dlZd dlmZ ddlmZ G dd„ deƒZdS )é    N)ÚAbstractFileSystemé   )Ú
MemoryFilec                       s„   e Zd ZdZdZdZd‡ fdd„	Ze‡ fdd„ƒZd	d
„ Z	e
dd„ ƒZe
ddd„ƒZddd„Zddd„Zddd„Zddd„Z‡  ZS )ÚGitFileSystemz\Browse the files of a local git repo at any hash/tag/branch

    (experimental backend)
    Ú TNc                    s4   t ƒ jf |Ž t |p |p t ¡ ¡| _|p,d| _dS )aM  

        Parameters
        ----------
        path: str (optional)
            Local location of the repo (uses current directory if not given).
            May be deprecated in favour of ``fo``. When used with a higher
            level function such as fsspec.open(), may be of the form
            "git://[path-to-repo[:]][ref@]path/to/file" (but the actual
            file path should not contain "@" or ":").
        fo: str (optional)
            Same as ``path``, but passed as part of a chained URL. This one
            takes precedence if both are given.
        ref: str (optional)
            Reference to work with, could be a hash, tag or branch name. Defaults
            to current working tree. Note that ``ls`` and ``open`` also take hash,
            so this becomes the default for those operations
        kwargs
        ZmasterN)ÚsuperÚ__init__Úpygit2Z
RepositoryÚosÚgetcwdÚrepoÚref)ÚselfÚpathÚfor   Úkwargs©Ú	__class__© úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fsspec/implementations/git.pyr      s    zGitFileSystem.__init__c                    sL   t ƒ  |¡ d¡}d|kr*| dd¡d }d|krB| dd¡d }| d¡S )Nú/ú:r   ú@)r   Ú_strip_protocolÚlstripÚsplit)Úclsr   r   r   r   r   +   s    zGitFileSystem._strip_protocolc                 C   s\   | j  |p| j¡\}}| d¡}|j}|D ],}|r*t|tjƒr*||krNt|ƒ‚|| }q*|S )Nr   )	r   Zresolve_refishr   r   ÚtreeÚ
isinstancer	   ÚTreeÚFileNotFoundError)r   r   r   ZcommÚpartsr   Úpartr   r   r   Ú_path_to_object4   s    

zGitFileSystem._path_to_objectc                 C   sV   |   d¡r| dd … } i }d| kr6|  dd¡\|d< } d| krR|  dd¡\|d< } |S )Nzgit://é   r   r   r   r   r   )Ú
startswithr   )r   Úoutr   r   r   Ú_get_kwargs_from_urls?   s    
z#GitFileSystem._get_kwargs_from_urlsc                 C   sh   t | tjƒ}|rdnd|r4d || jp(dg¡ d¡n| jt| jƒ| jd krNdn| jd›|r^dn| j	dœS )	NÚ	directoryÚfiler   r   Z100644Úor   )ÚtypeÚnameÚhexÚmodeÚsize)
r   r	   r   Újoinr,   r   ÚstrÚidÚfilemoder/   )Úobjr   Úis_dirr   r   r   Ú_object_to_infoJ   s    
"ùzGitFileSystem._object_to_infoc                    s8   |   |  ˆ¡|¡}‡ ‡fdd„t|tjƒr.|n|gD ƒS )Nc                    s,   g | ]$}ˆ rt  |ˆ¡nt  |ˆ¡d  ‘qS )r,   )r   r6   )Ú.0r4   ©Údetailr   r   r   Ú
<listcomp>Z   s   þÿz$GitFileSystem.ls.<locals>.<listcomp>)r#   r   r   r	   r   )r   r   r9   r   r   r   r   r8   r   ÚlsX   s    üzGitFileSystem.lsc                 K   s   |   |  |¡|¡}t ||¡S )N)r#   r   r   r6   )r   r   r   r   r   r   r   r   Úinfoa   s    zGitFileSystem.infoc                 C   s   | j ||d�d S )N)r   r-   )r<   )r   r   r   r   r   r   Úukeye   s    zGitFileSystem.ukeyÚrbc           	      K   s   |   ||p| j¡}t|jd�S )N)Údata)r#   r   r   r?   )	r   r   r.   Ú
block_sizeZ
autocommitZcache_optionsr   r   r4   r   r   r   Ú_openh   s    
zGitFileSystem._open)NNN)N)TN)N)N)r>   NTNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zroot_markerZcachabler   Úclassmethodr   r#   Ústaticmethodr'   r6   r;   r<   r=   rA   Ú__classcell__r   r   r   r   r   
   s(   


	

     ùr   )r
   r	   Zfsspec.specr   Zmemoryr   r   r   r   r   r   Ú<module>   s   