
    fx=                         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	      e      Zd
 Zd ZdZ G d de      Zy)    )print_functionabsolute_importN)SqliteDatabase3gettextugettextzcommand-not-foundT)fallbackc           
          d}t        t        |       dz         D cg c]  }| d| | |d f }}|D cg c]  \  }}|s	||dd z    }}}|D cg c](  \  }}t        |      dkD  s||d   z   |d   z   |dd z   * }}}|D cg c]  \  }}|D ]  }|s||z   |dd z     }	}}}|D cg c]  \  }}|D ]
  }||z   |z     }
}}}t        ||z   |	z   |
z         S c c}w c c}}w c c}}w c c}}}w c c}}}w )zw
    return a set with spelling1 distance alternative spellings

    based on http://norvig.com/spell-correct.html
    z&abcdefghijklmnopqrstuvwxyz-_0123456789   Nr      )rangelenset)wordalphabetisabdeletes
transposescreplacesinsertss              A/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.pysimilar_wordsr      s(    8H',SY]';<!$r(DH	<A<%&,TQ!q1QR5y,G,67Fda3q6A:!ad(QqT/AabE)FJF*+CC$!QXCA!"CCHC)*==AH=qq1uqy=y=G=w#h.899 	=,FC=s-   C!
C&
C&C,(C,C2C20C9c                      	 t        j                         } t        j                  d      d   | v xs t        j                  d      d   | v S # t        $ r Y yw xY w)Nsudor   adminF)posix	getgroupsgrpgetgrnamKeyError)groupss    r   user_can_sudor&   +   s[    "V$Q'61 3W%a(F2	4 s   A	A 	AAz&/var/lib/command-not-found/commands.dbc                       e Zd ZdZdZdZdZej                  Z	ddZ
ddZd Zd Zd	 Zd
 Zd ZddZd Zd Zd Zd Zd Zd Zd ZddZy)CommandNotFoundz
programs.d   )z	/snap/binz/binz/usr/binz/usr/local/binz/sbinz	/usr/sbinz/usr/local/sbinz
/usr/gamesz/usr/bin/snapc                 T   | j                         | _        t        j                  j	                  t
              r=t        j                  t
        t        j                        rt        t
              | _	        nt        d      t               | _        t        j                         | _        y )NzCannot find database)_getSourcesListsources_listospathexistsdbpathaccessR_OKr   dbFileNotFoundErrorr&   r    geteuideuid)selfdata_dirs     r   __init__zCommandNotFound.__init__K   sc     00277>>&!bii&@$V,DG#$:;;*_MMO	    c                     g }|t        |      cxk  r| j                  k  s|S  |S t        |      D ]3  }| j                  |      }|D ]  \  }}}|j	                  ||||f        5 |S )z try to correct the spelling )r   max_lenr   get_packagesappend)	r7   r   min_lenpossible_alternativeswpackagespackagevercomps	            r   spelling_suggestionsz$CommandNotFound.spelling_suggestionsU   s     "3t944(( 5((t$ 	FA((+H(0 F$#t%,,a$-DEF	F %$r:   c                 8    | j                   j                  |      S N)r3   lookupr7   commands     r   r=   zCommandNotFound.get_packages`   s    ww~~g&&r:   c                 l   g }g }t         j                  j                  | j                        s&t	        j
                  d| j                  z         g g fS 	 t        t         j                        5 }t        j                  | j                  ddd|g|d      }d d d        t	        j
                  dz         	 t        j                  |      }|D ]]  }|d
   |k(  r*|j                  |d   |d
   |j                  d      f       5|j                  |d
   |d   |j                  d      f       _ ||fS # 1 sw Y   xY w# t        j                  $ r&}t	        j
                  d|z         g g fcY d }~S d }~ww xY w# t        j                  $ r&}t	        j
                  d	|z         g g fcY d }~S d }~ww xY w)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)r-   r.   r/   snap_cmdloggingdebugopendevnull
