
    ͈2g3                         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mZmZ ddlmZ dd	l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ddZy)
    N)sha1)	getLogger)Path)DictOptionalTuple   )data)UnixLex
logged_run   )MenuMenuItemmenuitem_defaultsc                   \     e Zd ZdefdZdefdZedeeef   f fd       Z	defdZ
 xZS )	MacOSMenureturnc                 "    | j                         S N_pathsselfs    6lib/python3.12/site-packages/menuinst/platforms/osx.pycreatezMacOSMenu.create       {{}    c                 "    | j                         S r   r   r   s    r   removezMacOSMenu.remove   r   r   c                     t         |   }|j                  t        | j	                               dt        | j
                  dz  dz  dz  dz        d       |S )Nicnsz
python.appContentsMacOSpython)SP_DIRICON_EXT	PYTHONAPP)superplaceholdersupdatestr_site_packagesprefix)r   r*   	__class__s     r   r*   zMacOSMenu.placeholders   s]    w+d1134" |!;j!H7!RU]!]^	
 r   c                      y)N r1   r   s    r   r   zMacOSMenu._paths'   s    r   )__name__
__module____qualname__r	   r   r    propertyr   r,   r*   r   __classcell__r/   s   @r   r   r      sJ       	d38n 	 	 r   r   c                   F    e Zd Zedefd       Zedefd       Zedefd       ZdefdZ	 fdZ
dee   fdZdee   fdZdee   fd	Zd
 Zd Zd ZdefdZddeej*                     dej*                  fdZddeej*                     dej*                  fdZddeej*                     dej*                  fdZddeej*                     dej*                  fdZdeej*                     fdZdefdZdefdZddedefdZddedefdZddZd Z ede!fd       Z" xZ#S ) MacOSMenuItemr   c                 B    | j                         dz  | j                  z  S )z1Path to the .app directory defining the menu itemApplications)_base_location_bundle_namer   s    r   locationzMacOSMenuItem.location,   s#     ""$~58I8IIIr   c                 .    | j                  di        dS )Nname)extraz.app)
render_keyr   s    r   r=   zMacOSMenuItem._bundle_name1   s    //&/34D99r   c                 @    | j                   dz  dz  | j                  z  S )zAPath to the nested .app directory defining the menu item main appr#   	Resources)r>   r=   r   s    r   _nested_locationzMacOSMenuItem._nested_location5   s#     }}z)K7$:K:KKKr   c                 |    | j                   j                  dk(  rt        d      j                         S t        d      S )Nuser~/)menumoder   
expanduserr   s    r   r<   zMacOSMenuItem._base_location:   s/    99>>V#9''))Cyr   c                    t         |           | j                  d   xs i j                         D ]  \  }}| j                  | j                  |      z  j                         }t        |      j                  t        | j                              st        d| j                   d| d      |j                  j                  dd       t        j                  | j                  |      |        y )Nlink_in_bundlezF'link_in_bundle' destinations MUST be created inside the .app bundle (z), but it points to '.Tparentsexist_ok)r)   
_precreatemetadataitemsr>   renderresolver,   
startswith
ValueErrorparentmkdirossymlink)r   srcdestrendered_destr/   s       r   rS   zMacOSMenuItem._precreate?   s    --(89?RFFHIC#'==4;;t3D#D"M"M"OM}%00T]]1CD //3}}o=RS`Raabd    &&td&CJJt{{3'7 Ir   c                 &   | j                   j                         rd| j                    d}t        |      t        j	                  d| j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                   fS )NzApp already exists at z. Please remove the existing shortcut before installing. If you used conda to install this package, reinstall the package with --force-reinstall to create the shortcut once the location is cleared.zCreating %s)r>   existsRuntimeErrorlogdebug_create_application_treerS   
_copy_icon_write_pkginfo_write_plistinfo_write_appkit_launcher_write_launcher_write_script_write_event_handler#_maybe_register_with_launchservices_sign_with_entitlements)r   messages     r   r   zMacOSMenuItem.createL   s    ==!( 8D D  w''		-/%%'##%!!#002$$&r   c                     t         j                  d| j                         | j                  d       t	        j
                  | j                  d       | j                  fS )NzRemoving %sF)registerT)ignore_errors)rd   re   r>   rn   shutilrmtreer   s    r   r    zMacOSMenuItem.removed   sD    		-/00%0@dmm48r   c                     | j                   dz  dz  | j                   dz  dz  g}| j                  r'|| j                  dz  dz  | j                  dz  dz  gz  }|D ]  }|j                  dd        t	        |      S )Nr#   rD   r$   TFrP   )r>   _needs_appkit_launcherrE   r[   tuple)r   pathspaths      r   rf   z&MacOSMenuItem._create_application_treej   s    MMJ&4MMJ&0
 &&%%
