
    gYw                        d gZ ddlmZ ddlZddlmZ ddlZddlZddlZddl	m
Z
mZ ddlZddlmZmZmZmZm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 ddl m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ejh                  dk\  rddl)m5Z5 nddl6m5Z5 ddl7m8Z8 e1rddl9m:Z: ddl;m<Z<  ejz                  e>      Z? G d d ej                  e$ee#      ZAy)Commit    )defaultdictN)BytesIO)PopenPIPE)altzonedaylight	localtimetimetimezone)IStream)Git)Diffable)ActorStatsfinalize_process
hex_to_bin   )base)Tree)SerializableTraversableIterableObjaltz_to_utctz_strfrom_timestampparse_actor_and_date
parse_date)
AnyDictIOIteratorListSequenceTupleTYPE_CHECKINGUnioncast)      )Literal)PathLike)SymbolicReference)Repoc                   T    e Zd ZU dZdZdZdZdZdZe	d   e
d<   dZd	Zed    e
d
<   	 	 	 	 	 	 	 	 	 	 	 d;dddedeedf   deedf   deedf   dedef   deedf   deedf   dedef   deeedf   d
eed    df   deedf   deedf   ddf fdZedd ded   fd       Zedddd defd       Zdedd fdZd eddf fd!Zedej<                  fd"       Zedej<                  fd#       Z edeeef   fd$       Z!d<d%ee"ee"   f   dedefd&Z#edefd'       Z$e	 d<ddd(eed d)f   d%ee"ee"   f   dede%d    f
d*       Z&d<d%ee"ee"   f   dede%d    fd+Z'ede(fd,       Z)ede*eef   fd-       Z+ede,eeef      fd.       Z-ede*ee,e   f   fd/       Z.eddd0ee/e0f   de%d    fd1       Z1e	 	 	 	 	 	 d=dddeeef   ded2ede,d    f   d3e2dedef   dedef   d4edeej<                  f   d5edeej<                  f   dd fd6       Z3d7e4dd fd8Z5d7e4dd fd9Z6ede,e   fd:       Z7 xZ8S )>r   a1  Wraps a git commit object.

    See :manpage:`gitglossary(7)` on "commit object":
    https://git-scm.com/docs/gitglossary#def_commit_object

    :note:
        This class will act lazily on some of its attributes and will query the value on
        demand only if it involves calling the git binary.
    GIT_AUTHOR_DATEGIT_COMMITTER_DATEzi18n.commitencodingzUTF-8committype)treeauthorauthored_dateauthor_tz_offset	committercommitted_datecommitter_tz_offsetmessageparentsencodinggpgsighexshar:   Nrepor,   binshar2   r3   r4   r5   r6   r7   r8   r9   r;   r<   returnc                 F   t         |   ||       || _        |#t        |t              sJ dt        |      z         ||| _        ||| _        ||| _        ||| _	        ||| _
        ||| _        |	|	| _        |
|
| _        ||| _        ||| _        ||| _        yy)a  Instantiate a new :class:`Commit`. All keyword arguments taking ``None`` as
        default will be implicitly set on first query.

        :param binsha:
            20 byte sha1.

        :param tree:
            A :class:`~git.objects.tree.Tree` object.

        :param author:
            The author :class:`~git.util.Actor` object.

        :param authored_date: int_seconds_since_epoch
            The authored DateTime - use :func:`time.gmtime` to convert it into a
            different format.

        :param author_tz_offset: int_seconds_west_of_utc
            The timezone that the `authored_date` is in.

        :param committer:
            The committer string, as an :class:`~git.util.Actor` object.

        :param committed_date: int_seconds_since_epoch
            The committed DateTime - use :func:`time.gmtime` to convert it into a
            different format.

        :param committer_tz_offset: int_seconds_west_of_utc
            The timezone that the `committed_date` is in.

        :param message: string
            The commit message.

        :param encoding: string
            Encoding of the message, defaults to UTF-8.

        :param parents:
            List or tuple of :class:`Commit` objects which are our parent(s) in the
            commit dependency graph.

        :return:
            :class:`Commit`

        :note:
            Timezone information is in the same format and in the same sign as what
            :func:`time.altzone` returns. The sign is inverted compared to git's UTC
            timezone.
        Nz(Tree needs to be a Tree instance, was %s)super__init__r?   