subprocesscheck_outputCalledProcessErrorjsonloadsJSONDecodeErrorr>   get)	r7   rK   exact_resultmispell_resultrV   outputesnapssnaps	            r   	get_snapszCommandNotFound.get_snapsc   s   ww~~dmm,MM/DMM9:r6M		bjj! -W#00]]M? '+"'+	-- 	4v=>	JJv&E  	\DI')##T&\4	?DHHYDW$XY%%tIVdhhyFY&Z[		\
 ^++)- - ,, 	MMJQNOr6M	 ## 	MM4q89r6M	sT   D> .(D2D> 7E: 2D;7D> >E7E2,E72E7:F3F.(F3.F3c                 <   	 t        t        j                  j                  t        j                  dd      df            5 }|D cg c]&  }|j                         dk7  s|j                         ( c}cd d d        S c c}w # 1 sw Y   y xY w# t        $ r g cY S w xY w)NHOMEz/rootz.command-not-found.blacklist )rU   r-   sepjoingetenvstripIOError)r7   	blacklistlines      r   getBlacklistzCommandNotFound.getBlacklist   s    	bffkk299VW#=?]"^_` Rdm1:Qdjjlb>P

QR RQR R 	I	sG   >B  BA<A<0B2	B <BB
B 
B BBc                 L   	 dd l }ddlm} |j                          t        g       }	  |dd      }|D ]>  }|j                  r|j                  r|j                  D ]  }|j                  |        @ |S # t        t
        f$ r g cY S w xY w# t        $ r  |d      }Y pw xY w)Nr   )SourcesListFT)withMatcherdeb822)rr   )apt_pkgaptsources.sourceslistrq   initSystemErrorImportErrorr   	TypeErrordisabledinvalidcompsadd)r7   rt   rq   r,   sourcessource	components          r   r+   zCommandNotFound._getSourcesList   s    	:LLN 2w	5!eDAG  	0F??6>>!' 0I $$Y/0	0  [) 	I	  	5!e4G	5s"   A7 
