
    9i{C                        S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJrJrJrJr  SSKJrJrJr  \
" \5      r  " S S\5      r! " S S\5      r"g)     )annotationsN)ConfigParser)	getLogger)Path)CalledProcessError)TemporaryDirectory)Iterable)ElementTree   )UnixLexadd_xml_childindent_xml_tree
logged_rununlink   )MenuMenuItemmenuitem_defaultsc                     ^  \ rS rSrSr\" S5      r\" S5      rU 4S jrSS jr	SS jr
\SU 4S jj5       rS	 rSS
 jrS rSS jrS rSS jrSS jrS rS rSS jrSrU =r$ )	LinuxMenu   z
Menus in Linux are governed by the freedesktop.org standards,
spec'd here https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html

menuinst will populate the relevant XML config and create a .directory entry
z	/etc/xdg/z
/usr/sharec                  > [         TU ]  " U0 UD6  U R                  S:X  a#  U R                  U l        U R
                  U l        Ox[        [        R                  R                  SS5      5      R                  5       U l        [        [        R                  R                  SS5      5      R                  5       U l        [        R                  R                  SS5       S3nU R                  S	-  U-  U l        U R                  S	-  U-  U l        U R                  S
-  U R                  U R                  SS9 S3-  U l        U R                  S-  U l        g )NsystemXDG_CONFIG_HOMEz	~/.configXDG_DATA_HOMEz~/.local/shareXDG_MENU_PREFIXr   zapplications.menumenusdesktop-directoriesTslug
.directoryapplications)super__init__mode_system_config_directoryconfig_directory_system_data_directorydata_directoryr   osenvironget
expandusersystem_menu_config_locationmenu_config_locationrendernamedirectory_entry_locationdesktop_entries_location)selfargskwargs
menu_fname	__class__s       8lib/python3.13/site-packages/menuinst/platforms/linux.pyr%   LinuxMenu.__init__"   s5   $)&)99 $($A$AD!"&"="=D$(

0+>%jl ! #'

0@A#jl 
 

'8"=>>OP
+/+H+H7+RU_+_($($9$9G$Cj$P! #$TYYT23:>? 	%
 )-(;(;n(L%    c                    U R                  5         U R                  5       nU R                  5       (       a  U R                  5       (       a  U4$ U R	                  5         U R                  5         U4$ N)_ensure_directories_exist_write_directory_entry_is_valid_menu_file_has_this_menu_ensure_menu_file_add_this_menu)r5   paths     r:   createLinuxMenu.create;   s_    &&(**,##%%$*=*=*?*?7N wr<   c                   [        U R                  5      R                  5       (       d
  [        5       $ [        R
                  " U R                  5       H@  nUR                  U R                  U R                  SS9 S35      (       d  M6  [        5       s  $    U R                  5         U R                  R                  5       (       a!  [        U R                  SS9  U R                  4$ [        5       $ )NTr    _)
missing_ok)r   r4   existstupler+   listdir
startswithr1   r2   _remove_this_menur3   r   )r5   fns     r:   removeLinuxMenu.removeD   s    D11299;;7N**T::;B}}DIID AB!DEEw < 	 ((//11400TB1133wr<   c                T   > [         TU ]  n[        U R                  5       5      US'   U$ )NSP_DIR)r$   placeholdersstr_site_packages)r5   rU   r9   s     r:   rU   LinuxMenu.placeholdersQ   s+    w+!$T%8%8%:!;Xr<   c                    U R                   S-  U R                  S-  U R                  S-  /nU H)  n[        R                  SU5        UR	                  SSS9  M+     g )Nr   r   r#   zEnsuring path %s existsTparentsexist_ok)r(   r*   logdebugmkdirr5   pathsrE   s      r:   r?   #LinuxMenu._ensure_directories_existW   s_    !!G+"77.0

 DII/6JJtdJ3 r<   c                T   SSSSU R                  U R                  5       3/n[        R                  SU R                  5        [        U R                  S5       nUR                  SR                  U5      5        S S S 5        U R                  $ ! , (       d  f       U R                  $ = f)N[Desktop Entry]zType=DirectoryEncoding=UTF-8Name=zWriting directory entry at %sw
)r1   r2   r]   r^   r3   openwritejoin)r5   linesfs      r:   r@    LinuxMenu._write_directory_entrye   s    DKK		*+,	
 			143P3PQ$//5GGDIIe$% 6 ,,, 65 ,,,s   !B
B'c                   [        U R                  5      R                  5       (       d  g [        R	                  SU R                  U R                  U R                  5      5        [        R                  " U R                  5      nUR                  5       nUR                  S5       HN  nUR                  S5      R                  U R                  U R                  5      :X  d  M=  UR                  U5        MP     U R                  U5        g )NzEditing %s to remove %s configr   Name)r   r0   rK   r]   r^   r1   r2   r   parsegetrootfindallfindtextrQ   _write_menu_file)r5   treerootelts       r:   rO   LinuxMenu._remove_this_menuv   s    D--.5577		,d.G.GUYU^U^I_	
   !:!:;||~<<'Cxx$$DII(>>C  ( 	d#r<   c                   ^  [         R                  " T R                  5      R                  5       n[	        U 4S jUR                  S5       5       5      $ )Nc              3  r   >#    U  H,  oR                   TR                  TR                  5      :H  v   M.     g 7fr>   )ru   r1   r2   ).0er5   s     r:   	<genexpr>+LinuxMenu._has_this_menu.<locals>.<genexpr>   s'     W=V66T[[33=Vs   47z	Menu/Name)r   rq   r0   rr   anyrs   r5   rx   s   ` r:   rB   LinuxMenu._has_this_menu   s<      !:!:;CCEWT\\+=VWWWr<   c           	        [         R                  SU R                  U R                  U R                  5      5        [
        R                  " U R                  5      nUR                  5       n[        US5      n[        USU R                  U R                  5      5        [        USU R                  U R                  SS9 S35        [        US5      n[        US	U R                  U R                  5      5        U R                  U5        g )
NzEditing %s to add %s configr   rp   	DirectoryTr    r"   IncludeCategory)
r]   r^   r0   r1   r2   r   rq   rr   r   rv   )r5   rw   rx   menu_eltinc_elts        r:   rD   LinuxMenu._add_this_menu   s    		/1J1JDKKX\XaXaLbc  !:!:;||~ v.hDII(>?hDIID0Q/RR\-]^)4gz4;;tyy+ABd#r<   c                     [         R                  " U R                  5      R                  5       nUS L=(       a    UR                  S:H  $ ! [
         a     gf = f)Nr   F)r   rq   r0   rr   tag	Exceptionr   s     r:   rA   LinuxMenu._is_valid_menu_file   sQ    	$$T%>%>?GGIDt#:F(:: 		s   AA
 

AAc                ^   [         R                  SU R                  5        [        UR	                  5       5        [        U R                  S5       nUR                  S5        UR                  S5        UR                  U5        UR                  S5        S S S 5        g ! , (       d  f       g = f)Nz
Writing %swbs9   <!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
s<    "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd">
   
)r]   r^   r0   r   rr   ri   rj   )r5   rw   rm   s      r:   rv   LinuxMenu._write_menu_file   sr    		, 9 9:'$++T2aGGQRGGTUJJqMGGEN	 322s   AB
B,c                   U R                   R                  5       (       a8  U R                   R                  5       (       d  [        SU R                    S35      eU R                   R                  5       (       a  [        R
                  " S5      nU R                    SU 3n[        R                  " U R                   U5        U R                  5       (       d!  [        R                  " U R                   5        g g U R                  5         g )NzMenu config location z is not a file!z%Y-%m-%d_%Hh%Mm%S.)r0   rK   is_fileRuntimeErrortimestrftimeshutilcopyfilerA   r+   rQ   _new_menu_file)r5   cur_timebackup_menu_files      r:   rC   LinuxMenu._ensure_menu_file   s    $$++--d6O6O6W6W6Y6Y!6t7P7P6QQ`abb $$,,..}}%89H"&";";!<AhZHOOD557GH++--		$334 . !r<   c                F   [         R                  SU R                  5        [        U R                  S5       nUR	                  S5        U R
                  S:X  a  UR	                  SU R                   S35        UR	                  S5        S S S 5        g ! , (       d  f       g = f)NCreating %srg   z<Menu><Name>Applications</Name>userz<MergeFile type="parent">z</MergeFile>z</Menu>
)r]   r^   r0   ri   rj   r&   r/   )r5   rm   s     r:   r   LinuxMenu._new_menu_file   sw    		-!:!:;$++S1QGG56yyF"3D4T4T3UUabcGGK 	 211s   AB
B c                    U R                   4$ r>   )r3   r5   s    r:   _pathsLinuxMenu._paths   s    --//r<   )r(   r*   r4   r3   r0   r/   )returnztuple[os.PathLike])r   zdict[str, str]r   r   )r   bool)rw   zElementTree.ElementTree)r   ztuple[Path])__name__
__module____qualname____firstlineno____doc__r   r'   r)   r%   rF   rQ   propertyrU   r?   r@   rO   rB   rD   rA   rv   rC   r   r   __static_attributes____classcell__)r9   s   @r:   r   r      s|      $K0!,/M2  
4-"$X	$"$!0 0r<   r   c                      \ rS rSr\SS j5       rSS jrSS jrS rSS jr	S r
SSS jjrSSS	 jjrSS
 jr S       SS jjrSS jrSrg)LinuxMenuItem   c                    U R                  U R                  R                  S0 S9nU SU R                  SS0 S9 S3nU R                  R                  U-  $ )NT)r!   extrarI   r2   z.desktop)r1   menur2   
