
    7j'                     b   d 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
mZmZ ddlmZmZmZmZ dd	lmZmZmZmZmZmZmZmZ dd
lmZ ddlmZmZm Z  d Z!d Z"d Z#d Z$d Z% ejL                  ddddd       ejL                  ddddd       ejN                  d      d                      Z(y)zVQMK Doctor

Check out the user's QMK environment and make sure it's ready to compile.
    N)cli)yesno)
submodules)QMK_FIRMWAREQMK_FIRMWARE_UPSTREAMQMK_USERSPACEHAS_QMK_USERSPACE   )CheckStatuscheck_binariescheck_binary_versionscheck_submodules)git_check_repogit_get_branchgit_get_taggit_get_last_log_entrygit_get_common_ancestorgit_is_dirtygit_get_remotesgit_check_deviation)in_virtualenv)qmk_userspace_pathsqmk_userspace_validateUserspaceValidationErrorc                  p   d fd} fd}	 ddl m} |dz  j                         r7t        j                  j                  d|       |dz  j                  d      D cg c]
  } | |       }}t        |      dkD  r0t        j                  j                  d	d
j                  |             nt        j                  j                  d       |dz  j                  d      D cg c]
  } ||       }}t        |      dkD  r?t        j                  j                  dd
j                  |             t        j                  S t        j                  j                  d       t        j                  S c c}w c c}w # t        $ r1 t        j                  j                  d       Y t        j                  S w xY w)Nc                     i }t        | d      5 }|D ]=  }d|v s|j                  dd      \  }}|j                         ||j                         <   ? 	 ddd       |S # 1 sw Y   |S xY w)z7Load a simple key=value file into a dictionary
        r=r
   N)opensplitstrip)filevarsflinekeyvalues         L/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/cli/doctor/main.py_load_kvp_filez%distrib_tests.<locals>._load_kvp_file   sr     $_ 	6 6$;!%C!3JC(-D%6	6
 	6
 s   
A8AA'c                     	  |       }|j                  dd       d|j                  dd       d|j                  dd       S # t        $ r/}t        j                  j	                  d|       d|  cY d}~S d}~ww xY w)	z2Parse the QMK toolchain release info file
        TOOLCHAIN_HOSTunknown:TOOLCHAIN_TARGETCOMMIT_HASHz1Error reading QMK toolchain release info file: %sz%Unknown toolchain release info file: Nget	Exceptionr   logwarningr"   r#   er)   s      r(   _parse_toolchain_release_filez4distrib_tests.<locals>._parse_toolchain_release_file   s    	B!$'Dhh/;<AdhhGY[d>e=ffghlhphpq~  AJ  iK  hL  M  M 	BGGOOOQRS:4&AA	Bs   AA 	A=$A82A=8A=c                     	  |       }|j                  dd       d|j                  dd       S # t        $ r/}t        j                  j	                  d|       d|  cY d}~S d}~ww xY w)z3Parse the QMK flashutils release info file
        FLASHUTILS_HOSTr,   r-   r/   z2Error reading QMK flashutils release info file: %sz&Unknown flashutils release info file: Nr0   r5   s      r(   _parse_flashutils_release_filez5distrib_tests.<locals>._parse_flashutils_release_file(   sq    	C!$'Dhh0)<=QtxxW`?a>bcc 	CGGOOPRST;D6BB	Cs   .2 	A*$A%A*%A*r   )QMK_DISTRIB_DIRetcz3Found QMK tools distribution directory: {fg_cyan}%sztoolchain_release_*z!Found QMK toolchains: {fg_cyan}%sz, z!No QMK toolchains manifest found.zflashutils_release_*z!Found QMK flashutils: {fg_cyan}%sz!No QMK flashutils manifest found.z!QMK tools distribution not found.)qmk.clir;   existsr   r3   infogloblenjoinr4   ImportErrorr   OK)r7   r:   r;   r"   
toolchains
flashutilsr)   s         @r(   distrib_testsrG      su   	BC:+e#++-GGLLNP_`KZ]bKbJhJhi~J  A$7=  AJ  A:"@$))JBWX CDL[^cLcKiKi  kA  LB  C48>  CJ  C:"@$))JBWX >>	  CD >> A C
  :89>>:s7   AE;  E1/A5E; $E63?E; E; 1
E; ;(F54F5c                     t        j                          j                         } d| v sd| v rddlm}  |       S d| v rddlm}  |       S d| v rddlm}  |       S t        j                  j                  d	|        t        j                  S )
z5Determine our OS and run platform specific tests
    darwinmacosr
   )os_test_macoslinux)os_test_linuxwindows)os_test_windowszUnsupported OS detected: %s)platformlowerrJ   rK   rL   rM   rN   rO   r   r3   r4   r   WARNING)platform_idrK   rM   rO   s       r(   os_testsrT   H   s{     ##%++-K;'["8(	K	(	k	!,  5{C"""    c            	         t         j                  } t               }|s1t        j                  j                  d       t         j                  } | S t               }|rt        j                  j                  d|       t               }|r t        j                  j                  d|       t               }|r/t        j                  j                  d       t         j                  } t               }d|j                         vst        |d   j                  dd      vr1t        j                  j                  d       t         j                  } | S t        |      }|d	v r2|r0t        j                  j                  d
|       t         j                  } |ddfD ],  }t        j                  j                  d|t!        |             . dD ]-  }t        j                  j                  d|t#        |d             / | S )zRun Git-related checks
    zL{fg_yellow}QMK home does not appear to be a Git repository! (no .git folder)zGit branch: %szRepo version: %sz1{fg_yellow}Git has unstashed/uncommitted changes.upstreamurl z[{fg_yellow}The official repository does not seem to be configured as git remote "upstream".)masterdevelopzS{fg_yellow}The local "%s" branch contains commits not found in the upstream branch.upstream/masterupstream/developz- Latest %s: %s)r\   r]   z- Common ancestor with %s: %sHEAD)r   rD   r   r   r3   r4   rR   r   r?   r   r   r   keysr   r1   r   r   r   )statusgit_ok
