
    .e6                         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 dS )
    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                 V    t                      j        |i | | j        dk    r| j        | _        | j        | _        nt          t          j	        
                    dd                                                    | _        t          t          j	        
                    dd                                                    | _        | j        dz  dz  | _        | j        dz  dz  | _        | j        dz  |                     | j        d	
           dz  | _        | j        dz  | _        d S )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.11/site-packages/menuinst/platforms/linux.pyr#   zLinuxMenu.__init__   s1   $)&)))9  $($AD!"&"=D$(
0+>>% %jll ! #'
0@AA# #jll  )G36II 	( %)$9G$CFY$Y! #$TYT22>>>? 	%
 )-(;n(L%%%    returnc                     |                                   |                                 }|                                 r|                                 r|fS |                                  |                                  |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   s~    &&(((**,,##%% 	$*=*=*?*? 	7N   wr8   c                    t          | j        d           t          j        | j                  D ]>}|                    |                     | j        d           d          r
| j        fc S ?|                                  | j        fS )NT
missing_okr   _)	r   r1   r)   listdirr2   
startswithr/   r0   _remove_this_menu)r3   fns     r7   removezLinuxMenu.removeB   s    t,>>>>*T:;; 	8 	8B}}DID A ADDDEE 8577778 	   -//r8   c                 v    t                      j        }t          |                                           |d<   |S )NSP_DIR)r"   placeholdersstr_site_packages)r3   rO   r6   s     r7   rO   zLinuxMenu.placeholdersK   s3    ww+!$T%8%8%:%:!;!;Xr8   c                     | j         dz  | j        dz  | j        dz  g}|D ]4}t                              d|           |                    dd           5d S )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   st    !G+"77.0

  	4 	4DII/666JJtdJ3333	4 	4r8   c                 <   dddd|                      | j                   g}t                              d| j                   t          | j        d          5 }|                    d                    |                     d d d            n# 1 swxY w Y   | j        S )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	**,,	
 			143PQQQ$/55 	&GGDIIe$$%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& ,,s   )BBBc                 v   t                               d| j        | j                   t	          j        | j                  }|                                }|                    d          D ]:}|                    d          j	        | j        k    r|
                    |           ;|                     |           d S )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    		2D4MtyYYY !:;;||~~<<'' 	! 	!Cxx$	11C   d#####r8   c                      t          j         j                                                  }t	           fd|                    d          D                       S )Nc              3   8   K   | ]}|j         j        k    V  d S r;   )rk   r0   ).0er3   s     r7   	<genexpr>z+LinuxMenu._has_this_menu.<locals>.<genexpr>{   s,      JJ116TY&JJJJJJr8   z	Menu/Name)r   rg   r.   rh   anyri   r3   rn   s   ` r7   r?   zLinuxMenu._has_this_menuy   sQ     !:;;CCEEJJJJ[0I0IJJJJJJr8   c                    t                               d| j        | j                   t	          j        | j                  }|                                }t          |d          }t          |d| j                   t          |d|                     | j        d           d           t          |d          }t          |d	| j                   | 	                    |           d S )
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    		/1JDIVVV !:;;||~~ v..h	222hDID0Q0Q-]-]-]^^^)44gz49555d#####r8   c                     	 t          j        | j                                                  }|d uo
|j        dk    S # t
          $ r Y dS w xY w)Nr   F)r   rg   r.   rh   tag	Exceptionrv   s     r7   r>   zLinuxMenu._is_valid_menu_file   s_    	$T%>??GGIIDt#:F(:: 	 	 	55	s   9< 
A
	A
rm   c                    t                               d| j                   t          |                                           t          | j        d          5 }|                    d           |                    d           |                    |           |                    d           d d d            d S # 1 swxY w Y   d S )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:::'''$+T22 	aGGQRRRGGTUUUJJqMMMGGENNN		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AB99B= B=c                    | j                                         r1| j                                         st          d| j          d          | j                                         rkt	          j        d          }| j          d| }t          j        | j         |           |                                 st          j
        | j                    d S d S |                                  d S )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    $++-- 	cd6O6W6W6Y6Y 	cat7Paaabbb $,,.. 		"}%899H"&";HHhHHOD57GHHH++-- 5	$3444445 5 !!!!!r8   c                 H   t                               d| j                   t          | j        d          5 }|                    d           | j        dk    r|                    d| j         d           |                    d           d d d            d S # 1 swxY w Y   d S )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1 	!QGG5666yF""bD4TbbbcccGGK   		! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   AB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          $tK00!T,//M M M M M4bk*    0bk* 0 0 0 0 d38n      X
