
    l:i#%                        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 d dlm	Z
 d dlmZ ddlmZmZ ddlmZ ddlmZ  eej*                  d	      Zej.                  rd dlZej2                  Znd dlZej2                  Zd
 Zde_        ed        Zd ZddZ d dZ	d Z!ed        Z"d Z#ed        Z$e$d!d       Z%d Z&ed        Z'd Z( G d de)      Z* e*       Z+d Z,de,_        d Z-d Z.ed        Z/d Z0y)"    N	decorator)get_close_matcheswraps   )warn	exception)settings)Pathwc                 6     i t                fd       }|S )z&Caches previous calls to the function.c                      t         j                  s-t        j                  | |f      }|vr | i ||<   |   }|S  | i |}|S N)memoizedisabledpickledumps)argskwargskeyvaluefnmemos       D/var/www/html/bot/venv/lib/python3.12/site-packages/thefuck/utils.pywrapperzmemoize.<locals>.wrapper   s^    ,,f~.C$//S	IE
  ''E    r   )r   r   r   s   ` @r   r   r      s%    D
2Y
 
 Nr   Fc                    	 ddl m}  ||       S # t        $ r d }t        j                  j                  |       \  }}|r ||       rx| cY S t        j                  d   j                  t        j                        D ]A  }|j                  d      }t        j                  j                  ||       } ||      s=|c cY S  Y yw xY w)z!Returns `program` path or `None`.r   )whichc                     t         j                  j                  |       xr$ t        j                  | t         j                        S r   )ospathisfileaccessX_OK)fpaths    r   is_exezwhich.<locals>.is_exe8   s)    77>>%(FRYYubgg-FFr   PATH"N)
shutilr   ImportErrorr!   r"   splitenvironpathsepstripjoin)programr   r'   r&   fnamer"   exe_files          r   r   r   0   s     W~ 	G ww}}W-ug

6*00< $zz#77<<g6(##O	$ s"    :CA,C9C?CCc                 $      fd}t        |      S )zAdds default values to settings if it not presented.

    Usage:

        @default_settings({'apt': '/usr/bin/apt'})
        def match(command):
            print(settings.apt)

    c                 p    j                         D ]  \  }}t        j                  ||         | |      S r   )itemsr   
setdefault)r   commandkr   paramss       r   _default_settingsz+default_settings.<locals>._default_settingsS   s6    LLN 	&DAq1%	&'{r   r   )r:   r;   s   ` r   default_settingsr<   I   s     &''r   c                 l    t        |      }	 t        | |d|      d   S # t        $ r |r|d   cY S Y yw xY w)z7Returns closest match or just first from possibilities.r   r   N)listdifflib_get_close_matches
IndexError)wordpossibilitiescutofffallback_to_firsts       r   get_closestrE   Z   sI    'M$(}aHKK $ ## $s    33c                 B    |t         j                  }t        | |||      S )z<Overrides `difflib.get_close_match` to control argument `n`.)r   num_close_matchesr?   )rA   rB   nrC   s       r   r   r   d   s#    y&&$T=!VDDr   c                 J     t         fdt        j                  D               S )Nc              3   @   K   | ]  }j                  |        y wr   )
startswith).0xr"   s     r   	<genexpr>z)include_path_in_search.<locals>.<genexpr>l   s     V!4??1%V   )anyr   excluded_search_path_prefixesr"   s   `r   include_path_in_searchrS   k   s    Vx/U/UVVVVr   c            	      V   ddl m}  d }t               }ddg}t        j                  j                  dd      j                  t        j                        D cg c]v  t              ri |fdg       D ]Z  } ||j                  d	      sE|j                  |vr7t        j                  r|j                  j                  d
      n|j                  \ x }}}| j                         D cg c]*  }||k7  r#t        j                  r|j                  d
      n|, }}||z   S c c}}w c c}w )Nr   shellc                 4    	  |        S # t         $ r |cY S w xY wr   )OSError)r   fallbacks     r   _safez"get_all_executables.<locals>._safes   s"    	4K 	O	s   	 thefuckfuckr(    c                  H    t        t               j                               S r   )r>   r   iterdirrR   s   r   <lambda>z%get_all_executables.<locals>.<lambda>   s    T$t**<*<*>%? r   Tutf8)thefuck.shellsrV   	get_aliasr!   r-   getr,   r.   rS   is_dirnamesixPY2decodeget_aliases)	rV   rZ   tf_aliastf_entry_pointsr"   exebinsaliasaliasess	       `    r   get_all_executablesrq   o   s   $ {H &)O 

