
    .e;                         d 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mZ dd	lmZmZmZ d
dlmZmZ d
dlmZ d
dlmZmZmZmZ  ee           Z! G d de          Z" G d de          Z#dS )
    N)	getLogger)Path)CompletedProcess)NamedTemporaryFile)AnyDictOptionalTuple   )WinLex
logged_rununlink   )MenuMenuItem)folder_path)register_file_extensionregister_url_protocolunregister_file_extensionunregister_url_protocolc            
       D    e Zd Zdeej                 fdZdeej                 fdZede	fd            Z
ede	fd            Zede	fd            Zedeeef         f fd            Zd Z	 ddededeeeef                  def fdZdde	fdZdee	         fdZ xZS )WindowsMenureturnc                    t                               d| j                   | j                            dd           | j        r| j                            dd           | j        r| j                            dd           | j        fS )NzCreating %sTparentsexist_ok)logdebugstart_menu_locationmkdirquick_launch_locationdesktop_locationselfs    6lib/python3.11/site-packages/menuinst/platforms/win.pycreatezWindowsMenu.create   s    		-!9::: &&td&CCC% 	J&,,TD,III  	E!''t'DDD(**    c                     t                               d| j                   t          j        | j        d           | j        fS )NRemoving %sT)ignore_errors)r   r    r!   shutilrmtreer%   s    r'   removezWindowsMenu.remove#   s=    		-!9:::d.dCCCC(**r)   c                 ~    t          t          | j        dd                    |                     | j                  z  S )a   
        On Windows we can create shortcuts in several places:

        - Start Menu
        - Desktop
        - Quick launch (only for user installs)

        In this property we only report the path to the Start menu.
        For other menus, check their respective properties.
        Fstart)r   windows_folder_pathmoderendernamer%   s    r'   r!   zWindowsMenu.start_menu_location(   s6     '	5'BBCCdkkRVR[F\F\\\r)   c                     | j         dk    rt          j        d           d S t          t	          | j         dd                    S )Nsystemz>Quick launch menus are not available for system level installsFquicklaunch)r3   warningswarnr   r2   r%   s    r'   r#   z!WindowsMenu.quick_launch_location6   sB    9  MZ[[[F'	5-HHIIIr)   c                 H    t          t          | j        dd                    S )NFdesktop)r   r2   r3   r%   s    r'   r$   zWindowsMenu.desktop_location>   s    '	5)DDEEEr)   c                    t                      j        }|                    t          | j        dz            t          | j        dz            t          | j        dz            t          | j        dz            t          | j        dz            t          | j        dz  dz            t          |                                           dd           |S )NScriptsz
python.exezpythonw.exeLibrarybinico)SCRIPTS_DIRPYTHONPYTHONWBASE_PYTHONBASE_PYTHONWBIN_DIRSP_DIRICON_EXT)superplaceholdersupdatestrprefixbase_prefix_site_packages)r&   rK   	__class__s     r'   rK   zWindowsMenu.placeholdersB   s    ww+"4;#:;;dkL899t{]:;;"4#3l#BCC #D$4}$D E Et{Y6>??d113344!	 		
 	
 	
 r)   c           
      (   | j         dz  t          t          j                            dd                    | j         dz  dz  | j         dz  dz  t          t          j                            dd                    | j         dz  dz  | j         dz  dz  fS )	Nz
_conda.exe	CONDA_EXEz"C:\oops\a_file_that_does_not_existcondabinz	conda.batr@   	MAMBA_EXEzmicromamba.exe)rO   r   osenvirongetr%   s    r'   _conda_exe_path_candidatesz&WindowsMenu._conda_exe_path_candidatesS   s    |+-RSSTTz)K7u${2-RSSTTz),<<u$'77
 	