git_branchrepo_version	git_dirtygit_remotesgit_deviationbranchs           r(   	git_testsrh   [   s    ^^F Ffg$$8 M5 $%
GGLL):6&=L/>$I ST$,,)+K!1!1!337LT_`jTkToTopuwyTz7z }~$,, M !4J ?!66=GGOO$y  |F  G(00F)+<>PQ \FGGLL!2F<RSY<Z[\E sFGGLL!@&JabhjpJqrs MrU   c                     t         j                  j                  d       t        j                         } | j                         D ]  }| |   }d|v s|d   }d|v r|d   nd}d|v r|d   nd}d|v r|d   nd}|dk7  r-t         j                  j                  d| d| d	| d
| d	       et         j                  j                  d| d        y)z<Prints out information related to the submodule status.
    zSubmodule status:name	shorthashrY   describelast_log_timestampz- z: z -- z ()z: <<< missing or unknown >>>N)r   r3   r?   r   r`   r_   error)
sub_statusssub_infosub_namesub_shorthashsub_describesub_last_log_timestamps          r(   output_submodule_statusrw      s     GGLL$%""$J__ 
Ka=X'H5@H5LH[1RTM3=3I8J/rLG[_gGgX.B%Cmo"%+r(2.D-ET,WYZgYhhijk8*,HIJ
KrU   c                    | r"t         j                  j                  d|         t               D ]1  }	 t	        |       t         j                  j                  d| d       3 t        &t         j                  j                  dt                t         j                  j                  d	t                y # t
        $ r& t         j                  j                  d| d       Y t        $ rS}t         j                  j                  d| d       t         j                  j                  d| d|        Y d }~d }~ww xY w)
