o
    ŸŽ°añ<  ã                   @   s´   d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ e
jdkr:dZndZeejddd	�eƒZd
d„ Zdd„ ZdZG dd„ deƒZdS )é    )Úprint_functionÚabsolute_importN)ÚSqliteDatabaseÚ3ÚgettextÚugettextzcommand-not-foundT)Úfallbackc                    sv   d‰ ‡fdd„t tˆƒd ƒD ƒ}dd„ |D ƒ}dd„ |D ƒ}‡ fdd„|D ƒ}‡ fdd„|D ƒ}t|| | | ƒS )	zw
    return a set with spelling1 distance alternative spellings

    based on http://norvig.com/spell-correct.html
    z&abcdefghijklmnopqrstuvwxyz-_0123456789c                    s$   g | ]}ˆ d |… ˆ |d … f‘qS ©N© )Ú.0Úi)Úwordr
   úA/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.pyÚ
<listcomp>#   ó   $ z!similar_words.<locals>.<listcomp>é   c                 S   s$   g | ]\}}|r||d d…  ‘qS ©r   Nr
   ©r   ÚaÚbr
   r
   r   r   $   r   c                 S   s<   g | ]\}}t |ƒd kr||d   |d  |dd…  ‘qS )r   r   é   N©Úlenr   r
   r
   r   r   %   s   < c                    s2   g | ]\}}ˆ D ]}|r|| |d d…  ‘qqS r   r
   ©r   r   r   Úc©Úalphabetr
   r   r   &   s   2 c                    s&   g | ]\}}ˆ D ]}|| | ‘qqS r
   r
   r   r   r
   r   r   '   s   & )Úranger   Úset)r   ÚsÚdeletesÚ
transposesÚreplacesÚinsertsr
   )r   r   r   Úsimilar_words   s   r$   c                  C   sD   zt  ¡ } t d¡d | v pt d¡d | v W S  ty!   Y dS w )NÚsudor   ÚadminF)ÚposixÚ	getgroupsÚgrpÚgetgrnamÚKeyError)Úgroupsr
   r
   r   Úuser_can_sudo+   s   ÿÿr-   z&/var/lib/command-not-found/commands.dbc                   @   sª   e Zd ZdZdZdZdZejZ	d*dd„Z
d+d	d
„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd,dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd-d'd(„Zd)S ).ÚCommandNotFoundz
programs.dé   )z	/snap/binz/binz/usr/binz/usr/local/binz/sbinz	/usr/sbinz/usr/local/sbinz
/usr/gamesz/usr/bin/snapú/usr/share/command-not-foundc                 C   sN   |   ¡ | _tj t¡rt ttj¡rttƒ| _	nt
dƒ‚tƒ | _t ¡ | _d S )NzCannot find database)Ú_getSourcesListÚsources_listÚosÚpathÚexistsÚdbpathÚaccessÚR_OKr   ÚdbÚFileNotFoundErrorr-   r'   ÚgeteuidÚeuid)ÚselfÚdata_dirr
   r
   r   Ú__init__K   s   
zCommandNotFound.__init__é   c           	      C   sd   g }|t |ƒ  kr| jks|S  |S t|ƒD ]}|  |¡}|D ]\}}}| ||||f¡ q q|S )z try to correct the spelling )r   Úmax_lenr$   Úget_packagesÚappend)	r=   r   Úmin_lenÚpossible_alternativesÚwÚpackagesÚpackageÚverÚcompr
   r
   r   Úspelling_suggestionsU   s   ÿ
