a
    Ad&D                     @   s  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 d dlmZmZ d dlmZmZ d dlmZ d dlmZ ej \ZZeej ejZejddZejd	d
Z dZ!ejddkZ"dejvrdejd< dd Z#e dd Z$e dd Z%ddde"fe&e'dddZ(dd Z)dd Z*de"fddZ+e'e&dd d!Z,d"d# Z-ddde"d$fe&d%d&d'Z.d?d(d)Z/d*d+ Z0d,d- Z1d.d/ Z2d0d1 Z3d2d3 Z4e5d4Z6d5d6 Z7d7d8 Z8d9d: Z9d;d< Z:d=d> Z;dS )@    N)	lru_cache)cmd_argserrors)script_pathextensions_dir)startup_timer)logging_configZGITgitZ	INDEX_URL ZrepositoriesZWEBUI_LAUNCH_LIVE_OUTPUT1ZGRADIO_ANALYTICS_ENABLEDFalsec                  C   s   t  dk} tjj}tjj}tjj}| r0dg}ng d}|dkrH||v s~dd l}|j	d| d| d| d| rrd	nd
 d	 d S )NZWindows
   )      	   r         r   zV
INCOMPATIBLE PYTHON VERSION

This program is tested with 3.10.6 Python, but you have .a  .
If you encounter an error with "RuntimeError: Couldn't install torch." message,
or any other error regarding unsuccessful package (library) installation,
please downgrade (or upgrade) to the latest version of 3.10 Python
and delete current Python and "venv" folder in WebUI's directory.

You can download 3.10 Python from here: https://www.python.org/downloads/release/python-3106/

znAlternatively, use a binary release of WebUI: https://github.com/AUTOMATIC1111/stable-diffusion-webui/releasesr
   z<

Use --skip-python-version-check to suppress this warning.
)
platformsystemsysversion_infomajorminormicroZmodules.errorsr   Zprint_error_explanation)Z
is_windowsr   r   r   Zsupported_minorsmodules r   </var/www/html/stable-diffusion-webui/modules/launch_utils.pycheck_python_version!   s$    
r   c                   C   s6   zt jtddgddd W S  ty0   Y dS 0 d S )Nz	rev-parseZHEADFutf8shellencoding<none>)
subprocesscheck_outputr	   strip	Exceptionr   r   r   r   commit_hash@   s    r(   c                  C   s   zt jtddgddd W S  ty   zztjtjtjt	d} t
| ddd	:}td
d |D d}|dd}|W  d    W  Y S 1 s0    Y  W n ty   Y Y dS 0 Y n0 d S )NZdescribez--tagsFr   r    zCHANGELOG.mdrutf-8r"   c                 s   s   | ]}|  r|  V  qd S N)r&   ).0liner   r   r   	<genexpr>Q       zgit_tag.<locals>.<genexpr>r#   z## r
   )r$   r%   r	   r&   r'   ospathjoindirname__file__opennextreplace)Zchangelog_mdfiler.   r   r   r   git_tagH   s    ,r:   )livereturnc                 C   s   |d urt | | d|d u r"tjn|ddd}|sDtj |d< |d< tjf i |}|jdkr|pdd d	d
|  d|j g}|jr|d|j  |j	r|d|j	  t
d||jpdS )NTr   ignore)argsr!   envr"   r   stdoutstderrr   zError running commandr   z	Command: zError code: zstdout: zstderr: 
r
   )printr1   environr$   PIPErun
returncoder@   appendrA   RuntimeErrorr3   )commanddescerrdesc
custom_envr;   Z
run_kwargsresultZ
error_bitsr   r   r   rF   X   s,    

rF   c                 C   s.   zt j| }W n ty$   Y dS 0 |d uS )NF)	importlibZutil	find_specModuleNotFoundError)packagespecr   r   r   is_installedx   s
    rT   c                 C   s   t jtt| S r,   )r1   r2   r3   r   	dir_repos)namer   r   r   repo_dir   s    rW   c                 C   sN   t jr