NzQMK home: {fg_cyan}z&Testing userspace candidate: {fg_cyan}z({fg_reset} -- {fg_green}Valid `qmk.json`z({fg_reset} -- {fg_red}Missing `qmk.json`z({fg_reset} -- {fg_red}Invalid `qmk.json`z -- {fg_cyan}z&/qmk.json{fg_reset} validation error: zQMK userspace: {fg_cyan}zUserspace enabled: {fg_cyan})
r   r3   r?   r   r   FileNotFoundErrorr4   r   r   r	   )qmk_firmwarepatherrs      r(   userspace_testsr}      s
   ,\N;<#% c	c"4(GGLLCD6Iuvwc  1-ABGGLL12C1DEF ! 	{GGOOFtfLxyz' 	cGGOOFtfLxyzGGOOodV3[\_[`abb	cs   .B66,D?$D?,AD::D?z-yz--yes
store_trueTzAnswer yes to all questions.)actionarg_onlyhelpz-nz--nozAnswer no to all questions.zBasic QMK environment checksc                    | j                   j                  d       | j                   j                  dt        j                                | j                   j                  d| j                         | j                   j                  dt
               t               x}}t                t        d       t               }|t        j                  k(  s&|t        j                  k(  r|t        j                  k(  r|}t               r| j                   j                  d       t               }|t        j                  k(  r| j                   j                  d       n?|t        j                  k(  r| j                   j!                  d       nt        j                  }t#               }t        j                  |v rt        j                  }n5t        j                  |v r#|t        j                  k(  rt        j                  }t%               }|t        j                  k(  r| j                   j                  d	       nt'               r+t)        d
d      rt+        j,                          t%               }|t        j                  k(  rt        j                  }n6|t        j                  k(  r#|t        j                  k(  rt        j                  }t/                |t        j                  k(  r| j                   j                  d       y|t        j                  k(  r| j                   j                  d       y| j                   j                  d       | j                   j                  d       | j                   j                  d       y)zBasic QMK environment checks.

    This is currently very simple, it just checks that all the expected binaries are on your system.

    TODO(unclaimed):
        * [ ] Compile a trivial program with each compiler
    z(QMK Doctor is checking your environment.zPython version: %szCLI version: %szQMK home: {fg_cyan}%sNzCLI installed in virtualenv.zAll dependencies are installed.z/Issues encountered while checking dependencies.zSubmodules are up to date.z'Would you like to clone the submodules?T)defaultz{fg_green}QMK is ready to gor   z<{fg_yellow}QMK is ready to go, but minor problems were foundr
   zW{fg_red}Major problems detected, please fix these problems before proceeding.{fg_reset}z{fg_blue}If you're missing dependencies, try following the instructions on: https://docs.qmk.fm/newbs_getting_started{fg_reset}z{fg_blue}Additionally, check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/qmk) for help.{fg_reset}   )r3   r?   rP   python_versionversionr   rT   rG   r}   rh   r   ERRORrD   rR   r   r   r4   r   r   r   r   r   updaterw   )r   r`   	os_status
git_statusbin_okver_oksub_oks          r(   doctorr      sj    GGLL;<GGLL%x'>'>'@AGGLL"CKK0GGLL(,7!#FYODJ[&&&9+F:YdYlYlKl34 F67	;&&	&IJ"" #$FF"""				&6[^^+C$$ F12&OY] ^%'F[&&& &&F{***v/G ((F 34	;&&	&STno  X  	Y  g  	hrU   ))__doc__rP   milcr   milc.questionsr   qmkr   qmk.constantsr   r   r   r	   checkr   r   r   r   qmk.gitr   r   r   r   r   r   r   r   qmk.commandsr   qmk.userspacer   r   r   rG   rT   rh   rw   r}   argument
subcommandr    rU   r(   <module>r      s         _ _ W W e  e  e & _ _3l#&%PK$G& dGL4FdedF<$Ebc./E 0 d fErU   