
    q&f\                        d dl Z d dlZd dlZd dlmZmZmZmZmZm	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mZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z% d	 Z&	 	 	 	 	 d>d
Z'	 	 	 	 	 	 	 	 d?dZ( G d d      Z)d Z* G d d      Z+ G d de+      Z, G d de+      Z-d Z.d Z/d@dZ0dAdZ1ejd                   G d d             Z3dedee4   dee4ef   de3fdZ5d  Z6d! Z7d" Z8dBd#Z9d$ Z:dCd%Z;d&d'd(d)d*d+d,d-d.d/	Z<d0 Z=d1 Z>d2ed3e3de	ej~                  eeegej                  f      f   fd4ZAd2ed3e3de	ej~                  ee)   f   fd5ZBd6 ZCd7 ZDd8 ZEdDd9ZFd: ZGd; ZHd< ZId= ZJy)E    N)AnyCallableDictOptionalSequenceTuple   )_)wdirrev)attr)dagopdiffutilerror	formattergraphmodmatchmdiffpatchpathutilpycompatrevset
revsetlangscmutilsmartset
templatekw	templaterutil)dateutil
stringutilc                     | j                  d      }|r1	 t        |      }|dk  rt        j                  t        d            |S d}|S # t        $ r t        j                  t        d            w xY w)z0get the log limit according to option -l/--limits   limits    limit must be a positive integerr   s   limit must be positiveN)getint
ValueErrorr   
InputErrorr
   )optslimits     6/usr/lib/python3/dist-packages/mercurial/logcmdutil.pygetlimitr(   4   s    HHXE	KJE A:""1%>#?@@ L L  	K""1%H#IJJ	Ks   A	 	(A1c           	         |	r0t        j                  |j                  |j                         |	      ndd }d }fd}dk7  rt	        j
                  |d      } | |            }dz  |j                         D ]?  }|j                        r| j                  t        d       | ||            |fz         A t	        j                  |gd	      }t        j                  ||      }|}|j                  j                  d
d      xs |j                  j                  d
d      fd} |||      }|r1|j                  dd      }s |t	        j
                  |      |      }|j!                  |||||||
      S )N    c                       fdS )Nc                        |             S N )xfgs    r'   <lambda>z2get_diff_chunks.<locals>.compose.<locals>.<lambda>W   s    1Q4 r*   r.   )r0   r1   s   ``r'   composez get_diff_chunks.<locals>.composeV   s	      r*   c                 0    t        j                  |       S r-   )	posixpathjoin)r0   prefixs    r'   pathfnzget_diff_chunks.<locals>.pathfnY   s    ~~fa((r*   T)legacyrelativevalue   /s(   warning: %s not inside relative root %s
s   path)patsdefaults   devels   all-warningss   check-relrootc                 f    r!| j                        st        d| fz        | t              d  S )Ns%   file %s doesn't start with relroot %s)
startswithAssertionErrorlen)r0   	checkrootrelroots    r'   relrootpathfnz&get_diff_chunks.<locals>.relrootpathfnq   s=    g!6$<7|K  S\^$$r*   r   Fcontextnoprefix)r%   r8   copysourcematchhunksfilterfn)r   	canonpathrootgetcwdr   getuipathfnfilesr>   warnr
   r   matchmodintersectmatchersui
configboolcopydiff)rQ   repodiffoptsctx1ctx2r   changesstatr7   rJ   rH   rG   r3   r8   uipathfn	uirelroot	matchrootrelrootmatchrC   rA   rB   s           `          @@r'   get_diff_chunksr_   C   s    $$TYYtDO!) #~ &&tFVG_-	4 	I''0BCy 12I>?	 }}T	7K**5,?&GG&&o
 <WW*:; 		% /==U=;W006?F99'#   r*   c                     t         ||||||||
||      |r8|j                  dd      }d} j                         s j                         |	z
  }| j	                         rr|xs  }|r+t        j                  t        j                              gt        j                  t        j                              D ]  }|j                  |        n|r+t        j                  t        j                              nt        j                  d |	       j                         rJ fd
}t        j                  t        j                   |                   D ]  } j                  |        nD ]  \  }} j                  ||        |j                         }t!        j"                  ||      D ]  \  }}|}	 ||j$                  |   d   }t)        j*                  ||      }|j,                  j/                  |
|      }|s+|j1                  |      st3        |j5                               s||j7                   |||||||        y# t&        $ r d}Y w xY w)zshow diff or diffstat.)rY   rZ   r7   rJ   rH   r   FrD   P   N)widthc                     | S r-   r.   )chunkskwargss     r'   r2   z diffordiffstat.<locals>.<lambda>   s     r*   )r%   c               3   L   K   D ]  \  } }j                  | |        y w)Nlabelrg   )chunkrh   rd   rQ   s     r'   genzdiffordiffstat.<locals>.gen   s-     $* 7LE5((5(667s   !$rg   r	   )rY   rZ   fpr7   )r_   rS   plain	termwidthcanwritewithoutlabelsr   diffstatr   	iterlinesfilechunkiterchunkbufferwrite
diffstatui	difflabelcanbatchlabeledwritesnoder   itersubrepossubstateKeyErrorrO   subdirmatcherwvfsreljoinexactanyrM   rT   )rQ   rU   rV   rW   rX   r   rY   rZ   rk   
graphwidthr7   rJ   listsubreposrH   rb   outri   rj   rh   node2subpathsub	tempnode2submatch	subprefixrd   s   `                        @r'   diffordiffstatr      sF   $ 
#F ==U=;xxzLLNZ/E	~113hBnnT^^F%;5IJF''(8(8(@A 	EIIe	 %%dnnV&<EJF__/hF ##%7 ++D,<,<SU,CD    !' -ue,- IIKE,,T48 		  MM'215	 ))'59II%%fg6	5;;w/3x~~7G3HHH   	
  	 I		s   II I c                   ,    e Zd ZdZd Zd ZddZddZy)	changesetdifferzBGenerate diff of changeset with pre-configured filtering functionsc                 H    t        j                  |j                               S r-   )r   matchallrU   selfctxs     r'   _makefilematcherz changesetdiffer._makefilematcher   s    
