
    7jV                        d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dZd	Zd
Zd Zd Zd Zd Zd*dZ ej0                  ddddd       ej0                  dddd       ej0                  ddddd       ej0                  dddd        ej0                  d!d"de e	d#      d$%       ej2                  d&ej4                  j6                  j8                  rdnd'      d(                                           Zy))+z(Format C code according to QMK's style.
    )which)CalledProcessErrorDEVNULLPopenPIPE)FilesCompleter)cli)normpath)c_source_files)chcpphpp)driversquantumteststmk_core	platformsmodules)ztmk_core/protocol/usb_hidzplatforms/chibios/boardsc                     t        t        |       j                               j                  t        t        |      j                                     S )zHProvide similar behavior to PurePath.is_relative_to in Python > 3.9
    )strr
   resolve
startswith)fileothers     I/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/cli/format/c.pyis_relative_tor      s9     x~%%'(33C8O8O8Q4RSS    c                  P    t        ddd      D ]  } d|  }t        |      s|c S  y)z&Returns the path to clang-format.
          zclang-format-zclang-format)ranger   )clang_versionbinarys     r   find_clang_formatr&      s9     r1b)  0=M	 r   c           
      V   d}| D ]  }t         j                  j                  d|       t        t	               |gt
        t
        d      }t        j                  ddd| d| t        |      d	g|j                  d
      }|j                  dk7  st        |j                         d} |S )z1Run clang-format and diff it against a file.
    FzChecking for changes in %sT)stdoutstderruniversal_newlinesdiffz-uz
--label=a/z
--label=b/-)stdincapture_outputr   )r	   logdebugr   r&   r   runr   r(   
returncodeprint)filesfound_diffsr   clang_formatr+   s        r   
find_diffsr7   #   s     K 2D9/148dgklww
4&&9Zv;NPSTXPY[^_gsgzgz  LP  Q??a$++K r   c                    t               dg}	 t        j                  g |t        t        |       ddt
               t        j                  j                  d       y# t        $ r}t        j                  j                  d       t        j                  j                  d|j                  |j                         t        j                  j                  d       t        j                  j                  |j                         t        j                  j                  d	       t        j                  j                  |j                         Y d
}~yd
}~ww xY w)z8Spawn clang-format subprocess with proper arguments
    z-iTF)checkr.   r-   z"Successfully formatted the C code.zError formatting C code!z%s exited with returncode %szSTDOUT:zSTDERR:N)r&   r	   r1   mapr   r   r/   infor   errorr0   cmdr2   r(   r)   )r4   r6   es      r   cformat_runr?   4   s     &'.L1,1S%1e[bc9: 014aeeQ\\Ji ahhi ahhs   AA 	E&C$EEFc           	   #   |  K   t        t        t        t        d|                   } | D ]  |rQt	        fdt
        D              rt	        fdt        D              r!t        j                  j                  d       Vj                  dd t        v r pt        j                  j                  d        yw)z7Yield only files to be formatted and skip the rest
    Nc              3   6   K   | ]  }t        |        y wNr   .0ir   s     r   	<genexpr>zfilter_files.<locals>.<genexpr>S   s     B1~dA.B   c              3   6   K   | ]  }t        |        y wrB   rC   rD   s     r   rG   zfilter_files.<locals>.<genexpr>S   s     Isfg.Y]_`JaIsrH   z4Skipping non-core file %s, as '--core-only' is used.   zSkipping file %s)listr:   r
   filterany	core_dirsignoredr	   r/   r0   suffixc_file_suffixes)r4   	core_onlyr   s     @r   filter_filesrS   I   s      XvdE234E 4 B	BBcIskrIsFsTVZ[;;qr?o-JGGMM,d34s   B9B<z-nz	--dry-runT
store_truez&Flag only, don't automatically format.)arg_onlyactionhelpz-bz--base-branchzorigin/masterzBranch to compare to diffs to.)defaultrW   z-az--all-fileszFormat all core files.z--core-onlyzFormat core files only.r4   *z.czFilename(s) to format.)nargsrU   type	completerrW   z'Format C code according to QMK's style.)hiddenc           	         | j                   j                  rt        t        | j                   j                  | j                   j                              }|sX| j
                  j                  ddj                  t        t        | j                   j                                     t        d       | j                   j                  r7| j
                  j                  ddj                  t        t        |                   n| j                   j                  r%t        t              }t        t        |d            }nddd	| j                   j                  gt        } | j                   |t"        
      }|j$                  dk7  r=| j
                  j                  d|       t'        |j(                         |j$                  S |j*                  j-                         j/                  d      }t        t        |d            }|s| j
                  j                  d       y| j                   j0                  rt3        |       S t5        |      S )z,Format C code according to QMK's style.
    zNo C files in filelist: %sz, r   z-Filenames passed with -a, only formatting: %s,Tgitr+   z--name-only)r-   zError running %s
zINo changed files detected. Use "qmk format-c -a" to format all core filesF)argsr4   rK   rS   rR   r/   r<   joinr:   r   exit	all_fileswarningr   rN   base_branchr1   r   r2   r3   r)   r(   stripsplitdry_runr7   r?   )r	   r4   re   git_diff_cmdgit_diffchanged_filess         r   format_crn   ]   s    xx~~\#((..#((2D2DEFGGMM6		#c388>>BZ8[\G88GGOOKSXXVYZ]_dVeMfg			"9-	\)T23 v}chh6J6JWYW377<w7!#GGMM,l;(//"&&& --/55d;\-67 ab xxe$$$5!!r   N)F)__doc__shutilr   
subprocessr   r   r   r   argcomplete.completersr   milcr	   qmk.pathr
   qmk.c_parser   rQ   rN   rO   r   r&   r7   r?   rS   argument
subcommandconfiguser	developerrn    r   r   <module>r|      s    ? ? 1   &*O	
CT	"*4( dK$|JrsdO_CcddMDLdemd<F_`gS4h.Y]J^e}~93::??KdKd%jno'" p  a f e t'"r   