
    ͈2gR?                         d Z ddlZddlZddl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 ddlmZ ddlmZmZmZ dd	lmZ d
dlmZmZmZmZmZ ddlmZmZmZ  ee      Z  G d de      Z! G d de      Z"y)     N)ConfigParser)	getLogger)Path)CalledProcessError)TemporaryDirectory)DictIterableTuple)ElementTree   )UnixLexadd_xml_childindent_xml_tree
logged_rununlink   )MenuMenuItemmenuitem_defaultsc                       e Zd ZdZ ed      Z ed      Z fdZdee	j                     fdZdee	j                     fdZedeeef   f fd       Zd	 Zdefd
Zd ZdefdZd ZdefdZdefdZd Zd Zdee   fdZ xZS )	LinuxMenuz
    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                 f   t        |   |i | | j                  dk(  r#| j                  | _        | j
                  | _        nxt        t        j                  j                  dd            j                         | _        t        t        j                  j                  dd            j                         | _        | j                  dz  dz  | _        | j                  dz  dz  | _        | j                  dz  | j                  | j                  d	
       dz  | _        | j                  dz  | _        y )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.12/site-packages/menuinst/platforms/linux.pyr$   z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                     | j                          | j                         }| j                         r| j                         r|fS | j	                          | j                          |fS N)_ensure_directories_exist_write_directory_entry_is_valid_menu_file_has_this_menu_ensure_menu_file_add_this_menu)r4   paths     r8   createzLinuxMenu.create:   sY    &&(**,##%$*=*=*?7N wr9   c                 .   t        j                  | j                        D ]@  }|j                  | j	                  | j
                  d       d      s3| j                  fc S  t        | j                  d       | j                          | j                  fS )NTr   _
missing_ok)	r*   listdirr3   
startswithr0   r1   r2   r   _remove_this_menu)r4   fns     r8   removezLinuxMenu.removeC   s|    **T::;B}}DIID AB!DE5577 < 	t,,> --//r9   c                 T    t         |   }t        | j                               |d<   |S )NSP_DIR)r#   placeholdersstr_site_packages)r4   rP   r7   s     r8   rP   zLinuxMenu.placeholdersL   s+    w+!$T%8%8%:!;Xr9   c                     | j                   dz  | j                  dz  | j                  dz  g}|D ]+  }t        j                  d|       |j	                  dd       - y )Nr   r   r"   zEnsuring path %s existsTparentsexist_ok)r'   r)   logdebugmkdirr4   pathsrC   s      r8   r=   z#LinuxMenu._ensure_directories_existR   s_    !!G+"77.0

 DII/6JJtdJ3 r9   c                 J   dddd| j                  | j                         g}t        j                  d| j                         t        | j                  d      5 }|j                  dj                  |             d d d        | j                  S # 1 sw Y   | j                  S xY w)N[Desktop Entry]zType=DirectoryEncoding=UTF-8Name=zWriting directory entry at %sw
)r0   r1   rW   rX   r2   openwritejoin)r4   linesfs      r8   r>   z LinuxMenu._write_directory_entry`   s    DKK		*+,	
 			143P3PQ$//5GGDIIe$% 6 ,,, 6 ,,,s   !BB"c                    t         j                  d| j                  | j                  | j                               t        j                  | j                        }|j                         }|j                  d      D ]K  }|j                  d      j                  | j                  | j                        k(  s;|j                  |       M | j                  |       y )NzEditing %s to remove %s configr   Name)rW   rX   r/   r0   r1   r   parsegetrootfindallfindtextrM   _write_menu_file)r4   treerootelts       r8   rK   zLinuxMenu._remove_this_menuq   s    		,d.G.GUYU^U^I_	
   !:!:;||~<<'Cxx$$DII(>>C  ( 	d#r9   c                      t        j                   j                        j                         }t	         fd|j                  d      D              S )Nc              3   n   K   | ],  }|j                   j                  j                        k(   . y wr<   )rm   r0   r1   ).0er4   s     r8   	<genexpr>z+LinuxMenu._has_this_menu.<locals>.<genexpr>~   s*     W=V166T[[33=Vs   25z	Menu/Name)r   ri   r/   rj   anyrk   r4   rp   s   ` r8   r@   zLinuxMenu._has_this_menu|   s<      !:!:;CCEWT\\+=VWWWr9   c                    t         j                  d| j                  | j                  | j                               t        j                  | j                        }|j                         }t        |d      }t        |d| j                  | j                               t        |d| j                  | j                  d       d       t        |d      }t        |d	| j                  | j                               | j                  |       y )
