
    Y~hj3                         d dl Z d dlZd dlm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ej                  ZdS )	    N)Path)urlparse)*)cmf_evagit_repo)RepoBadNamec                   J    e Zd Zej        j        g dz   Zed             Zed             Ze	d fd	            Z
d Z fdZ fdZd	 Zd
 Zd Zd ZddZd ZddZd Zd Ze eddd          d                         Ze ed          d                         Z xZS )CmfEvagitRepo)	fetch_repo_treefetch_file_contentfetch_branchesfetch_commitfetch_commitscreate_branchdelete_branchfetch_commit_difffetch_unmerged_commitsc                     | j         j        s| j                                          t          t          j         d| j          d          S )N/repos/z.git)url
is_definedloadr   configGIT_DIRselfs    *./modules/evagit/models/cmf_evagit_repo.pypathzCmfEvagitRepo.path   sA    x" 	HMMOOOv~<<dh<<<===    c                     | j         j        s| j                                          t          t          j         d| j          d| j                   S )Nr   z.git_deleted_)r   r   r   r   r   r   coder   s    r   path_deletedzCmfEvagitRepo.path_deleted   sH    x" 	HMMOOOv~PPdhPPTYPPQQQr   Nc                 ~    |pi }|                     dg           g dg|d<    t                      j        |fd|i|S )NCmfRegistry)type=CmfEvagitGroupmodels_filters)getsuperfield_options_list)clsrelation_field_namer(   kwargs	__class__s       r   r+   z CmfEvagitRepo.field_options_list    sY    '-2)7););M2)N)NPoPoPo(p}%)uww)*=ggng`fgggr   c                 d    | j         r(t          j                            dd          | _        d S d S )Napp_gitT)sys_typesystem)is_newmodels	CmfFolderr)   parentr   s    r   _calc_parentzCmfEvagitRepo._calc_parent'   s:    ; 	P *..	$.OODKKK	P 	Pr   c           	      ^   | j         r3t          j                            d|            | j                                        rt          d| j         dd           t          j        | j        dd          }| j	        rat          j                    5 }| d}|                    |          }| j                            d          }t          | j                                      d	          ^ }}}	|                    ||	| j        j        t+          t,          j                  j        
          }
t3          |d          5 }|                    |
           d d d            n# 1 swxY w Y   |j                            |g           |j                            d           |                                                                 d d d            n# 1 swxY w Y   t          j                             d          }t          !                    | tD          j#        |          }|$                                 | j         s'| j%        r t          j                            d|            | j&        j%        rt          j!        '                    |             tQ                      j$        |i |S )Nperm_create_repou'   Репозиторий с именем u    уже существуетTabort)mkdirbarez
/README.mdz	README.md/)
group_name	repo_nameproject_namelocationwzInitial commitzsystem.owner:default)r!   )	namespacemembergit_roleperm_edit_repo))r4   r5   CmfEvagitRolecheck_role_permissionr   exists	cmf_alertr   initis_readme_createdtempfileTemporaryDirectoryclone
_jinja_envget_templatestrr   splitrendernamevaluer   requestbase_urlnetlocopenwriteindexaddcommitremotepushr)   CmfEvagitRoleAssigngcurrent_usersave
is_changedtree_parentcalc_repo_ssh_key_permsr*   )r   argsr.   repotmp_dirreadme_pathcloned_reporeadme_templater@   rA   readme_contentfilerolerole_assignr/   s                 r   rf   zCmfEvagitRepo.save+   s   ;  	 667I4PPPy!! ykDIkkkswxxxx9TYd>>>D% 0022 0g%,"8"8"8K"&**W"5"5K&*o&B&B;&O&OO36tx==3F3Fs3K3K0T:y%4%;%;#-%)Y_'JZA[A[Ab &< & &N k3// 34