B 7B
BB#"B#c                 8   dt         j                  vry |rt        d      }t        j                  dk\  rt        |      }d }n[ |      }t        j                  j                  r9t        |t              r)|j                  t        j                  j                        }|j                         t        d      k(  r_| j                  dk(  rd}nd}|d	|}t        d
|z  t        j                         t        j                   |j#                         d       y y y )N COMMAND_NOT_FOUND_INSTALL_PROMPTz Do you want to install it? (N/y)r   c                     | S rH    )xs    r   <lambda>z0CommandNotFound.install_prompt.<locals>.<lambda>   s    a r:   yr   rg   sudo zapt install z%sfileF)shell)r-   environ_sysversioninputstdinencoding
isinstancestrdecodelowerr6   printstdoutrW   callsplit)r7   package_namepromptanswer	raw_inputcommand_prefixinstall_commands          r   install_promptzCommandNotFound.install_prompt   s    1RZZ?9:F{{c!v'	"6*99%%*VS*A#]]399+=+=>F||~3'99>%'N%,N8F"Ud_,3::> 5 5 7uE ( r:   c                    t        |      t        |      z   |kD  rIt        t        d      |t        |      fz  | j                         | j                  j	                          yt        |      t        |      z   dkD  rt        t        d      |z  | j                         |D ]6  \  }}}|rd|z  }nd}t        t        d      |||fz  | j                         8 |D ]7  \  }}}	}|rd|z  }nd}t        t        d	      |||fz  | j                         9 t        |      dkD  r!t        t        d
      | j                         nat        |      dkD  rS| j
                  r$t        t        d      dz  | j                         n#t        t        d      dz  | j                         | j                  j	                          y)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)rg   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   r   r   	output_fdflushr&   )
r7   r   mispell_packagesmispell_snapsmax_altrK   rc   rD   rC   rE   s
             r   print_spelling_suggestionsz*CommandNotFound.print_spelling_suggestions   s    ]!33g=!LMQUWZ[kWlPmmtx  uC  uC  DNN  "!"3}#559!;<tC$..Y(5 f$$!C-CCa78GT3;OOVZVdVdef 2B h-'4!C-CCa677GS:QQX\XfXfgh }!!IJQUQ_Q_`!"Q&!!a,-0BBXa,-=DNNSr:   c                 N    t        t        d      d|iz  | j                         y )Nz;Command '%(command)s' not found, but can be installed with:rK   r   )r   r   r   rJ   s     r   _print_exact_headerz#CommandNotFound._print_exact_header   s)    aMNwR   &*nn	6r:   c                 t   | j                  |       |d   }| j                  dk(  rt        d|d   z  | j                         n[| j                  rt        d|d   z  | j                         n1t        d|d   z  | j                         t        t        d             | j                  j                          y )Nr   zsnap install %sr   zsudo snap install %sPlease ask your administrator.)r   r6   r   r   r&   r   r   )r7   rK   rB   rb   rc   s        r   advice_single_snap_packagez*CommandNotFound.advice_single_snap_package   s      )Qx99>#d1g-DNNC(472H#d1g-DNNC!456r:   c                 R   | j                  |       | j                  dk(  r8t        d|d   d   z  | j                         | j	                  |d   d          n| j
                  r8t        d|d   d   z  | j                         | j	                  |d   d          nqt        d|d   d   z  | j                         t        t        d             |d   d   | j                  vr)t        t        d      |d   d   z  | j                         | j                  j                          y )Nr   zapt install %sr   zsudo apt install %sr   r   z1You will have to enable the component called '%s')	r   r6   r   r   r   r&   r   r,   r   )r7   rK   rB   rb   s       r   advice_single_deb_packagez)CommandNotFound.advice_single_deb_package   s      )99>"Xa[^3$..IA/'(1+a.8t~~NA/"Xa[^3$..I!456A;q>T%6%66aKLxXY{[\~]dhdrdrsr:   c                 <    | j                   dk7  r| j                  ryy)Nr   r   rg   )r6   r&   )r7   s    r   r   zCommandNotFound.sudo   s    99>d00r:   c           	         | j                  |       t        ||z   D cg c]  }t        |d          c}      }t        |      D ]  \  }}d}|d   r$|dk(  rt        |      dkD  r	d|d   z  }nd|d   z  }|d   | j                  v r0t        d| j                         ||d   |fz  | j                         rt        d| j                         ||d   |fz  d	z   t        d
      |d   z  z   dz   | j                          | j                  dk7  r,| j                  s t        t        d      | j                         | j                  j                          y c c}w )Nr   rg   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   maxr   	enumerater,   r   r   r   r   r6   r&   r   )	r7   rK   rB   rb   r   padr   rC   rD   s	            r   advice_multi_deb_packagez(CommandNotFound.advice_multi_deb_package   s~     )eHn53qt956#H- 
	xJAwCqz6c'lQ..'!*=C*gaj9CqzT...,		S'!*c/RRY]YgYgh,		S'!*c/RRUYY\]  _N  ]O  RY  Z[  R\  ]\  \  _b  b  im  iw  iw  x
	x 99>$"4"4!DEDNN[ 6s   Ec           	         | j                  |       t        ||z   D cg c]  }t        |d          c}      }t        |      D ]_  \  }}d}|d   r$|dk(  rt        |      dkD  r	d|d   z  }nd|d   z  }t	        d| j                         ||d   |fz  | j                         a t	        t        d      | j                         | j                  j                          y c c}w )	Nr   rg   r   r   r   %ssnap install %-*s%sr   r   	r   r   r   r   r   r   r   r   r   )	r7   rK   rB   rb   r   r   r   rc   rD   s	            r   advice_multi_snap_packagesz*CommandNotFound.advice_multi_snap_packages  s      )eHn53qt956 ' 	cGAtCAw6c%j1n.a8C*T!W4C)TYY[#tAw,LLSWSaSab	c 	aEFT^^\ 6s   C"c           	         | j                  |       t        ||z   D cg c]  }t        |d          c}      }t        |      D ]Q  \  }}d}|d   r|dk(  r	d|d   z  }nd|d   z  }t	        d| j                         ||d   |fz  | j                         S |D ]@  }	d}|	d   rd|	d   z  }t	        d	| j                         ||	d   |fz  | j                         B t        |      dk(  r*t	        t        d
      |d   d   z  | j                         n t	        t        d      | j                         | j                  j                          y c c}w )Nr   rg   r   r   r   r   r   r   z%sapt  install %-*s%sz+See 'snap info %s' for additional versions.r   r   )