d S tdkrdt nd}tdt d|  d| d| d| |dS )	Nr
   z --index-url "z	" -m pip z --prefer-binaryInstalling zCouldn't install )rK   rL   r;   )r>   skip_install	index_urlrF   python)rJ   rK   r;   Zindex_url_liner   r   r   run_pip   s    r]   )coder<   c                 C   s    t jtd| gddd}|jdkS )Nz-cTF)Zcapture_outputr!   r   )r$   rF   r\   rG   )r^   rN   r   r   r   check_run_python   s    r_   c                 C   sX   t dt d|  dd| d| dd t dt d|  dd	| d
| dd d S )NrX   " -C "z" fetch --refetch --no-auto-gczFetching all contents for Couldn't fetch Tr;   z" gc --aggressive --prune=nowzPruning zCouldn't prune )rF   r	   )dirrV   r   r   r   git_fix_workspace   s    **rd   Trb   c                 C   s|   z&t dt d|  d| ||||dW S  ty>   |s: Y n0 t| d t| | t dt d|  d| ||||dS )NrX   r`   z" )rK   rL   rM   r;   z, attempting autofix...)rF   r	   rI   rC   rd   )rc   rV   rJ   rK   rL   rM   r;   autofixr   r   r   run_git   s    &
rf   c              	   C   sx  t j|r|d u rd S t||dd d| d| dd }||krHd S t||dd d| ddd | krt||d|  d	d d
| ddd t||dd| dd| dd t||d| d| d| dd| d| dd d S z<td	t d|  d| d	d| d| dd| dd W n$ tyJ   tj	|dd  Y n0 |d urttd	t d| d| d d d S )Nzrev-parse HEADzCouldn't determine z	's hash: Frb   zconfig --get remote.origin.urlz's origin URLzremote set-url origin "rX   zFailed to set ZfetchzFetching updates for z...ra   )re   z	checkout zChecking out commit for z with hash: zCouldn't checkout commit z for Tz	" clone "" "zCloning z into zCouldn't clone )ignore_errorsr`   z" checkout z-Couldn't checkout {name}'s hash: {commithash})
r1   r2   existsrf   r&   rF   r	   rI   shutilZrmtree)Zurlrc   rV   Z
commithashZcurrent_hashr   r   r   	git_clone   s$    $$$"4<
rk   c                 C   s   t | D ]\}}}t jt j|dr
z8ttd|ddg}td| d|	d
  d W q
 tjy } z.td	| d|j	d
  d W Y d }~q
d }~0 0 q
d S )
Nz.gitz-CZpullz--autostashz"Pulled changes for repository in 'z':
r*   rB   z.Couldn't perform 'git pull' on repository in ')r1   walkr2   ri   r3   r$   r%   r	   rC   decoder&   ZCalledProcessErroroutput)rc   Zsubdir_rn   er   r   r   git_pull_recursive   s    $rq   c              
   C   s   zvdd l }|d }| dkrR|d d | krRtd td td td n"|d d | krltd	 ntd
 W n. ty } ztd| W Y d }~n
d }~0 0 d S )Nr   zQhttps://api.github.com/repos/AUTOMATIC1111/stable-diffusion-webui/branches/masterr#   commitZshaz8--------------------------------------------------------z8| You are not up to date with the most recent release. |z8| Consider running `git pull` to update.               |z0You are up to date with the most recent release.z-Not a git clone, can't perform version check.zversion check failed)requestsgetjsonrC   r'   )rr   rs   Zcommitsrp   r   r   r   version_check   s    

rv   c              
   C   s   t j| d}t j|sd S zft j }t jd t j |dd |d< t	dt
 d| dd|  |d }|rt| W n2 ty } ztt| W Y d }~n
d }~0 0 d S )	Nz
install.pyr   Z
PYTHONPATHr
   rX   rg   z'Error running install.py for extension )rL   rM   )r1   r2   r3   isfilerD   copyabspathpathseprt   rF   r\   r&   rC   r'   r   reportstr)Zextension_dirZpath_installerr?   r@   rp   r   r   r   run_extension_installer   s    
