&4)?TddlmZddlmZddlZddlmZmZmZm Z m Z m Z m Z ddl Z ddlmZmZddlmZmZmZmZmZmZddlmZmZddlmZmZmZdd lm Z m!Z!dd l"m#Z#dd l$m%Z%ddl&m'Z(d d l)m*Z*m+Z+m,Z,m-Z-d dl.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:ddl;mZ>ddl?m@Z@ddlAmBZBeezZCe,ZDdZEdeFdesplitext)paths r@_has_file_extensionrEOs <  a  rAindexr.argsc t||jj}tj|tjsdStj}tt|j |d<d|d<|g} trQt|sBt||jj}d|g}t#j|t'|z|t"jt"j|jjt*t,}g}g}t/||j|jt2d|} d|} |jdkrAt9| t:} t9| t:} t=||j| | dS#t>$r} t=|| | d} ~ wwxYw) zRun the commit hook of the given name. Silently ignores hooks that do not exist. :param name: name of hook, like 'pre-commit' :param index: IndexFile instance :param args: arguments passed to hook file :raises HookExecutionError:NGIT_INDEX_FILE: GIT_EDITORzbash.exe)envstdoutstderrcwd close_fds creationflagsr) r8repor:osaccessX_OKenvironcopyrstrrDrrEr relative_to working_diras_posix subprocessPopenlistPIPErr r appendrr? returncoderrr Exception) r9rFrGhprLcmd relative_hp stdout_list stderr_listrMrNexs r@r7r7Ss 4+ , ,B 9R ! !t *//  C'EJ88CC  $CI  ,-b11 ,r((..uz/EFFOOQQK{+C $t** ?? &,   "$ !# c;#5{7IK[\\\%%%% >Q  //F//F$RHH H   111 R((b01sB+G G/G**G/modect|rtSt|st|tkrtSt |t zrdpdzS)zYConvert the given mode from a stat call to the corresponding index mode and return itii)rrrr r6r r )rjs r@r5r5sTt}}t}}t 33 dWn.7% 88rAentriesrstreamextension_data ShaStreamClscB||}|j}|j}d}|d|td|t||D]"}|} ||j||jt |j} t| t} t| tz} | t| ksJd|jz| |j tzz} |td|j |j|j|j|j|j|j| || || z dzdz}|d | |z|z z$||||d S) aWrite the cache represented by entries to a stream :param entries: **sorted** list of entries :param stream: stream to wrap into the AdapterStreamCls - it is used for final output. :param ShaStreamCls: Type to use when writing to the stream. It produces a sha while writing to it, before the data is passed on to the wrapped stream :param extension_data: any kind of data to write as a trailer, it must begin a 4 byte identifier, followed by its size ( 4 bytes )DIRC>LL)encodingz"Path %s too long to fit into index >LLLLLL20sHN)tellwriter"len ctime_bytes mtime_bytesrYrDrrr flagsCE_NAMEMASK_INVdevinoderjuidgidsizebinsha write_sha)rlrmrnro stream_sharyrzversionentry beginoffsetpath_strrDplenr~ real_sizes r@r1r1s$f%%J ?D  EG E'NNN E$ugs7|| , ,---<<dff  e    e   uz??!(V<<<4yy;&s4yy   "F"S    o56             d TVVk)A-3  e i/44669:;;;;!(((rAc  |d}|dkrtd|zttttft d|d}|\}}|dvsJ||fS)z=Return tuple(version_long, num_entries) from the given streamrrzInvalid index file header: %rrsrvrrq)readAssertionErrorr,r)intr#)rmtype_idunpackedr num_entriess r@ read_headerrskk!nnG'8srvru.rwrzNIndex Footer was not at least a sha on content as it was only %i bytes in sizeiN) rrryr#r decoderrrr{)rmrrcountrlrryrctimemtimerinorjrrrshar~ path_sizerDrrrn content_shas r@r2r2s'v..G[ E8:G ;D ;D +  dff udd1gg&&q)udd1gg&&q)7=mTTR`MaMa7b7b4c4c4eK' tI%%f--TVVk)A-3  kI% /000D#udE5#sCQTVZ[\\',u{#$   +  ,[[__N Nb   WZ]^lZmZmm !  !&K$DSD)N Wnk ::rAodbr/slsir0c g}|j}|j}||kr&||}|jdkrt||dz }|jd|}|dkr0||j|j|j|dfn|j||} |} | |krH|| } | jd|} | dks| j|| | krn | dz } | |kHt||t|dz | |dz\} }|| t| f| }||k&t}t||j|d|t#t$t'||}|j|fS)aCreate a tree from the given sorted list of entries and put the respective trees into the given object database :param entries: **sorted** list of IndexEntries :param odb: object database to store the trees in :param si: start index at which we should start creating subtrees :param sl: slice indicating the range we should process on the entries list :return: tuple(binsha, list(tree_entry, ...)) a tuple of a sha and a list of tree entries being a tuple of hexsha, mode, namerr/rN)startstoprrrDfindrarrjr3slicerrrrzseekstorerrr{getvalue)rlrrr tree_itemsciendrrboundbasexioentryorboundr_tree_entry_listsioistreams r@r3r3s(*J B 'C s((  ;!  &u-- - ab)) R<<   u|UZBCCI J J J J:bi(DBs((  +**333b==FK7 $;t$C$Ca s((%:'3bSTfVXHYHY[ade[e$f$f !C!   sGT2 3 3 3B; s((D ))C:sy)))HHQKKKii s3<<>>/B/BCHHIIG NJ ''rA tree_entryrc\t|d|d|tz|dfS)Nrrrq)rr!)rrs r@_tree_entry_to_baseindexentryrXs- :a=*Q--9OQ[\]Q^_ ` ``rA tree_shascVg}t|dvr?t||ddD]%}|t|d&|St|dkrt dt|zt ||dD]\}}}|&||D|d|dkr$|d|dkr|d|dks6|d|dkr|d|dkr||d|dkrj|t|d|t|d |t|d|d|dks|d|dkr%|t|d/|t|dT|d|dks|d|dkrF|t|d|t|d ||d|dks|d|dkrF|t|d|t|d0|)|J|t|d[|%|t|d|d|dks|d|dkrH|t|d |t|d|t|d|S) a :return: list of BaseIndexEntries representing the aggressive merge of the given trees. All valid entries are on stage 0, whereas the conflicting ones are left on stage 1, 2 or 3, whereas stage 1 corresponds to the common ancestor tree, 2 to our tree and 3 to 'their' tree. :param tree_shas: 1, 2 or 3 trees as identified by their binary 20 byte shas If 1 or two, the entries will effectively correspond to the last given tree If 3 are given, a 3 way merge is performedrrrRrzCannot handle %i trees at onceNrrq)r{rrar ValueErrorr)rroutrrourstheirss r@aggressive_tree_merger\s!#C 9~~,S)B-DD @ @E JJ4UA>> ? ? ? ?  9~~9C NNJKKK7sIrJJBGBGdF  %Q47**tAw&)/C/CQSYZ[S\H\H\Q47**tAw&)/C/CQSYZ[S\H\H\ #@q#I#IJJJ #@q#I#IJJJ #@#K#KLLLLaDG++tAw$q'/A/A #@q#I#IJJJJ #@#K#KLLLLAw$q'))T!WQ-?-? #@q#I#IJJJ #@q#I#IJJJ>ayDG++vayDG/C/C #@q#I#IJJJ #@#K#KLLL|))) 8CCDDDD 8qAABBBB7fQi''47fQi+?+?JJtyprrr r!utilr"r#typingr$r%r&r'r(r)r*r+r, git.typesr-rr.git.dbr/git.objects.treer0r6r__all__rYr8rEr7rr5bytesr1rr4r2rr3rrrAr@rs  =========<<<<<<< ;:::::::######GGGGGGGGGGGGUTTTTTTTTTTTTTTTTTTTTT.%%%%%%------ , ,C,(,s,,,, !!!*I#*Ik*I#*I$*I*I*I*I\9#9#9999*..A == eNL89 := uI=$+&=*+ =  ====@  5  eCHo     eNHc9:uXs]?S$1; uI1; 3U8S=)<78% FG1;1;1;1;jLM7(7( * 7($47(:?7(EH7( 5$~& &'7(7(7(7(tanaSa^aaaa`/`HUO`PTUcPd``````rA