>2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3  %));-888%,,-=>>>&&((--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" '++1G+HHD 44~ 5  K
 { 	Ot 	O 667GNNN& 	E&>>tDDDuww|T,V,,,s8   B/GE%G%E)	)G,E)	-AGGGc                    t           j                            d|            | j                                        s$t
                              d| j         d           n| j                            | j                   t           j	        
                    |           D ]}|                                  t                      j        |i |S )Nperm_delete_repoRepo z already been deleted)rE   )r5   rI   rJ   r   rK   loggingwarningrenamer"   rc   listdeleter*   )r   rj   r.   rs   r/   s       r   r{   zCmfEvagitRepo.deleteV   s    223EtLLLy!! 	0OODDIDDDEEEEIT.///!5::T:JJ 	! 	!K    uww~t.v...r   c                    g }d| d}t          | j                  }||j        vr|S |r|                    d          s|S 	 |j                            | d|           }n1# t          $ r$}t          d| d| d| d           Y d }~nd }~ww xY wt          	                    ||t          j
                  }|D ]}	t          |                    |d	| |	 
                    }
|
s|c S |
d         }d                    |                    d                              d          d d                   }|                    |	|	                    d          rdnd|j        |j        |j                                        |r|dz   n||	                    d          rdnd	d           |                    d            |S )Nz	^(?!tree z:\S*)\s*(^.+?$)r?   :u5   При получении файлов по пути u     возникла ошибка: Tr;      )rev	max_countpathsr   folderrq   )rW   r%   
commit_sha	commit_atcommit_message
parent_dirorderc                 "    | d         | d         fS )Nr   rW    )xs    r   <lambda>z/CmfEvagitRepo.fetch_repo_tree.<locals>.<lambda>   s    '
AfI6 r   )key)r   r   headsendswithgitshow	ExceptionrL   refindall	MULTILINErz   iter_commitsjoinstriprU   appendhexshacommitted_datetimemessagesort)r   ref	tree_pathrespatternrk   dataematchesobjcommitslast_commitr   s                r   r   zCmfEvagitRepo.fetch_repo_treec   se   3s333DIdj  J 	Y//44 	J	P8==C!5!5)!5!566DD 	P 	P 	P  Cc  C  CT]  C  C  @A  C  C  KO  P  P  P  P  P  P  P  P  P	P **WdBL99 	 	C4,,II\WZI\I\,]]^^G 


!!*K)//#"6"6"<"<S"A"A#2#"FGGJJJ(+S(9(9EHHv"-"4!,!?&1&9&?&?&A&A6@"P*s"2"2j"%,,s"3"3:QQ 
 
 
 
 	66777