NzEditing %s to add %s configr   rh   	DirectoryTr   r!   IncludeCategory)
rW   rX   r/   r0   r1   r   ri   rj   r   rn   )r4   ro   rp   menu_eltinc_elts        r8   rB   zLinuxMenu._add_this_menu   s    		/1J1JDKKX\XaXaLbc  !:!:;||~ v.hDII(>?hDIID0Q/RR\-]^)4gz4;;tyy+ABd#r9   c                     	 t        j                  | j                        j                         }|d uxr |j                  dk(  S # t
        $ r Y yw xY w)Nr   F)r   ri   r/   rj   tag	Exceptionrx   s     r8   r?   zLinuxMenu._is_valid_menu_file   sQ    	$$T%>%>?GGIDt#:F(:: 		s   AA 	AAro   c                 T   t         j                  d| j                         t        |j	                                t        | j                  d      5 }|j                  d       |j                  d       |j                  |       |j                  d       d d d        y # 1 sw Y   y xY w)Nz
Writing %swbs9   <!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
s<    "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd">
   
)rW   rX   r/   r   rj   rb   rc   )r4   ro   rf   s      r8   rn   zLinuxMenu._write_menu_file   sr    		, 9 9:'$++T2aGGQRGGTUJJqMGGEN	 322s   ABB'c                    | j                   j                         r3| j                   j                         st        d| j                    d      | j                   j                         rwt	        j
                  d      }| j                    d| }t        j                  | j                   |       | j                         s t        j                  | j                          y y | j                          y )NzMenu config location z is not a file!z%Y-%m-%d_%Hh%Mm%S.)r/   existsis_fileRuntimeErrortimestrftimeshutilcopyfiler?   r*   rM   _new_menu_file)r4   cur_timebackup_menu_files      r8   rA   zLinuxMenu._ensure_menu_file   s    $$++-d6O6O6W6W6Y!6t7P7P6QQ`abb $$,,.}}%89H"&";";!<AhZHOOD557GH++-		$334 . !r9   c                 :   t         j                  d| j                         t        | j                  d      5 }|j	                  d       | j
                  dk(  r|j	                  d| j                   d       |j	                  d       d d d        y # 1 sw Y   y xY w)NCreating %sr`   z<Menu><Name>Applications</Name>userz<MergeFile type="parent">z</MergeFile>z</Menu>
)rW   rX   r/   rb   rc   r%   r.   )r4   rf   s     r8   r   zLinuxMenu._new_menu_file   sw    		-!:!:;$++S1QGG56yyF"3D4T4T3UUabcGGK 	 211s   ABBc                     | j                   fS r<   )r2   r4   s    r8   _pathszLinuxMenu._paths   s    --//r9   )__name__
__module____qualname____doc__r   r&   r(   r$   r   r*   PathLikerD   rM   propertyr	   rQ   rP   r=   r>   rK   boolr@   rB   r?   r   rn   rA   r   r   __classcell__)r7   s   @r8   r   r      s      $K0!,/M4bkk* 0bkk* 0 d38n  
4- -"	$X X	$T [ "$!0c
 0r9   r   c            	          e Zd Zedefd       Zdeej                     fdZ	deej                     fdZ
