Ë
    À7j‚  ã                  ó�   — 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	 ddl
mZ  ed«      Zd	Zd
Zdd„Zdd„Zdd„Zefdd„Zdd„Zy)zöRead-only Git repository discovery.

For every repository found we collect only non-sensitive metadata. Remote URLs
are sanitized to strip any embedded credentials/tokens. We never read git
config secrets, stored credentials, or commit contents.
é    )ÚannotationsN)ÚPath)ÚAny)Úrun_readonly)Ú
get_loggerzdiscovery.git)z/var/wwwz/srvz/homez/opté   c                óR   — | syt        j                  dd| j                  «       «      S )zÃStrip credentials from a remote URL.

    https://user:token@github.com/x/y.git -> https://github.com/x/y.git
    Leaves SSH-style remotes (git@host:repo) untouched, as they carry no secret.
    Nz(https?://)[^/@]*@z\1)ÚreÚsubÚstrip)Úurls    úG/var/www/downloads.wolfpanel.net/public_html/agent/src/discovery/git.pyÚsanitize_remoter      s$   € ñ Øä�6‰6Ð'¨°·	±	³Ó<Ð<ó    c                ó\   — t        ddt        | «      g|¢«      }|r|j                  «       S d S )NÚgitz-C)r   Ústrr   )ÚrepoÚargsÚoutputs      r   Ú_gitr   $   s/   € Ü˜5 $¬¨D«	Ð9°DÐ9Ó:€FÙ#ˆ6�<‰<‹>Ð-¨Ð-r   c           	     óâ   — | j                   }t        |g d¢«      }t        |ddg«      }t        |«      t        |«      t        |g d¢«      t        |g d¢«      t        |g d¢«      t	        |«      dœS )z:Collect the allow-listed metadata for a single repository.)Úconfigz--getzremote.origin.urlÚstatusz--porcelain)z	rev-parsez--abbrev-refÚHEAD)Úlogú-1z--format=%H)r   r   z--format=%cI)ÚpathÚ
remote_urlÚcurrent_branchÚlast_commit_hashÚlast_commit_dateÚdirty_state)Úparentr   r   r   Úbool)Úrepo_dirr   Úremoter   s       r   Úinspect_repor(   )   sj   € à�?‰?€DÜ�$Ò@ÓA€FÜ�$˜ =Ð1Ó2€Fä�D“	Ü% fÓ-Ü˜tÒ%JÓKÜ  Ò'CÓDÜ  Ò'DÓEÜ˜F“|ñð r   c                óv  — g }t        «       }| D ]z  }t        |«      }|j                  «       sŒt        |dt        «      D ]H  }t        |j                  «      }||v rŒ|j                  |«       	 |j                  t        |«      «       ŒJ Œ| |S # t        $ r!}t        j                  d||«       Y d}~Œtd}~ww xY w)z;Find .git directories under the scan roots (bounded depth).z.gitzfailed to inspect %s: %sN)Úsetr   Úis_dirÚ_bounded_globÚ
_MAX_DEPTHr   r$   ÚaddÚappendr(   ÚOSErrorr   Údebug)ÚrootsÚreposÚseenÚrootÚbaseÚgit_dirÚkeyÚexcs           r   Úfind_repositoriesr:   8   s·   € à"$€EÜ“U€DØò DˆÜ�D‹zˆØ�{‰{Œ}ØÜ$ T¨6´:Ó>ò 	DˆGÜ�g—n‘nÓ%ˆCØ�d‰{ØØ�H‰H�SŒMðDØ—‘œ\¨'Ó2Õ3ñ	Dð	Dð €Løô ò DÜ—	‘	Ð4°g¸s×CÑCûðDús   Á.BÂ	B8ÂB3Â3B8c              #  óÂ   K  — t        |dz   «      D ]9  }|rdj                  dg|z  |gz   «      n|}	 | j                  |«      E d{  –—†  Œ; y7 Œ# t        $ r Y ŒJw xY w­w)z;Yield paths named `name` up to max_depth levels below base.é   ú/Ú*N)ÚrangeÚjoinÚglobr0   )r6   ÚnameÚ	max_depthÚdepthÚpatterns        r   r,   r,   L   sj   è ø€ ä�y 1‘}Ó%ò ˆÙ6;�#—(‘(˜C˜5 5™=¨D¨6Ñ1Ô2Àˆð	Ø—y‘y Ó)×)Ñ)ñð *ùÜò 	Ùð	üs:   ‚/A²AÁAÁAÁAÁAÁ	AÁAÁAÁA)r   ú
str | NoneÚreturnrF   )r   r   r   z	list[str]rG   rF   )r&   r   rG   zdict[str, Any])r2   ztuple[str, ...]rG   zlist[dict[str, Any]])r6   r   rB   r   rC   Úint)Ú__doc__Ú
__future__r   r
   Úpathlibr   Útypingr   Údiscovery.systemr   Úloggerr   r   Ú_SCAN_ROOTSr-   r   r   r(   r:   r,   © r   r   ú<module>rQ      sR   ðñõ #ã 	Ý Ý å )Ý á�Ó!€ð 4€Ø€
ó	=ó.ó
ð 0;ô ô(r   