U
    t^?                     @   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   s@   |   | _tjtr"tt| _ntdt	 | _	t
 | _d S )NzCannot find database)_getSourcesListsources_listospathexistsdbpathr   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)	r2   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   )r.   lookupr2   commandr   r   r   r6   `   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JSONDecodeErrorr7   get)	r2   r@   Zexact_resultZmispell_resultrF   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>)rE   r*   sepjoingetenvIOError)r2   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.sourceslistrY   ZinitSystemErrorImportErrorr   ZdisabledZinvalidcompsadd)r2   rZ   rY   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   rQ   sudo z%sapt install %sz%sfileF)shell)r*   environ_sysversioninputstdinencoding
isinstancestrdecodelowerr1   printstdoutrG   callsplit)r2   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 rQ   re   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   rs   	output_fdri   flushr$   )
r2   r   mispell_packagesmispell_snapsZmax_altr@   rN   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 )Nre   z;Command '%(command)s' not found, but can be installed with:r@   )rs   r}   ri   r?   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 %sre   zsudo snap install %sPlease ask your administrator.rQ   )r   r1   rs   r}   r$   ri   r~   )r2   r@   r9   rM   rN   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 %sre   zsudo apt install %sr   r   z1You will have to enable the component called '%s'rQ   )	r   r1   rs   r}   rx   r$   ri   r)   r~   )r2   r@   r9   rM   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   rd   rQ   )r1   r$   )r2   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>rQ   r   r     # version %s, or  # version %sr   z%sapt install %-*s%sre   z (z-You will have to enable component called '%s')z.Ask your administrator to install one of them.)r   max	enumerater   r)   rs   r   r}   ri   r1   r$   r~   )r2   r@   r9   rM   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>rQ   r   r   r   r   %ssnap install %-*s%sre   r|   )	r   r   r   r   rs   r   r}   ri   r~   )r2   r@   r9   rM   r   r
   rN   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>rQ   r   r   r   r   r   re   r   z%sapt  install %-*s%sz+See 'snap info %s' for additional versions.r|   )	r   r   r   rs   r   r}   r   ri   r~   )	r2   r@   r9   rM   r   r
   rN   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,   rU   isdir)prefixr@   r   r   r   
_in_prefix7  s    z*CommandNotFound.advise.<locals>._in_prefixF/c                    s   g | ]} |r|qS r   r   )r	   r   r   r@   r   r   r   E  s     
 z*CommandNotFound.advise.<locals>.<listcomp>r   z1Command '%(command)s' is available in '%(place)s'r   )r@   Zplacere   z:Command '%(command)s' is available in the following placesr@   z * %sPATHrQ   :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pythonrz   r{   )python3r   rQ   )r   zpython-is-python3rQ   Tzgot debs: %s snaps: %s)r   r5   
startswithr*   r+   r,   dirnameprefixesrs   ri   rU   r}   listr   rV   rv   rX   r6   rO   rC   rD   r=   r   r   r   r   r   r   )
r2   r@   Zignore_installedr   r   Zmissingr9   rM   r   r   r   r   r   advise5  sp    
,"





zCommandNotFound.adviseN)r'   )r4   )ry   )F)__name__
__module____qualname__Zprograms_dirr5   r   rB   rj   rA   r}   r3   r=   r6   rO   rX   r(   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   8   s*   




#r%   )Z
__future__r   r   r   r!   rH   rC   r*   os.pathr   rj   rG   ZCommandNotFound.db.dbr   rk   Z_gettext_methodgetattrZtranslationri   r   r$   r-   objectr%   r   r   r   r   <module>   s$   

