Ë
    ùmxiÖB  ã                   óþ  — d Z g d¢ZddlmZ ddlZddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlZddlZddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> e8rddl?m@Z@ ddlAmBZB ddlCmDZD eez  ZE	 e. ZFdeGde>deGfd„ZHdeGdeGfd„ZIdeGdddeGddfd„ZJd eKdeKfd!„ZLde(fd"e7e;e,d#f      d$e5eM   d%e;deMf   d&e:e(   ddf
d'„ZNd$e5eM   de9eKeKf   fd(„ZOd)e;e,e>eKf   de9e>eKf   fd*„ZPd$e5eM   de9eKe4e9e>eKf   d#f   eMeMf   fd+„ZQ	 d7d"e6e-   d,d-d.eRd/eKde9eMe6d0   f   f
d1„ZSd2d0d3eKde,fd4„ZTd,d-d5e7eM   de6e,   fd6„ZUy)8zVStandalone functions to accompany the index implementation and make it more
versatile.)Úwrite_cacheÚ
read_cacheÚwrite_tree_from_cacheÚ	entry_keyÚstat_mode_to_index_modeÚS_IFGITLINKÚrun_commit_hookÚ	hook_pathé    )ÚBytesION)ÚPath)ÚS_IFDIRÚS_IFLNKÚS_IFMTÚS_IFREGÚS_ISDIRÚS_ISLNKÚS_IXUSR)ÚIStream)Ústr_tree_type)Úhandle_process_outputÚsafer_popen)ÚdefencÚforce_bytesÚ
force_textÚsafe_decode)ÚHookExecutionErrorÚUnmergedEntriesError)Útraverse_tree_recursiveÚtraverse_trees_recursiveÚtree_to_stream)ÚIndexFileSHA1WriterÚfinalize_processé   )ÚCE_EXTENDEDÚBaseIndexEntryÚ
IndexEntryÚCE_NAMEMASKÚCE_STAGESHIFT)ÚpackÚunpack)	ÚDictÚIOÚListÚSequenceÚTYPE_CHECKINGÚTupleÚTypeÚUnionÚcast)ÚPathLike)ÚGitCmdObjectDB)ÚTreeCacheTup)Ú	IndexFileÚnameÚgit_dirÚreturnc                 ó0   — t        j                  |d| «      S )zK:return: path to the given named hook in the given git repository directoryÚhooks)ÚospÚjoin)r8   r9   s     úD/home/htdocs/ttos/venv/lib/python3.12/site-packages/git/index/fun.pyr	   r	   >   s   € ä�8‰8�G˜W dÓ+Ð+ó    Úpathc                 ó2   — t        j                  | «      d   S )Nr#   )r=   Úsplitext)rA   s    r?   Ú_has_file_extensionrD   C   s   € Ü�<‰<˜Ó˜aÑ Ð r@   Úindexr7   Úargsc                 óè  — t        | |j                  j                  «      }t        j                  |t        j
                  «      syt        j                  j                  «       }t        t        j                  |j                  «      «      |d<   d|d<   |g}	 t        j                  dk(  rKt        |«      s@t        |«      j                  |j                  j                   «      j#                  «       }d|g}t%        |t'        |«      z   |t(        j*                  t(        j*                  |j                  j                   ¬«      }g }g }	t-        ||j.                  |	j.                  t0        «       dj3                  |«      }
dj3                  |	«      }|j4                  d	k7  r8t7        |
t8        «      }
t7        |t8        «      }t;        ||j4                  ||
«      ‚y# t<        $ r}t;        ||«      |‚d}~ww xY w)
a:  Run the commit hook of the given name. Silently ignore hooks that do not exist.

    :param name:
        Name of hook, like ``pre-commit``.

    :param index:
        :class:`~git.index.base.IndexFile` instance.

    :param args:
        Arguments passed to hook file.

    :raise git.exc.HookExecutionError:
    NÚGIT_INDEX_FILEú:Ú
GIT_EDITORÚwin32zbash.exe)ÚenvÚstdoutÚstderrÚcwdÚ r
   )r	   Úrepor9   ÚosÚaccessÚX_OKÚenvironÚcopyr   ÚfspathrA   ÚsysÚplatformrD   r   Úrelative_toÚworking_dirÚas_posixr   ÚlistÚ