isinstancer   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   )selfr>   r?   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   	__class__s                 G/var/www/openai/venv/lib/python3.12/site-packages/git/objects/commit.pyrC   zCommit.__init__m   s    ~ 	v&dD)b+UX\]aXb+bb)DI DK$!.D'$4D! &DN%"0D*':D$"DL"DL$DM DK     )r   .c                 ,    t        |j                        S N)tupler:   )clsr0   s     rG   _get_intermediate_itemszCommit._get_intermediate_items   s    V^^$$rH   c                     t               }|j                  |       |j                         }|j                  d       |j                  j                  t        | j                  ||            }|j                  S )zCalculate the sha of a commit.

        :param repo:
            :class:`~git.repo.base.Repo` object the commit should be part of.

        :param commit:
            :class:`Commit` object for which to generate the sha.
        r   )	r   
_serializetellseekodbstorer   r1   r?   )rL   r>   r0   stream	streamlenistreams         rG   _calculate_sha_zCommit._calculate_sha_   sX     &!KKM	A((..9f!EF~~rH   kwargsc                 L   | j                   D ci c]  }|t        | |       }}|D ]  }|| j                   vst        d       |j                  |        | j                  | j
                  | j                  fi |}| j                  | j
                  |      |_        |S c c}w )zCreate new commit object from an existing commit object.

        Any values provided as keyword arguments will replace the corresponding
        attribute in the new object.
        zinvalid attribute name)		__slots__getattr
ValueErrorupdaterF   r>   NULL_BIN_SHArW   r?   )rE   rX   kattrsattrname
new_commits         rG   replacezCommit.replace   s     /3nn=nGD!$$n=Ht~~- !9::  	V#T^^DIIt/@/@JEJ
 00JG
 >s   B!attrc                    |t         j                  v rb| j                  j                  j	                  | j
                        \  }}| _        }| j                  t        |j                                      y t        | -  |       y rJ   )r   rZ   r>   rR   rT   r?   size_deserializer   readrB   _set_cache_)rE   rd   _binsha	_typenamerT   rF   s        rG   ri   zCommit._set_cache_   s^    6###48IIMM4H4H4U1GY	6gfkkm45G%rH   c                 B    t        | j                  | j                        S rJ   )r   r4   r5   rE   s    rG   authored_datetimezCommit.authored_datetime   s    d00$2G2GHHrH   c                 B    t        | j                  | j                        S rJ   )r   r7   r8   rm   s    rG   committed_datetimezCommit.committed_datetime   s    d1143K3KLLrH   c                     t        | j                  t              r| j                  j                  dd      d   S | j                  j                  dd      d   S )z):return: First line of the commit message
r   r      
)rD   r9   strsplitrm   s    rG   summaryzCommit.summary  sJ     dllC(<<%%dA.q11<<%%eQ/22rH   pathsc                 *   |rJt         | j                  j                  j                  | j                  d|fi |j                               S t         | j                  j                  j                  | j                  fi |j                               S )a  Count the number of commits reachable from this commit.

        :param paths:
            An optional path or a list of paths restricting the return value to commits
            actually containing the paths.

        :param kwargs:
            Additional options to be passed to :manpage:`git-rev-list(1)`. They must not
            alter the output style of the command, or parsing will yield incorrect
            results.

        :return:
            An int defining the number of reachable commits
        --)lenr>   gitrev_listr=   
splitlines)rE   rw   rX   s      rG   countzCommit.count
  sq    " -tyy}}--dkk4Q&Q\\^__)499==))$++@@KKMNNrH   c                 L    | j                   j                  j                  |       S )z
        :return:
            String describing the commits hex sha based on the closest
            `~git.refs.reference.Reference`.

        :note:
            Mostly useful for UI purposes.
        )r>   r{   name_revrm   s    rG   r   zCommit.name_rev  s     yy}}%%d++rH   revr+   c                    d|v rt        d      dg}|r@t        |t        t        j                  f      r|f}nt        |      }|j                  |        |j                  j                  ||fddi|}| j                  ||      S )a  Find all commits matching the given criteria.

        :param repo:
            The :class:`~git.repo.base.Repo`.

        :param rev:
            Revision specifier. See :manpage:`git-rev-parse(1)` for viable options.

        :param paths:
            An optional path or list of paths. If set only :class:`Commit`\s that
            include the path or paths will be considered.

        :param kwargs:
            Optional keyword arguments to :manpage:`git-rev-list(1)` where:

            * ``max_count`` is the maximum number of commits to fetch.
            * ``skip`` is the number of commits to skip.
            * ``since`` selects all commits since some date, e.g. ``"1970-01-01"``.

        :return:
            Iterator yielding :class:`Commit` items.
        prettyz<--pretty cannot be used as parsing expects single sha's onlyry   
