U
    ĮwhY/                     @   s^   d dl Z d dlZd dlmZ d dlT d dlmZ d dlmZm	Z	 d dlZG dd dej
Z
dS )    N)Path)*)cmf_evagit_repo)RepoBadNamec                
       s   e Zd Zejjddddddddd	g	 Zed
d Zedd Ze	d1 fdd	Z
dd Z fddZ fddZdd Zdd Zdd Zdd Zd2dd Zd!d" Zd3d$d%Zd&d' Zd(d) Zeed*d*d+d,d-d. Zd/d0 Z  ZS )4CmfEvagitRepofetch_repo_treefetch_file_contentfetch_branchesfetch_commitfetch_commitscreate_branchdelete_branchfetch_commit_difffetch_unmerged_commitsc                 C   s*   | j js| j   ttj d| j  dS )N/repos/z.git)url
is_definedloadr   configGIT_DIRself r   *./modules/evagit/models/cmf_evagit_repo.pypath   s    
zCmfEvagitRepo.pathc                 C   s0   | j js| j   ttj d| j  d| j S )Nr   z.git_deleted_)r   r   r   r   r   r   coder   r   r   r   path_deleted   s    
zCmfEvagitRepo.path_deletedNc                    s:   |pi }| dg dddgg|d< t j|fd|i|S )NZCmfRegistrytype=ZCmfEvagitGroupmodels_filters)getsuperfield_options_list)clsZrelation_field_namer    kwargs	__class__r   r   r#      s    z CmfEvagitRepo.field_options_listc                 C   s   | j rtjjddd| _d S )NZapp_gitT)Zsys_typesystem)is_newmodelsZ	CmfFolderr!   parentr   r   r   r   _calc_parent&   s    zCmfEvagitRepo._calc_parentc           
   
      s   | j rtjd|  | j r4td| j ddd tj| jddd}| j	rt
 `}| d}||}t|d}|d	 W 5 Q R X |j|g |jd
 |   W 5 Q R X tjjdd}tj| tj|d}	|	  | j s| jrtjd|  | jjrtj|  t j||S )NZperm_create_repou'   Репозиторий с именем u    уже существуетTabort)mkdirZbarez
/README.mdwzSome README TextzInitial commitzsystem.owner:default)r   )	namespacememberZgit_roleZperm_edit_repo)r)   r*   CmfEvagitRolecheck_role_permissionr   exists	cmf_alertr   initZis_readme_createdtempfileZTemporaryDirectoryZcloneopenwriteindexaddcommitZremotepushr!   CmfEvagitRoleAssigngZcurrent_usersaveZ
is_changedZtree_parentZcalc_repo_ssh_key_permsr"   )
r   argsr%   repoZtmp_dirZreadme_pathZcloned_repofileZrolerole_assignr&   r   r   rA   *   s4    




zCmfEvagitRepo.savec                    sf   t jd|  | j s.td| j d n| j| j t j	j
| dD ]}|  qJt j||S )NZperm_delete_repoRepo z already been deleted)r1   )r*   r3   r4   r   r5   ZloggingZwarningrenamer   r?   listdeleter"   )r   rB   r%   rE   r&   r   r   rI   N   s    

zCmfEvagitRepo.deletec                 C   sd  g }d| d}t | j}||jkr(|S |r:|ds:|S z|j| d| }W n@ tk
r } z"td| d| d| dd W 5 d }~X Y nX t	||tj
}|D ]}	t|j|d	| |	 d
}
|
s|  S |
d }d|ddd d }||	|	drdnd|j|j|j |r2|d n||	drDdnd	d q|jdd d |S )Nz	^(?!tree z:\S*)\s*(^.+?$)/:u5   При получении файлов по пути u     возникла ошибка: Tr-      )rev	max_countpathsr   ZfolderrD   )namer   
commit_sha	commit_atcommit_message
parent_dirorderc                 S   s   | d | d fS )NrV   rQ   r   )xr   r   r   <lambda>       z/CmfEvagitRepo.fetch_repo_tree.<locals>.<lambda>)key)r   r   headsendswithgitZshow	Exceptionr6   refindall	MULTILINErH   iter_commitsjoinstripsplitappendhexshacommitted_datetimemessagesort)r   refZ	tree_pathrespatternrC   dataematchesobjZcommitslast_commitrU   r   r   r   r   [   s<    

0zCmfEvagitRepo.fetch_repo_treec                 C   sN   t | j}||jkr(td| ddd |j| }|||j}|   |jS )Nu   Ветка u    не найденаTr-   )	r   r   branchesr6   r[   Zcreate_headr=   syncrQ   )r   Zbase_branch_nameZnew_branch_namerC   Zbase_branchZ
new_branchr   r   r   r      s    


zCmfEvagitRepo.create_branchc                 C   s.   t | j}||jkr"|jd| |   d S )Nz-D)r   r   rs   r]   branchrt   )r   Zbranch_namerC   r   r   r   r      s    

zCmfEvagitRepo.delete_branchc                 C   sD   t | j}g }|jD ]*}|j}||j|j|j|j	 d q|S )N)rQ   rR   rS   rT   )
r   r   rs   r=   rf   rQ   rg   rh   ri   rd   )r   rC   rl   ru   rr   r   r   r   r
      s    

zCmfEvagitRepo.fetch_branchesc                 C   sL   t | j}g }|j||||dD ]&}||j|j|j |jj	d q |S )N)rM   rN   skipauthor)rR   rS   rT   commit_author)
r   r   rb   rf   rg   rh   ri   rd   rw   rQ   )r   rM   countrv   rw   rC   rl   r=   r   r   r   r      s    
zCmfEvagitRepo.fetch_commitsc                 C   s   t | j}z||}W n tk
r0   i  Y S X |jrF|jd j}nd }|j|j|jj|j	|j
 dd |jD dd |jd| D | |j|dS )Nr   c                 S   s   g | ]
}|j qS r   )rg   ).0r+   r   r   r   
<listcomp>   s     z.CmfEvagitRepo.fetch_commit.<locals>.<listcomp>c                 S   s   g | ]}|  d  qS )rP   )re   rz   ru   r   r   r   r{      s     z
--contains)rR   rS   rx   commit_summaryrT   Zcommit_parentsZcommit_related_branchesZcommit_diffs)r   r   r=   r   parentsrg   rh   rw   rQ   summaryri   rd   r]   ru   
splitlinesr   )r   sharC   r=   Zparent_commit_shar   r   r   r      s"    

zCmfEvagitRepo.fetch_commitFc                 C   sV   t | j}||jks||jkr"g S |r*dnd}t|| | | }dd |D S )Nz...z..c                 S   s,   g | ]$}|j |j|j|j |jjd qS ))rR   rS   r}   rT   rx   )rg   rh   r   ri   rd   rw   rQ   )rz   r=   r   r   r   r{      s   z8CmfEvagitRepo.fetch_unmerged_commits.<locals>.<listcomp>)r   r   rs   rH   rb   )r   Zsource_branchZtarget_branchZinclude_sourcerC   cmdZunmerged_commitsr   r   r   r      s    
z$CmfEvagitRepo.fetch_unmerged_commitsc                 C   s  t | j}g }z||}W n tk
r4   g }Y nX |d krDd }n(z||}W n tk
rj   g }Y nX |d kr|jj D ]J}|j| j	 
d}||ddtjt |jdd||dd q|S |j|ddD ]}	|	jr|	j}d}
d	|	j d
|	j d}nt|	jr6|	j}d}
d	|	j d
|	j d}nJ|	jr`|	j}d}
d	|	j d
|	j d}n |	j}d}
d	|	j d
|	j d}|||
||	j
d d q|S )Nutf-8A T)keepends)ZfromfileZtofile)filenamechange_typediff)Zcreate_patchz--- z
+++ 
DRM)r   r   r=   r   Zstatsfileskeystreedata_streamreaddecoderf   rc   difflibZunified_diffstrr   r   Znew_fileZb_pathZdeleted_fileZa_pathZrenamed_file)r   Z
source_shaZ
target_sharC   ZdiffsZsource_commitZtarget_commitr   rD   Z	diff_itemr   headerr   r   r   r      sZ    


 zCmfEvagitRepo.fetch_commit_diffc                 C   sb   t | j}||}|j| }z|j d}|j|dW S  tk
