[m XUddlmZmZddlmZddlmZddlmZddl m Z m Z ddl m Z ddlmZdd lmZmZdd lmZmZmZmZmZmZmZmZmZmZmZdd lm Z m!Z!er dd l"m#Z#dd l$m%Z%ee&e'e(fZ)eeede edfZ*dZ+ee(e(ge'fe,d<dZ-de)de)de'fdZ.dee)dee)e)ge'fddfdZ/Gdde0Z1Gdde ej2ej3ej4Z5e5e5j6e5j7<dS)) IterableList join_pathN) to_bin_sha)util) IndexObject IndexObjUnion)Blob) Submodule)tree_entries_from_datatree_to_stream) AnyCallableDictIterableIteratorListTupleTypeUnioncast TYPE_CHECKING)PathLikeLiteral)Repo)BytesIO)TreeN)r r c||k||kz SN)abs /srv/buildsys-work-dir/castor/build_node/builder-2/WGSG1/unpkd_srcs/cloudlinux-venv-1.0.6/venv/lib/python3.11/site-packages/git/objects/tree.pyr$4sq1uQ.?cmp) TreeModifierrt1t2returnc|d|d}}t|t|}}t||}t|d||d|}|r|S||z S)N)lenminr&)r(r)r!r"len_alen_bmin_lenmin_cmps r#git_cmpr39sm a5"Q%qAq663q665E%G!HWH+q'{++G 5=r%r!ct|dkrdSt|dz}|d|}||d}t||t||d}d}d}|t|kr{|t|krh|||||dkr||||<|dz}n||||<|dz}|dz}|t|kr|t|kh|t|kr(||||<|dz}|dz}|t|k(|t|kr*||||<|dz}|dz}|t|k(dSdS)Nr,rr)r- merge_sort)r!r&midlefthalf righthalfijks r#r5r5Fs 1vvzzt a&&A+C#wH#$$Ixy# A A A c(mm  C NN 2 2 3x{IaL ) )Q . .A;AaDAAAQs r#__init__zTreeModifier.__init__rs  r%namecZt|jD]\}}|d|kr|cSdS)z7:return: index of an item with name, or -1 if not foundr,) enumerater=)r@rBr9ts r#_index_by_namezTreeModifier._index_by_nameusAdk**  DAqtt||rr%c:t|jt|S)zCall this method once you are done modifying the tree information. It may be called several times, but be aware that each call will cause a sort operation :return self:)r5r=r3r@s r#set_donezTreeModifier.set_dones 4;((( r%Fshamodeforcecd|vrtd|dz tjvrtd|zt|}||}|||f}|dkr|j|nD|r ||j|<n7|j|}|d|ks |d|krtd|z|S) aAAdd the given item to the tree. If an item with the given name already exists, nothing will be done, but a ValueError will be raised if the sha and mode of the existing item do not match the one you add, unless force is True :param sha: The 20 or 40 byte sha of the item to add :param mode: int representing the stat compatible mode of the item :param force: If True, an item with your name and information will overwrite any existing item with the same name, no matter which information it has :return: self/z$Name must not contain '/' characters z(Invalid object type according to mode %orDrrz)Item %r existed with different properties) ValueErrorr_map_id_to_typerrGr=append)r@rKrLrBrMindexitemex_items r#addzTreeModifier.adds $;;CDD D BJt3 3 3G$NOO Ooo##D))T4  B;; K  t $ $ $ $ Y%) E""+e,1:$$ d(:(:$%PSW%WXXX r%binshact|tr*t|trt|tsJ|||f}|j|dS)zAdd the given item to the tree, its correctness is assumed, which puts the caller into responsibility to assure the input is correct. For more information on the parameters, see ``add`` :param binsha: 20 byte binary shaN) isinstancebytesintstrr=rS)r@rXrLrB tree_caches r# add_uncheckedzTreeModifier.add_uncheckedsb &%((\Zc-B-B\zRVX[G\G\\\\dD)  :&&&&&r%cP||}|dkr |j|=dSdS)z0Deletes an item with the given name if it existsrDN)rGr=)r@rBrTs r# __delitem__zTreeModifier.__delitem__s5##D)) 2:: E""" :r%)r*r')F)__name__ __module__ __qualname____doc__ __slots__r TreeCacheTuprAr]r\rGrJr[boolrWr_rar r%r#r'r'isXX Id<0T33""u"C"s"4"N""""H 'E ' 'C 'D ' ' ' '########r%r'cHeZdZUdZdZeded<dZdZdZ dZ dZ ee e e e e iZeeeefed <e d zd fd d dededeed fffd ZededeededffdZdedd ffd ZdeedeefdZdedefdZ dedefdZ!e"de#dfdZ$e"de#e fdZ%e"de&fd Z'd!d"d#d$d%d&d%fd'e(eee)fege*fd(e(eee)fege*fd)ed*e*d+e*d,ed-e*deeeee)fffd. Z+d/e,d0e,de-effd1 Z.d2ed3ede#efd4Z/deefd5Z0defd6Z1d7eeee2fdefd8Z3d7eeefde*fd9Z4deefd:Z5d?d=Z6d?d>Z7xZ8S)@rzTree objects represent an ordered list of Blobs and other Trees. ``Tree as a list``:: Access a specific blob using the tree['filename'] notation. You may as well access by index blob = tree[0] treetyper= rRrPNreporrXrLpathc^tt|||||dSr)superrrA)r@rprXrLrq __class__s r#rAz Tree.__init__s/ dD""4t<<<<QRRSS Srr%attrc|dkrL|jj|j}t ||_dStt| |dS)Nr=) rpodbstreamrXr readr=rsr _set_cache_)r@r{ostreamrts r#rzTree._set_cache_sf 8  im**4;77G.DW\\^^.T.TDKKK $   ) )$ / / / / /r%iterablec#K|D]f\}}}t|j|} |j|dz |j|||V@#t$r}t d||fz|d}~wwxYwdS)zwIterable yields tuples of (binsha, mode, name), which will be converted to the respective object representationrPz0Unknown mode %o found in tree data for path '%s'N)rrqrRrpKeyError TypeError)r@rrXrLrBrqes r#rxzTree._iter_convert_to_objects#+ j j FD$TY--D j6d*42:6ty&$PTUUUUUU j j j RVZ\`Ua abbhii j  j js#A A)A$$A)filec  d}d|vr|}|}|d}t|D]F\}}||}|jdkr|}|t|dz krt ||z|cS||krt ||z|S|jD]\}|d|krN|j|ddz |j|d|dt|j |dcS]t ||z)zFind the named object in this tree's contents :return: ``git.Blob`` or ``git.Tree`` or ``git.Submodule`` :raise KeyError: if given file or tree does not exist in treezBlob or Tree named %r not foundrOrjrr,rPr) splitrErkr-rr=rRrprrq) r@rmsgrjrUtokensr9tokeninfos r#joinz Tree.joins? 0 $;;DDZZ__F%f--  5E{9&&DDCKK!O++&sTz222KKKt||sTz***K   7d??>4/Q2 > 47DGYty$q'5R5R# 3:&& &r%c,||S)z For PY3 only)r)r@rs r# __truediv__zTree.__truediv__(syyr%cd|DS)z?:return: list(Tree, ...) list of trees directly below this treec(g|]}|jdk |S)rjrk.0r9s r# zTree.trees../$444a16V#3#3#3#3#3r%r rIs r#treesz Tree.trees,5444444r%cd|DS)z?:return: list(Blob, ...) list of blobs directly below this treec(g|]}|jdk |S)blobrrs r#rzTree.blobs..4rr%r rIs r#blobsz Tree.blobs1rr%c*t|jS)aM :return: An object allowing to modify the internal cache. This can be used to change the tree's contents. When done, make sure you call ``set_done`` on the tree modifier, or serialization behaviour will be incorrect. See the ``TreeModifier`` for more information on how to alter the cache)r'r=rIs r#r>z Tree.cache6sDK(((r%cdS)NTr r9ds r#r$z Tree.As`dr%cdS)NFr rs r#r$z Tree.Bs\ar%rDTFr predicateprunedepth branch_first visit_once ignore_selfas_edgec ttttttft t |||||||S)zFor documentation, see util.Traversable._traverse() Trees are set to visit_once = False to gain more performance in the traversal)rrrr TraversedTreeTuprsr _traverse) r@rrrrrrrrts r#traversez Tree.traverse?s^. (=)84D+EE F $   ' '      r%argskwargscDtt|j|i|S)z :return: IterableList with the results of the traversal as produced by traverse() Tree -> IterableList[Union['Submodule', 'Tree', 'Blob']] )rsr_list_traverse)r@rrrts r# list_traversezTree.list_traversebs' 0uT4  /@@@@r%r9r:c`t||j||Sr)listrxr=)r@r9r:s r# __getslice__zTree.__getslice__ls)D00QqS1ABBCCCr%c6||jSr)rxr=rIs r#__iter__z Tree.__iter__os++DK888r%c*t|jSr)r-r=rIs r#__len__z Tree.__len__rs4;r%rUc Vt|trY|j|}|j|ddz |j|d|dt |j|dSt|tr||Std|z)NrrPrr,zInvalid index type: %r) rZr\r=rRrprrqr]rr)r@rUrs r# __getitem__zTree.__getitem__us dC  s;t$D64'Q2 6ty$q'4PQ7T]^b^gimnoipTqTqrr r dC  #99T?? "047888r%ct|tr|jD]}|j|dkrdSn.|j}|jD]}|t ||dkrdS dS)NrTr,F)rZrr=rXrqr)r@rUrrqs r# __contains__zTree.__contains__s dK ( (    ;$q'))44* 9D   9T473333444ur%cPt||jSr)reversedrxr=rIs r# __reversed__zTree.__reversed__s 44T[AABBBr%r~rc:t|j|j|S)a Serialize this tree into the stream. Please note that we will assume our tree data to be in a sorted state. If this is not the case, serialization will not generate a correct tree representation as these are assumed to be sorted by algorithms)r r=writer@r~s r# _serializezTree._serializes t{FL111 r%cRt||_|Sr)r rr=rs r# _deserializezTree._deserializes,V[[]];;  r%)r~rr*r)9rbrcrdrerkr__annotations__rf commit_idblob_id symlink_idtree_idr r rRrr\rr r[rrrA classmethodrrzr]rrrgrrxrrpropertyrrrr'r>rrrhrrrrrrrslicerrrrr __classcell__)rts@r#rrs  #D'&/"""IIGJG 9D7OT#tM223rM&* ==== = HdN# ======# u[!59, -[00000000j0Fj8TaKbjjjj''''''D 5tF|555X55tDz555X5)|)))X)TeSdOaOa! ! ! U=2B#BCSI4OP! }.>>?EtKL!  !  !  ! ! !  x &1A(BB C! ! ! ! ! ! FA3A#A,}:UAAAAAADcDcDd=.ADDDD9(=19999      9c3o 6 9= 9 9 9 9}h'>!?D&Ch}5CCCCr%r)8git.utilrrgit.diffdiffgit_diffrrbaserr rr submodule.baser funr r typingrrrrrrrrrrr git.typesrrgit.reporiorr[r\r]rgrr&r__all__r3r5objectr'Diffable Traversable SerializablerrRrr r%r#rs-,,,,,,,,,,,,,,,,%%%%%%77777777                          ('''''''UC_% u\2M5IaCbbcd"@!?XsCj#o??? "  , 3     $|$ 8\<4PRU4U+V [_    FU#U#U#U#U#6U#U#U#t^^^^^;)4+;T=N^^^H&*T\"""r%