2[@%%
2W< E DJJteJ4 U|r   c                     | j                  d      }|rZt        j                  || j                  dz  dz         | j                  r't        j                  || j
                  dz  dz         y y y )Niconr#   rD   )rB   rt   copyr>   rw   rE   )r   r|   s     r   rg   zMacOSMenuItem._copy_iconx   s`    v&KKdmmj8;FG**D$"7"7*"D{"RS + r   c           	         | j                   g}| j                  r|j                  | j                         |D ]E  }t	        |dz  dz  d      5 }|j                  d| j                  dd      d d         d d d        G y # 1 sw Y   RxY w)	Nr#   PkgInfowAPPLr@   Tslug   )r>   rw   appendrE   openwriterB   )r   app_bundlesappfs       r   rh   zMacOSMenuItem._write_pkginfo   s    }}o&&t445CcJ&2C8A$tvDA"1EFGH 98 88s   )B  B		c           	      6   | j                  d      }| j                  dd      }t        |      dkD  r1|d d t        |j                               j	                         d d z   }n|}|||| dd| d	d
d
d}| j                  d      }|rt        |      j                  |d<   | j                  rIt        | j                  dz  dz  d      5 }t        j                  ||       d d d        d|d<   d| d|d<   g t        dd}t        d   d   D ]4  }||v r| j                  |      }	|	|dk(  r|	|d<   | d|	 |d<   |	||<   6 t        | j                  dz  dz  d      5 }t        j                  ||       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr@   Tr      
      z-1.0.0com.r   z1.0.0)CFBundleNameCFBundleDisplayNameCFBundleExecutableCFBundleGetInfoStringCFBundleIdentifierCFBundlePackageTypeCFBundleVersionCFBundleShortVersionStringr|   CFBundleIconFiler#   z
Info.plistwbLSBackgroundOnlyz-appkit-launcherr   entitlementsrN   	platformsosxr   r   -r   )rB   lenr   encode	hexdigestr   r@   rw   r   rE   plistlibdumpr   r>   )
r   r@   slugname	shortnameplr|   r   ignore_keyskeyvalues
             r   ri   zMacOSMenuItem._write_plistinfo   s   v&??6?5x=2 "X__->(?(I(I(KBQ(OOI I%#'"*(0z%8$(
"3#)&*1	
 v&%)$Z__B!"&&d++j8<GNRSb!$ O &*B!")-hZ7G'HB#$ M)L>L;KL$[1%8Ck!OOC(E}''38/019
!E7.C*+BsG 9 $--*,|;TBaMM"a  CB' ON& CBs   
F#FFFc           	         dg}| j                  d      r|j                  g d       | j                  d      }|rNt        t        j                  j                  |            j                  dd       |j                  d| d       | 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j                  |      S )Nz	#!/bin/shterminal)z@if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; thenz#    open -b com.apple.terminal "$0"z    exit $?fiworking_dirTrP   zcd ""
precommandactivatezshell activatezshell.bash activatez	eval "$("z" z "z")" commandr   )rB   extendr   r\   rz   
expandvarsr[   r   rT   rJ   	conda_exe_is_micromambar.   joinr   
quote_args)r   linesr   r   r   r   s         r   _commandzMacOSMenuItem._command   s/   ??:& LL oom4##K0177t7TLL4}A./__\2
LL$==$		++Iyy''	2+0LL9YKr(2dii>N>N=OsSTSXXg001KLMNyyr   launcher_pathc                     || j                         }t        j                  | j                         |       t	        j
                  |d       |S N  )_default_appkit_launcher_pathrt   r}   _find_appkit_launcherr\   chmodr   r   s     r   rj   z$MacOSMenuItem._write_appkit_launcher   sA      >>@MD..0-@
&r   c                     || j                         }t        j                  | j                         |       t	        j
                  |d       |S r   )_default_launcher_pathrt   r}   _find_launcherr\   r   r   s     r   rk   zMacOSMenuItem._write_launcher   sA      779MD'')=9
&r   script_pathc                     || j                  d      }t        |d      5 }|j                  | j                                d d d        t	        j
                  |d       |S # 1 sw Y   !xY w)Nz-script)suffixr   r   )r   r   r   r   r\   r   )r   r   r   s      r   rl   zMacOSMenuItem._write_script   s[    55Y5GK+s#qGGDMMO$ $