subprocessÚPIPEr   Úappendr"   r>   Ú
returncoder   r   r   Ú	Exception)r8   rE   rF   ÚhprL   ÚcmdÚrelative_hpÚprocessÚstdout_listÚstderr_listrM   rN   Úexs                r?   r   r   G   s”  € ô 
�4˜Ÿ™×+Ñ+Ó	,€BÜ�9‰9�RœŸ™Ô!Øä
�*‰*�/‰/Ó
€CÜ'¬¯	©	°%·*±*Ó(=Ó>€CÐÑØ€CˆÑØˆ$€CðMÜ�<‰<˜7Ò"Ô+>¸rÔ+Bô ˜r›(×.Ñ.¨u¯z©z×/EÑ/EÓF×OÑOÓQˆKØ˜{Ð+ˆCäØ”$�t“*ÑØÜ—?‘?Ü—?‘?Ø—
‘
×&Ñ&ô
ˆð "$ˆØ!#ˆÜ˜g {×'9Ñ'9¸;×;MÑ;MÔO_Ô`Ø—‘˜Ó%ˆØ—‘˜Ó%ˆØ×Ñ Ò"Ü ¬Ó/ˆFÜ ¬Ó/ˆFÜ$ R¨×);Ñ);¸VÀVÓLÐLð #øô ò 1Ü   RÓ(¨bÐ0ûð1ús   ÂB*G Ç	G1ÇG,Ç,G1Úmodec                 óš   — t        | «      rt        S t        | «      st        | «      t        k(  rt        S t
        | t        z  xr dxs dz  S )zZConvert the given mode from a stat call to the corresponding index mode and
    return it.ií  i¤  )r   r   r   r   r   r   r   )rj   s    r?   r   r   z   sA   € ô ˆt„}ÜˆÜˆt„}œ˜t›¬Ò3ÜÐÜ�dœW‘nÒ.¨Ò7°%Ñ8Ð8r@   Úentriesr&   ÚstreamÚextension_dataÚShaStreamClsc                 óÚ  —  ||«      }|j                   }|j                  }t        d„ | D «       «      rdnd} |d«        |t        d|t	        | «      «      «       | D �]h  } |«       }	 ||j
                  «        ||j                  «       t        |j                  «      }
t        |
t        ¬«      }t	        |«      t        z  }|t	        |«      k(  sJ d|j                  z  «       ‚||j                  t        z  z  }|j                  r	|t        z  } |t        d|j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j,                  |«	      «       |j                  r |t        d	|j                  «      «        ||«        |«       |	z
  d
z   dz  } |d|	|z    |«       z
  z  «       �Œk |�|j                  |«       |j/                  «        y)a  Write 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).
    c              3   ó4   K  — | ]  }|j                   –— Œ y ­w)N)Úextended_flags)Ú.0Úentrys     r?   ú	<genexpr>zwrite_cache.<locals>.<genexpr>¡   s   è ø€ ÒA°�u×+Õ+ÑAùs   ‚é   é   ó   DIRCú>LL)Úencodingz"Path %s too long to fit into indexú>LLLLLL20sHú>Hé   éøÿÿÿó    N)ÚtellÚwriteÚanyr)   ÚlenÚctime_bytesÚmtime_bytesÚstrrA   r   r   r'   ÚflagsÚCE_NAMEMASK_INVrr   r$   ÚdevÚinoderj   ÚuidÚgidÚsizeÚbinshaÚ	write_sha)rl   rm   rn   ro   Ú
