
     h5                         d dl Z d dlZd dlmZ d dlmZ d dl d dlmZ d dl	m
Z
mZ d dl	Z	 G d dej                        Zy)	    N)Path)urlparse)*)cmf_evagit_repo)RepoBadNamec                   (    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                   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   s=    xx""HHMMOv~~&gdhhZt<==    c                     | j                   j                  s| j                   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   sE    xx""HHMMOv~~&gdhhZ}TYYKPQQr   c                 f    |xs i }|j                  dg       g dg|d<   t        |   |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    sF    '-2)7););M2)NPo(p}%w)*=gng`fggr   c                 j    | j                   r't        j                  j                  dd      | _        y y )Napp_gitT)sys_typesystem)is_newmodels	CmfFolderr)   parentr   s    r   _calc_parentzCmfEvagitRepo._calc_parent'   s+    ;; **..	$.ODK r   c           	      r   | j                   rt        j                  j                  d|        | j                  j                         rt        d| j                   dd       t        j                  | j                  dd      }| j                  r;t        j                         5 }| d}|j                  |      }| j                  j                  d      }t        | j                         j#                  d	      ^ }}}	|j%                  ||	| j&                  j(                  t+        t,        j.                        j0                  
      }
t3        |d      5 }|j5                  |
       d d d        |j6                  j9                  |g       |j6                  j;                  d       |j=                         j?                          d d d        t        j                  jA                  d      }t        jC                  | tD        jF                  |      }|jI                          | j                   s,| jJ                  r t        j                  j                  d|        | jL                  jJ                  rt        jB                  jO                  |        tQ        |   |i |S # 1 sw Y   9xY w# 1 sw Y   xY w)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yy!CDII;Njkswx99TYYd>D%%002 0g%,IZ"8K"&**W"5K&*oo&B&B;&OO36txx=3F3Fs3K0T:y%4%;%;#-%)YY__'JZJZA[AbAb &< &N k3/ 34

>23  %%));-8%%,,-=>&&(--/0" ''++1G+HD 44~~ 5 K
 {{t  667GN&&&&>>tDw|T,V,,+3 30 0s&   'B0J-J )AJ- J*	%J--J6c                    t         j                  j                  d|        | j                  j	                         s$t
        j                  d| j                   d       n%| j                  j                  | j                         t         j                  j                  |       D ]  }|j                           t        | ,  |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yy!OOeDII;.CDEIIT../!55::T:J 	!K 	! w~t.v..r   c                 D   g }d| d}t        | j                        }||j                  vr|S |r|j                  d      s|S 	 |j                  j                  | d|       }t        j                  |t        j                        }|D ]  }	t        |j                  |d	| |	 
            }
|
s|c S |
d   }dj                  |j                  d      j                  d      d d       }|j!                  |	|	j                  d      rdnd|j"                  |j$                  |j&                  j                         |r|dz   n||	j                  d      rdnd	d        |j)                  d        |S # t        $ r!}t        d| d| d| d       Y d }~6d }~ww xY w)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   s   se?3DIIdjj JY//4J	P88==C5)!56D **WdBLL9 	C4,,I;WZV[I\,]^G
!!*K)//#"6"<"<S"A#2"FGJJJ(+S(9Hv"-"4"4!,!?!?&1&9&9&?&?&A6@*s"2j"%,,s"3Q
	& 	67
1  	PMcURST]S^^~  @A  B  C  KO  P  P	Ps    E5 5	F>FFc                 8   t        | j                        }||j                  vrt        d| dd       |j                  |   }|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    DII4==0$4#55IJRVWjj!12%%o{7I7IJ
f22<<DGG;Or   c                     t        | j                        }||j                  v r|j                  j	                  d|       t        t        j                  j                  | j                  g       y )Nz-Dr   )
r   r   r   r   branchr   r5   r
   r   r   )r   branch_namerk   s      r   r   zCmfEvagitRepo.delete_branch   sI    DII$--'HHOOD+.f22<<DGG;Or   c                    t        | j                        }g }|j                  D ]Z  }|j                  }|j	                  |j
                  |j                  |j                  |j                  j                         d       \ |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   ss    DIImm 		F --KJJ"KK"-"4"4!,!?!?&1&9&9&?&?&A			 
r   c                 4   t        | j                        }g }|j                  ||||      D ]  }|j                  |j                  |j
                  |j                  j                         |j                  j                  |j                  j                  |j                  |j                  D cg c]  }|j                   c}|j                  j                  d   |j                  j                  d   |j                  j                  d   d
        |S c c}w )N)r   r   skipauthor