vr288D1 1%d+?D1 T*/ (+wwCHHOOF#CHH< 1< 1D 1 "--/F5H3D (+wwu||F#E9 FG F '>1Fs   A;D */D&c                    t        j                  dj                  t        j                  |            dj                  |      | d      }|| k7  r|S | j	                  dj                  |      dj                  |      d      S )zReplaces command line argument.z {}$z {}r   )countz {} )resubformatescapereplace)scriptfrom_toreplaced_in_the_ends       r   replace_argumentr}      sn    &&		%0@!A6==QSCT!'q2f$""~~NN5!7>>"#5q: 	:r   c                 $    t         | |i |      S r   )r>   )r   r   r   s      r   eagerr      s    D#F#$$r   c              #      K   t        |t              s|g}d}| j                  d      D ])  }|D ]
  }||v sd}  |s|s|j                          + y w)NF
T)
isinstancer>   r,   r/   )stderr	separatorshould_yieldlineseps        r   get_all_matched_commandsr      se     i&K	LT" # 	#Cd{#	#
 jjl"#s   3AAAAc           	          t        ||d      }|D cg c]'  }t        | j                  ||j                               ) c}S c c}w )zHelper for *_no_command rules.g?)rC   )r   r}   ry   r/   )r8   brokenmatchednew_cmdsnew_cmds        r   replace_commandr      sC     =H#% W^^VW]]_E % % %s   ,Ac                    |j                  dd      }|r(t        dj                  |j                                     t	        | j
                        |kD  r.t        j                  j                  | j
                  d         |v S y)z=Returns `True` if command is call to one of passed app names.at_leastr   z'got an unexpected keyword argument '{}'F)	pop	TypeErrorrv   keyslenscript_partsr!   r"   basename)r8   	app_namesr   r   s       r   is_appr      so     zz*a(HAHHWXX
7 8+ww 4 4Q 78IEEr   c                  (      fd}t        |      S )z7Specifies that matching script is for one of app names.c                 4    t        |gi r | |      S y)NF)r   )r   r8   r   r   s     r   _for_appzfor_app.<locals>._for_app   s"    '0I00g;r   r   )r   r   r   s   `` r   for_appr      s     Xr   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
Cachez)Lazy read cache and save changes at exit.c                     d | _         y r   )_dbselfs    r   __init__zCache.__init__   s	    r   c                     	 | j                          y # t        $ r( t        dt        j                                i | _        Y y w xY w)NzUnable to init cache)	_setup_db	Exceptionr
   sysexc_infor   r   s    r   _init_dbzCache._init_db   s8    	NN 	,clln=DH	s    .AAc                    | j                         }t        |      j                  d      j                         }	 t	        j
                  |      | _        t        j                  | j                  j                         y # t        t        fz   $ r= t        d       t        j                  |       t	        j
                  |      | _        Y ww xY w)Nr[   z!Removing possibly out-dated cache)_get_cache_dirr   joinpathas_posixshelveopenr   shelve_open_errorr+   r	   r!   removeatexitregisterclose)r   	cache_dir
cache_paths      r   r   zCache._setup_db   s    '')	)_--i8AAC
	/{{:.DH 	' !K>1 	/45IIj!{{:.DH		/s   A> >ACCc                     t         j                  j                  d      }t        j                  d|      }	 t        j                  |       |S # t
        $ r$ t         j                  j                  |      s Y |S w xY w)Nz~/.cacheXDG_CACHE_HOME)r!   r"   
expandusergetenvmakedirsrX   isdir)r   default_xdg_cache_dirr   s      r   r   zCache._get_cache_dir   ss     " 2 2: >II.0EF		KK	"
 	  	77==+ , 		s   A )A;:A;c                 r    	 t        t        j                  j                  |            S # t        $ r Y yw xY w)N0)strr!   r"   getmtimerX   )r   r"   s     r   
_get_mtimezCache._get_mtime   s3    	rww''-.. 		s   '* 	66c                     |j                   t        |      j                  d      d   |||f}t        t	        j
                  |            S )Natr   )