stream_shar€   r�   Úversionrt   ÚbeginoffsetÚpath_strrA   Úplenr‡   Ú	real_sizes                  r?   r   r   „   s¸  € ñ. ˜fÓ%€Jà�?‰?€DØ×Ñ€Eô ÑA¸ÔAÔA‰aÀq€GÙ	ˆ'„NÙ	Œ$ˆu�gœs 7›|Ó
,Ô-ð ó <ˆÙ“fˆÙˆe×ÑÔ Ùˆe×ÑÔ Ü�u—z‘z“?ˆÜ! (´VÔ<ˆÜ�4‹yœ;Ñ&ˆØ”s˜4“yÒ ÐSÐ"FÈÏÉÑ"SÓSÐ Ø˜Ÿ™¤oÑ5Ñ6ˆØ×ÒØ”[Ñ ˆEÙÜØØ—	‘	Ø—‘Ø—
‘
Ø—	‘	Ø—	‘	Ø—
‘
Ø—‘Øó
ô	
ð ×ÒÙ”$�t˜U×1Ñ1Ó2Ô3ÙˆdŒÙ“V˜kÑ)¨AÑ-°Ñ3ˆ	Ùˆe˜ iÑ/±4³6Ñ9Ñ:Ö;ð9<ð@ Ð!Ø×Ñ˜Ô(ð ×ÑÕr@   c           	      óä   — | j                  d«      }|dk7  rt        d|z  «      ‚t        t        t        t        f   t        d| j                  d«      «      «      }|\  }}|dv s
J d|z  «       ‚||fS )z>Return tuple(version_long, num_entries) from the given stream.é   rx   zInvalid index file header: %rry   r}   )r#   rw   rv   z@Unsupported git index version %i, only 1, 2, and 3 are supported)ÚreadÚAssertionErrorr3   r0   Úintr*   )rm   Útype_idÚunpackedr‘   Únum_entriess        r?   Úread_headerrž   Í   s{   € à�k‰k˜!‹n€GØ�'ÒÜÐ<¸wÑFÓGÐGÜ”Eœ#œs˜(‘O¤V¨E°6·;±;¸uÓ3EÓ%FÓG€HØ#Ñ€Gˆ[à�iÑÐmÐ!cÐfmÑ!mÓmÐØ�KÐÐr@   rt   c                  óº   — t        | «      dk(  r/| d   }t        |t        «      sJ ‚|j                  |j                  fS t        t        t        t        f   | «      } | S )zá
    :return:
        Key suitable to be used for the
        :attr:`index.entries <git.index.base.IndexFile.entries>` dictionary.

    :param entry:
        One instance of type BaseIndexEntry or the path and the stage.
    r#   r
   )	rƒ   Ú
isinstancer%   rA   Ústager3   r0   r4   rš   )rt   Úentry_firsts     r?   r   r   Ù   s[   € ô ˆ5ƒz�Q‚Ø˜A‘hˆÜ˜+¤~Ô6Ð6Ð6Ø× Ñ  +×"3Ñ"3Ð4Ð4ô ”Uœ8¤S˜=Ñ)¨5Ó1ˆØˆr@   c                 ó°  — t        | «      \  }}d}i }| j                  }| j                  }||k  ræ |«       }t        d |d«      «      d   }t        d |d«      «      d   }	t        d |d«      «      \  }
}}}}}}}d}|t        z  rt        d |d«      «      d   }|t
        z  } ||«      j                  t        «      } |«       |z
  dz   dz  } |||z    |«       z
  «       t        ||||||	|
|||||f«      }||||j                  f<   |d	z  }||k  rŒæ| j                  d
«      }t        |«      dkD  sJ dt        |«      z  «       ‚|dd }|dd }||||fS )a·  Read a cache file from the given stream.

    :return:
        tuple(version, entries_dict, extension_data, content_sha)

        * *version* is the integer version number.
        * *entries_dict* is a dictionary which maps IndexEntry instances to a path at a
          stage.
        * *extension_data* is ``""`` or 4 bytes of type + 4 bytes of size + size bytes.
        * *content_sha* is a 20 byte sha on all cache file contents.
    r
   z>8sr}   r{   é.   r|   rw   r~   r#   éÿÿÿÿé   zNIndex Footer was not at least a sha on content as it was only %i bytes in sizeiìÿÿÿN)rž   r˜   r€   r*   r$   r'   Údecoder   r&   r¡   rƒ   )rm   r‘   r�   Úcountrl   r˜   r€   r’   ÚctimeÚmtimer‰   Úinorj   r‹   rŒ   r�   Úshar‡   rr   Ú	path_sizerA   r•   rt   rn   Úcontent_shas                            r?   r   r   ñ   s¤  € ô ' vÓ.Ñ€Gˆ[Ø€EØ8:€Gà�;‰;€DØ�;‰;€DØ
�+Ò
Ù“fˆÜ�u™d 1›gÓ& qÑ)ˆÜ�u™d 1›gÓ& qÑ)ˆÜ7=¸mÉTÐR`ÓMaÓ7bÑ4ˆˆc�4˜˜c 4¨¨eØˆØ”;ÒÜ# D©$¨q«'Ó2°1Ñ5ˆNØœKÑ'ˆ	Ù�I‹×%Ñ%¤fÓ-ˆá“V˜kÑ)¨AÑ-°Ñ3ˆ	Ùˆk˜IÑ%©«Ñ/Ô0Ü˜D # u¨d°E¸5À#ÀsÈCÐQTÐVZÐ\jÐkÓlˆà',ˆ��u—{‘{Ð#Ñ$Ø�‰
ˆð! �+Ó
ð2 —[‘[ “_€NÜˆ~Ó Ò#ð ØXÔ[^Ð_mÓ[nÑnóÐ#ð !  Ð&€Kð $ D SÐ)€Nà�W˜n¨kÐ:Ð:r@   Úodbr5   ÚslÚsir6   c           	      ó\  — g }|j                   }|j                  }||k  �r| |   }|j                  dk7  rt        |«      ‚|dz  }|j                  j                  d|«      }|dk(  r6|j                  |j                  |j                  |j                  |d f«       n•|j                  || }	|}
|
|k  rD| |
   }|j                  j                  d|«      }|dk(  s|j                  || |	k7  rn|
dz  }
|
|k  rŒDt        | |t        |dz
  |
«      |dz   «      \  }}|j                  |t        |	f«       |
}||k  r�Œt        «       }t        ||j                  «       |j                  d«       |j!                  t#        t$        t'        |j)                  «       «      |«      «      }|j                  |fS )aN  Create a tree from the given sorted list of entries and put the respective
    trees into the given object database.

    :param entries:
        **Sorted** list of :class:`~git.index.typ.IndexEntry`\s.

    :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, name.
    r
   r#   ú/r¥   N)ÚstartÚstopr¡   r   rA   Úfindr`   rŽ   rj   r   Úslicer   r   r    r�   ÚseekÚstorer   r   rƒ   Úgetvalue)rl   r¯   r°   r±   Ú
