a
    Ad                     @   s   d 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ZddlmZm	Z	m
Z
 ddlmZmZ i add Zdd	 Zd
d Zdd Zdd Zdd ZdS )zX
Supports saving and restoring webui and extensions from a known working set of commits
    N)datetime)shared
extensionserrors)script_pathconfig_states_dirc            
      C   s0  t   tjtdd g } ttD ]}|dr$tjt|}z^t	|ddd<}t
|}d|v slJ d||d	< | | W d    n1 s0    Y  W q$ ty } z td
| d|  W Y d }~q$d }~0 0 q$t| dd dd} | D ]:}tt|d }|dd}| d| }	|t |	< qt S )NT)exist_okz.jsonrzutf-8)encoding
created_atz"created_at" does not existfilepathz[ERROR]: Config states z, c                 S   s   | d S )Nr    )csr   r   =/var/www/html/stable-diffusion-webui/modules/config_states.py<lambda>&       z$list_config_states.<locals>.<lambda>)keyreversenameConfig: )all_config_statesclearosmakedirsr   listdirendswithpathjoinopenjsonloadappend	Exceptionprintsortedtimeasctimegmtimeget)
config_statesfilenamer   fjer   	timestampr   	full_namer   r   r   list_config_states   s*    

,,
r1   c                  C   s   d } z$t jt jtdr&tt} W n& tyN   tj	dt dd Y n0 d }d }d }d }| r| j
sz4t|  jd }| jj}| jjj}|j}| jj}W n ty   d }Y n0 ||||dS )N.git"Error reading webui git info from Texc_info)remotecommit_hashcommit_datebranch)r   r   existsr   r   gitRepor#   r   reportbarenextr6   urlsheadcommitcommitted_datehexshaactive_branchr   )
webui_repowebui_remotewebui_commit_hashwebui_commit_datewebui_branchrA   r   r   r   get_webui_config1   s0    


rK   c                  C   sP   i } t j D ]@}|  |j|j|j|j|j|j|j|j	|j
d	}|| |j< q
| S )N)	r   r   enabled
is_builtinr6   r7   r8   r9   have_info_from_repo)r   read_info_from_repor   r   rL   rM   r6   r7   r8   r9   rN   )
ext_configextentryr   r   r   get_extension_configQ   s    
rS   c                  C   s$   t   } t }t }| ||dS )N)r   webuir   )r   nowr/   rK   rS   )Zcreation_timewebui_configrP   r   r   r   
get_configh   s    rW   c                 C   s   t d d| vrt d d S | d }d|vr8t d d S |dd }d }z$tjtjtdrjtt}W n( t	y   t
jdt dd	 Y d S 0 z2|jjdd
 |jj|dd t d| d W n" t	y   t
d|  Y n0 d S )Nz* Restoring webui state...rT   z$Error: No webui data saved to configr7   z&Error: No commit saved to webui configr2   r3   Tr4   )all)hardz* Restored webui to commit .zError restoring webui to commit)r$   r)   r   r   r:   r   r   r;   r<   r#   r   r=   fetchreset)configrV   rH   rF   r   r   r   restore_webui_configt   s,    r^   c                 C   s  t d d| vrt d d S | d }g }g }ttjD ]B}|jrFq8|  |j}|j|vrd|_||j |||d d ddf q8||j }d|v r:|d r:zL|	|d  |  ||d kr|||d d d|d d d f W n@ t
y6 } z&|||d d d|f W Y d }~n
d }~0 0 n|||d d dd	f |d
dsvd|_||j q8d|_q8|tj_tjtj t d |D ]J\}}}	}
|	rt d|j d| d|
  nt d|j d|
 d qd S )Nz* Restoring extension state...r   z(Error: No extension data saved to configT   Fz>Saved extension state not found in config, marking as disabledr7   zNo commit hash found in configrL   z)* Finished restoring extensions. Results:z  + r   z -> z  ! z: FAILURE ())r$   tqdmr   rM   rO   r7   r   disabledr"   fetch_and_reset_hardr#   r)   r   optsdisabled_extensionssaveconfig_filename)r]   rP   resultsrb   rQ   Zcurrent_commitrR   exZprev_commitsuccessresultr   r   r   restore_extension_config   sL    

*2rl   )__doc__r   r    r&   ra   r   r;   modulesr   r   r   modules.paths_internalr   r   r   r1   rK   rS   rW   r^   rl   r   r   r   r   <module>   s    