s   A" "
B,BBc                    t          | j                  }||j        vrt          d| dd           |j        |         }|                    ||j                  }t          t          j	        j
        | j        g           |j        S )Nu   Ветка u    не найденаTr;   rj   )r   r   branchesrL   r   create_headr`   schedule_deferred_jobr5   r
   	sync_repoidrW   )r   base_branch_namenew_branch_namerk   base_branch
new_branchs         r   r   zCmfEvagitRepo.create_branch   s    DI4=00J$4JJJRVWWWWj!12%%o{7IJJ
f2<DG;OOOOr   c                     t          | j                  }||j        v r|j                            d|           t          t          j        j        | j	        g           d S )Nz-Dr   )
r   r   r   r   branchr   r5   r
   r   r   )r   branch_namerk   s      r   r   zCmfEvagitRepo.delete_branch   sU    DI$-''HOOD+...f2<DG;OOOOOOr   c                     t          | j                  }g }|j        D ]I}|j        }|                    |j        |j        |j        |j        	                                d           J|S )N)rW   r   r   r   )
r   r   r   r`   r   rW   r   r   r   r   )r   rk   r   r   r   s        r   r   zCmfEvagitRepo.fetch_branches   s{    DIm 		 		F -KJJ"K"-"4!,!?&1&9&?&?&A&A	     
r   c                     t          | j                  }g }|                    ||||          D ]G}|                    |j        |j        |j                                        |j        j	        d           H|S )N)r   r   skipauthor)r   r   r   commit_author)
r   r   r   r   r   r   r   r   r   rW   )r   r   countr   r   rk   r   r`   s           r   r   zCmfEvagitRepo.fetch_commits   s    DI''C5tTZ'[[ 	 	FJJ"(-!'!:&,n&:&:&<&<%+]%7	     
r   c                    t          | j                  }	 |                    |          }n# t          $ r i cY S w xY w|j        r|j        d         j        }nd }|j        |j        |j        j        |j	        |j
                                        d |j        D             d |j                            d|                                          D             |                     |j        |          dS )Nr   c                     g | ]	}|j         
S r   )r   ).0r7   s     r   
<listcomp>z.CmfEvagitRepo.fetch_commit.<locals>.<listcomp>   s    JJJv}JJJr   c                 B    g | ]}|                                 d          S )r   )rU   r   r   s     r   r   z.CmfEvagitRepo.fetch_commit.<locals>.<listcomp>   s%    'y'y'yvr(:'y'y'yr   z
--contains)r   r   r   commit_summaryr   commit_parentscommit_related_branchescommit_diffs)r   r   r`   r   parentsr   r   r   rW   summaryr   r   r   r   
splitlinesr   )r   shark   r`   parent_commit_shas        r   r   zCmfEvagitRepo.fetch_commit   s   DI	[[%%FF 	 	 	III	 > 	% &q 1 8 $ !-2#]/$n$n2244JJ6>JJJ'y'yYegjIkIkIvIvIxIx'y'y'y 226=BSTT	
 	
 		
s   , ;;Fc                     t          | j                  }||j        vs	||j        vrg S |rdnd}t          |                    | | |                     }d |D             S )Nz...z..c                 ~    g | ]:}|j         |j        |j        |j                                        |j        j        d ;S ))r   r   r   r   r   )r   r   r   r   r   r   rW   )r   r`   s     r   r   z8CmfEvagitRepo.fetch_unmerged_commits.<locals>.<listcomp>   sZ     , , ,  #)-!'!:&,n&,n&:&:&<&<%+]%7 , , ,r   )r   r   r   rz   r   )r   source_branchtarget_branchinclude_sourcerk   cmdunmerged_commitss          r   r   z$CmfEvagitRepo.fetch_unmerged_commits   s    DI--dm1S1SI%/ee4 1 1]2XC2X2X2X Y YZZ, , +, , , 	,r   c                    t          | j                  }g }	 |                    |          }n# t          $ r g }Y nw xY w|d }n)	 |                    |          }n# t          $ r g }Y nw xY w||j        j                                        D ]}|j        |         j        	                                
                    d          }|                    |dd                    t          j        t                      |                    d          ||                    d           |S |                    |d          D ]}	|	j        r|	j        }d}
d	|	j         d
|	j         d}nd|	j        r|	j        }d}
d	|	j         d
|	j         d}n@|	j        r|	j        }d}
d	|	j         d
|	j         d}n|	j        }d}
d	|	j         d
|	j         d}|                    ||
||	j        
                    d          z   d           |S )Nutf-8A T)keepends)fromfiletofile)filenamechange_typediff)create_patchz--- z