d ZdefdZd ZddZdd	ee   d
efdZdedeeef   fdZ	 ddedededefdZdeej                     fdZy)LinuxMenuItemr:   c                     | j                  | j                  j                  di       }| d| j                  ddi        d}| j                  j                  |z  S )NT)r    extrarF   r1   z.desktop)r0   menur1   
render_keyr3   )r4   menu_prefixfilenames      r8   locationzLinuxMenuItem.location   sX    kk$))..t2kF "]!DOOFRO$P#QQYZyy11H<<r9   c                     t         j                  d| j                         | j                          | j	                          | j                  d       | j                          | j                         S )Nr   Tregister)rW   rX   r   
_precreate_write_desktop_file_maybe_register_mime_types_update_desktop_databaser   r   s    r8   rD   zLinuxMenuItem.create   sS    		-/  "'''6%%'{{}r9   c                     | j                         }| j                  d       |D ]%  }t        j                  d|       t	        |d       ' | j                          |S )NFr   zRemoving %sTrG   )r   r   rW   rX   r   r   rZ   s      r8   rM   zLinuxMenuItem.remove   sS    '''7DIImT*4D)  	%%'r9   c                     t        j                  d      }|r-t        |t        | j                  j
                        gd       y y )Nzupdate-desktop-databaseFcheck)r   whichr   rQ   r   r3   )r4   exes     r8   r   z&LinuxMenuItem._update_desktop_database   s;    ll45c$))<<=> r9   c           	         g }| j                  d      }|r|j                  |       | j                  d   re| j                  j                  }| j                  j                  |      rd}nd}|j                  d| d| d| j                  j                   d       |j                  d	j                  t        j                  | j                  d
                         dt        j                  dj                  |            z   S )N
precommandactivatezshell activatezshell.bash activatez	eval "$("z" z "z")"r   commandzbash -c z && )r   appendmetadatar   	conda_exe_is_micromambaprefixrd   r   
quote_argsshlexquote)r4   partsr   r   r   s        r8   _commandzLinuxMenuItem._command   s    __\2
LL$==$		++Iyy''	2+0LL9YKr(2dii>N>N=OsSTSXXg001KLMNEKKE(:;;;r9   c                    | j                   j                         r t        j                  d| j                          dddd| j	                  d       d| j                          dt        | j	                  d	            j                          g}| j	                  d
      }|r#|j                  d| j	                  d
              | j	                  d      }|r#|j                  d| j	                  d              | j	                  d      }|rMt        t        j                  j                  |            j                  dd       |j                  d|        t        d   d   D ]  }|g t        dv r| j	                  |      }|%t        |t               rt        |      j                         }n*t        |t"        t$        f      rdj'                  |      dz   }|j                  | d|         t)        | j                   d      5 }|j+                  dj'                  |             |j+                  d       d d d        y # 1 sw Y   y xY w)Nz Overwriting existing file at %s.r]   zType=Applicationr^   r_   r1   zExec=z	Terminal=terminaliconzIcon=descriptionzComment=working_dirTrT   zPath=	platformslinuxglob_patterns;=r`   ra   )r   r   rW   warningr   r   rQ   lowerr   r   r*   rC   