++r*   c                      y r-   r.   r   s     r'   _makehunksfilterz changesetdiffer._makehunksfilter   s    r*   c                     t        ||j                         |t        j                  |      || j	                  |      ||| j                  |      	       y )N)r   rZ   r   rH   )r   rU   r   diff_parentr   r   )r   rQ   r   rV   r   rZ   s         r'   showdiffzchangesetdiffer.showdiff   sL    HHJ  %'',!//4
	
r*   c                 >   t        ||j                         |t        j                  |      || j	                  |      || j                  |            }g }t        j                  t        j                  |            D ]  \  }}}	}
|j                  |||	|
d        |S )N)r   rZ   rH   )   names	   additionss   removalss   binary)r_   rU   r   r   r   r   r   diffstatdatar   rp   append)r   rQ   r   rV   rZ   rd   diffdatafilename	additionsremovalsbinarys              r'   getdiffstatszchangesetdiffer.getdiffstats   s     HHJ  %'',//4	
 5:5G5GNN6"6
 
	1Hi6 OO%"+!)%	
	 r*   N)r   FF)__name__
__module____qualname____doc__r   r   r   r   r.   r*   r'   r   r      s    L,
r*   r   c                 $   dd| j                         z  g}| j                         r|j                  d       | j                         r:|j                  d       | j	                         D ]  }|j                  d|z          dj                  |      S )Ns   log.changesets   changeset.%ss   changeset.obsoletes   changeset.unstables   instability.%s    )phasestrobsoleter   
isunstableinstabilitiesr6   )r   labelsinstabilitys      r'   changesetlabelsr     s}    #,,. @AF
||~+,
~~+,,,. 	;KMM+k9:	;99Vr*   c                   F    e Zd ZdZddZd Zd ZddZd Zd Z	d	 Z
dd
Zy)changesetprinterz9show changeset information when templating not requested.Nc                 \   || _         || _        || _        |xs
 t               | _        t        j                  ||      | _        |xr |j                  d      | _	        |xr |j                  d      | _
        i | _        i | _        d | _        d | _        t        j                          | _        y )Ns   stats   patch)rQ   rU   bufferedr   _differr   diffallopts	_diffoptsr!   _includestat_includediffheaderhunk
lastheaderfooterr   getlogcolumns_columns)r   rQ   rU   differrV   r   s         r'   __init__zchangesetprinter.__init__$  s    	 2!2**2x8$>g)>$?h)?	"002r*   c                 b   |j                         }|| j                  v rM| j                  |   }|| j                  k7  r"|| _        | j                  j	                  |       | j                  |= || j
                  v r6| j                  j	                  | j
                  |          | j
                  |= y y r-   )revr   r   rQ   rs   r   )r   r   r   hs       r'   flushzchangesetprinter.flush2  s    ggi$++C ADOO#"#a C $))GGMM$))C.)		# r*   c                 h    | j                   r&| j                  j                  | j                          y y r-   )r   rQ   rs   r   s    r'   closezchangesetprinter.close>  s"    ;;GGMM$++& r*   c                 6   t        j                  |      }| j                  re| j                  j	                  d       | j                  |||       | j                  j                         | j                  |j                         <   y | j                  |||       y )NT)labeled)	r   byteskwargsr   rQ   
pushbuffer_show	popbufferr   r   )r   r   copiespropss       r'   showzchangesetprinter.showB  so    $$U+==GGt,JJsFE*#'77#4#4#6DIIcggi JJsFE*r*   c                 ^   |j                         }|j                  dd      }| j                  j                  r4| j                  j	                  dt        j                  |      z  d       y| j                  }| j                  j	                  |d   t        j                  |      z  t        |             |j                         }|dk7  r#| j                  j	                  |d	   |z  d
       | j                  j                  j                         D ]c  \  }}	|dk(  r|	j                  | j                  |      D ]9  }
