
     [1f6                         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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)	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)r3   paths     r7   createzLinuxMenu.create9   sY    &&(**,##%$*=*=*?7N wr8   c                 .   t        | j                  d       t        j                  | j                        D ]@  }|j                  | j                  | j                  d       d      s3| j                  fc S  | j                          | j                  fS )NT
missing_okr   _)	r   r1   r)   listdirr2   
startswithr/   r0   _remove_this_menu)r3   fns     r7   removezLinuxMenu.removeB   s    t,,>**T::; 	8B}}DIID AB!DE5577	8 	 --//r8   c                 T    t         |   }t        | j                               |d<   |S )NSP_DIR)r"   placeholdersstr_site_packages)r3   rO   r6   s     r7   rO   zLinuxMenu.placeholdersK   s+    w+!$T%8%8%:!;Xr8   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r3   pathsrB   s      r7   r<   z#LinuxMenu._ensure_directories_existQ   sd    !!G+"77.0

  	4DII/6JJtdJ3	4r8   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wr   )r/   r0   rV   rW   r1   openwritejoin)r3   linesfs      r7   r=   z LinuxMenu._write_directory_entry_   s    DKK		*+,	
 			143P3PQ$//5 	&GGDIIe$%	& ,,,	& ,,,s   !BB"c                 z   t         j                  d| j                  | j                         t	        j
                  | j                        }|j                         }|j                  d      D ]<  }|j                  d      j                  | j                  k(  s,|j                  |       > | j                  |       y )NzEditing %s to remove %s configr   Name)rV   rW   r.   r0   r   parsegetrootfindallfindtextrL   _write_menu_file)r3   treerootelts       r7   rJ   zLinuxMenu._remove_this_menup   s    		2D4M4MtyyY  !:!:;||~<<' 	!Cxx$$		1C 	! 	d#r8   c                      t        j                   j                        j                         }t	         fd|j                  d      D              S )Nc              3   P   K   | ]  }|j                   j                  k(    y wr;   )rk   r0   ).0er3   s     r7   	<genexpr>z+LinuxMenu._has_this_menu.<locals>.<genexpr>{   s     J1166TYY&Js   #&z	Menu/Name)r   rg   r.   rh   anyri   r3   rn   s   ` r7   r?   zLinuxMenu._has_this_menuy   s<      !:!:;CCEJ[0IJJJr8   c                    t         j                  d| j                  | j                         t	        j
                  | j                        }|j                         }t        |d      }t        |d| j                         t        |d| j                  | j                  d       d       t        |d      }t        |d	| j                         | j                  |       y )
NzEditing %s to add %s configr   rf   	DirectoryTr   r    IncludeCategory)
rV   rW   r.   r0   r   rg   rh   r   r/   rl   )r3   rm   rn   menu_eltinc_elts        r7   rA   zLinuxMenu._add_this_menu}   s    		/1J1JDIIV  !:!:;||~ v.h		2hDIID0Q/RR\-]^)4gz4995d#r8   c                     	 t        j                  | j                        j                         }|d uxr |j                  dk(  S # t
        $ r Y yw xY w)Nr   F)r   rg   r.   rh   tag	Exceptionrv   s     r7   r>   zLinuxMenu._is_valid_menu_file   sQ    	$$T%>%>?GGIDt#:F(:: 		s   AA 	AArm   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">
   
)rV   rW   r.   r   rh   r`   ra   )r3   rm   rd   s      r7   rl   zLinuxMenu._write_menu_file   s{    		, 9 9:'$++T2 	aGGQRGGTUJJqMGGEN		 	 	s   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)   rL   _new_menu_file)r3   cur_timebackup_menu_files      r7   r@   zLinuxMenu._ensure_menu_file   s    $$++-d6O6O6W6W6Y!6t7P7P6QQ`abb $$,,.}}%89H"&";";!<AhZHOOD557GH++-		$334 . !r8   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>
)rV   rW   r.   r`   ra   r$   r-   )r3   rd   s     r7   r   zLinuxMenu._new_menu_file   s    		-!:!:;$++S1 	!QGG56yyF"3D4T4T3UUabcGGK 		! 	! 	!s   ABBc                     | j                   fS r;   )r1   r3   s    r7   _pathszLinuxMenu._paths   s    --//r8   )__name__
__module____qualname____doc__r   r%   r'   r#   r
   r)   PathLikerC   rL   propertyr   rP   rO   r<   r=   rJ   boolr?   rA   r>   r   rl   r@   r   r   __classcell__)r6   s   @r7   r   r      s      $K0!,/M4bkk* 0bkk* 0 d38n  
4- -"$K K	$T [ "$!0c
 0r8   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)LinuxMenuItemr9   c                     | j                  | j                  j                  di       }| d| j                  ddi        d}| j                  j                  |z  S )NT)r   extrarG   r0   z.desktop)r/   menur0   
render_keyr2   )r3   menu_prefixfilenames      r7   locationzLinuxMenuItem.location   sX    kk$))..t2kF "]!DOOFRO$P#QQYZyy11H<<r8   c                     t         j                  d| j                         | j                          | j	                          | j                  d       | j                          | j                         S )Nr   Tregister)rV   rW   r   
_precreate_write_desktop_file_maybe_register_mime_types_update_desktop_databaser   r   s    r7   rC   zLinuxMenuItem.create   sS    		-/  "'''6%%'{{}r8   c                     | j                         }| j                  d       |D ]%  }t        j                  d|       t	        |d       ' | j                          |S )NFr   zRemoving %sTrE   )r   r   rV   rW   r   r   rY   s      r7   rL   zLinuxMenuItem.remove   sX    '''7 	*DIImT*4D)	* 	%%'r8   c                     t        j                  d      }|r-t        |t        | j                  j
                        gd       y y )Nzupdate-desktop-databaseFcheck)r   whichr   rP   r   r2   )r3   exes     r7   r   z&LinuxMenuItem._update_desktop_database   s;    ll45c$))<<=> r8   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")" commandzbash -c z && )r   appendmetadatar   	conda_exe_is_micromambaprefixrb   r   
quote_argsshlexquote)r3   partsr   r   r   s        r7   _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(:;;;r8   c                    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      }|r0t        |      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)Nr\   zType=Applicationr]   r^   r0   zExec=z	Terminal=terminaliconzIcon=descriptionzComment=working_dirTrS   zPath=	platformslinuxglob_patterns;=r_   r   )r   r   rP   lowerr   r   rX   r   
isinstancer   listtuplerb   r`   r   ra   )r3   rc   r   r   r   keyvaluerd   s           r7   r   z!LinuxMenuItem._write_desktop_file   s   DOOF+,-DMMO$%DOOJ78>>@AB
 v&LL5!8 9:;oom4LL8DOOM$B#CDEoom4##D4#@LL5./$[1': 
	+C;);?;;OOC(E}%&E