expandvarsrY   r   
isinstancer   listtuplerd   rb   rc   )r4   re   r   r   r   keyvaluerf   s           r8   r   z!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#-LLC5%)* ; $--%GGDIIe$%GGDM &%%s   2I		Ic                 R    | j                  d      }|sy | j                  ||       y )NMimeTyper   )r   _register_mime_types)r4   r   
mime_typess      r8   r   z(LinuxMenuItem._maybe_register_mime_types  s)    __Z0
!!*x!@r9   r   r   c           	         | j                  d      xs i }|D ]*  }|j                  |      }|s| j                  |||       , | j                  j                  dz  }|r<t        d       }|j                         r|j                  |       t        j                  d||       d|j                         vr|j                  d       d|j                         vr|j                  d       |d   }|d   }	|D ]y  }||vr| j                  j                  ||<   ||	v r=| j                  j                  |	|   vr"|	|    d| j                  j                   |	|<   a| j                  j                  |	|<   { t        |d	      5 }
|j                  |
d
       d d d        nd|j                         rSt        d       }|j                  |       t        j                  d||       dD ]  }||j                         vr||   }|j!                         D ]  \  }}| j                  j                  |k(  r|j#                  |       1| j                  j                  |j%                  d      v sYdj'                  |j%                  d      D cg c]  }|| j                  j                  k7  s|  c}      ||<    |j)                         r|j+                  |        t        |d	      5 }
|j                  |
d
       d d d        t-        j.                  d      }|r(t1        |d| j                  j2                  dz  gd
       y y # 1 sw Y   IxY wc c}w # 1 sw Y   ZxY w)Nr   )installzmimeapps.list)default_sectionzRegistering %s to %s...Default ApplicationsAdded Associationsr   r`   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   readrW   rX   sectionsadd_sectionr   r1   rb   rc   itemspopsplitrd   keysremove_sectionr   r   r   r)   )r4   r   r   r   	mime_typeglob_patternmimeappsconfigdefaultsaddedrf   section_namesectionmimetypedesktop_filesxupdate_mime_databases                    r8   r   z"LinuxMenuItem._register_mime_types  s   8>B#I(,,Y7L00LRZ0[ $
 99--?!$7F!H%II/XF%V__->>""#9:#6??+<<""#7845H/0E'	H,*.--*<*<HY'%$--*<*<E)DT*T*/	*:);1T]]=O=O<P'QE)$'+}}'9'9E)$ ( h$Q> %$!$7FKK!II3ZJ Lv'88 ./6}}+Hm}}))]:H-++}/B/B3/GG,/HH(5(;(;C(@\(@1AI[I[D[Q(@\-)	 0? ||~)),7 !M h$Q> %  &||,BC%tTYY-E-E-NO  1 %$  ] %$s$   ?MM%M%MM
Mr   c                 >   |j                  dd      }t        | j                  j                  dz  dz  j	                  d| d            }|r.t        |      dkD  rd}t        j                  |||       |d	   d
fS | j                  j                  dz  dz  | dz  dfS )N/-r   r"   *z*.xmlr   z;Found multiple files for MIME type %s: %s. Returning first.r   Tpackagesz.xmlF)replacer   r   r)   globlenrW   rX   )r4   r   basename	xml_filesmsgs        r8   _xml_path_for_mime_typez%LinuxMenuItem._xml_path_for_mime_typeS  s    $$S#.YY%%.?EE(SXFYZ
	 9~!S		#y)4Q<%%yy''&0:=8*D@QQSXXXr9   r   r   c           	      :   | j                  |      \  }}|r|S d}t        j                  d|      }t        j                  |d|      }t        j                  |d|       d| d	| d
}	|	t        j                  |d      _        t        j                  |      }
|rdnd}	 t               5 }t        t        j                  j                  |t        j                  j                  |            d      5 }|
j                  |dd       ddd       t        d|d| j                  j                  dj                  gd       ddd       y# 1 sw Y   CxY w# 1 sw Y   yxY w# t         $ r. t"        j%                  d||       |
j                  |dd       Y yw xY w)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
SubElementrm   r   rb   r*   rC   rd   r   rc   r   r   r%   r1   r   rW   rX   )r4   r   r   r   xml_pathr   r  	mime_infomime_type_tagdescrro   
subcommandtmprf   s                 r8   r   z)LinuxMenuItem._glob_pattern_for_mime_type_  sr     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# ,AE4E	9EE# E	EE E#  E# #4FFc                     | j                   g}| j                  d      xs d}|D ]=  }| j                  |      \  }}|sd|j                         v s-|j	                  |       ? t        |      S )Nr    zregistered by menuinst)r   r   r   	read_textr   r   )r4   r[   r   r   r  r   s         r8   r   zLinuxMenuItem._paths  sk    __Z06B
D#;;DAHf2h6H6H6JJX&  U|r9   N)T)r   r   r   r   r   r   r
   r*   r   rD   rM   r   rQ   r   r   r   r   r   r   r   r   r   r  r9   r8   r   r      s    =$ = =- - <# <(TA7x} 7 7r
Y 
YtTz9J 
Y  	'I'I 'I 	'I
 
'IR- r9   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   rW   r   r   r  r9   r8   <module>r     s_     	    %   ) ' ( ( ! O O 3 3a0 a0HVH Vr9   