render_keyr4   )r5   menu_prefixfilenames      r:   locationLinuxMenuItem.location   sX    kk$))..t2kF "]!DOOFRO$P#QQYZyy11H<<r<   c                    [         R                  SU R                  5        U R                  5         U R	                  5         U R                  SS9  U R                  5         U R                  5       $ )Nr   Tregister)r]   r^   r   
_precreate_write_desktop_file_maybe_register_mime_types_update_desktop_databaser   r   s    r:   rF   LinuxMenuItem.create   sS    		-/  "'''6%%'{{}r<   c                    S U R                  5        5       nU R                  SS9  U(       a:  U H$  n[        R                  SU5        [	        U5        M&     U R                  5         U$ )Nc              3  f   #    U  H'  n[        U5      R                  5       (       d  M#  Uv   M)     g 7fr>   )r   r   )r}   rE   s     r:   r   'LinuxMenuItem.remove.<locals>.<genexpr>   s!     H-$4:3E3E3G-s   "1	1Fr   zRemoving %s)r   r   r]   r^   r   r   r`   s      r:   rQ   LinuxMenuItem.remove   sX    H$++-H'''7		-.t  ))+r<   c                    [         R                  " S5      nU(       a*  [        U[        U R                  R
                  5      /SS9  g g )Nzupdate-desktop-databaseFcheck)r   whichr   rV   r   r4   )r5   exes     r:   r   &LinuxMenuItem._update_desktop_database   s;    ll45c$))<<=> r<   c           	     *   / nU R                  S5      nU(       a  UR                  U5        U R                  S   (       aj  U R                  R                  nU R                  R                  U5      (       a  SnOSnUR                  SU SU SU R                  R                   S35        UR                  S	R                  [        R                  " U R                  S
5      5      5      5        S[        R                  " SR                  U5      5      -   $ )N
precommandactivatezshell activatezshell.bash activatez	eval "$("z" z "z")" commandzbash -c z && )r   appendmetadatar   	conda_exe_is_micromambaprefixrk   r   
quote_argsshlexquote)r5   partsr   r   r   s        r:   _commandLinuxMenuItem._command   s    __\2
LL$==$		++Iyy''	22+0LL9YKr(2dii>N>N=OsSTSXXg001KLMNEKKE(:;;;r<   c                   U R                   R                  5       (       a   [        R                  SU R                   5        SSSSU R	                  S5       3SU R                  5        3S[        U R	                  S	5      5      R                  5        3/nU R	                  S
5      nU(       a#  UR                  SU R	                  S
5       35        U R	                  S5      nU(       a#  UR                  SU R	                  S5       35        U R	                  S5      nU(       aJ  [        [        R                  R                  U5      5      R                  SSS9  UR                  SU 35        [        S   S    H  nU/ [        QSP7;   a  M  U R	                  U5      nUc  M*  [        U[         5      (       a  [        U5      R                  5       nO/[        U["        [$        45      (       a  SR'                  U5      S-   nUR                  U SU 35        M     [)        U R                   S5       nUR+                  SR'                  U5      5        UR+                  S5        S S S 5        g ! , (       d  f       g = f)Nz Overwriting existing file at %s.rd   zType=Applicationre   rf   r2   zExec=z	Terminal=terminaliconzIcon=descriptionzComment=working_dirTrZ   zPath=	platformslinuxglob_patterns;=rg   rh   )r   rK   r]   warningr   r   rV   lowerr   r   r+   rE   
expandvarsr_   r   
isinstancer   listrL   rk   ri   rj   )r5   rl   r   r   r   keyvaluerm   s           r:   r   !LinuxMenuItem._write_desktop_file   s   ==!!KK:DMMJ DOOF+,-DMMO$%DOOJ78>>@AB
 v&LL5!8 9:;oom4LL8DOOM$B#CDEoom4##K0177t7TLL5./$[1':C;);?;;OOC(E}%&&E
((*ED%=11#-LLC5%)* ; $--%GGDIIe$%GGDM &%%s   02I++
I9c                T    U R                  S5      nU(       d  g U R                  X!S9  g )NMimeTyper   )r   _register_mime_types)r5   r   
mime_typess      r:   r   (LinuxMenuItem._maybe_register_mime_types  s'    __Z0
!!*!@r<   c           	        U R                  S5      =(       d    0 nU H-  nUR                  U5      nU(       d  M  U R                  XEUS9  M/     U R                  R                  S-  nU(       Ga@  [        S S9nUR                  5       (       a  UR                  U5        [        R                  SX5        SUR                  5       ;  a  UR                  S5        SUR                  5       ;  a  UR                  S5        US   nUS   n	U Hz  nXH;  a  U R                  R                  X'   XI;   a=  U R                  R                  X   ;  a!  X    SU R                  R                   3X'   Mb  U R                  R                  X'   M|     [        US	5       n
UR                  U
S
S9  S S S 5        GOvUR                  5       (       Ga`  [        S S9nUR                  U5        [        R                  SX5        S GH  nXR                  5       ;  a  M  X{   nUR!                  5        H  u  pU R                  R                  U:X  a  UR#                  U5        M2  U R                  R                  UR%                  S5      ;   d  M]  SR'                  UR%                  S5       Vs/ s H   oU R                  R                  :w  d  M  UPM"     sn5      X'   M     UR)                  5       (       a  M  UR+                  U5        GM     [        US	5       n
UR                  U
S
S9  S S S 5        [,        R.                  " S5      nU(       a%  [1        USU R                  R2                  S-  /S
S9  g g ! , (       d  f       NQ= fs  snf ! , (       d  f       Ng= f)Nr   )installzmimeapps.list)default_sectionzRegistering %s to %s...Default ApplicationsAdded Associationsr   rg   F)space_around_delimiterszDeregistering %s from %s...)r   r   zupdate-mime-databasez-Vmimer   )r   r-   _glob_pattern_for_mime_typer   r(   r   r   readr]   r^   sectionsadd_sectionr   r2   ri   rj   itemspopsplitrk   keysremove_sectionr   r   r   r*   )r5   r   r   r   	mime_typeglob_patternmimeappsconfigdefaultsaddedrm   section_namesectionmimetypedesktop_filesxupdate_mime_databases                    r:   r   "LinuxMenuItem._register_mime_types"  s   8>B#I(,,Y7L|00RZ0[ $
 99--?!$7F!!H%II/F%V__->>""#9:#6??+<<""#7845H/0E'	,*.--*<*<H'%$--*<*<EDT*T*/*:);1T]]=O=O<P'QE$'+}}'9'9E$ ( h$Q> %$!$7FKK!II3ZJ L'88 ./6}}+H}}))]:H-++}/B/B3/GG,/HH(5(;(;C(@\(@1I[I[D[Q(@\-)	 0? ||~~)),7 !M h$Q> %  &||,BC%tTYY-E-E-NO  1 %$  ] %$s$   M(M9 M9M>(