e$ $#s    A!!A*c                    | j                   sy | j                  d      }|y || j                  dz  dz  dz  }t        |d      5 }|j	                  d| d       d d d        t        j                  |d       |S # 1 sw Y   !xY w)	Nevent_handlerr#   rD   zhandle-eventr   z#!/bin/bash
r   r   )rw   rB   r>   r   r   r\   r   )r   r   event_handler_logicr   s       r   rm   z"MacOSMenuItem._write_event_handler   s    **"ooo>&--*4{B^SK+s#qGGm$7#8;< $
e$ $#s   A;;Bc                     | j                   fS r   )r>   r   s    r   r   zMacOSMenuItem._paths   s    r   c                 (   dt        j                          }t        j                  D ]I  }t	        |      |z  }|j                         s"t        j                  |t        j                        sG|c S  t        dt        j                                )Nappkit_launcher_'Could not find executable launcher for 
platformmachine_menuinst_data__path__r   is_filer\   accessX_OKrY   r   launcher_namedatapathr   s       r   r   z#MacOSMenuItem._find_appkit_launcher   sx    *8+;+;+=*>?&//H N]:M$$&299]BGG+L$$ 0 B8CSCSCUBVWXXr   c                 (   dt        j                          }t        j                  D ]I  }t	        |      |z  }|j                         s"t        j                  |t        j                        sG|c S  t        dt        j                                )Nosx_launcher_r   r   r   s       r   r   zMacOSMenuItem._find_launcher  sx    '(8(8(:';<&//H N]:M$$&299]BGG+L$$ 0 B8CSCSCUBVWXXr   r   c                 Z    | j                  dd      }| j                  dz  dz  | | z  S Nr@   Tr   r#   r$   )rB   r>   r   r   r@   s      r   r   z+MacOSMenuItem._default_appkit_launcher_path  s6    vD1}}z)G3vh6GGGr   c                     | j                  dd      }| j                  r| j                  dz  dz  | | z  S | j                  dz  dz  | | z  S r   )rB   rw   rE   r>   r   s      r   r   z$MacOSMenuItem._default_launcher_path  sc    vD1&&((:5?TF6(BSSS}}z)G3vh6GGGr   c                     | j                   sy |r t        dt        | j                               y t        dddt        | j                               y )Nz-Rz-uz-all)rw   _lsregisterr,   r>   )r   rr   s     r   rn   z1MacOSMenuItem._maybe_register_with_launchservices  s;    **c$--01dFC,>?r   c                 \   | j                  d      }|sy| j                  dd      }|D ci c]  }|d }}| j                  dz  dz  }t        |d      5 }t        j                  ||       ddd       t        d	d
dddd| ddddd|| j                  gd       yc c}w # 1 sw Y   6xY w)z1Self-sign shortcut to apply required entitlementsr   Nr@   Tr   r#   zEntitlements.plistr   z/usr/bin/codesignz	--verbosez--signr   z--prefixr   z	--optionsruntimez--forcez--deepz--entitlementscheck)rB   r>   r   r   r   r   )r   entitlement_keysr   r   plistentitlements_pathr   s          r   ro   z%MacOSMenuItem._sign_with_entitlements!  s    ??>:??6?5&67&6sd&67 MMJ69MM#T*aMM%# + $xj! !  #	
	 8**s   
BB""B+c                 J    t        | j                  j                  d            S )a  
        In macOS, file type and URL protocol associations are handled by the
        Apple Events system. When the user opens on a file or URL, the system
        will send an Apple Event to the application that was registered as a handler.
        Some apps might not have the needed listener to process the event. In that case,
        we provide a generic one. This is decided by the presence of "event_handler".
        If that key is absent or null, we assume the app has its own listener.

        See:
        - https://developer.apple.com/library/archive/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCConcepts/LSCConcepts.html  # noqa
        - The source code at /src/appkit-launcher in this repository
        r   )boolrT   getr   s    r   rw   z$MacOSMenuItem._needs_appkit_launcher?  s     DMM%%o677r   r   ) )T)$r2   r3   r4   r5   r   r>   r,   r=   rE   r<   rS   r	   r   r    rf   rg   rh   ri   r   r   r\   PathLikerj   rk   rl   rm   r   r   r   r   r   rn   ro   r   rw   r6   r7   s   @r   r9   r9   +   s   J$ J J :c : : L$ L L 
8 d  0 d  %+ TI,!\! # ! FHR[[4I UWU`U` Xbkk-B bkk "++)> "++ 0E QSQ\Q\  bkk*  Yt YY YHC H HHS H$ H@
< 8 8 8r   r9   Tr   c                 (    d}t        |g|fd| i|S )Nzh/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregisterr   )r   )r   argskwargsexes       r   r   r   P  s*    	B  slTl:%:6::r   )__doc__r\   r   r   rt   hashlibr   loggingr   pathlibr   typingr   r   r	   r   r   r   utilsr   r   baser   r   r   r2   rd   r   r9   r   r1   r   r   <module>r      sb    
       ( ( % ' 3 3 .b8H b8J	 " ;r   