as_processT)
r\   rD   rt   osr*   rK   extendr{   r|   _iter_from_process_or_stream)rL   r>   r   rw   rX   	args_list	paths_tupprocs           rG   
iter_itemszCommit.iter_items+  s    < v[\\ &*F	%#r{{!34"H	!%L	Y' !txx  iKDKFK//d;;rH   c                 |    |j                  dd      }|dk(  rd}||d<    | j                  | j                  | |fi |S )a  Iterate _all_ parents of this commit.

        :param paths:
            Optional path or list of paths limiting the :class:`Commit`\s to those that
            contain at least one of the paths.

        :param kwargs:
            All arguments allowed by :manpage:`git-rev-list(1)`.

        :return:
            Iterator yielding :class:`Commit` objects which are parents of ``self``
        skipr   r   )getr   r>   )rE   rw   rX   r   s       rG   iter_parentszCommit.iter_parents_  sG     zz&!$19Dvttyy$@@@rH   c                    dt         t           dt        fd}| j                  sO| j                  j                  j                  | j                  ddddd      j                         dd } ||      }nb| j                  j                  j                  | j                  d	   j                  | j                  dddd
      j                         } ||      }t        j                  | j                  |      S )zCreate a git stat from changes between this commit and its first parent
        or from all changes done if this is the very first commit.

        :return:
            :class:`Stats`
        linesr@   c           
          d}t        | | t        |       dz  d        D ]B  \  }}|j                  d      d   d   }|j                  d      \  }}}||d|d|d|dz  }D |S )N    	r   rr   )ziprz   ru   )r   text	file_infolinechange_type
insertions	deletionsfilenames           rG   process_linesz#Commit.stats.<locals>.process_lines}  su    D#&ueCJ!O4E.F#G	4'ood3A6r:48JJt4D1Yk:yRZ[[ $H KrH   ry   T)numstat
no_renamesrootrawr   Nr   )r   r   r   )r!   rt   r:   r>   r{   	diff_treer=   r}   diffr   _list_from_string)rE   r   r   r   s       rG   statszCommit.statst  s    	c 	s 	 ||IIMM++T4DtQU , jl12E !'DIIMM&&Q&&T4TX^b ' jl  !'D&&tyy$77rH   c                     t        j                  dt        d       | j                  j	                         D ci c]  \  }}||d    c}}S c c}}w )al  Deprecated. Get the trailers of the message as a dictionary.

        :note:
            This property is deprecated, please use either :attr:`trailers_list` or
            :attr:`trailers_dict`.

        :return:
            Dictionary containing whitespace stripped trailer information.
            Only contains the latest instance of each trailer key.
        zWCommit.trailers is deprecated, use Commit.trailers_list or Commit.trailers_dict insteadr   )