| j                  j	                  |	j                  |
z  d|	j                  z         ; e | j                  j                  r1| j                  j	                  |d   |j!                         z  d       t        j"                  | j                  |      D ]K  }d|j!                         z  }| j                  j	                  |d   t        j                  |      z  |       M | j                  j                  r|j%                         }|'| j                  j&                  j(                  }t*        }n%| j                  j,                  j/                  |      }| j                  j	                  |d   t        j0                  | j                  ||      z  d       | j                  j	                  |d   |j3                         z  d       | j                  j	                  |d   t5        j6                  |j9                               z  d       |j;                         rC|j=                         }| j                  j	                  |d   dj?                  |      z  d       n!|jA                         r| jC                  |       | jE                  |       | j                  j                  rytG        g d|jI                         |jK                         |jM                         g      D ]:  \  }}|s	| j                  j	                  ||   dj?                  |      z  d       < nf|jO                         rV| j                  jP                  r@| j                  j	                  |d   dj?                  |jO                               z  d       |rZ| j                  jP                  rD|D cg c]  }d|z  	 }}| j                  j	                  |d    dj?                  |      z  d!       |jS                         }|ro| j                  j                  rYtU        |j                               D ]=  \  }}| j                  j	                  |d"   |tW        jX                  |      fz  d#       ? |j[                         j]                         }|r| j                  jP                  r_| j                  j	                  t_        d$      d%       | j                  j	                  |d%       | j                  j	                  d&       n6| j                  j	                  |d'   tW        j`                  |      z  d(       | j                  j	                  d)       | jc                  ||       yc c}w )*(show a single changeset or file revision
   graphwidthr   s   %s
s   log.noderg   N	   changesets   default   branchs
   log.branchs   branchess   log.%ss   phases	   log.phases   log.parent changeset.%s   parent   manifests   ui.debug log.manifest   users   log.user   dates   log.dates   instabilitys   , s   log.instability)   filess   files+s   files-r   s   ui.debug log.filesr   s   ui.note log.filess   %s (%s)   copiess   ui.note log.copies   extras   ui.debug log.extras   description:
s   ui.note log.descriptions   

s   summarys   log.summary   
)2rw   r!   rQ   quietrs   r   formatchangeidr   r   branchrU   namesitemslogfmt	colorname	debugflagr   meaningfulparentsmanifestnodenodeconstantswdiridr   manifestlogr   formatrevnodeuserr   datestrdater   r   r6   r   _showobsfate_exthookzipfilesmodified
filesaddedfilesremovedrM   verboseextrasortedr   	escapestrdescriptionstripr
   	firstline
_showpatch)r   r   r   r   
changenoder   columnsr   nsnamensnamepctxrh   mnodemrevr   keyvaluecr   r   s                        r'   r   zchangesetprinter._showK  s   XXZ
YY}a0
77==GGMM'0055[   --L!G$:$:3$??!#& 	 	
 ZGGMM'),v5]MK))////1 	PJFB $ J7 Pbii$.i",,6NOP	P 77GGMM!CLLN2,   --dii= 	D.@EGGMM	"W%;%;D%AA  	 77$$&E}		//66yy,,007GGMM$''u=>.  
 	gg&3;GGx//
;;; 	 	
 >>--/MGGMM'%**]*CC(  
 \\^c"c77!0""$cnn&68H8H8JK 
U GGMMtyy'773 "  YY[TWW__GGMM!DIIciik$::*   dggoo.45j1n5F5GGMM	"TYYv%66+  
 		TWW&&$U[[]3 
UH%j.B.B5.I(JJ/   oo'--/ww'(0J   k1KLg&J'**>*>{*KK(   	eZ(; 6s   0Z*c                    t        j                  | j                  j                  | j                        }t        j                  | j                  j                  dt
        j                  |      }|j                  d|i      j                         }|r5|D ]/  }| j                  j                  | j                  d   |z  d       1 y y )Ns   {join(obsfate, "
")}defaults	resources   ctxs   obsoletes   log.obsfaterg   )r   templateresourcesrU   rQ   maketemplaterr   keywordsrenderdefault
splitlinesrs   r   )r   r   trestobsfateobsfatelines         r'   r   zchangesetprinter._showobsfate  s    **499<<C##IILL$((	
 //63-0;;=& MM+.<(   r*   c                      y)z.empty method used by extension as a hook pointNr.   r   s     r'   r   zchangesetprinter._exthook  s    r*   c                    | j                   r4| j                  j                  | j                  || j                  |d       | j                   r'| j
                  r| j                  j                  d       | j
                  r4| j                  j                  | j                  || j                  |d       | j                   s| j
                  r| j                  j                  d       y y )NTrZ   r   F)r   r   r   rQ   r   r   rs   )r   r   r   s      r'   r   zchangesetprinter._showpatch  s    LL!!dnnjt "  !2!2GGMM% LL!!dnnju "   1 1GGMM%  !2r*   NNFr-   )r   )r   r   r   r   r   r   r   r   r   r   r   r   r.   r*   r'   r   r   !  s/    C3
