3 \�-�@s�dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl m Z dd�Z Gdd �d e j �Zd d �Zdd d �ZdS)z Main program for 2to3. �)�with_statement�print_functionN�)�refactorc Cs(|j�}|j�}tj||||dddd�S)z%Return a unified diff of two strings.z (original)z (refactored)�)Zlineterm)� splitlines�difflibZ unified_diff)�a�b�filename�r �$/usr/lib64/python3.6/lib2to3/main.py� diff_textss  rcs>eZdZdZd �fdd� Zdd�Z�fdd�Zd d �Z�ZS) �StdoutRefactoringToola2 A refactoring tool that can avoid overwriting its input files. Prints output to stdout. Output files can optionally be written to a different directory and or have an extra file suffix appended to their name for use in situations where you do not want to replace the input files. rc sR||_||_|r(|jtj� r(|tj7}||_||_||_tt |�j |||�dS)aF Args: fixers: A list of fixers to import. options: A dict with RefactoringTool configuration. explicit: A list of fixers to run even if they are explicit. nobackups: If true no backup '.bak' files will be created for those files that are being refactored. show_diffs: Should diffs of the refactoring be printed to stdout? input_base_dir: The base directory for all input files. This class will strip this path prefix off of filenames before substituting it with output_dir. Only meaningful if output_dir is supplied. All files processed by refactor() must start with this path. output_dir: If supplied, all converted files will be written into this directory tree instead of input_base_dir. append_suffix: If supplied, all files output by this tool will have this appended to their filename. Useful for changing .py to .py3 for example by passing append_suffix='3'. N) � nobackups� show_diffs�endswith�os�sep�_input_base_dir� _output_dir�_append_suffix�superr�__init__) �selfZfixers�options�explicitrr�input_base_dir� output_dir� append_suffix)� __class__r r r$s zStdoutRefactoringTool.__init__cOs*|jj|||f�|jj|f|�|�dS)N)�errors�append�logger�error)r�msg�args�kwargsr r r � log_errorAszStdoutRefactoringTool.log_errorc !s||}|jrH|j|j�r6tjj|j|t|j�d��}ntd||jf��|jrX||j7}||kr�tjj |�}tjj |� r�|r�tj |�|j d||�|j �s4|d}tjj|�r�ytj|�Wn.tk r�}z|j d|�WYdd}~XnXytj||�Wn2tk �r2}z|j d||�WYdd}~XnXtt|�j} | ||||�|j �sbtj||�||k�rxtj||�dS)Nz5filename %s does not start with the input_base_dir %szWriting converted %s to %s.z.bakzCan't remove backup %szCan't rename %s to %s)r� startswithrr�path�join�len� ValueErrorr�dirname�isdir�makedirs� log_messager�lexists�remove�OSError�renamerr� write_file�shutilZcopymode) rZnew_textr Zold_text�encodingZ orig_filenamerZbackup�err�write)r r r r6Es@          z StdoutRefactoringTool.write_filecCs�|r|jd|�n�|jd|�|jr�t|||�}yX|jdk rp|j�&x|D] }t|�qJWtjj�WdQRXnx|D] }t|�qvWWn"tk r�t d|f�dSXdS)NzNo changes to %sz Refactored %sz+couldn't encode %s's diff for your terminal) r1rrZ output_lock�print�sys�stdout�flush�UnicodeEncodeError�warn)r�old�newr ZequalZ diff_lines�liner r r � print_outputls"       z"StdoutRefactoringTool.print_output)rrr) �__name__� __module__� __qualname__�__doc__rr(r6rD� __classcell__r r )r r rs  'rcCstd|ftjd�dS)Nz WARNING: %s)�file)r;r<�stderr)r%r r r r@�sr@c stjdd�}|jddddd�|jdd d gd d �|jd dddddd�|jddd gdd �|jddddd�|jddddd�|jddddd�|jd dd!d�|jd"d#dd$d�|jd%d&dd'd(d �|jd)d*dd+d,d-d.�|jd/d0dd1d�|jd2dd+d,d3d.�d'}i}|j|�\}}|j�r@d4|d5<|j�s:td6�d4|_|j�r\|j �r\|j d7�|j �rx|j �rx|j d8�|j �r�|j �r�td9�|j �r�|j�r�|j d:�|j �r�t d;�xtj��D]}t |��q�W|�s�d�t d?tjd>�d@SdA|k�r4d4}|j�r4t dBtjd>�d@S|j�rDd4|dC<|j�rRtjntj}tjdD|dE�tjdF�}ttj���} t�fdGdH�|jD��} t�} |j�r�d'} x2|jD](} | dIk�r�d4} n| j�dJ| ��q�W| �r�| j| �n| }n | j| �}|j| �}t j!j"|�}|�rD|j#t j$� �rDt j!j%|� �rDt j!j&|�}|j�rh|j't j$�}|j(dK|j|�t)t*|�|t*| �|j|j ||j|j dL�}|j+�s|�r�|j,�nRy|j||j|j-|j.�Wn6tj/k �r�|j.dk�s�t0�t dMtjd>�dSX|j1�t2t3|j+��S)Nz�Main program. Args: fixer_pkg: the name of a package where the fixers are located. args: optional; a list of command line arguments. If omitted, sys.argv[1:] is used. Returns a suggested exit status (0, 1, 2). z2to3 [options] file|dir ...)Zusagez-dz--doctests_only� store_truezFix up doctests only)�action�helpz-fz--fixr"z1Each FIX specifies a transformation; default: all)rM�defaultrNz-jz --processesZstorer�intzRun 2to3 concurrently)rMrO�typerNz-xz--nofixz'Prevent a transformation from being runz-lz --list-fixeszList available transformationsz-pz--print-functionz0Modify the grammar so that print() is a functionz-vz --verbosezMore verbose loggingz --no-diffsz#Don't show diffs of the refactoringz-wz--writezWrite back modified filesz-nz --nobackupsFz&Don't write backups for modified filesz-oz --output-dir�strrzXPut output files in this directory instead of overwriting the input files. Requires -n.)rMrQrOrNz-Wz--write-unchanged-fileszYAlso write files even if no changes were required (useful with --output-dir); implies -w.z --add-suffixzuAppend this string to all output filenames. Requires -n if non-empty. ex: --add-suffix='3' will generate .py3 files.T�write_unchanged_filesz&--write-unchanged-files/-W implies -w.z%Can't use --output-dir/-o without -n.z"Can't use --add-suffix without -n.z@not writing files and not printing diffs; that's not very usefulzCan't use -n without -wz2Available transformations for the -f/--fix option:rz1At least one file or directory argument required.)rJzUse --help to show usage.��-zCan't write to stdin.rz%(name)s: %(message)s)�format�levelz lib2to3.mainc3s|]}�d|VqdS)z.fix_Nr )�.0�fix)� fixer_pkgr r � �szmain..�allz.fix_z7Output in %r will mirror the input directory %r layout.)rrrz+Sorry, -j isn't supported on this platform.)4�optparseZ OptionParserZ add_option� parse_argsrSr:r@rrr$Z add_suffixZno_diffsZ list_fixesr;rZget_all_fix_namesr<rKr�verbose�logging�DEBUG�INFOZ basicConfigZ getLogger�setZget_fixers_from_packageZnofixrY�add�union� differencerr*� commonprefixrrr/r.�rstrip�infor�sortedr!�refactor_stdinZ doctests_onlyZ processesZMultiprocessingUnsupported�AssertionErrorZ summarizerP�bool)rZr&�parserrk�flagsrZfixnamerWr#Z avail_fixesZunwanted_fixesrZ all_presentrYZ requestedZ fixer_namesrZrtr )rZr �main�s�                                 rp)N)rHZ __future__rrr<rrr`r7r]rrrZMultiprocessRefactoringToolrr@rpr r r r �s  g