
    Vh                     l   d dl m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 ddlmZ ddlmZ  ej        e          Z G d d	e          Zd
 ZdedefdZd Z ed          fdefdZdedefdZdedefdZedefd            ZdedefdZ e
j         de!e          Z"de"de"fdZ#dS )    )contextmanagerN)Path   )DecoratedMain)fatal)XPc                       e Zd ZdS )CommandErrorN)__name__
__module____qualname__     S/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/dora/git_save.pyr
   r
      s        Dr   r
   c                 `   t          j        | ft           j        t           j        d|}|j        rTd                    d | D                       }t          d| d|j         d|j                                        z             |j                                        	                                S )N)stdoutstderr c              3   >   K   | ]}t          j        |          V  d S )N)shlexquote).0cs     r   	<genexpr>zrun_command.<locals>.<genexpr>   s*      ??!u{1~~??????r   zCommand z	 failed (z): 
)
sprunPIPESTDOUT
returncodejoinr
   r   decodestrip)commandkwargsproccommand_strs       r   run_commandr'      s    6'F"'")FFvFFD \hh??w?????C{CCT_CCCdkFXFXFZFZZ\ \ 	\;%%'''r   rootmainc                 R   t          g d          }g }|j        j        }|
|j        dz   }t          j                            |          }d }|4|j        J t          |j                  	                                j
        }|                    d          D ]}|st          j        |          }g }	t          |          dk    r|	                    |d                    n6t          |          dk    r"|d         dk    sJ |	|d         |d         gz  }	n	 d
}
|	D ]G}|d}
 n@| |z  	                                }	 |                    |           6# t           $ r d}
Y Dw xY w|
s|                    |           |r)d                    |          }t%          d|            d S d S )N)gitstatusz--porcelainz.grids
   r         z->zInvalid partsTFzRRepository is not clean! The following files should be commited or git ignored: 
 )r'   doragrid_packagepackage	importlibutil	find_specoriginr   resolveparentsplitr   lenappendrelative_to
ValueErrorr    r   )r(   r)   outfiltered	grid_namespec	grid_pathlinepartspaths
line_cleanpathrpathfiless                 r   check_repo_cleanrK   %   s
   
666
7
7CH 	&IL8+	>##I..D#'I{&&&%%--//6			$ " " 	D!! u::??LLq""""ZZ1__8t####eAha))EE)
 	# 	#D "
D[))++E#!!),,,, # # #"


# 	"OOD!!! -		(## ,$), , 	- 	- 	- 	- 	-- -s   <EE! E!c                  b    t          t          g d                                                    S )N)r+   z	rev-parsez--show-toplevel)r   r'   r8   r   r   r   get_git_rootrM   Q   s+    CCCDDEEMMOOOr   .repoc                 (    t          g d|           S )N)r+   logz-1z--format=%H)cwd)r'   )rO   s    r   get_git_commitrS   U   s    :::EEEEr   sourcetargetc           	          |j         |j        dz   z  }t          ddddt          |           z   t          |          g           t	          |          }|j         |z  }|                    |           |S )Nz.tmpr+   clonez	--depth=1zfile://)r9   namer'   strrS   rename)rT   rU   
tmp_targetactual_commitactual_targets        r   shallow_cloner^   Y   st    &+"67Ji#f++.Es:WXXX
 #:..MMM1Mm$$$r   returnc                 <   t                      }t                      }t          ||            | j        j        | j        j        z  }|                    dd           ||z  }|                                st          ||          }|                                sJ |S )z,Return a fresh clone in side the given path.T)parentsexist_ok)	rM   rS   rK   r1   dir_codesmkdirexistsr^   )r)   rT   commitcodesrU   s        r   get_new_cloneri   f   s    ^^FFVT"""IMDI,,E	KKtK,,,V^F==?? /vv..==???Mr   rW   c              #     K   t          d                                          }t                      }|                    |          }t	          |          t
          j        d<   t          j        | |z             	 dV  t          j        |           t
          j        d= dS # t          j        |           t
          j        d= w xY w)zcContext manager that temporarily relocates to a clean clone of the
    current git repository.
    rN   _DORA_ORIGINAL_DIRN)r   r8   rM   r=   rY   osenvironchdir)rW   rR   r(   relative_paths       r   enter_clonerp   t   s      
 s))



C>>DOOD))M'*3xxBJ#$HU]"###-
J+,,, 	J+,,,,,s   ;B" "#Cxpc                 :   | j         j        sJ | j        }|                                r\|                                r|                                 n3|                                r|                    |j        dz             n	 |	                    |           d S )Nold_code)
r1   git_savecode_folderrf   
is_symlinkunlinkis_dirrZ   r9   
symlink_to)rq   rW   codes      r   assign_cloner{      s    7>D{{}} C?? 	CKKMMMM[[]] 	CKKj01111BOOEr   AnyPathrH   c                 
   t          |           }t          |           }dt          j        vr	 ddl}t          |j                            t          |                              }nG# t          $ r: |	                                s#t          t          j
                              |z  }Y nw xY w ||          S t          t          j        d                   }|	                                r ||          S  |||z            S )an  When using `git_save`, this takes a potentially relative path
    with respect to the original execution folder and return an absolute path.
    This is required if you use relative path with respect to this original folder.

    When using both `git_save` and Hydra, two change of directory happens:
    - Dora moves to git clone
    - Hydra moves to XP folder

    Hydra provides a `to_absolute_path()` function. In order to simplify your code,
    if `git_save` was not used, and Hydra is in use, this will fallback to calling
    Hydra version, so that you only need to ever call this function to cover all cases.
    rk   r   N)typer   rl   rm   hydra.utilsutilsto_absolute_pathrY   ImportErroris_absolutegetcwd)rH   klass_pathhydraoriginal_cwds        r   r   r      s	    JJEJJE2:--	C
 55c%jjAABBEE	  	2 	2 	2$$&& 2RY[[))E1	2
 uU|| BJ';<== 	/5<<5-...s   A' 'AB+*B+)$
contextlibr   importlib.utilr4   loggingrl   r   
subprocessr   typingtppathlibr   r)   r   rQ   r   rq   r   	getLoggerr   logger	Exceptionr
   r'   rK   rM   rS   r^   ri   rp   r{   TypeVarrY   r|   r   r   r   r   <module>r      s%   & % % % % %      				                                  
	8	$	$	 	 	 	 	9 	 	 	( ( ()-4 )-} )- )- )- )-XP P P !%S		 F F F F F F
$ 
 
 
 
 
 $     -t - - - -"
R 
 
 
 
 
 "*YT
*
* /7  /w  /  /  /  /  /  /r   