^cQ;dZddlZddlZddlmZddlmZejdZGdde Z ej Gd d Z ej Gd d Z Gd dZGddeZGddeZGddeZGddeZGddeZdZGddZdS)alinelog is an efficient cache for annotate data inspired by SCCS Weaves. SCCS Weaves are an implementation of https://en.wikipedia.org/wiki/Interleaved_deltas. See mercurial/helptext/internals/linelog.txt for an exploration of SCCS weaves and how linelog works in detail. Here's a hacker's summary: a linelog is a program which is executed in the context of a revision. Executing the program emits information about lines, including the revision that introduced them and the line number in the file at the introducing revision. When an insertion or deletion is performed on the file, a jump instruction is used to patch in a new body of annotate information. N)attr)pycompats>IIceZdZdZdS) LineLogErrorz>Error raised when something bad happens internally in linelog.N)__name__ __module__ __qualname____doc__3/usr/lib/python3/dist-packages/mercurial/linelog.pyrrsHHHHr rcheZdZejZejZejZdS)lineinfoN)rr r ribrevlinenum_offsetr r rrr#s7 $'))CdgiiGdgiiGGGr rcneZdZejZejZejZdZdS)annotateresultc*t|jSN)iterlinesselfs r__iter__zannotateresult.__iter__3sDJr N) rr r rrrr_eofrr r rrr-sJ $'))C DGIIE 4799D     r rceZdZejZejdZejdZdZ ejdZ ejdZ ejdZ dS)_llinstructioncdSrr rop1op2s r__init__z_llinstruction.__init__; r cdSrr rs r__str__z_llinstruction.__str__?r&r c t|Sr)strrs r__repr__z_llinstruction.__repr__Cs4yyr cdSrr rothers r__eq__z_llinstruction.__eq__Fr&r cdS)z5Encode this instruction to the binary linelog format.Nr rs rencodez_llinstruction.encodeJr cdS)agExecute this instruction. Args: rev: The revision we're annotating. pc: The current offset in the linelog program. emit: A function that accepts a single lineinfo object. Returns: The new value of pc. Returns None if exeuction should stop (that is, we've found the end of the file.) Nr rrpcemits rexecutez_llinstruction.executeNr2r N) rr r abcABCMeta __metaclass__abstractmethodr%r(r+r/r1r7r r rr r 7sKM            DDD        r r c0eZdZdZdZdZdZdZdZdS)_jgez@If the current rev is greater than or equal to op1, jump to op2.c"||_||_dSr_cmprev_targetr"s rr%z _jge.__init__`  r c$d|j|jfzS)Nz JGE %d %dr?rs rr(z _jge.__str__dsdlDL999r ct|t|ko|j|jko|j|jkSrtyper@rAr-s rr/z _jge.__eq__g= JJ$u++ % .  - .  - r cRt|jdz|jSN_llentrypackr@rArs rr1z _jge.encodens}}T\Q. ===r c0||jkr|jS|dzSNrr?r4s rr7z _jge.executeqs $,  < Av r N rr r r r%r(r/r1r7r r rr=r=]seJJ:::   >>>r r=c0eZdZdZdZdZdZdZdZdS)_jumpz=Unconditional jumps are expressed as a JGE with op1 set to 0.cD|dkrtd|z||_dS)Nrs%malformed JUMP, op1 must be 0, got %d)rrAr"s rr%z_jump.__init__zs* !88G#MNN N r cd|jzS)NzJUMP %drArs rr(z _jump.__str__sDL))r cbt|t|ko|j|jkSr)rFrAr-s rr/z _jump.__eq__s'DzzT%[[(JT\U]-JJr cBtd|jSNr)rLrMrArs rr1z _jump.encodes}}Q ---r c|jSrrUr4s rr7z _jump.executes |r NrPr r rrRrRwshGG ***KKK...r rRc0eZdZdZdZdZdZdZdZdS)rz1EOF is expressed as a JGE that always jumps to 0.cf|dkrtd|z|dkrtd|zdS)Nrs$malformed EOF, op1 must be 0, got %ds$malformed EOF, op2 must be 0, got %d)rr"s rr%z _eof.__init__sC !88FLMM M !88FLMM M 8r cdS)NEOFr rs rr(z _eof.__str__svr cBt|t|kSr)rFr-s rr/z _eof.__eq__sDzzT%[[((r c8tddSrX)rLrMrs rr1z _eof.encodes}}Q"""r cdSrr r4s rr7z _eof.executestr NrPr r rrrsh;;NNN )))###r rc0eZdZdZdZdZdZdZdZdS)_jlz1If the current rev is less than op1, jump to op2.c"||_||_dSrr?r"s rr%z _jl.__init__rBr c$d|j|jfzS)NzJL %d %dr?rs rr(z _jl.__str__sT\4<888r ct|t|ko|j|jko|j|jkSrrEr-s rr/z _jl.__eq__rGr cXtd|jdzz|jS)NrrJrKrs rr1z _jl.encodes$}}Q$,!"34dlCCCr c0||jkr|jS|dzSrOr?r4s rr7z _jl.executes   < Av r NrPr r rrbrbsh;;999   DDDr rbc0eZdZdZdZdZdZdZdZdS)_linez Emit a line.c"||_||_dSr_rev _origlinenor"s rr%z_line.__init__s r c$d|j|jfzS)Nz LINE %d %drkrs rr(z _line.__str__sty$*:;;;r ct|t|ko|j|jko|j|jkSr)rFrlrmr-s rr/z _line.__eq__s? JJ$u++ % 6 UZ' 6 E$55 r cXtd|jdzz|jSrI)rLrMrlrmrs rr1z _line.encodes$}}Q$)q.143CDDDr cT|t|j|j||dzSrO)rrlrmr4s rr7z _line.executes, Xdi!12 6 6777Av r NrPr r rrirish <<<   EEEr ric t||\}}n)#tj$r}t d|zd}~wwxYw|dz}|dz }|dkr<|dkr&|dkrt ||St ||St||S|dkrt||S|dkrt||Std|z)z?Decode a single linelog instruction from an offset in a buffer.s!reading an instruction failed: %rNrJrrsUnimplemented opcode %r) rL unpack_fromstructerrorrrrRr=rbriNotImplementedError)dataoffsetr#r$eopcodes r _decodeoner|sE''f55SS <EEE?!CDDDE 4ZF (C {{ !88axxC~~%c?? "C~~ 13}} 1S# 86A B BBs!AAAceZdZdZddZdZdZdZedZ d Z d Z d Z dd Z d ZedZedZdZddZdS)linelogz1Efficient cache for per-line history information.Nrct| tddtddg}||_d|_||_dSrX)r_program _lastannotate_maxrev)rprogrammaxrevs rr%zlinelog.__init__s= ?Aqzz41::.G ! r ct|t|ko|j|jko|j|jkSr)rFrrr-s rr/zlinelog.__eq__s= JJ$u++ % . / .  - r ctdtt||jt|jfzS)Nz")hexidrlenrrs rr+zlinelog.__repr__s53 4MM L   7   r cdttt|jztjdfdt |jdddDS)Nz %%%dd %%s c3,K|]\}}||fzVdSrr ).0idxifmts r z#linelog.debugstr.. s@+ + %sAC3(N+ + + + + + r r)rr*rrsysstrjoin enumerate)rrs @rdebugstrzlinelog.debugstrsCC $6$6 7 7888u%%**+ + + + )24=3Da)H)H+ + +    r ct|tjzdkr+tdt|tjfzt|tjz }t |d}t |t rd}nHt |ttfr|j }n$tdt|j zt |t ttfsJ|j }||krtd||fztddg}td|D]2}|t ||tjz3|||S)Nrs9invalid linelog buffer size %d (must be a multiple of %d)z,Expected one of _jump, _jge, or _jl. Got %s.sFcorrupt linelog data: claimed %d entries but given data for %d entriesr)r)rrLsizerr| isinstancerRr=rbr@rFrrArrangeappend)clsbufexpectedfakejger numentries instructionsrys rfromdatazlinelog.fromdata s s88hm #q ( (Ls88X]+, s88hm+S!$$ gu % % FF $ - - _FF>w--() 'E4#566666_ z ! !=Z()  Q | Az** I IF    30F G G H H H Hs<////r ct|jt|j}|dd|jddDzS)Nr c3>K|]}|VdSr)r1)rrs rrz!linelog.encode...s*DDQahhjjDDDDDDr r)r=rrrr1r)rhdrs rr1zlinelog.encode,sZ4<T]!3!344;;==SXXDD$-2CDDDDDDDr c0g|_d|_d|_dSrX)rrrrs rclearz linelog.clear0s  !r c R||||dt||S)Nr)_internal_blines) replacelinesr)rra1a2bliness rreplacelines_veczlinelog.replacelines_vec5s2  RCKK&!   r c |jr|j}n||}|t|jkr't d|t|j|fz|t|jkr't dd}t dd|j} n|j|} |j| j}|jj } | } |jj } g} | j }||kr| ||z dzz}| t||t||D]}|<|t ||| | t||@||\}}|t ||| | t||||kr|t|jkr't d|t|j|fz|t|jkr|j}n|j|j}|dkr#||jkr|j|dz jdz}| t||| }| |t!|t"t fs!| t#d| jdzt#d| |j| j<t|jj|kr||jj|_n#t!|t sJ||j_| |jj||<t%|jj||j_||jkr ||_dSdS)z+Replace lines [a1, a2) with lines [b1, b2).s-%d contains %d lines, tried to access line %drrN)rannotaterrrrrrr__len__rrbrrirr=rrRmaxr)rrrrb1b2rara1insta1info programlen oldproglen appendinst blineinfosbappendtgtrnewrev newlinenumendaddra1instpcs rrzlinelog.replacelines:s   $ #BBs##B BH  @BH r*+ 3rx== !QZZFaBG,,FFXb\F]6>2F]* Z\\ ])  # 77R! ,C Js3}} % % % R== : :#+GHS'::<<@@AAAJuS'223333)9')B&FJGHVZFFGGGJuVZ889999 77CMM!!"DCMM2./s28}}$$'(2,.Avv# ,, (26*2Q6 JtC)) * * *:<< 6&5$-00 5 JuQ 233 4 4 4(-a(<(< fn% t!' ( (2 - -3;D  $R ( 0 0fd++ + + +&.D  #*4 B'!$T%7%;S!A!A   DLLL  r cVd}g}d}|b|t|jkrJ|j|}|}||||j}|dz }||t|jkJ|$t d|zt |||}||_|S)Nrrz4Probably hit an infinite loop in linelog. Program:\n)rrr7rrrrr)rrr5rexecutedinstlastpcrs rrzlinelog.annotates nC ,>,>!>!>=$DFc2u|44B MH nC ,>,>!>!> >G--//" C / / r c|jSr)rrs rrzlinelog.maxrevs |r c.d|jjDS)z?Return the last annotation result. C linelog code exposed this.c*g|]}|j|jfSr )rr)rls r z*linelog.annotateresult..s!EEEq "EEEr )rrrs rrzlinelog.annotateresultsFED,>,DEEEEr c0|jj|jSr)rrr)rlines r getoffsetzlinelog.getoffsets!'-55r c|pd}g}tt|jD]}|j|}|dz}t|tr|j}nt|t r|cSt|ttfrnIt|tr"| |j |j fntd|z||kr|cS|}td)zGet all lines that ever occurred in [start, end). Passing start == end == 0 means "all lines ever". This works in terms of *internal* program offsets, not line numbers. rsIllegal instruction %rsFailed to perform getalllines)rrrrrRrArrbr=rirrlrmr)rstartendr5rsteprnextpcs r getalllineszlinelog.getallliness Za#dm,,--  D=$D!VF$&& ED$'' E D3+.. ED%(( E di)9:;;;;"#rs?    6= IIIII9III        # # # # # # # # L>4N*>,.4N6CCC*f=f=f=f=f=f=f=f=f=f=r