
     [1f;                         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#y)
    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            
           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         j                  d| j                         | j                  j                  dd       | j                  r| j                  j                  dd       | j
                  r| j
                  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.12/site-packages/menuinst/platforms/win.pycreatezWindowsMenu.create   s    		-!9!9:  &&td&C%%&&,,TD,I  !!''t'D((**    c                     t         j                  d| j                         t        j                  | j                  d       | j                  fS )NRemoving %sT)ignore_errors)r   r    r!   shutilrmtreer%   s    r'   removezWindowsMenu.remove#   s9    		-!9!9:d..dC((**r)   c                 z    t        t        | j                  dd            | j                  | 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(   s2     '		5'BCdkkRVR[R[F\\\r)   c                     | j                   dk(  rt        j                  d       y 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   s7    99 MMZ['		5-HIIr)   c                 B    t        t        | j                  dd            S )NFdesktop)r   r2   r3   r%   s    r'   r$   zWindowsMenu.desktop_location>   s    '		5)D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        | j                               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    w+"4;;#:;dkkL89t{{]:;"4#3#3l#BC #D$4$4}$D Et{{Y6>?d1134!		
 r)   c           
      J   | j                   dz  t        t        j                  j	                  dd            | j                   dz  dz  | j                   dz  dz  t        t        j                  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Tz)K7u${2-RSTz),<<u$'77
 	
r)   valueslugextrac                     t         |   |||      }t        |d      rd|v r|d   dk7  r|j                  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^   sH     u4u=5)$%(c/MM#t,Er)   c                 B    || 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   +bkk* ++bkk* +
 ]T ] ] Jt J J F$ F F d38n   	
 QU $5=d38n5M	(5T 5
+d +r)   r   c                   0   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y)WindowsMenuItemr   c                 P    | j                   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"     yy,,t/F/F/HHHr)   .c                    ddl m} | j                          | j                         }|D ]  }|j                  dk(  s| j                         ^}}| j                  d      }|rt        |      j                  dd       nd}| j                  d      xs d	} ||| j                  d	
      t        |      dj                  |      ||d| j                                 | j                          | j                          |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   s    : 	D;;&(&*&;&;&=#K)//-8K[!''t'D*??6*0bD ''B'/D	#'')	#	8 	&&($$&r)   c                     | j                          | j                          | j                         }|D ]%  }t        j	                  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   sS    ((*&&( 	*DIImT*4D)	* r)   c                    | j                   g}g }| j                  d   r%|j                  | j                  j                         | j                  d   r;| j                  j
                  r%|j                  | j                  j
                         |r$||D cg c]  }|| j                         z   c}z  }| j                  d   r|j                  | j                                t        |      S c c}w )Nr<   r8   activate)	rs   metadataappendrq   r$   r#   rr   _path_for_scripttuple)r&   r   
extra_dirs	directorys       r'   rf   zWindowsMenuItem._paths   s    
==#dii889=='DII,K,Kdii==>ZX	i$"9"9";;XXE==$LL..01U| Ys   C-ry   c                     | j                   j                  rd| j                   j                   dnd}|rd| nd}| j                  di        | | S )Nz ()rx   .r5   )r\   )rq   env_namer   )r&   ry   
env_suffixs      r'   rr   z"WindowsMenuItem._shortcut_filename   sY    37993E3Er$)),,-Q/2
#iB//&/34ZLFFr)   c                 j    t        | j                  j                  d         | j                  d      z  S )NMENU_DIRbat)r   rq   rK   rr   r%   s    r'   r   z WindowsMenuItem._path_for_script   s-    DII**:67$:Q:QRW:XXXr)   c                    | j                  d      }|sy t        dd      5 }|j                  |       d d d        t        t        j
                  j                  dd            dz  }t        |dz  d	z  d
z        dj                   dg}t        |d       t	        j                  |j                         y # 1 sw Y   xY w)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u37 	&3IIn%	&

|]CDzQ..7:JJKz!89
 	3d#
		#((	& 	&s   B99Cc           	         ddg}| j                  d      }|r|j                  |       | j                  d   rv| j                  j                  }| j                  j                  |      rd}nd}| j                  j                   d| d| j                  j                   d	}|d