tree_itemsÚciÚendrt   ÚrboundÚbaseÚxiÚoentryÚorboundr¬   Ú_tree_entry_listÚsioÚistreams                    r?   r   r   +  s�  € ð. (*€Jà	�‰€BØ
�'‰'€CØ
ˆs‹(Ø˜‘ˆØ�;‰;˜!ÒÜ& uÓ-Ð-à
ˆa‰ˆØ—‘—‘  bÓ)ˆØ�RŠ<à×Ñ˜uŸ|™|¨U¯Z©Z¸¿¹ÀBÀC¸ÐIÕJð —:‘:˜b Ð(ˆDØˆBØ�s’(Ø  ™�Ø Ÿ+™+×*Ñ*¨3°Ó3�Ø˜b’= F§K¡K°°7Ð$;¸tÒ$CØà�a‘�ð �s“(ô %:¸'À3ÌÈbÐSTÉfÐVXÓHYÐ[aÐdeÑ[eÓ$fÑ!ˆCÐ!Ø×Ñ˜s¤G¨TÐ2Ô3ð ˆBð; ˆsŒ(ôD ‹)€CÜ�:˜sŸy™yÔ)Ø‡H�HˆQ„Kà�i‰iœ¤¬s°3·<±<³>Ó/BÀCÓHÓI€GØ�N‰N˜JÐ'Ð'r@   Ú
tree_entryr¡   c                 ó@   — t        | d   | d   |t        z  | d   f«      S )Nr#   r
   rw   )r%   r(   )rÆ   r¡   s     r?   Ú_tree_entry_to_baseindexentryrÈ   p  s*   € Ü˜: a™=¨*°Q©-¸Ä-Ñ9OÐQ[Ð\]ÑQ^Ð_Ó`Ð`r@   Ú	tree_shasc                 ót  — g }t        |«      dv r2t        | |d   d«      D ]  }|j                  t        |d«      «       Œ |S t        |«      dkD  rt	        dt        |«      z  «      ‚t        | |d«      D �]@  \  }}}|��‹|��4|�â|d   |d   k7  r|d   |d   k7  r|d   |d   k7  s!|d   |d   k7  rh|d   |d   k7  r]|d   |d   k7  rR|j                  t        |d«      «       |j                  t        |d«      «       |j                  t        |d«      «       Œ¤|d   |d   k7  s|d   |d   k7  r|j                  t        |d«      «       ŒÖ|j                  t        |d«      «       Œò|d   |d   k7  s|d   |d   k7  s�Œ
|j                  t        |d«      «       |j                  t        |d«      «       �ŒB|€�ŒF|d   |d   k7  s|d   |d   k7  s�Œ^|j                  t        |d«      «       |j                  t        |d«      «       �Œ–|€!|€J ‚|j                  t        |d«      «       �Œ¹|€|j                  t        |d«      «       �ŒØ|d   |d   k7  s|d   |d   k7  r8|j                  t        |d«      «       |j                  t        |d«      «       �Œ&|j                  t        |d«      «       �ŒC |S )	a7  
    :return:
        List of :class:`~git.index.typ.BaseIndexEntry`\s 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 performed.
    )r#   rw   r¥   rP   r
   rv   zCannot handle %i trees at oncer#   rw   )rƒ   r   r`   rÈ   Ú