&&r}   c                    s   i }zHt j| rJt| ddd}t|}W d    n1 s@0    Y  W n  tyl   tjddd Y n0 t	|
dg  |
dd	}|d	kstjstjst jtsg S  fd
dt tD S )Nr)   r   r+   zCould not load settingsT)exc_infodisabled_extensionsdisable_all_extensionsZnonec                    s   g | ]}| vr|qS r   r   )r-   xr   r   r   
<listcomp>   r0   z#list_extensions.<locals>.<listcomp>)r1   r2   rw   r6   ru   loadr'   r   r{   setrt   r>   Zdisable_extra_extensionsr   isdirr   listdir)settings_fileZsettingsr9   r   r   r   r   list_extensions   s    , r   c                 C   s   t jtsd S tdZ t| D ]@}td|  t j	t|}t j|r$t
| t| q$W d    n1 sz0    Y  d S )Nzrun extensions installersrY   )r1   r2   r   r   r   subcategoryr   loggingdebugr3   r}   record)r   Zdirname_extensionr2   r   r   r   run_extensions_installers  s    r   z5\s*([-_a-zA-Z0-9]+)\s*(?:==\s*([-+_.a-zA-Z0-9]+))?\s*c           	   
   C   s  ddl }ddl}t| ddd}|D ]}| dkr6q$tt|}|du r\ W d   dS |d }|d	pvd }|dkrq$z|j	|}W n" t
y   Y  W d   dS 0 |j	||j	|kr$ W d   dS q$W d   n1 s0    Y  d
S )z
    Does a simple parse of a requirements.txt file to determine if all rerqirements in it
    are already installed. Returns True if so, False if not installed or parsing fails.
    r   Nr)   r   r+   r
   F      T)importlib.metadataZpackaging.versionr6   r&   reZmatchre_requirementgroupZmetadataversionr'   Zparse)	requirements_filerO   Z	packagingr9   r.   mrR   Zversion_requiredZversion_installedr   r   r   requirements_met  s(    2r   c                  C   s  t jdd} t jdd|  }t jdd}t jdd}t jd	d
}t jdd}t jdd}t jdd}t jdd}t jdd}	t jdd}
t jdd}t jdd}t jdd}t jdd}t jdd }z(t t jtd!d" t jd#d$ W n ty"   Y n0 t	j
s2t  td% t }t }td& td'tj  td(|  td)|  t	jstd*rtd+std,t d-| d.d/d0d1 td2 t	jstd3std4td5 td6std7| d6 td8 td9s,td7| d9 td: td;r>t	jr`t	jr`td<| d; td= td>st	jrtd?d> td? t jt jttd0d@ t |t!dAdB| t |t!dCdD| t |t!dEdF| t |	t!dGdG| t |
t!dHdH| tdI tdJs6tdKt jt!dGdL d,dM tdN t j"|sRt jt|}t#|sxtdK| d,dO tdP t	j$st%t	j&dQ t	j'rt(| tdR t	j)rt*t+ tdS dTtj,v rtdU t-dV d S )WNZTORCH_INDEX_URLz&https://download.pytorch.org/whl/cu118ZTORCH_COMMANDz?pip install torch==2.0.1 torchvision==0.15.2 --extra-index-url Z	REQS_FILEzrequirements_versions.txtZXFORMERS_PACKAGEzxformers==0.0.20ZCLIP_PACKAGEzShttps://github.com/openai/CLIP/archive/d50d76daa670286dd6cacf3bcd80b5e4823fc8e1.zipZOPENCLIP_PACKAGEz_https://github.com/mlfoundations/open_clip/archive/bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b.zipZSTABLE_DIFFUSION_REPOz3https://github.com/Stability-AI/stablediffusion.gitZSTABLE_DIFFUSION_XL_REPOz5https://github.com/Stability-AI/generative-models.gitZK_DIFFUSION_REPOz,https://github.com/crowsonkb/k-diffusion.gitZCODEFORMER_REPOz(https://github.com/sczhou/CodeFormer.gitZ	BLIP_REPOz&https://github.com/salesforce/BLIP.gitZSTABLE_DIFFUSION_COMMIT_HASHZ(cf1d67a6fd5ea1aa600c4df58e5b47da45f6bdbfZSTABLE_DIFFUSION_XL_COMMIT_HASHZ(45c443b316737a4ab6e40413d7794a7f5657c19fZK_DIFFUSION_COMMIT_HASHZ(ab527a9a6d347f364e3d185ba6d714e22d80cb3cZCODEFORMER_COMMIT_HASHZ(c5b4593074ba6214284d6acd5f1719b6c5d739afZBLIP_COMMIT_HASHZ(48211a1594f1321b00f14c9f7a5b4813144b2fb9ZtmpZrestartZSD_WEBUI_RESTARTINGr   Zcheckszgit version infozPython z	Version: zCommit hash: ZtorchZtorchvisionrX   z" -m z Installing torch and torchvisionzCouldn't install torchTrb   zinstall torchz.import torch; assert torch.cuda.is_available()zkTorch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this checkztorch GPU testZclipzinstall zinstall clipZ	open_clipzinstall open_clipxformerszinstall -U -I --no-deps zinstall xformersngrokzinstall ngrok)exist_okzstable-diffusion-stability-aizStable Diffusionzgenerative-modelszStable Diffusion XLzk-diffusionzK-diffusionZ
CodeFormerZBLIPzclone repositoresZlpipszinstall -r "zrequirements.txtzrequirements for CodeFormerzinstall CodeFormer requirementsZrequirementszinstall requirements)r   zcheck versionzupdate extensionsz--exitz"Exiting because of --exit argumentr   ).r1   rD   rt   remover2   r3   r   
setdefaultOSErrorr>   Zskip_python_version_checkr   r   r   r(   r:   rC   r   r   Zreinstall_torchrT   rF   r\   Zskip_torch_cuda_testr_   rI   r]   Zreinstall_xformersr   r   makedirsrU   rk   rW   rw   r   rZ   r   Zui_settings_fileZupdate_checkrv   Zupdate_all_extensionsrq   r   argvexit)Ztorch_index_urlZtorch_commandr   Zxformers_packageZclip_packageZopenclip_packageZstable_diffusion_repoZstable_diffusion_xl_repoZk_diffusion_repoZcodeformer_repoZ	blip_repoZstable_diffusion_commit_hashZstable_diffusion_xl_commit_hashZk_diffusion_commit_hashZcodeformer_commit_hashZblip_commit_hashrr   tagr   r   r   prepare_environment6  s    












 