d| dddgz  }|j                  dj                  t        j                  | j                  d                         dj                  |      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
LL$==$		++Iyy''	2+399../q
"TYY=M=M<NaPI27	{B[\#3	 E 	SXXf//	0JKLM{{5!!r)   Nscript_pathc                     || j                         }nt        |      }|j                  j                  dd       t	        |d      5 }|j                  | j                                ddd       |S # 1 sw Y   |S xY w)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   sy     //1K{+K   =+s# 	%qGGDMMO$	% 	% s    A22A<c                    | j                   d   r| j                         }| j                   d   rdddd| dg}|r|j                  d       |S t        t        j
                  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 | j                  d      }|r#t        d |D              r|j                  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 
 yw)r   N ).0args     r'   	<genexpr>z3WindowsMenuItem._process_command.<locals>.<genexpr>#  s     @T_@s   )r   r   r   r   rV   rW   rX   r   allr   r   )r&   	with_arg1scriptr   r   arg1s         r'   r~   z WindowsMenuItem._process_command  s!   ==$'')F}}Z( $&m<NN4(& N#  

|] KLzY )ur
 9,-Q/#66?BRRSSTU"xr$/DE N//),@@@NN4   ))r)   c                 6    | j                  dd      }| d| S )Nr5   Tr[   z
.AssocFile)r   )r&   	extension
identifiers      r'   _ftype_identifierz!WindowsMenuItem._ftype_identifier'  s%    __V$_7
Z	{33r)   c           	      ^   | j                   d   }|sydj                  | j                               }t        t        j                  |D cg c]  }|j                          c}            }|D ]8  }| j                  |      }| j                  ||       | j                  ||       : yc c}w )H
        This function uses CMD's `assoc` and `ftype` commands.
        file_extensionsNrz   )associate_to)
r   r   r~   listdictfromkeyslowerr   
_cmd_ftype
_cmd_assoc)r&   
extensionsr   ry   extsr   s         r'   _register_file_extensions_cmdz-WindowsMenuItem._register_file_extensions_cmd+  s     ]]#45
((40023DMM*"E3399;"EFG 	:C//4JOOJ0OOCjO9	: #Fs   
B*c           	          | j                   d   }|syt        t        j                  |D cg c]  }|j	                          c}            }|D ]$  }| j                  |      }| j                  |       & yc c}w )r   r   N)r   r   r   r   r   r   r   r&   r   ry   r   r   s        r'   _unregister_file_extensions_cmdz/WindowsMenuItem._unregister_file_extensions_cmd9  sn     ]]#45
DMM*"E3399;"EFG 	(C//4JOOJ'	( #Fs   A7c                     t        |||g      dk7  rt        d      | j                  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UVV##C(;<<Kq/CCKq/C5$sen=TJJr)   c                     t        |||g      dk7  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  sj     '(A-PQQL'+CCL"C5$sen=TJJr)   c           	         | j                   d   }|sydj                  | j                  d            }| j                  d      }t	        t
        j                  |D cg c]  }|j                          c}            }|D ]7  }| j                  |      }t        ||||| j                  j                         9 yc c}w )WIPr   Nrz   Tr   rw   rw   r3   )r   r   r~   r   r   r   r   r   r   r   rq   r3   )r&   r   r   rw   ry   r   r   s          r'   r   z)WindowsMenuItem._register_file_extensionsb  s    ]]#45
((40040@Av&DMM*"E3399;"EFG 	^C//4J#CW4diinn]	^ #Fs   B<c           	         | j                   d   }|sy t        t        j                  |D cg c]  }|j	                          c}            }|D ]5  }| j                  |      }t        ||| j                  j                         7 y c c}w )Nr   r3   )	r   r   r   r   r   r   r   rq   r3   r   s        r'   r   z+WindowsMenuItem._unregister_file_extensionso  sv    ]]#45
DMM*"E3399;"EFG 	LC//4J%c:DIINNK	L #Fs   Bc                    | j                   d   }|sydj                  | j                  d            }| j                  d      }|D ]7  }| j	                  |      }t        ||||| j                  j                         9 y)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~    MM/2	((40040@Av&! 	aH//9J!(GZdQUQZQZQ_Q_`	ar)   c                     | j                   d   }|sy |D ]5  }| j                  |      }t        ||| j                  j                         7 y )Nr   r   )r   r   r   rq   r3   )r&   r   r   r   s       r'   r   z)WindowsMenuItem._unregister_url_protocols  sK    MM/2	! 	OH//9J#Hjtyy~~N	Or)   c                 ~    | j                  d      }|s)d| j                  dd      j                  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  sJ    23tvDAII#rRSTUYVYZZr)   )lnkre   )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   {   s"   I$ I I%dCi( %N	dCi( 	dCi( "Gc G
Y$ Y"# "4"++)> $ *5: *@4:
( KO_ K K 
KK[ 
K 
K^L	a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     sd    	     ' ' - - . .   F  _+$ _+DUh Ur)   