'+u)n$=!r*   r   c                   &    e Zd ZdZ	 ddZd Zd Zy)changesetformatterz1Format changeset information by generic formatterNc                     t         j                  | |||||       t        j                  ||d      | _        || _        y )NT)git)r   r   r   difffeatureoptsr   _fm)r   rQ   rU   fmr   rV   r   s          r'   r   zchangesetformatter.__init__  s9     	!!$D&(HM..r8Fr*   c                 8    | j                   j                          y r-   )r  endr   s    r'   r   zchangesetformatter.close  s    r*   c                    | j                   }|j                          |j                  |       |j                  t	        j
                  |      |j                  t	        j                  |                   |j                         }| j                  j                  r|sy|j                  |j                         |j                         |j                         |j                  |j                               |j!                         |j#                  |j%                         d      |j#                  |j'                         d      |j#                  |j)                         D cg c]!  }|j                  |j+                               # c}d             | j                  j,                  sd	|v rQ|j                  |j                  |j/                         xs  | j0                  j2                  j4                        
       | j                  j,                  sd|v r/|j                  |j7                  |j9                                      | j                  j,                  sd|v sd|v sd|v rq|j                  |j#                  |j;                         d      |j#                  |j=                         d      |j#                  |j?                         d             | j                  j,                   xr | j                  j@                  }|sd|v r1|j                  |j#                  |jC                         d             |r|sd|v r(|j                  |j7                  |xs i dd             | jD                  sd|v rV| jF                  jI                  | j                  || jJ                  d      }|j                  |j#                  |d             | jL                  sd|v rx| j                  jO                          | jF                  jQ                  | j                  || jJ                  d       |j                  | j                  jS                                yyc c}w ) r   )r   )r   rw   N   bookmark)r   s   tags   node)r   phaser   r   desc	bookmarkstagsparentsr   )manifestr   )r   s   modifieds   added   removeds   file)modifiedaddedremovedr   )rM   r   r   s   source)r  r  r   s   diffstatTr  )ro   s   diffF)rT   )*r  	startitemrE   datar   intrevhexfuncbinnodedatahintrQ   r   r   r   r   
formatdater   r   
formatlistr&  r'  r(  rw   r   r   rU   r   r   
formatdictr   r   r   r   r   rM   r   r   r   r   r   r   r   r   )	r   r   r   r   r  r4  r  r   r0  s	            r'   r   zchangesetformatter._show  s[   XX



s

GNN3'bjj9M.NO;;=77==
::<,,.sxxz*"mmCMMO+mFsxxz7MM/2{{}=!AFFH%=G "  	 	
 77x 7GG$$&H$))*A*A*H*H  
 77H 4GG"--		4G5 GGh&8#X%GGs'8'8':ImmCNN$47mCc&6&6&8wG   gg''';DGGOOh(*GG"--		'-BGCvh!6GG}}V\rwi}P   x 7<<,,dnn4 - D GGR]]4k]BGC8 3GG LL!!$''3U!KGG**,G- !4M >s   "&Q"r  )r   r   r   r   r   r   r   r.   r*   r'   r  r    s    ; BG=.r*   r  c                   2     e Zd ZdZ	 ddZ fdZd Z xZS )changesettemplatera  format changeset information.

    Note: there are a variety of convenience functions to build a
    changesettemplater for common cases. See functions such as:
    maketemplater, changesetdisplayer, buildcommittemplate, or other
    functions that use changesest_templater.
    c                 J   t         j                  | |||||       t        j                  ||      x| _        }t        j
                  ||t        j                  |t        j                        | _	        t        j                         | _        |j                  | _        dddd|j                  |j                  ddddddi| _        |j                   rd| j"                  j$                  d	f| j"                  j&                  d
f| j"                  j(                  dfg}|D ]<  \  }	}
| j                  D ](  }||
z   }|	s|| j                  v s|| j                  |<   * > ns| j                  j+                         D cg c]  }||j                  k7  s| }}t        j,                  || j                  |      }| j                  j/                  |       | j                  d   rC| j"                  j1                  | j                  j3                  | j                  d   i              y y c c}w )N)r	  r
  cache   headerr*      footers	   docheader	   docfooter	   separator)Tr*   s   _verboses   _quiets   _debug)r   r   r   r  _tresourcesloadtemplaterr   r  defaulttemplr  	itertoolscount_counterref_tref_partsmapfilerQ   r   r   r   keystemplatepartsmapupdaters   render)r   rQ   rU   tmplspecr   rV   r   r  	tmplmodesmodepostfixr  curp	partnamesms                   r'   r   zchangesettemplater.__init__>  s    	!!$D&(HM"+"="=b$"GG4(((())
 ")\\
ssLL(,,###
  +.	*""I.	I "+ -g -Ag+Ctvv),A-- %)KK$4$4$6Lq!x||:KLIL**8TVVYGAKKq!;;|$GGMM$&&--L(A2FG %	 Ms   6H H c                     | j                   d   rO| j                  sd| _        | xj                  | j                  j                  | j                   d   i       z  c_        t        t
        |          S )Nr>  r*   )rH  r   r  rM  superr9  r   )r   	__class__s    r'   r   zchangesettemplater.closel  sT    ;;|$;;!KK466==\)BBGGK'466r*   c                    |j                         }||d<   t        | j                        x|d<   }d|i|d<   |j                  dd      }| j                  d   rG|dkD  rB| j
                  j                  | j                  j                  | j                  d   i              | j                  d   r| j                  j                  | j                  d   |      }| j                  r|| j                  |j                         <   n1| j                  |k7  r"|| _        | j
                  j                  |       | j                  | j                     }| j
                  j                  | j                  j                  ||             | j                  |       | j                  ||       | j                  d	   r<| j                   s/| j                  j                  | j                  d	   |      | _        y
y
y
)r   r  s   indexr   s   revcacher   r   r?  r<  r=  N)rS   nextrE  r!   rH  rQ   rs   r  rM  r   r   r   r   rG  r   r   r   )r   r   r   r   indexr   r   r  s           r'   r   zchangesettemplater._shows  sz   