r\   t	ddd Y nX d S )Nr   )rQ   ZcontentuM   Содержимое файла невозможно декодироватьTr-   )
r   r   r=   r   r   r   r   rQ   UnicodeDecodeErrorr6   )r   rk   r   rC   r=   Z	file_blobZfile_contentr   r   r   r	     s    


z CmfEvagitRepo.fetch_file_contentTz*/5 * * * *)Z	only_onceZ
system_jobZschedulec                  O   s    t j }|D ]}|  qd S )N)r*   r   rH   rt   )rB   r%   ZreposrC   r   r   r   
sync_repos#  s    
zCmfEvagitRepo.sync_reposc           	   	   C   s.  | j dgd zdd |  D }W n* tjjk
rN   td| j dY nX dd tjj	| dgd	D }|
 D ]\}}||}|stj| |d
}tjj| |d d}|s| |d }tj| |d |d |d |d |d d}|jdd ||_|  qt|
 D ]\}}||kr|  qd S )Nr   )fieldsc                 S   s   i | ]}|d  |qS rQ   r   r|   r   r   r   
<dictcomp>.  s      z&CmfEvagitRepo.sync.<locals>.<dictcomp>rF   z not found on file systemc                 S   s   i | ]}|j |qS r   r   r|   r   r   r   r   2  s      rQ   )r+   r   )r+   rQ   rR   )r+   r   r}   rT   rx   rS   )r+   rQ   textrx   r   Zcommited_dateF)audit)Zload_fieldsr
   r]   excZNoSuchPathError
ValueErrorr   r*   ZCmfEvagitBranchrH   itemsr!   ZCmfEvagitCommitr   rA   r=   rI   )	r   Zgit_branchesZdb_branchesZgit_branch_nameZ
git_branchZ	db_branchZ	db_commitZ
git_commitZdb_branch_namer   r   r   rt   *  s6    


zCmfEvagitRepo.sync)N)N)F)__name__
__module____qualname__r   r   Zapi_methodspropertyr   r   classmethodr#   r,   rA   rI   r   r   r   r
   r   r   r   r   r	   staticmethodZcmf_deferred_jobr   rt   __classcell__r   r   r&   r   r      sB        

$(

9r   )r8   r   pathlibr   Zcmf.includeZmodules.evagit.fieldsr   r]   r   r   r   r   r   r   r   <module>   s   