((*ED%=1#-LLC5%)*
	+ $--% 	GGDIIe$%GGDM	 	 	s   72G22G;c                 R    | j                  d      }|sy | j                  ||       y )NMimeTyper   )r   _register_mime_types)r3   r   
mime_typess      r7   r   z(LinuxMenuItem._maybe_register_mime_types  s)    __Z0
!!*x!@r8   r   r   c                    | j                  d      xs i }|D ]*  }|j                  |      }|s| j                  |||       , |rFt        j                  d      }|st
        j                  d       t        |d| j                  g|       t        j                  d      }|r(t        |d| j                  j                  dz  gd	
       y y )Nr   )installxdg-mimez:xdg-mime not found, not registering mime types as default.defaultzupdate-mime-databasez-VmimeFr   )r   r+   _glob_pattern_for_mime_typer   r   rV   rW   r   r   r   r(   )r3   r   r   r   	mime_typeglob_patternxdg_mimeupdate_mime_databases           r7   r   z"LinuxMenuItem._register_mime_types  s    8>B# 	\I(,,Y7L00LRZ0[	\
 ||J/H		VW)T]]HZHI%||,BC%tTYY-E-E-NO  r8   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lenrV   rW   )r3   r   basename	xml_filesmsgs        r7   _xml_path_for_mime_typez%LinuxMenuItem._xml_path_for_mime_type(  s    $$S#.YY%%.?EE(SXFYZ
	 9~!S		#y)4Q<%%yy''&0:=8*D@QQSXXXr8   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_declarationNr   z--modez
--novendorr   zPCould not un/register MIME type %s with xdg-mime. Writing to '%s' as a fallback.)r   r   Element
SubElementrk   r   r`   r)   rB   rb   r   ra   r   r   r$   r0   r   rV   rW   )r3   r   r   r   xml_pathr   r   	mime_infomime_type_tagdescrrm   
subcommandtmprd   s                 r7   r   z)LinuxMenuItem._glob_pattern_for_mime_type4  s     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N JRSJJq7DJIJXtyy~~|UVU[U[\ J J  " 	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   )r3   rZ   r   r   r   r   s         r7   r   zLinuxMenuItem._paths]  sp    __Z06B
 	'D#;;DAHf2h6H6H6JJX&	' U|r8   N)T)r   r   r   r   r   r   r	   r)   r   rC   rL   r   rP   r   r   r   r   r   r
   r   r   r   r   r8   r7   r   r      s    =$ = =- - <# <%NAx}  (
Y 
YtTz9J 
Y  	'I'I 'I 	'I
 
'IR- r8   r   )!r   r)   r   r   r   loggingr   pathlibr   
subprocessr   tempfiler   typingr   r	   r
   	xml.etreer   utilsr   r   r   r   r   baser   r   r   r   rV   r   r   r   r8   r7   <module>r     s^    	      ) ' ( ( ! O O 3 3_0 _0DnH nr8   