U
    
b?                     @   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rtd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gettextZugettextzcommand-not-foundT)Z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>#   s     z!similar_words.<locals>.<listcomp>   c                 S   s$   g | ]\}}|r||d d  qS r   Nr   r	   abr   r   r   r   $   s      c                 S   s<   g | ]4\}}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
        c                    s&   g | ]\}} D ]}|| | qqS r   r   r   r   r   r   r   '   s       )ranger   set)r   sZdeletesZ
transposesZreplacesZinsertsr   )r   r   r   similar_words   s    r   c                  C   sJ   z.t  } tdd | kp,tdd | kW S  tk
rD   Y dS X d S )Nsudor   ZadminF)posix	getgroupsgrpZ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r0tttjr0t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)selfZdata_dirr   r   r   __init__K   s    
zCommandNotFound.__init__   c           	      C   sb   g }|t |  kr| jks$n |S t|D ]0}| |}|D ]\}}}|||||f q>q,|S )z try to correct the spelling )r   max_lenr   get_packagesappend)	r4   r   Zmin_lenZpossible_alternativeswpackagespackagevercompr   r   r   spelling_suggestionsU   s    
z$CommandNotFound.spelling_suggestionsc                 C   s   | j |S r   )r0   lookupr4   commandr   r   r   r8   `   s    zCommandNotFound.get_packagesc           	   
   C   sb  g }g }t j| js.td| j  g g fS z6tt j"}tj	| jddd|g|dd}W 5 Q R X W n> tj
k
r } ztd|  g g f W Y S d }~X Y nX td|  zt|}W n@ tjk
r  } ztd	|  g g f W Y S d }~X Y nX |D ]R}|d
 |kr8||d |d
 |df n||d
 |d |df q||fS )Nz%s not existszadvise-snapz--format=jsonz	--commandT)stderrZuniversal_newlinesz.calling snap advice-snap returned an error: %szgot %s from snap advise-snapzcannot decoding json: %sZCommandZSnapZVersion)r*   r+   r,   snap_cmdloggingdebugopendevnull
subprocessZcheck_outputZCalledProcessErrorjsonloadsZJSONDecodeErrorr9   get)	r4   rB   Zexact_resultZmispell_resultrH   outputesnapssnapr   r   r   	get_snapsc   s:      "zCommandNotFound.get_snapsc              
   C   sb   zDt tjtdddf}dd |D W  5 Q R  W S Q R X W n tk
r\   g  Y S X d S )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>)rG   r*   sepjoingetenvIOError)r4   Z	blacklistr   r   r   getBlacklist   s
    &zCommandNotFound.getBlacklistc              	   C   s|   z dd l }ddlm} |  W n ttfk
r<   g  Y S X tg }|ddD ]&}|jsP|jsP|j	D ]}|
| qfqP|S )Nr   )SourcesListF)ZwithMatcher)apt_pkgZaptsources.sourceslistr[   ZinitSystemErrorImportErrorr   ZdisabledZinvalidcompsadd)r4   r\   r[   r)   sourceZ	componentr   r   r   r(      s    

zCommandNotFound._getSourcesListc                 C   s   dt jkrd S |rtd}tjdkr6t|}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 )NZ COMMAND_NOT_FOUND_INSTALL_PROMPTz Do you want to install it? (N/y)r   c                 S   s   | S r   r   )xr   r   r   <lambda>       z0CommandNotFound.install_prompt.<locals>.<lambda>yr   rS   sudo z%sapt install %sz%sfileF)shell)r*   environ_sysversioninputstdinencoding
isinstancestrdecodelowerr3   printstdoutrI   callsplit)r4   Zpackage_namepromptZanswerZ	raw_inputZcommand_prefixZinstall_commandr   r   r   install_prompt   s"    



zCommandNotFound.install_prompt   c           
      C   s  t |t | |kr\td| jd ttd|t |f | jd td| jd | j  dS t |t | dkr$td| jd ttd| | jd td| jd |D ]8\}}}|rd| }nd}ttd|||f | jd q|D ]<\}}}	}|rd| }nd}ttd	|||f | jd qtd| jd t |dkrTttd
| jd nDt |dkr| jrttdd | jd nttdd | jd td| jd | j  dS )z3 print spelling suggestions for packages and snaps rS   rg   z6Command '%s' not found, but there are %s similar ones.Nr   %Command '%s' not found, did you mean:z (%s)z  command '%s' from snap %s%s  command '%s' from deb %s%s3See 'snap info <snapname>' for additional versions.zTry: %s <deb name>zsudo apt installzapt install)r   ru   	output_fdrk   flushr$   )
r4   r   mispell_packagesmispell_snapsZmax_altrB   rP   r=   r<   r>   r   r   r   print_spelling_suggestions   s:    


z*CommandNotFound.print_spelling_suggestionsc                 C   s6   t | jd t tdd|i | jd t | jd d S )Nrg   z;Command '%(command)s' not found, but can be installed with:rB   )ru   r   rk   rA   r   r   r   _print_exact_header   s     z#CommandNotFound._print_exact_headerc                 C   s   |  | |d }| jdkr4td|d  | jd n@| jrRtd|d  | jd n"td|d  | jd ttd td| jd | j  d S )Nr   zsnap install %srg   zsudo snap install %sPlease ask your administrator.rS   )r   r3   ru   r   r$   rk   r   )r4   rB   r;   rO   rP   r   r   r   advice_single_snap_package   s    

z*CommandNotFound.advice_single_snap_packagec                 C   s   |  | | jdkrBtd|d d  | jd | |d d  n| jrvtd|d d  | jd | |d d  nVtd|d d  | jd ttd |d d | jkrttd|d d  | jd td| jd | j  d S )	Nr   zapt install %srg   zsudo apt install %sr   r   z1You will have to enable the component called '%s'rS   )	r   r3   ru   r   rz   r$   rk   r)   r   )r4   rB   r;   rO   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   rf   rS   )r3   r$   )r4   r   r   r   r      s    zCommandNotFound.sudoc                 C   s(  |  | tdd || D }t|D ]\}}d}|d rj|dkr^t|dkr^d|d  }nd|d  }|d | jkrt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d| jd
 ttd| jd
 td| jd
 | j  d S )Nc                 S   s   g | ]}t |d  qS r   r   r	   r   r   r   r   r      s     z<CommandNotFound.advice_multi_deb_package.<locals>.<listcomp>rS   r   r     # version %s, or  # version %sr   z%sapt install %-*s%srg   z (z-You will have to enable component called '%s')z.Ask your administrator to install one of them.)r   max	enumerater   r)   ru   r   r   rk   r3   r$   r   )r4   rB   r;   rO   padr
   r<   r=   r   r   r   advice_multi_deb_package   s     
$<z(CommandNotFound.advice_multi_deb_packagec                 C   s   |  | tdd || D }t|D ]d\}}d}|d rj|dkr^t|dkr^d|d  }nd|d  }td|  ||d |f | jd	 q(td| jd	 ttd
| jd	 td| jd	 | j  d S )Nc                 S   s   g | ]}t |d  qS r   r   r   r   r   r   r     s     z>CommandNotFound.advice_multi_snap_packages.<locals>.<listcomp>rS   r   r   r   r   %ssnap install %-*s%srg   r~   )	r   r   r   r   ru   r   r   rk   r   )r4   rB   r;   rO   r   r
   rP   r=   r   r   r   advice_multi_snap_packages  s    
$z*CommandNotFound.advice_multi_snap_packagesc           	      C   s0  |  | tdd || D }t|D ]X\}}d}|d r^|dkrRd|d  }nd|d  }td|  ||d |f | jd	 q(|D ]>}d}|d
 rd|d
  }td|  ||d |f | jd	 qtd| jd	 t|d
krttd|d d  | jd	 nttd| jd	 td| jd	 | j  d S )Nc                 S   s   g | ]}t |d  qS r   r   r   r   r   r   r     s     z?CommandNotFound.advice_multi_mixed_packages.<locals>.<listcomp>rS   r   r   r   r   r   rg   r   z%sapt  install %-*s%sz+See 'snap info %s' for additional versions.r~   )	r   r   r   ru   r   r   r   rk   r   )	r4   rB   r;   rO   r   r
   rP   r=   r<   r   r   r   advice_multi_mixed_packages  s(    
$$ z+CommandNotFound.advice_multi_mixed_packagesFc           
         sx  dd  t | jkrdS drFtjr@tjg}q\g }n fdd| jD }|rR|sRt |dkrtt	dtj
|d	 d
 | jd n@tt	ddi | jd |D ] }tdtj
| | jd qtt|ttddd }t |d	krNtt	dd
| | jd dd
|krNtt	d| jd dS tjdsrtjdsrdS |  krdS dkrtd tt	d | jd td tt	dd | jd tt	dd | jd td dS | }| \}}td||f  t |d	krht |d	krh| }	t |	d	ksXt |d	krB| |	| nt |d	krt |dkr| || nt |d	krt |d	kr| || nt |dkrt |d	kr| || nVt |dkrt |d	kr| || n*t |d	krBt |d	krB| || t |d	kpvt |d	kpvt |d	kpvt |	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 )r*   r+   r,   rW   isdir)prefixrB   r   r   r   
_in_prefix7  s    z*CommandNotFound.advise.<locals>._in_prefixF/c                    s   g | ]} |r|qS r   r   )r	   r   r   rB   r   r   r   E  s     
 z*CommandNotFound.advise.<locals>.<listcomp>r   z1Command '%(command)s' is available in '%(place)s'r   )rB   Zplacerg   z:Command '%(command)s' is available in the following placesrB   z * %sPATHrS   :z_The command could not be located because '%s' is not included in the PATH environment variable.Z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   rS   )r   zpython-is-python3rS   Tzgot debs: %s snaps: %s)r   r7   
startswithr*   r+   r,   dirnameprefixesru   rk   rW   r   listr   rX   rx   rZ   r8   rQ   rE   rF   r?   r   r   r   r   r   r   )
r4   rB   Zignore_installedr   r   Zmissingr;   rO   r   r   r   r   r   advise5  sp    
,"





zCommandNotFound.adviseN)r'   )r6   )r{   )F)__name__
__module____qualname__Zprograms_dirr7   r   rD   rl   rC   r   r5   r?   r8   rQ   rZ   r(   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   8   s*   




#r%   )Z
__future__r   r   r   r!   rJ   rE   r*   os.pathr   rl   rI   ZCommandNotFound.db.dbr   rm   Z_gettext_methodgetattrZtranslationrk   r   r$   r-   objectr%   r   r   r   r   <module>   s$   