r)   FNvalueslugextrac                     t                                          |||          }t          |d          r&d|v r"|d         dk    r|                    dd          }|S )a?  
        We extend the render method here to replace forward slashes with backslashes.
        We ONLY do it if the string does not start with /, because it might
        be just a windows-style command-line flag (e.g. cmd /K something).

        This will not escape strings such as `/flag:something`, common
        in compiler stuff but we can assume such windows specific
        constructs will have their platform override, which is always an option.

        This is just a convenience for things like icon paths or Unix-like paths
        in the command key.
        )r[   r\   replace/r   \)rJ   r4   hasattrr^   )r&   rZ   r[   r\   rQ   s       r'   r4   zWindowsMenu.render^   s^     u4u==5)$$ 	-%(c//MM#t,,Er)   c                 .    || j         }| j         dz  dz  S )NLibzsite-packages)rN   )r&   rN   s     r'   rP   zWindowsMenu._site_packagesr   s     >[F{U"_44r)   c                     | j         fS N)r!   r%   s    r'   _pathszWindowsMenu._pathsw   s    (**r)   )FNre   )__name__
__module____qualname__r   rV   PathLiker(   r/   propertyr   r!   r#   r$   r	   rM   rK   rY   r   boolr
   r4   rP   rf   __classcell__)rQ   s   @r'   r   r      s       +bk* + + + ++bk* + + + +
 ]T ] ] ] X] Jt J J J XJ F$ F F F XF d38n      X 	
 	
 	
 QU  $5=d38n5M	     (5 5T 5 5 5 5
+d + + + + + + + +r)   r   c                   X   e Zd Zedefd            Zdeedf         fdZdeedf         fdZdeedf         fdZ	dde
fd	Zdefd
Zd Zde
fdZddeej                 defdZddee
         fdZd Zd Zd Zeddefd            Zeddefd            Zd Zd Zd Zd Zd ZdS ) WindowsMenuItemr   c                 D    | j         j        |                                 z  S )z
        Path to the .lnk file placed in the Start Menu
        On Windows, menuinst can create up to three shortcuts (start menu, desktop, quick launch)
        This property only lists the one for start menu
        )menur!   _shortcut_filenamer%   s    r'   locationzWindowsMenuItem.location|   s      y,t/F/F/H/HHHr)   .c                 Z   ddl m} |                                  |                                 }|D ]}|j        dk    s|                                 ^}}|                     d          }|r%t          |                              dd           nd}|                     d          pd	} ||| 	                    d	
          t          |          d                    |          ||d|                                            |                                  |                                  |S )Nr   )create_shortcutz.lnkworking_dirTr   z