f"&t}}"55h%'0kYY}a0

 ;;|$GGMM$&&--L(A2FG ;;y!dkk)4e<A}})*CGGI&??a'&'DOGGMM!$ kk$**%dffmmC/0cZ(;;y!;;"ffmmDKK	,BEJ  "r*   r  )r   r   r   r   r   r   r   __classcell__)rX  s   @r'   r9  r9  3  s!     HM,H\7 Kr*   r9  c                 h    | r|rJ |rt        j                  d|      S t        j                  |       S )Nr   )r   mapfile_templatespecliteral_templatespec)tmplrI  s     r'   templatespecra    s4    !!--lGDD--d33r*   c                    |sc|sa| j                  dd      }|r(t        j                  t        j                  |            S t        j                  | j                  dd            }|su|rs|}d}t        j                  j                  |      d   s6t        j                  d|z         xs t        j                  |      \  }}|r|}t        j                  d||      S t        j                  | d|      S )	zqFind the template matching the given template spec or style

    See formatter.lookuptemplate() for details.
       command-templates   logs   ui   styleNr   s   map-cmdline.r   )configr   r_  r   unquotestringr   
expandpathospathsplittry_open_templater^  lookuptemplate)rQ   r`  stylerI  rk   mapnames         r'   _lookuptemplaterp    s     yy-v611)2I2I$2OPPOOBIIeX$>?EEww}}W%a(%77') 6,,W5 Wb !--lGRHH##Bd;;r*   c                 J    t        j                  |      }t        | |||      S )zKCreate a changesettemplater from a literal template 'tmpl'
    byte-string.)r   )r   r_  r9  )rQ   rU   r`  r   specs        r'   r  r    s%     ))$/Db$x@@r*   c                 <   |||f}t        | |j                  d      |j                  d            }|j                  dv r | j                  d|      }t	        | ||g| S |j                  s%|j
                  s|j                  st        | |g| S t        | ||g| S )a_  show one changeset using template or regular display.

    Display format will be the first non-empty hit of:
    1. option 'template'
    2. option 'style'
    3. [command-templates] setting 'log'
    4. [ui] setting 'style'
    If all of these values are either the unset or the empty string,
    regular display via changesetprinter() is done.
    s   templatere  >      cbor   jsonrd  )	rp  r!   rF  r   r  r`  rI  r   r9  )rQ   rU   r%   r   r   postargsrr  r  s           r'   changesetdisplayerrw    s     h'H2txx4dhhx6HID
 xx%%\\&$'!"dB:::88DIIdllD4844b$8x88r*   c                      e Zd ZdZ ej
                         Z ej
                         Z ej
                         Z ej
                   ej                  e
            Z ej
                   ej                  e
            Z ej
                  d      Z ej
                   ej                  e
            Z ej
                  d      Z ej
                  d      Z ej
                   ej                  e
            Z ej
                   ej                  e
            Z ej
                   ej                  e
            Z ej
                   ej                  e
            Z ej
                  d      Z ej
                  d      Z ej
                  d      Z ej
                  d      Z ej
                  d      Zy)walkoptszgOptions to configure a set of revisions and file matcher factory
    to scan revision/file history
    )r<   NFr   T)r   r   r   r   r   ibr;   r%   revspecFactorylistr&  branchesr   r  	no_mergesonly_mergesprune_ancestorsusersinclude_patsexclude_patsfollowforce_changelog_traversalfilter_revisions_by_patssort_revisionsr&   r.   r*   r'   ry  ry    s   
 4779D4779D dggiG T 23Itww|t||D12H4774 Dtww|t||D12H&I$''%(Kdggldll4&89ODGGLDLL./E 477<4<<#56L477<4<<#56L TWWQF !( 6  'twwt4 TWWT*N DGGD!Er*   ry  rQ   r;   r%   returnc           
      
   |j                  d      rd}n|j                  d      rd}nd}|j                  d      r| j                  dd      rd	}nd
}nd}t        d*i d|d|d|j                  dg       d|j                  dg       d|j                  dg       |j                  dg       z   d|j                  d      d|j                  dg       dt        |j                  d            dt        |j                  d            d|j                  dg       d|j                  d g       d!|j                  d"g       d#|j                  d$g       d%|d&t        |j                  d'            d(|d)t	        |      S )+zwParse log command options into walkopts

    The returned walkopts will be passed in to getrevs() or makewalker().
    s   follow_firstr	   s   follow   r      graph   experimentals   log.topo   topo   descNr;   r%   r{  s   revr&  r#  r~  r   s   only_branchr   r   r     keywordr  	   no_mergesr     only_mergesr     pruner  r   r  s   includer  s   excluder  r  r*  r  r&   r.   )r!   rR   ry  boolr(   )rQ   r;   r%   r  r  s        r'   	parseoptsr  
  s    xx 	)	xx==+6$N$N  $ ((;+	 )R(488NB+GG XXg *b) txx-. .12 2. hhw# XXj"- XXj"-  !" #'txx
';"<#$ &%& tn' r*   c                 \   | d   }t        j                  ||j                  |j                        \  }}|j	                         xs |j                          xr |j                  }|s|j                  r|j                  rt        |j                               }t        |      }|}	|D ]O  }
|	s nK| |
   }|	D ]?  }||v r|j                  |       |j                  |      s+|j                  |       d}|}	A Q |D ]'  }||v st        j                  t!        d      |z         n|j                  r|j                         D ]  }||vrRt"        j$                  j'                  | j)                  |            rd}8t        j                  t!        d      |z        | j+                  |      }|rmt        j                  t!        d      |z         n+|j                         D ]  }| j+                  |      }|rd} |r)|j                         D ]  }|r|| j,                  v s n d}|||fS )a^  Build matcher and expanded patterns from log options

    If --follow, revs are the revisions to follow from.

    Returns (match, pats, slowpath) where
    - match: a matcher built from the given pats and -I/-X opts
    - pats: patterns used (globs are expanded on Windows)
    - slowpath: True if patterns aren't as simple as scanning filelogs
    NTs>   cannot follow file not in any of the specified revisions: "%s"/   cannot follow file not in parent revision: "%s"s$   cannot follow nonexistent file: "%s"F)r   matchandpatsr;   r%   anypatsalwaysr  r  r{  r}  rM   setdiscardhasdirr   
StateErrorr
   ri  rj  existswjoinfilestore)rU   revswoptswctxr   r;   slowpath	all_filesmissing_filesrM   rr   r0   filelogrj  s                  r'   _makematcherr  9  sF    :D&&tUZZDKE4}} LLN>u>>  <<EMM U[[]+I	NME .1g 	.ACx%--a0A &--a0#' -	..  %**/ 	  \\[[] D= ww~~djjm4#' #..!2  	   ))A,  **ABQF '. [[] $))A,  $H$  !ttzz1! !$  r*   c                     	 g 	|D ]0  } |   	j                  fdj                  |      D               2 i  fd}	fd}t        j                   |       d      |fS )Nc              3   D   K   | ]  }|   j                           y wr-   )introfilectx).0r0   r   s     r'   	<genexpr>z!_fileancestors.<locals>.<genexpr>  s     DqSV((*Ds    c                 v    t        j                  j                  t        j                  |       g             S r-   )r   
matchfilesr!   r1  )r   fcacherU   s    r'   filematcherz#_fileancestors.<locals>.filematcher  s*    !!$

7>>#3F(KLLr*   c               3      K   t        j                        D ]*  \  } }|D cg c]  }|j                          c}| <   |  , y c c}w w)Nfollowfirst)r   filectxancestorsrj  )r   csr  r  fctxsr  s      r'   revgenz_fileancestors.<locals>.revgen  sI     --eM 	GC-/016680F3KI	0s   "AA	AF)iterasc)extendwalkr   generatorset)
rU   r  r   r  r  r  r  r   r  r  s
   `  `   @@@r'   _fileancestorsr    sj    E E1gDCHHUODDE FM
   59;FFr*   c                      y)zDhook for extensions to override the filematcher for non-follow casesNr.   )rU   r;   r%   s      r'   _makenofollowfilematcherr    s    r*   c                     	 t        j                  | |||      S # t        j                  $ r3}t        j                  |j
                  d   |j                        d}~ww xY w)zResolves user-provided revset(s) into a single revision.

    This just wraps the lower-level scmutil.revsingle() in order to raise an
    exception indicating user error.
    r   hintN)r   	revsingler   RepoLookupErrorr$   argsr  )rU   r{  r<   
localaliases        r'   r  r    sS    7  wDD   7qvvayqvv667s    A .AA c                     	 t        j                  | |      S # t        j                  $ r3}t        j                  |j
                  d   |j                        d}~ww xY w)zResolves user-provided revset(s) into two revisions.

    This just wraps the lower-level scmutil.revpair() in order to raise an
    exception indicating user error.
    r   r  N)r   revpairr   r  r$   r  r  )rU   r  r  s      r'   r  r    sM    7tT**   7qvvayqvv667s    A.AAc                     	 t        j                  | ||      S # t        j                  $ r3}t        j                  |j
                  d   |j                        d}~ww xY w)zResolves user-provided revset(s).

    This just wraps the lower-level scmutil.revrange() in order to raise an
    exception indicating user error.
    r   r  N)r   revranger   r  r$   r  r  )rU   specsr  r  s       r'   r  r    sQ    7eZ88   7qvvayqvv667s    A.AA)s   not merge()N)s   merge()N)Ns   _matchfiles(%ps))s   date(%s)N)s
   branch(%s)   %lr)s   filelog(%s)r  )s   keyword(%s)r  )s   ancestors(%s)s   not %lr)s   user(%s)r  )	r  r     _matchfilesr   r      _patslogr  r  r   c                    |j                   D cg c]  }d| j                  |      z    c}|j                  |j                  |j                  |j
                  |j                  |j                  D cg c]  }d|z   	 c}d}|j                  r{|ryddg}|j                  D ]  }|j                  d|z           |j                  D ]  }|j                  d|z           |j                  D ]  }|j                  d|z           ||d<   n0|j                  r$|j                  st        |j                        |d	<   g }t        |j!                               D ]  \  }	}
|
s	t"        |	   \  }}|rd
|vr|j                  |       -|s&|j                  t%        j&                  ||
             U|r#|
D cg c]  }t%        j&                  ||       }
}|j                  t%        j&                  ||
              |j(                  rP|j                  t%        j&                  d|j(                  D cg c]  }t+        j,                  |       c}             |rddj/                  |      z   dz   }|S d}|S c c}w c c}w c c}w c c}w )z?Return a revset string built from log options and file patternss   literal:)r   r   r  r  r  r  r   s   r:s	   d:relpaths   p:s   i:s   x:r  r     %r     (s    and    )N)r~  lookupbranchr   r  r  r  r  r  r  r;   r   r  r  r  r}  r   r   _opt2logrevsetr   
formatspecr&  r   format_bookmark_revspecr6   )rU   r  r  bvr%   	matchargsrS  expropvalrevoplistops                r'   _makerevsetr    sU    AFO1K$"3"3A"66ONNoo))''+0;;7a+/7D %%( L)	 	(AUQY'	(## 	(AUQY'	(## 	(AUQY'	((^		'	' ,[D$**,' <C&r*vT&KKKK
--eS9:@CD1z,,UA6DDKK
--fc:;< !!=B__M003M	
 hmmD))D0 K Kk P 8@ E Ns   I01I5/I:*I?c                 h   |j                   rt        | |j                         }|S |j                  r=| j                  j	                         | j
                  k(  rt        j                         }|S |j                  r| j                  d      }|S t        j                  |       }|j                          |S )z>Return the initial set of revisions to be filtered or followed   .)r{  r  r  dirstatep1nullidr   basesetr  spansetreverse)rU   r  r  s      r'   _initialrevsr  "  s    }}emm, K 
$--**,;! K 
yy K %Kr*   rU   r  c                    t        | |      }|st        j                         dfS t        | ||      \  }}t	        j
                  ||      }d}|j                  ru|sj                         r&t        j                  | ||j                  dk(        }n-|j                  rJ t        | ||j                  dk(        \  }}|j                          |!t        | |j                  |j                        }|fd}t!        | ||      }|j"                  r|j"                  dv sJ |j"                  dk(  r[|j%                         s}t        j&                  || j(                  j*                        }t-        j                  t/        |      d	      }n2|j1                         s"|j%                         s|j3                  d
       |rt-        j4                  d|      } || |      }|j6                  |j9                  d|j6                        }||fS )zBuild (revs, makefilematcher) to scan revision/file history

    - revs is the smartset to be traversed.
    - makefilematcher is a function to map ctx to a matcher for that revision
    N)r;   r	   r  c                     S r-   r.   )r   r   s    r'   r  zmakewalker.<locals>.filematcherP  s    Lr*   >   r  r  r  T)istopor  r   )r  r   r  r  r   evolver  r  r   revancestorsr  r  r  r  r;   r%   r  r  r  toposort	changelog
parentrevsr   r}  isdescendingsortr   r&   slice)	rU   r  r  r;   r  r  r  matcherr   s	           @r'   
makewalkerr  0  s    e$D!4''(tU;E4KKD)EK||u||~%%dDella>OPD6666 .dEu||q/@!D+ 	.tUZZL	 tUH-D##'99997*;;=~~dDNN,E,EF~~d4j>##%IIdI#,,tT*tT"{{zz!U[[)r*   c                 V    t        | |      \  }}|s|dfS t               }||_        ||fS )zvReturn (revs, differ) where revs is a smartset

    differ is a changesetdiffer with pre-configured file matcher.
    N)r  r   r   )rU   r  r  r  r   s        r'   getrevsr  g  s<     #4/D+TzF)F<r*   c                    g }|j                  dg       D ]  }	 |j                  dd      \  }}	 t        t        |j                  d            \  }}t        d      |z  }t        j                  | d||      }|j                  |t        j                  ||      f        |S # t        $ r" t        j                  t        d      |z        w xY w# t        $ r" t        j                  t        d      |z        w xY w)	zbParse --line-range log option and return a list of tuples (filename,
    (fromline, toline)).
    s
   line_range   ,r	   s"   malformatted line-range pattern %s   :s   invalid line range for %ss3   line range pattern '%s' must match exactly one fileN)r!   rsplitr#   r   r$   r
   mapr"   rk  r   parsefollowlinespatternr   r   processlinerange)	rU   r%   linerangebyfnamepat	linerangefromlinetolinemsgfnames	            r'   _parselinerangeoptr  w  s    xxr* 
	 ZZa0NC
	J"3	(=>Hf FG#M//dCED))(F;<	

    	""783> 	  	J""1%A#BS#HII	Js   B""C"+C+C;c                 <     d   }i t         |      D ]  \  }\  }}||vr!t        j                  t        d      |z        |j	                  |      }t        j                  |||      D ]a  \  }}|j                         }	|	t        }	|	|vr#j                  |	i       j                  |j                         g       j                  |       c  d fd}
 fd}t        d      }t               }||_        |
|_        t!        j"                  |      |fS )a  Return (revs, differ).

    "revs" are revisions obtained by processing "line-range" log options and
    walking block ancestors of each specified file/line-range.

    "differ" is a changesetdiffer with pre-configured file matcher and hunks
    filter.
    Nr  c                     |S r-   r.   )fctxhunkss     r'   nofilterhunksfnz)getlinerangerevs.<locals>.nofilterhunksfn  s    r*   c                 d    j                  t        j                  |             S fd}|S )Nc              3      K   j                  | j                               }|/|D ])  \  }|f t        fd|D              s$|f + y |D ]  }|  y w)Nc              3   P   K   | ]  }t        j                  d d |        yw)r  N)r   hunkinrange)r  lrhrs     r'   r  zJgetlinerangerevs.<locals>.hunksfilter.<locals>.filterfn.<locals>.<genexpr>  s$     NR5,,RVR8Ns   #&)r!   rj  r   )r  r  
linerangeslinesr   r  fctxlinerangess        @r'   filterfnz7getlinerangerevs.<locals>.hunksfilter.<locals>.filterfn  st     '++DIIK8J%!& (IBz %i N:NN %i( " DJs   AA!A!)r!   r   r1  )r   r  r  linerangesbyrevr  s     @r'   hunksfilterz%getlinerangerevs.<locals>.hunksfilter  s4    (,,W^^C-@A!""	 r*   c                     t        j                  t        j                  |       g             }t        j                  |      S r-   )r}  r!   r   r1  r  )r   rM   r  rU   s     r'   r  z%getlinerangerevs.<locals>.filematcher  s6    _(()<bAB!!$..r*   Tr  )r  r   r  r
   filectxr   blockancestorsintrorevr   
setdefaultrj  r   r   r   r   r   r   r  )rU   userrevsr%   r  r
  r  r  r  r  r   r  r  r  r   r  r  s   `             @@r'   getlinerangerevsr#    s+    :D O%7d%C  !!&""DEM  ||E"$33D(FK 	 OD)--/C{("&&sB/::		RfY	   (/ /40DF)F)FD!6))r*   c                 6   | j                  dd      }|st        j                  S t        j                  |      }t        |t              r|j                  }nt        j                  |       }t        j                  | |t        j                  |      fd}|S )Nrc  s	   graphnoder  c                 0    || d}j                  |      S )N)r  s   repo)r  )rU   r   r;  r   templs       r'   