__module__reprr,   r   r   r   )r   r   
depends_onr   r   partss         r   _get_keyzCache._get_key   s?    Rt 4Q 7T6+6<<&''r   c                      j                    j                          |D cg c]7  }t        |      j                         j	                         j                         9 }} j                  ||||      }dj                   fd|D              } j                   j                  |i       j                  d      |k(  r j                   |   d   S  ||i |}||d j                   |<   |S c c}w )N.c              3   @   K   | ]  }j                  |        y wr   )r   )rL   r"   r   s     r   rN   z"Cache.get_value.<locals>.<genexpr>  s     E$-ErO   etagr   )r   r   )	r   r   r   r   absoluter   r   r0   rd   )	r   r   r   r   r   rf   r   r   r   s	   `        r   	get_valuezCache.get_value   s    88MMO #-. 4j++-668AAC .
 .mmB
D&9xxE*EE88<<R $$V,488C=))''E%)E:DHHSML.s   <C*N)__name__r   __qualname____doc__r   r   r   r   r   r   r    r   r   r   r      s(    3((
r   r   c                        fd}|S )zCaches function result in temporary file.

    Cache will be expired when modification date of files from `depends_on`
    will be changed.

    Only functions should be wrapped in `cache`, not methods.

    c                 D     t         t                fd              }|S )Nc                  d    t         j                  r | i |S t        j                  | |      S r   )cacher   _cacher   )r   r   r   r   s     r   r   z/cache.<locals>.cache_decorator.<locals>.wrapper  s3     ~~4*6**''JfEEr   )r   r   )r   r   r   s   ` r   cache_decoratorzcache.<locals>.cache_decorator  s*    		r	F 
 
	F r   r   )r   r   s   ` r   r   r     s    	 r   c                      	 ddl m}   | d      S # t        $ r% dd l}|j	                  d      d   j                  cY S w xY w)Nr   )versionr[   )importlib.metadatar   r+   pkg_resourcesrequire)r   r   s     r   get_installation_versionr   )  sC    ;.y!! ;$$Y/2:::;s    +>>c                  B    t         j                  j                  dd      S )NTF_ALIASr\   )r!   r-   rd   r   r   r   rc   rc   4  s    ::>>*f--r   c                 L   d }ddl m} |j                         }t               }t	        t                     j                  |j                               } |||      D cg c]:  }|j                  |      s'|| j                  k(  s|j                  d      d   |v r|< c}S c c}w )Nc              3   L   K   d}| D ]  }|	||k7  r| |} | r| d    yyw)z?Returns all lines from history except that comes before `fuck`.Nr   )historyrk   previousr   s       r   _not_correctedz9get_valid_history_without_current.<locals>._not_corrected:  sE      	D#(8H	 "+ s   "$r   rU    )rb   rV   get_historyrc   setrq   unionget_builtin_commandsrK   ry   r,   )r8   r   rV   r   rk   executablesr   s          r   !get_valid_history_without_currentr   8  s     %!G{H)+,	u))+	,  ,GX> 3T??8,TW^^5K

3"k1  3 3 3s   ?B!c                     t         j                  r(dj                  d | D              }|j                         S dj                  |       }|j                         S )zsCreates single script from a list of script parts.

    :type raw_script: [basestring]
    :rtype: basestring

    r   c              3   >   K   | ]  }|j                  d         yw)zutf-8N)ri   )rL   args     r   rN   z$format_raw_script.<locals>.<genexpr>W  s     D##**W-Ds   )rg   rh   r0   lstrip)
raw_scriptry   s     r   format_raw_scriptr   O  sI     wwDDD ==? *%==?r   )333333?T)Nr   )zDid you mean)1r   r!   r   rt   r   r   rg   r   difflibr   r?   	functoolsr   logsr	   r
   confr   systemr   r   devnullDEVNULLrh   anydbmerrorr   dbmr   r   r   r<   rE   rS   rq   r}   r   r   r   r   r   objectr   r   r   r   rc   r   r   r   r   r   <module>r     s>    	  	  
 
  B  !  
rzz3
77		(   	 	0("$EW 	 	0: % % # #% 	
 	
BF BJ 
. ;. 	3 	3,r   