
    @i
;                         d dl Z d dlZd dlm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)datetime)urlparse)*)cmf_evagit_repo)RepoBadNamec                   0    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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))r5   r6   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_templaterA   rB   readme_contentfilerolerole_assignr0   s                 r   rg   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)rF   )r6   rJ   rK   r   rL   loggingwarningrenamer#   rd   listdeleter+   )r   rk   r/   rt   r0   s       r   r|   zCmfEvagitRepo.deleteW   s    223EtLyy!OOeDII;.CDEIIT../!55::T:J 	!K 	! w~t.v..r    c                 2   g }d| d}t        | j                        }||j                  vr|S |r|j                  d      s|S 	 |j                  j                  | d|       }t        j                  |t        j                        || }
|
D cg c]  }| | 
 }}| j                  ||      }|
D ]  }|j                  | | d       }|sdj                  |j                  d      j                  d      d d	       }|j!                  ||j                  d      rd
nd|d   |d   |d   |r|dz   n||j                  d      rdndd        |j#                  d        |S # t        $ r!}	t        d| d| d|	 d       Y d }	~	(d }	~	ww xY wc c}w )Nz	^(?!tree z:\S*)\s*(^.+?$)r@   :u5   При получении файлов по пути u     возникла ошибка: Tr<   folderrr   hash	timestampmessager      )rX   r&   
commit_sha	commit_atcommit_message
parent_dirorderc                     | d   | d   fS )Nr   rX    )xs    r   <lambda>z/CmfEvagitRepo.fetch_repo_tree.<locals>.<lambda>   s    '
AfI6 r    key)r   r   headsendswithgitshow	ExceptionrM   refindall	MULTILINE _get_files_last_commit_from_logsr*   joinstriprV   appendsort)r   ref	tree_pathcountskiprespatternrl   dataematchesobjpathscommitslast_commitr   s                   r   r   zCmfEvagitRepo.fetch_repo_treed   s   se?3DIIdjj JY//4J	P88==C5)!56D **WdBLL9$uE078I;se$8877UC 	C!++C5&94@K)//#"6"<"<S"A#2"FGJJJ(+S(9Hv"-f"5!,[!9&1)&<6@*s"2j"%,,s"3Q
	" 	67
5  	PMcURST]S^^~  @A  B  C  KO  P  P	P
 9s    E' F'	F0FFc                 6   t        | j                        }|D cg c]  }|j                  d      s| }}|D cg c]  }|j                  d      r| }} |j                  j                  ddd| dg| }i }d }	|j                         D ]  }
|
j                  d      r@|
dd  j                  d      }|d	   t        j                  t        |d
               |d   d}	T|
j                         se|	sh|
j                         }||vs}|	||<    |D ci c]  }||j                  |       }}|D ]N  }|j                         D cg c]  \  }}|j                  |      r| }}}|rt        |d       ||<   Jd ||<   P |S c c}w c c}w c c}w c c}}w )Nr@   z --pretty=format:COMMIT:%H|%at|%sz--name-onlyz--diff-filter=dz--zCOMMIT:   |r   r      )r   r   r   c                     | d   S )Nr   r   )cs    r   r   z@CmfEvagitRepo._get_files_last_commit_from_logs.<locals>.<lambda>   s
    Q{^ r    r   )r   r   r   r   log
splitlines
startswithrV   r   fromtimestampintr   r*   itemsmax)r   r   r   rl   pfoldersfilesrawfile_commitscurrent_commitlinepartsfnamer   r   r   ra   folder_file_commitss                     r   r   z.CmfEvagitRepo._get_files_last_commit_from_logs   s   DII#7qzz#177!9qC99dhhll.e
 
 NN$ 	9Dy)QRs+!!H!)!7!7E!H!F$Qx"
 .

,*8L'	9 055!q,""1%%55 		#F+7+=+=+?#'4??6* # #
 #!"5;STF"F		# 
S 896 6#s!   FFF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<   rk   )r   r   branchesrM   r   create_headra   schedule_deferred_jobr6   r   	sync_repoidrX   )r   base_branch_namenew_branch_namerl   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   r6   r   r   r   )r   branch_namerl   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)rX   r   r   r   )
r   r   r   ra   r   rX   hexshacommitted_datetimer   r   )r   rl   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)rev	max_countr   author
insertions	deletionsr   )
r   r   r   commit_authorcommit_author_emailauthored_dateparents	additionsr   total)r   r   iter_commitsr   r   r   r   r   r   rX   emailr   r   statsr   )	r   r   r   r   r   rl   r   ra   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   ra   r	   r   r   r   r   rX   summaryr   r   r   r   r   rV   r   )r   sharl   ra   parent_commit_shar8   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   r{   r   r   r   r   r   r   r   rX   )r   source_branchtarget_branchinclude_sourcerl   cmdunmerged_commitsra   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   ra   r	   r   r   keystreedata_streamreaddecoder   r   difflibunified_diffrU   r   r   new_fileb_pathdeleted_filea_pathrenamed_file)r   
source_sha
target_sharl   diffssource_committarget_commitr   rr   	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   )rX   contentuM   Содержимое файла невозможно декодироватьTr<   )
r   r   ra   r   r  r  r  rX   UnicodeDecodeErrorrM   )r   r   r   rl   ra   	file_blobfile_contents          r   r   z CmfEvagitRepo.fetch_file_contentW  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   )r6   r   r{   r   r   r   )rk   r/   reposrl   s       r   
sync_reposzCmfEvagitRepo.sync_reposb  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   fieldsrX   rw   z not found on file system)r8   r  )r8   rX   r   )r8   r   r   r   r   r   )r8   rX   textr   r   commited_dateF)auditOR	branch_toINbranch_from)filter)r6   r   r*   r   r   excNoSuchPathError
ValueErrorr   CmfEvagitBranchr{   rX   r   CmfEvagitCommitr   rg   ra   r|   valuesr   CmfEvagitMergeRequestsync)obj_idrl   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_repoi  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)r   r   )NNN)F)__name__
__module____qualname__r   r   api_methodspropertyr   r#   classmethodr,   r9   rg   r|   r   r   r   r   r   r   r   r   r   r   staticmethodcmf_deferred_jobr  r   __classcell__)r0   s   @r   r   r      s    !//;; ? K > >
 R R
 h hP)-V/(T,\
P *
0,"7r	s 	JT K T
 %) & )r    r   )rP   r  pathlibr   r   urllib.parser   cmf.includemodules.evagit.fieldsr   r   r   r	   r   r   r    r   <module>rF     s4        !  1  
GO11 Gr    