M6>
Nc                H   UR                  SS5      n[        U R                  R                  S-  S-  R	                  SU S35      5      nU(       a.  [        U5      S:  a  Sn[        R                  XAU5        US	   S
4$ U R                  R                  S-  S-  U S3-  S4$ )N/-r   r#   *z*.xmlr   z;Found multiple files for MIME type %s: %s. Returning first.r   Tpackagesz.xmlF)replacer   r   r*   globlenr]   r^   )r5   r  basename	xml_filesmsgs        r:   _xml_path_for_mime_type%LinuxMenuItem._xml_path_for_mime_type[  s    $$S#.YY%%.?EE(SXFYZ
	 9~!S		#)4Q<%%yy''&0:=8*D@QQSXXXr<   c           	        U R                  U5      u  pEU(       a  U$ Sn[        R                  " SUS9n[        R                  " USUS9n[        R                  " USUS9  SU S	U S
3n	U	[        R                  " US5      l        [        R                  " U5      n
U(       a  SOSnSn [        5        n[        [        R                  R                  U[        R                  R                  U5      5      S5       nU
R                  USSS9  SSS5        [        R                  " S5      nU(       a.  [        XSU R                  R                   SWR"                  /SS9  O*U R%                  S5      n[&        R)                  SUU5        SnSSS5        U(       a(  [&        R-                  SU5        U
R                  USSS9  gg! , (       d  f       N= f! , (       d  f       NO= f! [*         a    Sn[&        R-                  SU5         Nvf = f)z
See https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-latest.html
for more information on the default locations.
z5http://www.freedesktop.org/standards/shared-mime-infoz	mime-info)xmlnsz	mime-type)typer  )patternzCustom MIME type z for 'z ' files (registered by menuinst)commentr   	uninstallFr   zUTF-8T)encodingxml_declarationNzxdg-mimez--modez
--novendorr   r2   znUnable to un/register MIME type '%s' for Desktop Entry of name '%s': 'xdg-mime' is not present on the system.'z1Could not un/register MIME type %s with xdg-mime.zWriting to '%s' as a fallback.)r  r   Element
SubElementru   r	   ri   r+   rE   rk   r  rj   r   r   r   r   r&   r2   r   r]   r   r   r^   )r5   r  r  r   xml_pathrK   r!  	mime_infomime_type_tagdescrrw   
subcommanduse_fallbacktmprm   xdg_mimer2   s                    r:   r   )LinuxMenuItem._glob_pattern_for_mime_typeg  s     77	BO H''5A	#..y+IV}flK#I;f\NBbc@E}i8=&&y1")Y{
	V#%"'',,sBGG,<,<X,FGNRSJJq7DJI O "<<
3!xWXW]W]^"
  ??62DKKD % $(L' &4 II6AJJx'4JH 3 ON &%( " 	V  LIII9U		VsJ   )
G$ 3AG;GA=G
G$ 
G	G
G!G$ !G$ $"H	H	c                    U R                   /nU R                  S5      =(       d    SnU HF  nU R                  U5      u  pEU(       d  M  SUR                  5       ;   d  M5  UR	                  U5        MH     [        U5      $ )Nr    zregistered by menuinst)r   r   r  	read_textr   rL   )r5   ra   r   r   r*  rK   s         r:   r   LinuxMenuItem._paths  sk    __Z06B
D#;;DAHv2h6H6H6JJX&  U|r<   r4  Nr   )r   zIterable[os.PathLike])r   rV   )T)r   r   )r   zIterable[str]r   r   )r  rV   r   ztuple[Path, bool])r  rV   r  rV   r   r   r   zPath | None)r   r   r   r   r   r   rF   rQ   r   r   r   r   r   r  r   r   r   r4  r<   r:   r   r      s{    = =<(TA7r
Y  	7I7I 7I 	7I
 
7Irr<   r   )#r   
__future__r   r+   r   r   r   configparserr   loggingr   pathlibr   
subprocessr   tempfiler	   typingr
   	xml.etreer   utilsr   r   r   r   r   baser   r   r   r   r]   r   r   r4  r<   r:   <module>rA     s_     " 	    %   ) '  ! O O 3 3f0 f0RgH gr<   