formatnodez'_graphnodeformatter.<locals>.formatnode  s    t,""5))r*   )rf  r   getgraphnoder   rg  
isinstancer9  r@  r   r  r  r  )rQ   	displayerrr  r  r'  r&  s        @r'   _graphnodeformatterr+    s    99)<8D&&&""4(D)/0$$**2.##
D:..$E* r*   c           
         |xs i }t        | |      }t        j                         }|j                  }	| j	                  d      r&|	j                  t        j                  |	d             nt        j                  t        j                  t        j                  d}
|
j                         D ],  \  }}| j                  dd|z  |	|         |	|<   |	|   r(d |	|<   . | j                  dd      |_        i }|D ]  \  }}}} ||||      }|r ||      nd } ||||||      }t        |      }|d   } |j                   |f||dt#        j$                  |       |j&                  j)                  |      j+                  d	      }|d
   s|d
= |j-                  |       t/        j0                  |g|      D ]#  \  }}}}t        j2                  | |||||       g }%  |j5                          y )Nr     |)r   s   grandparents   missingr  s   graphstyle.%ss   graphshortenr  )r   r   r   )r+  r   
asciistatestylesrl   rL  dictfromkeysPARENTGRANDPARENTMISSINGPARENTr   rf  rR   graphshortenrZ  r   r   	strkwargsr   poprk  r   rC  chainasciir   )rQ   rU   dagr*  edgefn	getcopiesr   r'  stater0  	edgetypesr   r  formatnode_cacher   typer   r(  charr   edges	firstedgerb   r  coldatas                            r'   displaygraphrF    s   KRE$R3J!E\\F 
xxdmmFD12  $00 ..
	
 #* 	#ID#))!1D!8&+F3K #;"s	#  ]]?OL#& T3$%56#,3$tT5#w7K	!		