ValueErrorr   )r¯   rÉ   Úoutrt   r¿   ÚoursÚtheirss          r?   Úaggressive_tree_mergerÏ   t  s×  € ð !#€Cô ˆ9ƒ~˜ÑÜ,¨S°)¸B±-ÀÓDò 	@ˆEØ�J‰JÔ4°U¸AÓ>Õ?ð	@ð ˆ
ô ˆ9ƒ~˜ÒÜÐ9¼CÀ	»NÑJÓKÐKô 7°s¸IÀrÓJó AGÑˆˆd�FØÑàÑàÐ%ð ˜Q™ 4¨¡7Ò*¨t°A©w¸&À¹)Ò/CÈÈQÉÐSYÐZ[ÑS\ÒH\Ø˜Q™ 4¨¡7Ò*¨t°A©w¸&À¹)Ò/CÈÈQÉÐSYÐZ[ÑS\ÒH\ð Ÿ
™
Ô#@ÀÀqÓ#IÔJØŸ
™
Ô#@ÀÀqÓ#IÔJØŸ
™
Ô#@ÀÈÓ#KÕLØ˜a™ D¨¡GÒ+¨t°A©w¸$¸q¹'Ò/AàŸ
™
Ô#@ÀÀqÓ#IÕJð Ÿ
™
Ô#@ÀÈÓ#KÕLð ˜A‘w $ q¡'Ò)¨T°!©W¸¸Q¹Ô-?àŸ
™
Ô#@ÀÀqÓ#IÔJØŸ
™
Ô#@ÀÀqÓ#IÖJð �>áà˜a‘y D¨¡GÒ+¨v°a©y¸DÀ¹GÔ/CàŸ
™
Ô#@ÀÀqÓ#IÔJØŸ
™
Ô#@ÀÈÓ#KÖLð ˆ|àÐ)Ð)Ð)Ø—
‘
Ô8¸ÀÓCÖDØ�à—
‘
Ô8¸¸qÓAÖBð ˜‘7˜f Q™iÒ'¨4°©7°f¸Q±iÒ+?Ø—J‘JÔ<¸TÀ1ÓEÔFØ—J‘JÔ<¸VÀQÓGÖHð —J‘JÔ<¸TÀ1ÓEÖFðCAGðN €Jr@   )r
   )VÚ__doc__Ú__all__Úior   rR   Úos.pathrA   r=   Úpathlibr   Ústatr   r   r   r   r   r   r   r^   rX   Ú
gitdb.baser   Ú	gitdb.typr   Úgit.cmdr   r   Ú
git.compatr   r   r   r   Úgit.excr   r   Úgit.objects.funr   r   r    Úgit.utilr!   r"   Útypr$   r%   r&   r'   r(   Úutilr)   r*   Útypingr+   r,   r-   r.   r/   r0   r1   r2   r3   Ú	git.typesr4   Úgit.dbr5   Úgit.objects.treer6   r¿   r7   r   rˆ   r†   r	   rD   r   rš   r   Úbytesr   rž   r   r   r·   r   rÈ   rÏ   © r@   r?   ú<module>rå      sm  ðñò	€õ Û 	Ý Ý ß M× MÑ MÛ Û 
å Ý #ç 6ß CÓ Cß <÷ñ ÷
 ;ç TÕ Tß ÷ U× TÕ Tå áÝ%Ý-åð ˜Ñ€Ø à�,€ð,�Cð , (ð ,¨só ,ð
!˜cð ! có !ð/M˜#ð /M kð /M¸#ð /MÀ$ó /Mðf9 #ð 9¨#ó 9ð *.Ø.Añ	FØ�e˜N¨LÐ8Ñ9Ñ:ðFàˆu‰IðFð ˜$ ˜+Ñ&ðFð Ð*Ñ+ð	Fð
 
óFðR	 ˜˜5™	ð 	  e¨C°¨H¡oó 	 ð�e˜N¨H°cÐ9Ñ:ð ¸uÀXÈsÀ]Ñ?Só ð07;Øˆu‰Ið7;à
ˆ3��U˜8 S˜=Ñ)¨<Ð7Ñ8¸%ÀÐFÑGó7;ðv LMñB(Ø�*ÑðB(Ø$4ðB(Ø:?ðB(ØEHðB(à
ˆ5�$�~Ñ&Ð&Ñ'óB(ðJa¨nð aÀSð aÈ^ó aðcÐ/ð c¸HÀU¹Oð cÐPTÐUcÑPdô cr@   