stacklevelr   )warningswarnDeprecationWarningtrailers_dictitems)rE   r_   vs      rG   trailerszCommit.trailers  sP     	e	

 %)$6$6$<$<$>?$>DAq1Q4$>???s   Ac                    g d}| j                   j                  j                  |dt              }|j	                  t        | j                        j                               d   j                  d      }|j                         }|sg S g }|j                  d      D ]F  }|j                  dd      \  }}|j                  |j                         |j                         f       H |S )	a  Get the trailers of the message as a list.

        Git messages can contain trailer information that are similar to :rfc:`822`
        e-mail headers. See :manpage:`git-interpret-trailers(1)`.

        This function calls ``git interpret-trailers --parse`` onto the message to
        extract the trailer information, returns the raw trailer data as a list.

        Valid message with trailer::

            Subject line

            some body information

            another information

            key1: value1.1
            key1: value1.2
            key2 :    value 2 with inner spaces

        Returned list will look like this::

            [
                ("key1", "value1.1"),
                ("key1", "value1.2"),
                ("key2", "value 2 with inner spaces"),
            ]

        :return:
            List containing key-value tuples of whitespace stripped trailer information.
        )r{   zinterpret-trailersz--parseT)r   rV   r   utf8rr   :r   )r>   r{   executer   communicatert   r9   encodedecodestripru   append)rE   cmdr   trailertrailer_listtkeyvals           rG   trailers_listzCommit.trailers_list  s    B 7"&))--"7"7 #8 #

 ''DLL(9(@(@(BCAFMMfU--/It$AwwsAHCciik :; % rH   c                     t        t              }| j                  D ]  \  }}||   j                  |        t	        |      S )a  Get the trailers of the message as a dictionary.

        Git messages can contain trailer information that are similar to :rfc:`822`
        e-mail headers. See :manpage:`git-interpret-trailers(1)`.

        This function calls ``git interpret-trailers --parse`` onto the message to
        extract the trailer information. The key value pairs are stripped of leading and
        trailing whitespaces before they get saved into a dictionary.

        Valid message with trailer::

            Subject line

            some body information

            another information

            key1: value1.1
            key1: value1.2
            key2 :    value 2 with inner spaces

        Returned dictionary will look like this::

            {
                "key1": ["value1.1", "value1.2"],
                "key2": ["value 2 with inner spaces"],
            }


        :return:
            Dictionary containing whitespace stripped trailer information, mapping
            trailer keys to a list of their corresponding values.
        )r   listr   r   dict)rE   dr   r   s       rG   r   zCommit.trailers_dict  s<    F **HCcFMM# +AwrH   proc_or_streamc              #     K   t        |d      r)t        t        |      }|j                  +|j                  }nt        |d      rt        t        |      }|}j
                  }	  |       }|sn`|j                         }t        |      dkD  r|j                  dd      \  }}t        |      dk(  s
J d|z          | |t        |             jt        |d      rt        t        |      }t        |       yyw)a  Parse out commit information into a list of :class:`Commit` objects.

        We expect one line per commit, and parse the actual commit information directly
        from our lighting fast object database.

        :param proc:
            :manpage:`git-rev-list(1)` process instance - one sha per line.

        :return:
            Iterator supplying :class:`Commit` objects
        waitNreadline(   r   zInvalid line: %s)hasattrr&   r   stdoutr   r   r   rz   ru   r   r   )rL   r>   r   rT   r   r   r=   _s           rG   r   z#Commit._iter_from_process_or_stream   s     ( >6*!%8N$$0'..^Z0!"n5N#F??:DZZ\F6{R JJtQ/	 v;"$A&86&AA$dJv.//   >6*!%8N^, +s   C4C6parent_commitsheadauthor_datecommit_datec
                 V   |	 |j                   j                  g}n$|D ]  }
t        |
|       rt        d|
d|         |j	                         }t
        j                  }|xs t        j                  |      }|xs t        j                  |      }t        t                     }t        xr t               j                  dkD  }|rt        nt         }|j#                  | j$                  d      }|rt'        |      \  }}n|rt'        |      \  }}n||}}|j#                  | j(                  d      }|	rt'        |	      \  }}n|rt'        |      \  }}n||}}| j*                  j-                  d      \  }}|j/                  ||| j0                        }t        |t2              st5        d      t        |t2              r|j7                  |      } | || j8                  ||||||||||      }| j;                  ||      |_        |r$ddl}	 |j                   jA                  ||       |S |S # t        $ r g }Y w xY w# t        $ rd |jB                  jD                  jG                  ||j                   jH                  |d	|z        }|j                   jK                  |d
|z         Y |S w xY w)a  Commit the given tree, creating a :class:`Commit` object.

        :param repo:
            :class:`~git.repo.base.Repo` object the commit should be part of.

        :param tree:
            :class:`~git.objects.tree.Tree` object or hex or bin sha.
            The tree of the new commit.

        :param message:
            Commit message. It may be an empty string if no message is provided. It will
            be converted to a string, in any case.

        :param parent_commits:
            Optional :class:`Commit` objects to use as parents for the new commit. If
            empty list, the commit will have no parents at all and become a root commit.
            If ``None``, the current head commit will be the parent of the new commit
            object.

        :param head:
            If ``True``, the HEAD will be advanced to the new commit automatically.
            Otherwise the HEAD will remain pointing on the previous commit. This could
            lead to undesired results when diffing files.

        :param author:
            The name of the author, optional.
            If unset, the repository configuration is used to obtain this value.

        :param committer:
            The name of the committer, optional.
            If unset, the repository configuration is used to obtain this value.

        :param author_date:
            The timestamp for the author field.

        :param commit_date:
            The timestamp for the committer field.

        :return:
            :class:`Commit` object representing the new commit.

        :note:
            Additional information about the committer and author are taken from the
            environment or from the git configuration. See :manpage:`git-commit-tree(1)`
            for more information.
        NzParent commit 'z' must be of type r   r   .z)conf_encoding could not be coerced to str)logmsgzcommit (initial): %szcommit: Switching to %s)&r   r0   r\   rD   config_readerr   environr   r6   r3   intr   r	   r
   tm_isdstr   r   r   env_author_dater   env_committer_dateconf_encodingru   	get_valuedefault_encodingrt   	TypeErrorr2   r^   rW   r?   git.refs
set_commitrefsHeadcreaterefset_reference)rL   r>   r2   r9   r   r   r3   r6   r   r   pcrenv	unix_timeis_dstoffsetauthor_date_strauthor_timeauthor_offsetcommitter_date_strcommitter_timecommitter_offsetenc_section
enc_optionr   rb   r{   masters                               rG   create_from_treezCommit.create_from_tree1  s   v !$"&))"2"2!3 $!!S)$qe;McU%STT $ !jj4!4	+5<<+ K	6ik22Q6"''#"5"5r:)3K)@&K)3O)D&K)2FK !WWS%;%;R@/9+/F,N,/9:L/M,N,/8&,N #&"3"3"9"9#">Z[*c>R>RS--GHH dC 99T?D 

  //jA
 [		$$Z$@ zA  $!#$f  	[ --IIMM1G;	 .  		''7PSY7Y'Z 	[s$   H) H; )H87H8;A)J('J(rT   c           
         |j                   } |d| j                  z  j                  d             | j                  D ]  } |d|z  j                  d              | j                  }|j
                  }| j                  }d} ||d||j                  | j                  t        | j                        fz  j                  | j                               |j
                  } ||d||j                  | j                  t        | j                        fz  j                  | j                               | j                  | j                  k7  r$ |d| j                  z  j                  d             	 | j                  d      rT |d	       | j                   j#                  d
      j%                  d
      D ]  } |d|z   d
z   j                  d             !  |d       t)        | j*                  t,              r- || j*                  j                  | j                               | S  || j*                         | S # t&        $ r Y nw xY w)Nztree %s
asciiz
parent %s
z%s %s <%s> %s %s
r3   r6   zencoding %s
r<   s   gpgsigrr    rs   )writer2   r   r:   r3   namer6   emailr4   r   r5   r;   r7   r8   r   __getattribute__r<   rstripru   AttributeErrorrD   r9   rt   )	rE   rT   r   r   aanamecfmtsiglines	            rG   rO   zCommit._serialize  s   {TYY&..w78A=1$,,W56  KKNN"GG&&%d&;&;< fT]]#	
 GG''%d&>&>? fT]]#	
 ==D111?T]]2::7CD	$$X.i #{{11$7==dCG3=4/77@A  D
 	e dllC($,,%%dmm45  $,,  		s   ,A%H4 4	I ?I c           
      v   |j                   }t        | j                  t         |       j	                         d         t        j
                  dz  d      | _        g | _        d }	  |       }|j                  d      s|}n_| j                  j                   t        |       | j                  t        |j	                         d   j                  d                         zt        | j                        | _        |} |       } |       }|j                  d      rC |       }|j                  d	      r |       }|j                  d	      r|j                  d      rC| j                  | _        d| _        |}|j!                         }|r|d
d dk(  r7||j#                  d	      dz   d  j                  | j                  d      | _        n|d
d dk(  r~||j#                  d	      dz   d  dz   }	d}
	  |       }|sn$|d
d d	k7  r|j!                         }d}
n	|	|dd  z  }	.|	j%                  d      j                  | j                  d      | _        |
r |       j!                         }|r	 t'        |j                  | j                  d            \  | _        | _        | _        	 t'        |j                  | j                  d            \  | _        | _        | _        |j;                         | _        	 | j<                  j                  | j                  d      | _        | S # t.        $ r& t0        j3                  d|| j                  d       Y w xY w# t.        $ r& t0        j3                  d|| j                  d       Y w xY w# t.        $ r1 t0        j3                  d| j<                  | j                  d       Y | S w xY w)Nr      r   Ts   parentr   r   s	   mergetag     r   
   s	   encoding ignore   s   gpgsig rs   Frc   z3Failed to decode author line '%s' using encoding %s)exc_infoz6Failed to decode committer line '%s' using encoding %sz/Failed to decode message '%s' using encoding %s)r   r   r>   r   ru   tree_idr2   r:   
startswithr   r1   r   rK   r   r;   r<   r   findr   r   r3   r4   r5   UnicodeDecodeError_loggererrorr6   r7   r8   rh   r9   )rE   rT   r   	next_lineparent_lineauthor_linecommitter_lineencbufsigis_next_headersigbufs               rG   rg   zCommit._deserialize  s   ??Jxz/?/?/A!/D$Et||WYGY[]^		"*K)))4'	LL
T
499jARARATUWAXA_A_`gAh6i jk  T\\*  ! J	""<0 
I&&t,$J	 &&t, ""<0 -- iik1RyL( #CHHTNQ$6$8 9 @ @PX YQqZ'#((4.1,./%7!&%ZF!a{d*$lln)-6!":%C  "jj/66t}}hO!*""$C' ,	
 %[%7%7y%QR	"%	
 %^%:%:4==)%TU	#( {{}	<<..t}}iHDL K " 	MME	  	 " 	MMH	  	 " 	MMA	   	s6   &8L 8M -+M> ,M	M	,M;:M;>6N87N8c                     g }| j                   rMt        j                  d| j                   t        j                        }|D ]  }|j	                  t        |         |S )a  Search the commit message for any co-authors of this commit.

        Details on co-authors:
        https://github.blog/2018-01-29-commit-together-with-co-authors/

        :return:
            List of co-authors for this commit (as :class:`~git.util.Actor` objects).
        z^Co-authored-by: (.*) <(.*?)>$)r9   refindall	MULTILINEr   r   )rE   