r7   rK   rB   rb   r   r   r   rc   rD   rC   s
             r   advice_multi_mixed_packagesz+CommandNotFound.advice_multi_mixed_packages  sX     )eHn53qt956 ' 	cGAtCAw6.a8C*T!W4C)TYY[#tAw,LLSWSaSab	c   	fGCqz&3)TYY[#wqz3,OOVZVdVde		f
 u:?!ABU1Xa[PW[WeWef!IJQUQ_Q_`% 6s   Ec           	      8	   d }t        |      | j                  kD  ry|j                  d      rCt        j                  j                  |      r!t        j                  j                  |      g}n&g }n#| j                  D cg c]  } |||      s| }}|rt|sqt        |      dk(  rHt        t        d      |t        j                  j                  |d   |      dz  | j                         ndt        t        d	      d
|iz  | j                         |D ]:  }t        dt        j                  j                  ||      z  | j                         < t        t        |      t        t        j                  dd      j                  d            z
        }t        |      dkD  ret        t        d      dj                  |      z  | j                         ddj                  |      v r t        t        d      | j                         yt        j                  j                  d      s t        j                  j                  d      sy|| j!                         v ry|dk(  rjt        t        d      |z  | j                         t        t        d      dz  | j                         t        t        d      dz  | j                         y| j#                  |      }| j%                  |      \  }}	t'        j(                  d|d|       t        |      dk(  rPt        |      dk(  rB| j+                  |      }
t        |
      dkD  st        |	      dkD  r| j-                  ||
|	       nt        |      dk(  r"t        |      dk(  r| j/                  |||       nt        |      dkD  r"t        |      dk(  r| j1                  |||       nt        |      dk(  r"t        |      dk(  r| j3                  |||       n_t        |      dkD  r"t        |      dk(  r| j5                  |||       n/t        |      dkD  r!t        |      dkD  r| j7                  |||       t        |      dkD  xs. t        |      dkD  xs t        |	      dkD  xs t        
      dkD  S c c}w )z7 give advice where to find the given command to stderr c                     t         j                  j                  t         j                  j                  | |            xr> t         j                  j	                  t         j                  j                  | |             S )z? helper that returns if a command is found in the given prefix )r-   r.   r/   ri   isdir)prefixrK   s     r   
_in_prefixz*CommandNotFound.advise.<locals>._in_prefix+  sO    GGNN277<<#@A IGGMM"'',,vw*GHHJr:   F/r   z1Command '%(command)s' is available in '%(place)s'r   )rK   placer   z:Command '%(command)s' is available in the following placesrK   z * %sPATHrg   :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   rg   )r   zpython-is-python3rg   Tz
got debs: z snaps: )r   r<   
startswithr-   r.   r/   dirnameprefixesr   r   ri   r   listr   rj   r   ro   r=   rd   rS   rT   rF   r   r   r   r   r   r   )r7   rK   ignore_installedr   r   r   missingrB   rb   r   r   s              r   advisezCommandNotFound.advise)  sV   	J
 w<$,,&c"ww~~g&GGOOG45-1]]Z6jQX>YZHZ ,8}!aKL[bmomtmtmymy  {C  DE  {F  HO  nP  PQ  Q  X\  Xf  Xf  gaTUYbdkXllsw  tB  tB  C& XF'BGGLL$AAWX3x=3ryy/D/J/J3/O+PPQG7|aayz  ~A  ~F  ~F  GN  ~O  O  VZ  Vd  Vd  eSXXg..!  E  F  MQ  M[  M[  \ ~.23d''))
 h!;<wFT^^\!236PPW[WeWef!236YY`d`n`no$$W-#~~g6}(EBCx=A#e*/#88A#$q(C,>,B//9I=Y]aCJ!O++GXuEZ!^H 2++GXuE]aCJ!O**7HeD]Q3u:?))'8UC]Q3u:>,,WhFH! DSZ!^ DM"Q&D*-.>*?!*C	Ek [s   ?RRN)z/usr/share/command-not-found)   )   )F)__name__
__module____qualname__programs_dirr<   r   rR   r   rM   r   r9   rF   r=   rd   ro   r+   r   r   r   r   r   r   r   r   r   r   r   r:   r   r(   r(   8   sv    LGH H

I$	%',:*F,:6

$,FEr:   r(   )
__future__r   r   r   r"   rZ   rS   r-   os.pathr    r   rW   CommandNotFound.db.dbr   r   _gettext_methodgetattrtranslationr   r   r&   r0   objectr(   r   r:   r   <module>r      s~   
  
   	   
  0;;#O OG 3dC_U: 
2wEf wEr:   