%HOMEPATH%icon )ext r   )win_utils.winshortcutru   
_precreaterf   suffix_process_command
render_keyr   r"   rr   rM   join_app_user_model_id_register_file_extensions_register_url_protocols)r&   ru   pathspathtarget_path	argumentsrv   rw   s           r'   r(   zWindowsMenuItem.create   sK   :::::: 	 	D;&((&*&;&;&=&=#K)//-88K +[!!''t'DDDD*??6**0bD O''B'//D		##''))	 	 	 	 	&&((($$&&&r)   c                     |                                   |                                  |                                 }|D ].}t                              d|           t          |d           /|S )Nr+   T)
missing_ok)_unregister_file_extensions_unregister_url_protocolsrf   r   r    r   )r&   r   r   s      r'   r/   zWindowsMenuItem.remove   sq    ((***&&((( 	* 	*DIImT***4D)))))r)   c                      j         g}g } j        d         r|                     j        j                    j        d         r+ j        j        r|                     j        j                   |r| fd|D             z  } j        d         r'|                                                                t          |          S )Nr<   r8   c                 >    g | ]}|                                 z  S  )rr   ).0	directoryr&   s     r'   
<listcomp>z*WindowsMenuItem._paths.<locals>.<listcomp>   s*    XXX	i$"9"9";";;XXXr)   activate)rs   metadataappendrq   r$   r#   _path_for_scripttuple)r&   r   
extra_dirss   `  r'   rf   zWindowsMenuItem._paths   s    
=# 	:di8999=' 	?DI,K 	?di=>>> 	YXXXXZXXXXE=$ 	2LL..00111U||r)   lnkry   c                     | j         j        rd| j         j         dnd}|rd| nd}|                     di            | | S )Nz ()rx   .r5   )r\   )rq   env_namer   )r&   ry   
env_suffixs      r'   rr   z"WindowsMenuItem._shortcut_filename   sa    3793EM/$),////2
&i#iiiB//&/33FZFFFFr)   c                 l    t          | j        j        d                   |                     d          z  S )NMENU_DIRbat)r   rq   rK   rr   r%   s    r'   r   z WindowsMenuItem._path_for_script   s.    DI*:677$:Q:QRW:X:XXXr)   c                    |                      d          }|sd S t          dd          5 }|                    |           d d d            n# 1 swxY w Y   t          t          j                            dd                    dz  }t          |dz  d	z  d
z            d|j         dg}t          |d           t	          j
        |j                   d S )N	precreateFw)deleter3   
SystemRoot
C:\Windowssystem32WindowsPowerShellv1.0powershell.exe"start 'z' -WindowStyle hidden"Tcheck)r   r   writer   rV   rW   rX   rM   r5   r   r   )r&   precreate_codetmpr   cmds        r'   r|   zWindowsMenuItem._precreate   s   55 	Fu3777 	&3IIn%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&
|]CCDDzQ..7:JJKK9999
 	3d####
	#(s   AAAc           	         ddg}|                      d          }|r|                    |           | j        d         rW| j        j        }| j                            |          rd}nd}| j        j         d| d| j        j         d	}|d
d| dddgz  }|                    d                    t          j	        |                      d                                         d                    |          S )Nz	@ECHO OFFz%:: Script generated by conda/menuinst
precommandr   zshell activatezshell.cmd.exe activaterz   z ""z @SETLOCAL ENABLEDELAYEDEXPANSIONz%@FOR /F "usebackq tokens=*" %%i IN (`z`) do set "ACTIVATOR=%%i"z@CALL %ACTIVATOR%z!:: This below is the user commandcommandz
)
r   r   r   rq   	conda_exe_is_micromambarN   r   r   
quote_args)r&   linesr   r   r   	activators         r'   _commandzWindowsMenuItem._command   s   3
 __\22
 	%LL$$$=$ 		+Iy''	22 4+39.PPPPTY=MPPPI2\	\\\#3	 E 	SXXf/	0J0JKKLLMMM{{5!!!r)   Nscript_pathc                 (   ||                                  }nt          |          }|j                            dd           t	          |d          5 }|                    |                                            ddd           n# 1 swxY w Y   |S )z\
        This method generates the batch script that will be called by the shortcut
        NTr   r   )r   r   parentr"   openr   r   )r&   r   fs      r'   _write_scriptzWindowsMenuItem._write_script   s     //11KK{++K   ===+s## 	%qGGDMMOO$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% s   (BBBFc                    | j         d         r|                                 }| j         d         r"dddd| dg}|r|                    d           n]t          t          j                            dd	                    d
z  }|rdnd}d|dz   ddddddd|dz  dz  dz   dddd| d| dg
}|S |                     d          }|r.t          d |D                       r|                    d           t          j
        |          S )Nr   terminalr   /Dz/Kr   %1r   r   r   z%1 rx   zcmd.exe/CSTARTz/MINz""r   r   r   z-WindowStylehiddenr   z' z-WindowStyle hidden"r   c              3      K   | ]}d |vV  	dS )r   Nr   )r   args     r'   	<genexpr>z3WindowsMenuItem._process_command.<locals>.<genexpr>#  s&      @@T_@@@@@@r)   )r   r   r   r   rV   rW   rX   r   allr   r   )r&   	with_arg1scriptr   r   arg1s         r'   r~   z WindowsMenuItem._process_command  sY   =$ 	''))F}Z(  $m&mmm< )NN4(((
|] K KLLzY )1uur
 09,///U#66?BRRUUU"EEE$EEE N//),, 	!@@@@@@@ 	!NN4    )))r)   c                 >    |                      dd          }| d| S )Nr5   Tr[   z
.AssocFile)r   )r&   	extension
identifiers      r'   _ftype_identifierz!WindowsMenuItem._ftype_identifier'  s+    __V$_77
33	333r)   c                 f   | j         d         }|sdS d                    |                                           }t          t                              d |D                                 }|D ]D}|                     |          }|                     ||           |                     ||           EdS )H
        This function uses CMD's `assoc` and `ftype` commands.
        file_extensionsNrz   c                 6    g | ]}|                                 S r   lowerr   ry   s     r'   r   zAWindowsMenuItem._register_file_extensions_cmd.<locals>.<listcomp>3       "E"E"E3399;;"E"E"Er)   )associate_to)	r   r   r~   listdictfromkeysr   
_cmd_ftype
_cmd_assoc)r&   
extensionsr   extsry   r   s         r'   _register_file_extensions_cmdz-WindowsMenuItem._register_file_extensions_cmd+  s     ]#45
 	F((4002233DMM"E"E*"E"E"EFFGG 	: 	:C//44JOOJ000OOCjO9999	: 	:r)   c                     | j         d         }|sdS t          t                              d |D                                 }|D ],}|                     |          }|                     |           -dS )r   r   Nc                 6    g | ]}|                                 S r   r   r   s     r'   r   zCWindowsMenuItem._unregister_file_extensions_cmd.<locals>.<listcomp>@  r   r)   )r   r   r   r   r   r   r&   r   r   ry   r   s        r'   _unregister_file_extensions_cmdz/WindowsMenuItem._unregister_file_extensions_cmd9  s     ]#45
 	FDMM"E"E*"E"E"EFFGG 	( 	(C//44JOOJ''''	( 	(r)   c                     t          |||g          dk    rt          d          |                     d          st          d          |r|  d| }n|r| }n|r|  d}t          dddd	| gd
          S )zVhttps://learn.microsoft.com/en-us/windows-server/administration/windows-commands/assocr   z6Only one of {associate_to, query, remove} must be set.r   zextension must startwith '.'=r   r   r   assoc Tr   )sum
ValueError
startswithr   )r   r   queryr/   r   s        r'   r   zWindowsMenuItem._cmd_assocF  s     eV,--22UVVV##C(( 	=;<<< 	"////CC 	"CC 	"///C5$nsnn=TJJJJr)   c                     t          |||g          dk    rt          d          |r|  d| }n|r| }n|r|  d}t          dddd| gd	          S )
zVhttps://learn.microsoft.com/en-us/windows-server/administration/windows-commands/ftyper   z1Only one of {command, query, remove} must be set.r   r   r   r   r   Tr   )r   r   r   )r   r   r   r/   r   s        r'   r   zWindowsMenuItem._cmd_ftypeU  s     '((A--PQQQ 	#++'++CC 	#CC 	#"""C5$nsnn=TJJJJr)   c                 v   | j         d         }|sdS d                    |                     d                    }|                     d          }t	          t
                              d |D                                 }|D ]5}|                     |          }t          ||||| j	        j
                   6dS )	WIPr   Nrz   Tr   rw   c                 6    g | ]}|                                 S r   r   r   s     r'   r   z=WindowsMenuItem._register_file_extensions.<locals>.<listcomp>j  r   r)   rw   r3   )r   r   r~   r   r   r   r   r   r   rq   r3   )r&   r   r   rw   r   ry   r   s          r'   r   z)WindowsMenuItem._register_file_extensionsb  s    ]#45
 	F((40040@@AAv&&DMM"E"E*"E"E"EFFGG 	^ 	^C//44J#CW4din]]]]]	^ 	^r)   c                     | j         d         }|sd S t          t                              d |D                                 }|D ]3}|                     |          }t          ||| j        j                   4d S )Nr   c                 6    g | ]}|                                 S r   r   r   s     r'   r   z?WindowsMenuItem._unregister_file_extensions.<locals>.<listcomp>t  r   r)   r3   )r   r   r   r   r   r   rq   r3   r   s        r'   r   z+WindowsMenuItem._unregister_file_extensionso  s    ]#45
 	FDMM"E"E*"E"E"EFFGG 	L 	LC//44J%c:DINKKKKK	L 	Lr)   c                    | j         d         }|sdS d                    |                     d                    }|                     d          }|D ]5}|                     |          }t          ||||| j        j                   6dS )z~See https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914(v=vs.85)url_protocolsNrz   Tr   rw   r   )r   r   r~   r   r   r   rq   r3   )r&   	protocolsr   rw   protocolr   s         r'   r   z'WindowsMenuItem._register_url_protocolsy  s    M/2	 	F((40040@@AAv&&! 	a 	aH//99J!(GZdQUQZQ_`````	a 	ar)   c                     | j         d         }|sd S |D ]3}|                     |          }t          ||| j        j                   4d S )Nr   r   )r   r   r   rq   r3   )r&   r   r   r   s       r'   r   z)WindowsMenuItem._unregister_url_protocols  sg    M/2	 	F! 	O 	OH//99J#Hjty~NNNNN	O 	Or)   c                     |                      d          }|s6d|                      dd                              dd           d d         S |S )	Napp_user_model_idz	Menuinst.r5   Tr   r   rx      )r   r^   )r&   aumis     r'   r   z"WindowsMenuItem._app_user_model_id  s\    233 	[TtvDAAII#rRRTTUYVYUYZZr)   )r   re   )F)NFF) rg   rh   ri   rk   r   rs   r   r(   r/   rf   rM   rr   r   r|   r   r
   rV   rj   r   r~   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r)   r'   ro   ro   {   sX       I$ I I I XI%dCi( % % % %N	dCi( 	 	 	 	dCi(    "G Gc G G G G
Y$ Y Y Y Y  "# " " " "4 "+)> $    * *5: * * * *@4 4 4: : :
( 
( 
( K KO_ K K K \K 
K 
KK[ 
K 
K 
K \
K^ ^ ^L L L	a 	a 	aO O O    r)   ro   )$__doc__rV   r-   r9   loggingr   pathlibr   
subprocessr   tempfiler   typingr   r	   r
   r   utilsr   r   r   baser   r   win_utils.knownfoldersr   r2   win_utils.registryr   r   r   r   rg   r   r   ro   r   r)   r'   <module>r     s    				               ' ' ' ' ' ' ' ' ' ' ' ' - - - - - - - - - - - - . . . . . . . . . .                 F F F F F F            i_+ _+ _+ _+ _+$ _+ _+ _+DU U U U Uh U U U U Ur)   