U
    _h                      @   sF   d dl Z d dlZd dlmZ d dlT d dlmZ G dd dejZdS )    N)Repo)*)cmf_evagit_merge_requestc                       sn   e Zd Zejjdddg Z fddZ fddZ fdd	Zd
d Z	dd Z
dd Zdd Zdd Z  ZS )CmfEvagitMergeRequestclosefetch_conflictsmergec                    s"   ddddddddg}t   | S )	Nbranch_from.commit.parentbranch_from.namebranch_to.namebranch_from.commit.shabranch_to.commit.shaworkflowbranch_from.parentbranch_to.parent)supersave_preload_fields)selffields	__class__ 3./modules/evagit/models/cmf_evagit_merge_request.pyr      s         z)CmfEvagitMergeRequest.save_preload_fieldsc              	      s  | j rBtjd| jj tjd| jj tjjddd| jgdd| jgdddgggd}|rtt	d	|j
 d
dd | jjj}t|j}|| jj
| jj
}|j| jj
| jj
}g }|D ]^}	tjj||	d d}
|
stj||	d |	d |	d |	d |	d d}
|
j|| ||
 q|| _tj| | jjj| jjj|d }| j sv| jrvtjd| jj tjd| jj | jjr| jdkrtjd| jj tjd| jj tj| _t j||S )NZperm_create_merge_requestZANDbranch_from=	branch_tozstatus.codeopen)filterzPull request u3    уже создан для данных ветокTabortZ
commit_sha)parentshaZcommit_summaryZcommit_messagecommit_authorZ	commit_at)r    nametextr"   r!   Zcommited_dater    Z
source_shaZ
target_shabase_shaZperm_edit_merge_requestZCLOSEDZperm_close_merge_request)is_newmodelsCmfEvagitRolecheck_role_permissionr   r    r   r   get	cmf_alertr#   commitr   pathZfetch_unmerged_commitsgit
merge_baseZCmfEvagitCommitsaveappendZcommitsCmfEvagitMergeRequestDiffr!   Z
is_changedstatusZcache_status_typegZcurrent_user	closed_byr   )r   argskwargsmrbd_repofs_repoZunmerged_commitsr&   Z
db_commitsr-   Z	db_commitmr_diffr   r   r   r1      sZ    




zCmfEvagitMergeRequest.savec                    s   t   ddg S )Nr6   r4   )r   project_perm_allow_fieldsr   r   r   r   r=   P   s    z/CmfEvagitMergeRequest.project_perm_allow_fieldsc                 C   s   | j rtjjddd| _d S )NZapp_gitT)Zsys_typesystem)r'   r(   Z	CmfFolderr+   r    r>   r   r   r   _calc_parentS   s    z"CmfEvagitMergeRequest._calc_parentc                 C   s    | j stjjdddgd| _ d S )Nzmerge_request.base:defaultTZsave_eval_code)codeZcache_inmemoryr   )r   r(   ZCmfWorkflowr+   r>   r   r   r   _calc_workflowW   s    z$CmfEvagitMergeRequest._calc_workflowc              
   C   sB  | j dddgd | jjj}t|j}g }t }||}|	 "}|
ddd |
ddd	 W 5 Q R X z0|j| jj |jjd
| jj ddd W n tk
r2   |j }| D ]h\}}	|g d}
|	D ]F\}}dddd}g g g d}|j d||| < |
d | q||
 qY nX W 5 Q R X |S )Nr	   r
   r   r   userr#   Ztmpemailztmp@example.comorigin/T)Z	no_commitZno_ff)r#   	conflictsbasetargetsource)         )rH   rI   rJ   zutf-8rG   )load_fieldsr   r-   r    r   r.   tempfileTemporaryDirectorycloneconfig_writer	set_valuer/   checkoutr   r#   r   	ExceptionindexZunmerged_blobsitemsZdata_streamreaddecoder2   )r   r:   r;   restmp_dircloned_reporR   rG   Z	file_pathZblobsdataiZblob_mapZconflict_datar   r   r   r   [   s.    



 

z%CmfEvagitMergeRequest.fetch_conflictsc              
   C   s  | j ddddddddgd	 tjd
| jj tjd
| jj |  }|rXtddd | jj	j}t
|j}| jj|jkrtd| jj ddd | jj|jkrtd| jj ddd t }||}| "}|ddd |ddd W 5 Q R X |j| jj |jjd| jj d| jj d| jj dd |   W 5 Q R X | jjdd| _|   ttjj|jgd | S )Nr	   r
   r   r   r   r   r   r   rC   Zperm_merge_merge_requestu6   Обнаружены конфликты слиянияTr   u0   Слияние невозможно. Ветка u    не найденаrD   r#   u   СистемаrE   zsystem@example.comrF   zMerge branch 'z' into '')mZmerged)Zstatus_code)r7   ) rN   r(   r)   r*   r   r    r   r   r,   r-   r   r.   r#   ZbranchesrO   rP   rQ   rR   rS   r/   rT   r   Zremotepushr   Zget_default_statusr4   r1   Zschedule_deferred_jobZCmfEvagitRepoZ	sync_repoid)r   rG   r:   r;   r[   r\   rR   r   r   r   r   {   sH         




zCmfEvagitMergeRequest.mergec              	   C   s   | j ddddddddgd	 | jjj}t|j}|j| jj	| jj	}t
jj| | jjj| jjj|d
}|st
j| | jjj| jjj|d
 }t
jj| d}|D ]}|  qd S )Nr	   r
   r   r   r   r   r   r   rC   r%   )r    )rN   r   r-   r    r   r.   r/   r0   r   r#   r(   r3   r+   r!   r1   ZCmfEvagitDiscussionlistZrecalc_position)r   r:   r;   r&   r<   ZdiscussionsZ
discussionr   r   r   sync   s:         


zCmfEvagitMergeRequest.sync)__name__
__module____qualname__r   r   Zapi_methodsr   r1   r=   r@   rB   r   r   re   __classcell__r   r   r   r   r   
   s     9 +r   )rO   Zdatetimer/   r   Zcmf.includeZmodules.evagit.fieldsr   r   r   r   r   r   <module>   s
   