r   c                   C   s|   dt jvrt jd dt jvrBt jd t jtjtd dt jvrXt jd dt jvrnt jd dtjd< d S )Nz--apiz--ckptztest/test_files/empty.ptz--skip-torch-cuda-testz--disable-nan-checkr
   ZCOMMANDLINE_ARGS)r   r   rH   r1   r2   r3   r   rD   r   r   r   r   configure_for_tests  s    



r   c               	   C   sZ   t ddtjv rdnd ddtjdd    dd l} dtjv rN|   n|   d S )	Nz
Launching z	--nowebuiz
API serverzWeb UIz with arguments:  r   r   )rC   r   r   r3   webuiZapi_only)r   r   r   r   start  s
    2

r   c                  C   sp   ddl m}  dd l}|  }d|j d d}t|ddd}|| W d    n1 sb0    Y  |S )	Nr   )sysinfozsysinfo-z%Y-%m-%d-%H-%Mz.txtwr   r+   )r   r   datetimert   Zutcnowstrftimer6   write)r   r   textfilenamer9   r   r   r   dump_sysinfo  s    (r   )N)<r   r   r$   r1   rj   r   Zimportlib.utilrO   r   ru   Z	functoolsr   r   r   r   Zmodules.paths_internalr   r   Zmodules.timerr   r   ZparserZparse_known_argsr>   ro   Zsetup_loggingZloglevel
executabler\   rD   rt   r	   r[   rU   Zdefault_command_liver   r(   r:   boolr|   rF   rT   rW   r]   r_   rd   rf   rk   rq   rv   r}   r   r   compiler   r   r   r   r   r   r   r   r   r   <module>   s\   



 	


#j	