insertions	deletionsfiles)
r   r   r   commit_authorcommit_author_emailauthored_dateparents	additionsr   total)r   r   r   r   r   r   r   r   r   rW   emailr   r   statsr   )	r   r   countr   r   rk   r   r`   parent_commits	            r   r   zCmfEvagitRepo.fetch_commits   s    DII''C5tTZ'[ 	FJJ"(--!'!:!:&,nn&:&:&<%+]]%7%7+1==+>+>%+%9%9JP..Y 4 4Y!'!3!3L!A!'!3!3K!@#\\//8	 
  Zs   -Dc                    t        | j                        }	 |j                  |      }|j                  r|j                  d   j
                  }nd }|j
                  |j                  |j                  j                  |j                  |j                  j                         |j                  D cg c]  }|j
                   c}|j                  j                  d|      j                         D cg c]  }|j                         d    c}| j!                  |j
                  |      dS # t        $ r i cY S w xY wc c}w c c}w )Nr   z
--containsr   )r   r   r   commit_summaryr   commit_parentscommit_related_branchescommit_diffs)r   r   r`   r   r   r   r   r   rW   summaryr   r   r   r   
splitlinesrU   r   )r   shark   r`   parent_commit_shar7   r   s          r   r   zCmfEvagitRepo.fetch_commit   s   DII	[[%F >> &q 1 8 8 $ !--22#]]//$nn$nn224;A>>Jv}}JIMYegjIkIvIvIx'yvr(:'y 226==BST	
 		
  	I	 K'ys   D( -D9.D>(D65D6c           	      ~   t        | j                        }||j                  vs||j                  vrg S |rdnd}t        |j	                  | | |             }|D cg c]T  }|j
                  |j                  |j                  |j                  j                         |j                  j                  dV c}S c c}w )Nz...z..)r   r   r   r   r   )r   r   r   rz   r   r   r   r   r   r   r   rW   )r   source_branchtarget_branchinclude_sourcerk   cmdunmerged_commitsr`   s           r   r   z$CmfEvagitRepo.fetch_unmerged_commits   s    DII-dmm1SI%e4 1 1]OC52X YZ +,  #)--!'!:!:&,nn&,nn&:&:&<%+]]%7%7, 	, ,s   AB:c                 v   t        | j                        }g }	 |j                  |      }|d }n	 |j                  |      }j                  j
                  j                         D ]  }|j                  |   j                  j                         j                  d      }|j                  |ddj                  t        j                  t               |j!                  d      ||            d        |S |j#                  d      D ]  }	|	j$                  r,|	j&                  }d}
d	|	j&                   d
|	j&                   d}n|	j(                  r,|	j*                  }d}
d	|	j*                   d
|	j*                   d}nc|	j,                  r,|	j*                  }d}
d	|	j*                   d
|	j&                   d}n+|	j*                  }d}
d	|	j*                   d
|	j&                   d}|j                  ||
||	j"                  j                  d      z   d       
 |S # t        $ r g }Y w xY w# t        $ r g }Y w xY w)Nutf-8A T)keepends)fromfiletofile)filenamechange_typediff)create_patchz--- z
+++ 
DRM)r   r   r`   r   r   r   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   sU   DII	 KK
3M
  M $J 7  )//55::< $))(3??DDFMMgV$,'* "(<(<SUDOO]aODbmu  G  )H  !I L&++M+M 	I!!$++!	 0 01	8H8H7IL''$++!	 0 01	8H8H7IL''$++!	 0 01	8H8H7IL$++!	 0 01	8H8H7ILLL (#."Y^^%:%:7%CC%	2 c  	E	  s"   H H) H&%H&)H87H8c                    t        | j                        }|j                  |      }|j                  |   }	 |j                  j                         j                  d      }|j                  |dS # t        $ r t        dd       Y y 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|    DIIS!KK%		s$00557>>wGL%NN|DD! 	semqr	ss   7A/ /BBTz@hourly)	only_once
system_jobschedulec                      t         j                  j                         }|D ]2  }t        t         j                  j                  |j
                  g       4 y )Nr   )r5   r
   rz   r   r   r   )rj   r.   reposrk   s       r   
sync_reposzCmfEvagitRepo.sync_repos1  sE     $$))+ 	TD!&"6"6"@"@{S	Tr   )r   c           
         t         j                  j                  | dg      }	 |j                         D ci c]  }|d   |
 }}t         j                  j                  |dg      D ci c]  }|j                  | }}|j                         D ]  \  }}|j                  |      }|st         j                  ||      }t         j                  j                  ||d   	      }|sP|j                  |d         }	t         j                  ||	d
   |	d   |	d   |	d   |	d         }|j                  d       ||_        |j                           |j                         D ]  \  }
}|
|vs|j#                           ddd|j%                         D cg c]  }|j&                   c}gdd|j%                         D cg c]  }|j&                   c}gg}t         j(                  j                  |      D ]  }|j+                           y c c}w # t        j
                  j                  $ r t        d|j                   d      w xY wc c}w c c}w c c}w )Nr   )r   fieldsrW   rv   z not found on file system)r7   r  )r7   rW   r   )r7   r   r   r   r   r   )r7   rW   textr   r   commited_dateF)auditOR	branch_toINbranch_from)filter)r5   r
   r)   r   r   excNoSuchPathError
ValueErrorr   CmfEvagitBranchrz   rW   itemsCmfEvagitCommitr   rf   r`   r{   valuesr   CmfEvagitMergeRequestsync)obj_idrk   r   git_branchesdb_branchesgit_branch_name
git_branch	db_branch	db_commit
git_commitdb_branch_namer  mrs                r   r   zCmfEvagitRepo.sync_repo8  s_    ##''63%'@	KAEATATAVWvF6NF2WLW :@9O9O9T9T\`jpiq9T9rsvv{{F*ss+7+=+=+? 	'OZ#8I"22$_2U	..22$J|D\2]I!..z,/GH
"22#$45#$45",_"="<0",["9 3 	 U+(INN'	* *5):):)< 	#%NI\1  "	#
 $9K9K9M Nv NOD;;M;M;O"P699"PQ
 ..3363B 	BGGI	I Xww&& 	KuTYYK/HIJJ	K t: !O"Ps.   H HH )II
:IH 7I)N)NNN)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 > >
 R R
 h hP)-V/&P
P *
0,"7r	s 	JT K T
 %) & )r   r
   )rO   r   pathlibr   urllib.parser   cmf.includemodules.evagit.fieldsr   r   r   r   r
   r   r   r   <module>r-     s1       !  1  
WO11 Wr   