5	
4<4F4Fu4M	
 ""3'--e4Ryb	*3//9+u*M 	&D$wNN2udD%AE	  OOr*   c                 l    t        j                  ||      }t        | |||t         j                  |       y r-   )r   	dagwalkerrF  
asciiedges)rQ   rU   r  r*  
getrenamedrevdags         r'   displaygraphrevsrL    s,    d+FT69h.A.A:Nr*   c                     |D ]7  }||   }|r ||      nd }|j                  ||       |j                  |       9 |j                          y )Nr.  )r   r   r   )rQ   rU   r  r*  r=  r   r   r   s           r'   displayrevsrN    sO     3i#,3$s6*	
 OOr*   c                     dD ]=  }||v s||   st        j                  t        d      |j                  dd      z         y )N)s   newest_firsts+   -G/--graph option is incompatible with --%s   _   -)r   r$   r
   replace)r;   r%   r  s      r'   checkunsupportedgraphflagsrS  "  sM     :$r(""@A**T4() r*   c                 r    t        |      }|j                          ||d | }t        j                  | |      S r-   )r(   r  r   nodes)rU   rU  r%   r&   s       r'   	graphrevsrV  +  s6    TNE	MMOfu>>$&&r*   )NFr*   r*   N)NFNr   r*   r*   FNr   )NF)r  Nr-   )NN)KrC  ri  r5   typingr   r   r   r   r   r   i18nr
   rw   r   
thirdpartyr    r   r   r   r   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   utilsr   r   r(   r_   r   r   r   r   r  r9  ra  rp  r  rw  sry  bytesr  r  r  r  r  r  r  r  r  r  abstractsmartsetbasematcherr  r  r  r#  r+  rF  rL  rN  rS  rV  r.   r*   r'   <module>r`     s#    	         &, 		E^ 		Vr/ /dB! B!JJ.) J.Z`K) `KF4<8A96 *" *" *"Z,,
5/, ucz
, 	,^]!@G0
	7	7	7 )&/ &)(,"
8v4
44 x#8L8L1L(MNN4n
 8$$h&??@ 0=*@,,^O
'r*   