
    
\hR?                         S 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Jr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)     N)ConfigParser)	getLogger)Path)CalledProcessError)TemporaryDirectory)DictIterableTuple)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\	\
R                     4S jrS\	\
R                     4S jr\S\\\4   4U 4S	 jj5       rS
 rS\4S jrS rS\4S jrS rS\4S jrS\4S jrS rS rS\	\   4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                 d  > [         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        U R                  S-  S-  U l        U R                  S-  S-  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menuszapplications.menu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	__class__s      8lib/python3.13/site-packages/menuinst/platforms/linux.pyr%   LinuxMenu.__init__    s   $)&)99 $($A$AD!"&"="=D$(

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

0@A#jl  ))G36II 	( %)$9$9G$CFY$Y! #$TYYT23:>? 	%
 )-(;(;n(L%    returnc                     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     r9   createLinuxMenu.create:   s_    &&(**,##%%$*=*=*?*?7N wr;   c                 2   [         R                  " U R                  5       HC  nUR                  U R	                  U R
                  SS9 S35      (       d  M6  U R                  4s  $    [        U R                  SS9  U R                  5         U R                  4$ )NTr    _
missing_ok)	r+   listdirr4   
startswithr1   r2   r3   r   _remove_this_menu)r5   fns     r9   removeLinuxMenu.removeC   s    **T::;B}}DIID AB!DEE5577 < 	t,,> --//r;   c                 T   > [         TU ]  n[        U R                  5       5      US'   U$ )NSP_DIR)r$   placeholdersstr_site_packages)r5   rT   r8   s     r9   rT   LinuxMenu.placeholdersL   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      r9   r?   #LinuxMenu._ensure_directories_existR   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      r9   r@    LinuxMenu._write_directory_entry`   s    DKK		*+,	
 			143P3PQ$//5GGDIIe$% 6 ,,, 65 ,,,s   !B
B'c                    [         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\   r]   r0   r1   r2   r   parsegetrootfindallfindtextrP   _write_menu_file)r5   treerootelts       r9   rN   LinuxMenu._remove_this_menuq   s    		,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>   )rt   r1   r2   ).0er5   s     r9   	<genexpr>+LinuxMenu._has_this_menu.<locals>.<genexpr>~   s'     W=V66T[[33=Vs   47z	Menu/Name)r   rp   r0   rq   anyrr   r5   rw   s   ` r9   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   ro   	DirectoryTr    r"   IncludeCategory)
r\   r]   r0   r1   r2   r   rp   rq   r   ru   )r5   rv   rw   menu_eltinc_elts        r9   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   rp   r0   rq   tag	Exceptionr   s     r9   rA   LinuxMenu._is_valid_menu_file   sQ    	$$T%>%>?GGIDt#:F(:: 		s   AA
 

AArv   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   rq   rh   ri   )r5   rv   rl   s      r9   ru   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   existsis_fileRuntimeErrortimestrftimeshutilcopyfilerA   r+   rP   _new_menu_file)r5   cur_timebackup_menu_files      r9   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 %srf   z<Menu><Name>Applications</Name>userz<MergeFile type="parent">z</MergeFile>z</Menu>
)r\   r]   r0   rh   ri   r&   r/   )r5   rl   s     r9   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    r9   _pathsLinuxMenu._paths   s    --//r;   )r(   r*   r4   r3   r0   r/   ) __name__
__module____qualname____firstlineno____doc__r   r'   r)   r%   r   r+   PathLikerF   rP   propertyr	   rU   rT   r?   r@   rN   boolrB   rD   rA   r   ru   rC   r   r   __static_attributes____classcell__)r8   s   @r9   r   r      s      $K0!,/M4bkk* 0bkk* 0 d38n  
4- -"	$X X	$T [ "$!0c
 0 0r;   r   c            	           \ rS rSr\S\4S j5       rS\\R                     4S jr
S\\R                     4S jrS rS\4S jrS rSS	 jrSS
\\   S\4S jjrS\S\\\4   4S jr SS\S\S\S\4S jjrS\\R                     4S jrSrg)LinuxMenuItem   r<   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      r9   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    r9   rF   LinuxMenuItem.create   sS    		-/  "'''6%%'{{}r;   c                     U R                  5       nU R                  SS9  U H#  n[        R                  SU5        [	        USS9  M%     U R                  5         U$ )NFr   zRemoving %sTrJ   )r   r   r\   r]   r   r   r_   s      r9   rP   LinuxMenuItem.remove   sS    '''7DIImT*4D)  	%%'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   rU   r   r4   )r5   exes     r9   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prefixrj   r   
quote_argsshlexquote)r5   partsr   r   r   s        r9   _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.rc   zType=Applicationrd   re   r2   zExec=z	Terminal=terminaliconzIcon=descriptionzComment=working_dirTrY   zPath=	platformslinuxglob_patterns;=rf   rg   )r   r   r\   warningr   r   rU   lowerr   r   r+   rE   
expandvarsr^   r   
isinstancer   listtuplerj   rh   ri   )r5   rk   r   r   r   keyvaluerl   s           r9   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      r9   r   (LinuxMenuItem._maybe_register_mime_types  s'    __Z0
!!*!@r;   r   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   rf   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   rh   ri   itemspopsplitrj   keysremove_sectionr   r   r   r*   )r5   r   r   r   	mime_typeglob_patternmimeappsconfigdefaultsaddedrl   section_namesectionmimetypedesktop_filesxupdate_mime_databases                    r9   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r  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        r9   _xml_path_for_mime_type%LinuxMenuItem._xml_path_for_mime_typeS  s    $$S#.YY%%.?EE(SXFYZ
	 9~!S		#)4Q<%%yy''&0:=8*D@QQSXXXr;   r  r   c           	      H   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 [        5        n[        [        R                  R                  U[        R                  R                  U5      5      S5       nU
R                  USSS9  SSS5        [        SUSU R                  R                  SWR                  /SS9  SSS5        g! , (       d  f       NE= f! , (       d  f       g= f! [          a+    ["        R%                  SUU5        U
R                  USSS9   gf = 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   	uninstallr   zUTF-8T)encodingxml_declarationNzxdg-mimez--modez
--novendorr   zPCould not un/register MIME type %s with xdg-mime. Writing to '%s' as a fallback.)r  r   Element
SubElementrt   r   rh   r+   rE   rj   r  ri   r   r   r&   r2   r   r\   r]   )r5   r  r  r   xml_pathr   r  	mime_infomime_type_tagdescrrv   
subcommandtmprl   s                 r9   r   )LinuxMenuItem._glob_pattern_for_mime_type_  sp     77	BO H''5A	#..y+IV}flK#I;f\NBbc@E}i8=&&y1")Y{
	I#%"'',,sBGG,<,<X,FGNRSJJq7DJI OXtyy~~|UVU[U[\ &%NN &% " 	IIIb
 JJx'4JH	IsI   '
E, 1AE9E
6EE, 

E	E
E)%E, )E, ,2F! F!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   r   )r5   r`   r   r   r(  r   s         r9   r   LinuxMenuItem._paths  sk    __Z06B
D#;;DAHv2h6H6H6JJX&  U|r;   r0  N)T)r   r   r   r   r   r   r   r
   r+   r   rF   rP   r   rU   r   r   r   r   r   r   r  r   r   r   r0  r;   r9   r   r      s    =$ = =- - <# <(TA7x} 7 7r
Y 
YtTz9J 
Y  	'I'I 'I 	'I
 
'IR- r;   r   )#r   r+   r   r   r   configparserr   loggingr   pathlibr   
subprocessr   tempfiler   typingr	   r
   r   	xml.etreer   utilsr   r   r   r   r   baser   r   r   r   r\   r   r   r0  r;   r9   <module>r<     s_     	    %   ) ' ( ( ! O O 3 3a0 a0HVH Vr;   