ÿz$CommandNotFound.spelling_suggestionsc                 C   s   | j  |¡S r	   )r9   Úlookup©r=   Úcommandr
   r
   r   rB   `   s   zCommandNotFound.get_packagesc           	   
   C   sl  g }g }t j | j¡st d| j ¡ g g fS z%tt jƒ�}tj	| jddd|g|dd�}W d   ƒ n1 s6w   Y  W n tj
yZ } zt d| ¡ g g fW  Y d }~S d }~ww t d| ¡ zt |¡}W n tjy‡ } zt d	| ¡ g g fW  Y d }~S d }~ww |D ]'}|d
 |kr¢| |d |d
 | d¡f¡ qŠ| |d
 |d | d¡f¡ qŠ||fS )Nz%s not existszadvise-snapz--format=jsonz	--commandT)ÚstderrÚuniversal_newlinesz.calling snap advice-snap returned an error: %szgot %s from snap advise-snapzcannot decoding json: %sÚCommandÚSnapÚVersion)r3   r4   r5   Úsnap_cmdÚloggingÚdebugÚopenÚdevnullÚ
subprocessÚcheck_outputÚCalledProcessErrorÚjsonÚloadsÚJSONDecodeErrorrC   Úget)	r=   rN   Úexact_resultÚmispell_resultrX   ÚoutputÚeÚsnapsÚsnapr
   r
   r   Ú	get_snapsc   sD   ÿüÿ€€þ€þ  zCommandNotFound.get_snapsc                 C   sj   z)t tj t dd¡df¡ƒ�}dd„ |D ƒW  d   ƒ W S 1 s"w   Y  W d S  ty4   g  Y S w )NÚHOMEz/rootz.command-not-found.blacklistc                 S   s    g | ]}|  ¡ d kr|  ¡ ‘qS )Ú )Ústrip)r   Úliner
   r
   r   r   ƒ   s     z0CommandNotFound.getBlacklist.<locals>.<listcomp>)rW   r3   ÚsepÚjoinÚgetenvÚIOError)r=   Ú	blacklistr
   r
   r   ÚgetBlacklist€   s   (ÿÿzCommandNotFound.getBlacklistc              	   C   sz   zdd l }ddlm} | ¡  W n ttfy   g  Y S w tg ƒ}|dd�D ]}|js:|js:|j	D ]}| 
|¡ q2q'|S )Nr   )ÚSourcesListF)ÚwithMatcher)Úapt_pkgÚaptsources.sourceslistrq   ÚinitÚSystemErrorÚImportErrorr   ÚdisabledÚinvalidÚcompsÚadd)r=   rs   rq   r2   ÚsourceÚ	componentr
   r
   r   r1   ‡   s   ÿ
€zCommandNotFound._getSourcesListc                 C   s¾   dt jvrd S |r[tdƒ}tjdkrt|ƒ}dd„ }n||ƒ}tjjr/t|t	ƒr/| 
tjj¡}| ¡ tdƒkr]| jdkr?d}nd	}d
||f }td| tjd� tj| ¡ dd� d S d S d S )NÚ COMMAND_NOT_FOUND_INSTALL_PROMPTz Do you want to install it? (N/y)r   c                 S   s   | S r	   r
   )Úxr
   r
   r   Ú<lambda>Ÿ   s    z0CommandNotFound.install_prompt.<locals>.<lambda>Úyr   rh   úsudo z%sapt install %sz%s©ÚfileF)Úshell)r3   ÚenvironÚ_ÚsysÚversionÚinputÚstdinÚencodingÚ
isinstanceÚstrÚdecodeÚlowerr<   ÚprintÚstdoutrY   ÚcallÚsplit)r=   Úpackage_nameÚpromptÚanswerÚ	raw_inputÚcommand_prefixÚinstall_commandr
   r
   r   Úinstall_prompt˜   s&   



ï
zCommandNotFound.install_prompté   c           
      C   sV  t |ƒt |ƒ |kr ttdƒ|t |ƒf | jd� | j ¡  dS t |ƒt |ƒ dkrtttdƒ| | jd� |D ]\}}}|rCd| }nd}ttdƒ|||f | jd� q7|D ]\}}}	}|rcd| }nd}ttd	ƒ|||f | jd� qVt |ƒdkr„ttd
ƒ| jd� n t |ƒdkr¤| jr™ttdƒd | jd� nttdƒd | jd� | j ¡  dS )z3 print spelling suggestions for packages and snaps z6Command '%s' not found, but there are %s similar ones.rƒ   Nr   ú%Command '%s' not found, did you mean:z (%s)rh   z  command '%s' from snap %s%sú  command '%s' from deb %s%sú3See 'snap info <snapname>' for additional versions.zTry: %s <deb name>zsudo apt installzapt install)r   r‘   r‡   Ú	output_fdÚflushr-   )
r=   r   Úmispell_packagesÚmispell_snapsÚmax_altrN   re   rI   rH   rJ   r
   r
   r   Úprint_spelling_suggestions®   s.   


z*CommandNotFound.print_spelling_suggestionsc                 C   s   t tdƒd|i | jd� d S )Nz;Command '%(command)s' not found, but can be installed with:rN   rƒ   )r‘   r‡   r    rM   r
   r
   r   Ú_print_exact_headerË   s
   ÿ
ÿz#CommandNotFound._print_exact_headerc                 C   s‚   |   |¡ |d }| jdkrtd|d  | jd� n | jr)td|d  | jd� ntd|d  | jd� ttdƒƒ | j ¡  d S )Nr   zsnap install %srƒ   zsudo snap install %súPlease ask your administrator.)r¦   r<   r‘   r    r-   r‡   r¡   )r=   rN   rG   rd   re   r
   r
   r   Úadvice_single_snap_packageÏ   s   

z*CommandNotFound.advice_single_snap_packagec                 C   sÚ   |   |¡ | jdkr!td|d d  | jd� |  |d d ¡ nE| jr;td|d d  | jd� |  |d d ¡ n+td|d d  | jd� ttdƒƒ |d d | jvrfttdƒ|d d  | jd� | j ¡  d S )Nr   zapt install %srƒ   zsudo apt install %sr§   r   z1You will have to enable the component called '%s')	r¦   r<   r‘   r    r›   r-   r‡   r2   r¡   )r=   rN   rG   rd   r
   r
   r   Úadvice_single_deb_packageÛ   s   

z)CommandNotFound.advice_single_deb_packagec                 C   s   | j dkr
| jr
dS dS )Nr   r‚   rh   )r<   r-   )r=   r
   r
   r   r%   ê   s   zCommandNotFound.sudoc                 C   s  |   |¡ tdd„ || D ƒƒ}t|ƒD ]W\}}d}|d r5|dkr/t|ƒdkr/d|d  }nd|d  }|d | jv rNtd	|  ¡ ||d |f | jd
� qtd	|  ¡ ||d |f d tdƒ|d   d | jd
� q| j	dkr}| j
s}ttdƒ| jd
� | j ¡  d S )Nc                 S   ó   g | ]}t |d  ƒ‘qS ©r   r   ©r   r   r
   r
   r   r   ñ   ó    z<CommandNotFound.advice_multi_deb_package.<locals>.<listcomp>rh   r   r   ú  # version %s, orú  # version %sr   z%sapt install %-*s%srƒ   z (z-You will have to enable component called '%s'ú)z.Ask your administrator to install one of them.)r¦   ÚmaxÚ	enumerater   r2   r‘   r%   r    r‡   r<   r-   r¡   )r=   rN   rG   rd   Úpadr   rH   rI   r
   r
   r   Úadvice_multi_deb_packageï   s   
$<z(CommandNotFound.advice_multi_deb_packagec                 C   s®   |   |¡ tdd„ || D ƒƒ}t|ƒD ]2\}}d}|d r5|dkr/t|ƒdkr/d|d  }nd|d  }td|  ¡ ||d |f | jd	� qttd
ƒ| jd	� | j ¡  d S )Nc                 S   rª   r«   r   r¬   r
   r
   r   r     r­   z>CommandNotFound.advice_multi_snap_packages.<locals>.<listcomp>rh   r   r   r®   r¯   ú%ssnap install %-*s%srƒ   rŸ   )	r¦   r±   r²   r   r‘   r%   r    r‡   r¡   )r=   rN   rG   rd   r³   r   re   rI   r
   r
   r   Úadvice_multi_snap_packages  s   
$z*CommandNotFound.advice_multi_snap_packagesc           	      C   s  |   |¡ tdd„ || D ƒƒ}t|ƒD ],\}}d}|d r/|dkr)d|d  }nd|d  }td|  ¡ ||d |f | jd	� q|D ]}d}|d
 rQd|d
  }td|  ¡ ||d |f | jd	� qCt|ƒd
kryttdƒ|d d  | jd	� n	ttdƒ| jd	� | j ¡  d S )Nc                 S   rª   r«   r   r¬   r
   r
   r   r     r­   z?CommandNotFound.advice_multi_mixed_packages.<locals>.<listcomp>rh   r   r   r®   r¯   rµ   rƒ   r   z%sapt  install %-*s%sz+See 'snap info %s' for additional versions.rŸ   )	r¦   r±   r²   r‘   r%   r    r   r‡   r¡   )	r=   rN   rG   rd   r³   r   re   rI   rH   r
   r
   r   Úadvice_multi_mixed_packages  s$   
$$ z+CommandNotFound.advice_multi_mixed_packagesFc           
         sP  dd„ ‰ t ˆƒ| jkrdS ˆ d¡r#tj ˆ¡r tj ˆ¡g}ng }n‡ ‡fdd„| jD ƒ}|r¥|s¥t |ƒdkrNtt	dƒˆtj 
|d	 ˆ¡d
œ | jd� n tt	dƒdˆi | jd� |D ]}tdtj 
|ˆ¡ | jd� q]tt|ƒtt dd¡ d¡ƒ ƒ}t |ƒd	kr£tt	dƒd 
|¡ | jd� dd 
|¡v r£tt	dƒ| jd� dS tj d¡s³tj d¡s³dS ˆ|  ¡ v r»dS ˆdkrâtt	dƒˆ | jd� tt	dƒd | jd� tt	dƒd | jd� dS |  ˆ¡}|  ˆ¡\}}t d||f ¡ t |ƒd	k�r t |ƒd	k�r |  ˆ¡}	t |	ƒd	k�st |ƒd	k�r|  ˆ|	|¡ nmt |ƒd	k�r6t |ƒdk�r6|  ˆ||¡ nWt |ƒd	k�rLt |ƒd	k�rL|  ˆ||¡ nAt |ƒdk�rbt |ƒd	k�rb|  ˆ||¡ n+t |ƒdk�rxt |ƒd	k�rx|  ˆ||¡ nt |ƒd	k�r�t |ƒd	k�r�|  ˆ||¡ t |ƒd	k�p§t |ƒd	k�p§t |ƒd	k�p§t |	ƒd	kS )z7 give advice where to find the given command to stderr c                 S   s.   t j t j | |¡¡ot j t j | |¡¡ S )z? helper that returns if a command is found in the given prefix )r3   r4   r5   rl   Úisdir)ÚprefixrN   r
   r
   r   Ú
_in_prefix'  s   ÿz*CommandNotFound.advise.<locals>._in_prefixFú/c                    s   g | ]	}ˆ |ˆƒr|‘qS r
   r
   )r   r¹   ©rº   rN   r
   r   r   5  s    z*CommandNotFound.advise.<locals>.<listcomp>r   z1Command '%(command)s' is available in '%(place)s'r   )rN   Úplacerƒ   z:Command '%(command)s' is available in the following placesrN   z * %sÚPATHrh   ú:z_The command could not be located because '%s' is not included in the PATH environment variable.ÚsbinzfThis is most likely caused by the lack of administrative privileges associated with your user account.z/usr/bin/aptz/usr/bin/aptitudeÚpythonr�   rž   )Úpython3rÂ   rh   )rÁ   zpython-is-python3rh   Tzgot debs: %s snaps: %s)r   rA   Ú
startswithr3   r4   r5   ÚdirnameÚprefixesr‘   r‡   rl   r    Úlistr   rm   r”   rp   rB   rf   rU   rV   rK   r¥   r¨   r¶   r©   r´   r·   )
r=   rN   Úignore_installedrÅ   r¹   ÚmissingrG   rd   r£   r¢   r
   r¼   r   Úadvise%  sl   
,"
ÿ

€
ÿ
ÿzCommandNotFound.adviseN)r0   )r@   )rœ   )F)Ú__name__Ú
__module__Ú__qualname__Úprograms_dirrA   rÅ   rT   rˆ   rO   r    r?   rK   rB   rf   rp   r1   r›   r¥   r¦   r¨   r©   r%   r´   r¶   r·   rÉ   r
   r
   r
   r   r.   8   s,    




r.   )Ú
__future__r   r   r   r)   r\   rU   r3   Úos.pathr'   rˆ   rY   ÚCommandNotFound.db.dbr   r‰   Ú_gettext_methodÚgetattrÚtranslationr‡   r$   r-   r6   Úobjectr.   r
   r
   r
   r   Ú<module>   s&   