co_authorsresultsr3   s       rG   r  zCommit.co_authorsx  sU     
<<jj1G
 "!!%.1 " rH   )NNNNNNNNNNN)r   )NFNNNN)9__name__
__module____qualname____doc__r   r   r   r   r1   r)   __annotations__rZ   _id_attribute_r"   bytesr%   r   r   r   floatrt   rC   classmethodr#   rM   rW   r   rc   ri   propertydatetimern   rp   rv   r*   r~   r   r    r   r   r   r   r   r   r!   r   r   r   r   r   boolr   r   rO   rg   r  __classcell__)rF   s   @rG   r   r   C   sA    (O- *M &D'(
&I Nh #'%)*./3(,+/26+/37%)#'X!X! X! D$J	X!
 eTk"X! S$Y'X!  e,X! %X! c4i(X! #4;/X! sE4'(X! x)4/0X! T	"X! c4i X! 
X!t %X %%:N % % 6 8   $  && & & I8#4#4 I I MH$5$5 M M 3sEz* 3 3O58H+=!=> Os OWZ O* 	,# 	, 	, 
 68	1<1< 3"5561< Xx112	1<
 1< 
(	1< 1<fA%(82D(D"E AVY A^fgo^p A* 8u 8 88 @$sCx. @ @$ 1tE#s(O4 1 1f %tCcN3 % %N .- .-eUWiHX .-]efn]o .- .-`  7;%)(,;?;?]] D#I] 	]
 dDN23] ] dEk"] u%] 4h&7&778] 4h&7&778] 
] ]B9 9X 9vf7 fx fT DK  rH   )B__all__collectionsr   r)  ior   loggingr   r  
subprocessr   r   sysr   r   r	   r
   r   r   gitdbr   git.cmdr   git.diffr   git.utilr   r   r   r   r   r   r2   r   utilr   r   r   r   r   r   typingr   r   r   r    r!   r"   r#   r$   r%   r&   version_infor)   typing_extensions	git.typesr*   r   r+   git.repor,   	getLoggerr  r  Objectr    rH   rG   <module>r?     s    * #    	 	 " 
 = =     ? ?      v) * '

H
%JT[[0(L JrH   