4 4 4- - - - -"$ $ $K K K K K	$ 	$ 	$T    [    " " "$! ! !0c
 0 0 0 0 0 0 0 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dS )LinuxMenuItemr9   c                     |                      | j        j        di           }| d|                     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   sW    kk$).t2kFF "ZZDOOFRO$P$PZZZy1H<<r8   c                    t                               d| j                   |                                  |                                  |                     d           |                                  |                                 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   sq    		-///  """'''666%%'''{{}}r8   c                     |                                  }|                     d           |D ].}t                              d|           t	          |d           /|                                  |S )NFr   zRemoving %sTrE   )r   r   rV   rW   r   r   rY   s      r7   rL   zLinuxMenuItem.remove   sv    '''777 	* 	*DIImT***4D)))))%%'''r8   c                     t          j        d          }|r,t          |t          | j        j                  gd           d S d S )Nzupdate-desktop-databaseFcheck)r   whichr   rP   r   r2   )r3   exes     r7   r   z&LinuxMenuItem._update_desktop_database   s]    l455 	c$)<==>     	 	r8   c           	         g }|                      d          }|r|                    |           | j        d         rT| j        j        }| j                            |          rd}nd}|                    d| d| d| j        j         d           |                    d	                    t          j	        |                      d
                                         dt          j        d                    |                    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2
 	%LL$$$=$ 	U	+Iy''	22 1+0LLSYSS(SSdi>NSSSTTTSXXg01K1KLLMMNNNEKE(:(:;;;;r8   c                    dddd|                      d           d|                                  dt          |                      d                                                     g}|                      d	          }|r+|                    d
|                      d	                      |                      d          }|r+|                    d|                      d                      |                      d          }|r<t          |                              dd           |                    d|            t          d         d         D ]}|g t          dR v r|                      |          }|)t          |t                    r"t          |                                          }n4t          |t          t          f          rd                    |          dz   }|                    | d|            t          | j        d          5 }|                    d                    |                     |                    d           d d d            d S # 1 swxY w Y   d S )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++--%DMMOO%%BDOOJ7788>>@@BB
 v&& 	<LL:!8!8::;;;oom44 	FLLDDOOM$B$BDDEEEoom44 	0##D4#@@@LL...///$[1': 
	+ 
	+C;);?;;;;OOC((E}%&& .E

((**ED%=11 .#-LLC))%))****$-%% 	GGDIIe$$%%%GGDMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   >I""I&)I&Tc                 f    |                      d          }|sd S |                     ||           d S )NMimeTyper   )r   _register_mime_types)r3   r   
mime_typess      r7   r   z(LinuxMenuItem._maybe_register_mime_types  s?    __Z00
 	F!!*x!@@@@@r8   r   r   c                    |                      d          pi }|D ]1}|                    |          }|r|                     |||           2|rIt          j        d          }|st
                              d           t          |d| j        g|           t          j        d          }|r#t          |d| j	        j
        dz  gd	
           d S d S )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8>B# 	\ 	\I(,,Y77L \00LRZ0[[[ 	J|J//H X		VWWW)T]HZHIII%|,BCC 	%tTY-E-NO     	 	r8   r   c                 H   |                     dd          }t          | j        j        dz  dz                      d| d                    }|r;t          |          dk    rd}t                              |||           |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#..Y%.?EEFY(FYFYFYZZ
 
	  	&9~~!!S		#y)444Q<%%y'&0:=8@Q@Q@QQSXXXr8   r   r   c           	      `   |                      |          \  }}|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        	                    |t          j        
                    |                    d          5 }|
                    |dd           ddd           n# 1 swxY w Y   t          d|d| j        j        d|j        gd           ddd           dS # 1 swxY w Y   dS # t           $ r8 t"                              d||           |
                    |dd           Y dS 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  ss     77	BB& 	O H'5AAA	#.y+IVVV}flKKKKcIcc\ccc@E}i88=&y11"):YY{
	I#%% "',,sBG,<,<X,F,FGGNN JRSJJq7DJIIIJ J J J J J J J J J J J J J JXty~|UVU[\                     " 	I 	I 	IIIb  
 JJx'4JHHHHHH	Is[   !E+ /AE;D E D$	$E'D$	()EE+ E""E+ %E"&E+ +>F-,F-c                     | j         g}|                     d          pd}|D ]G}|                     |          \  }}|r+d|                                v r|                    |           Ht          |          S )Nr    zregistered by menuinst)r   r   r   	read_textr   r   )r3   rZ   r   r   r   r   s         r7   r   zLinuxMenuItem._paths]  s    __Z006B
 	' 	'D#;;DAAHf '2h6H6H6J6JJ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       =$ = = = X=-    -      <# < < < <% % %NA A A A x}     (
Y 
YtTz9J 
Y 
Y 
Y 
Y  	'I 'I'I 'I 	'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     ss    				                ) ) ) ) ) ) ' ' ' ' ' ' ( ( ( ( ( ( ( ( ( ( ! ! ! ! ! ! O O O O O O O O O O O O O O 3 3 3 3 3 3 3 3 3 3i_0 _0 _0 _0 _0 _0 _0 _0Dn n n n nH n n n n nr8   