+++ 
DRM)r   r   r`   r   statsfileskeystreedata_streamreaddecoder   r   difflibunified_diffrT   r   r   new_fileb_pathdeleted_filea_pathrenamed_file)r   
source_sha
target_shark   diffssource_committarget_commitr   rq   	diff_itemr   headers               r   r   zCmfEvagitRepo.fetch_commit_diff   s   DI	 KK
33MM 	 	 	EEE	  MM $J 7 7     )/5::<<  $)(3?DDFFMMgVV$,'* "(<SUUDOO]aODbDbmu  G  )H  )H  )H  !I  !I     L&++M+MM 	 	I! M$+!L	 0LL	8HLLL' M$+!L	 0LL	8HLLL' M$+!L	 0LL	8HLLL$+!L	 0LL	8HLLLLL (#."Y^%:%:7%C%CC     s   . ==A A+*A+c                     t          | j                  }|                    |          }|j        |         }	 |j                                                            d          }|j        |dS # t          $ r t          dd           Y d S w xY w)Nr   )rW   contentuM   Содержимое файла невозможно декодироватьTr;   )
r   r   r`   r   r   r   r   rW   UnicodeDecodeErrorrL   )r   r   r   rk   r`   	file_blobfile_contents          r   r   z CmfEvagitRepo.fetch_file_content   s    DIS!!K%		s$05577>>wGGL%N|DDD! 	s 	s 	semqrrrrrrr	ss   5A. .BBTz@hourly)	only_once
system_jobschedulec                      t           j                                        }|D ](}t          t           j        j        |j        g           )d S )Nr   )r5   r
   rz   r   r   r   )rj   r.   reposrk   s       r   
sync_reposzCmfEvagitRepo.sync_repos+  sU     $))++ 	T 	TD!&"6"@{SSSSS	T 	Tr   )r   c           
         t           j                            | dg          }	 d |                                D             }n0# t          j        j        $ r t          d|j         d          w xY wd t           j	        
                    |dg          D             }|                                D ]\  }}|                    |          }|st           	                    ||	          }t           j                            ||d
                   }|so|                    |d
                   }t                               ||d         |d         |d         |d
         |d                   }|                    d           ||_        |                                 |                                D ]\  }	}|	|vr|                                 dddd |                                D             gddd |                                D             gg}
t           j        
                    |
          D ]}|                                 d S )Nr   )r   fieldsc                      i | ]}|d          |S rW   r   r   s     r   
<dictcomp>z+CmfEvagitRepo.sync_repo.<locals>.<dictcomp>8  s    WWWvF6NFWWWr   rv   z not found on file systemc                     i | ]
}|j         |S r   r  r   s     r   r  z+CmfEvagitRepo.sync_repo.<locals>.<dictcomp><  s    sssvv{Fsssr   rW   )r7   r  )r7   rW   r   )r7   r   r   r   r   r   )r7   rW   textr   r   commited_dateF)auditOR	branch_toINc                     g | ]	}|j         
S r   r   r   s     r   r   z+CmfEvagitRepo.sync_repo.<locals>.<listcomp>Y  s     N N Nv N N Nr   branch_fromc                     g | ]	}|j         
S r   r  r   s     r   r   z+CmfEvagitRepo.sync_repo.<locals>.<listcomp>Z  s    "P"P"P69"P"P"Pr   )filter)r5   r
   r)   r   r   excNoSuchPathError
ValueErrorr   CmfEvagitBranchrz   itemsCmfEvagitCommitr   rf   r`   r{   valuesCmfEvagitMergeRequestsync)obj_idrk   git_branchesdb_branchesgit_branch_name
git_branch	db_branch	db_commit
git_commitdb_branch_namer  mrs               r   r   zCmfEvagitRepo.sync_repo2  s    #''63%'@@	KWWATATAVAVWWWLLw& 	K 	K 	KITYIIIJJJ	K ts9O9T9T\`jpiq9T9r9rsss+7+=+=+?+? 	 	'OZ#88I V"22$_2UU	.22$J|D\2]]I 
,!..z,/GHH
"22#$45#$45",_"="<0",["9 3  	 U+++(INN)4):):)<)< 	# 	#%NI\11  """ $ N N9K9K9M9M N N NOD"P"P;;M;M;O;O"P"P"PQ
 .3363BB 	 	BGGIIII	 	s   A -A0)N)F)__name__
__module____qualname__r   r
   api_methodspropertyr   r"   classmethodr+   r8   rf   r{   r   r   r   r   r   r   r   r   r   staticmethodcmf_deferred_jobr   r   __classcell__)r/   s   @r   r
   r
      s       !/; ? ? ? K > > X>
 R R XR
 h h h h h [hP P P)- )- )- )- )-V/ / / / /& & &P
 
 
P P P      
 
 
0, , , ,"7 7 7r	s 	s 	s 	JJJT T KJ \T
 %%%) ) &% \) ) ) ) )r   r
   )rO   r   pathlibr   urllib.parser   cmf.includemodules.evagit.fieldsr   r   r   r   r
   r   r   r   <module>r2     s            ! ! ! ! ! !     1 1 1 1 1 1         



Q Q Q Q QO1 Q Q Q Q Qr   