^cddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z ddl mZddlmZmZmZmZmZmZmZmZm Z mZmZmZmZddlmZmZm Z m!Z!ej"Z"ej#dZ$ej#d Z%ej#d Z&ej'Z'ej(Z(ej)Z)d Z*gd Z+ej,d Z-dZ.GddZ/dZ0GddZ1GddZ2Gdde2Z3Gdde3Z4GddZ5Gdde2Z6ej#dZ7ej#dZ8gd Z9Gd!d"Z:Gd#d$Z;Gd%d&ZGd)d*Z?Gd+d,Z@d-ZAd.ZBdVd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZIdWd8ZJd9ZK dWd:ZLd;ZM dXd<ZN dYd=ZO dXd>ZP dZd?ZQd[d@ZRGdAdBeSZTejUZVejUZUejWZW d\dCZX d]dDZYdEZZdFZ[dGZ\dHZ]dIZ^dJZ_dKdLdMdNZ`dOZadPZbdQZcdRZdd^dTZedUZfdS)_N_)hexsha1nodeconstantsshort)open) copies diffhelperdiffutilencodingerrormailmdiffpathutilpycompatscmutilsimilarutilvfs)dateutilhashutilprocutil stringutilsdiff --git a/(.*) b/(.*)s (\t+|[^\t]+)s9(\t+| +|[a-zA-Z0-9_\x80-\xff]+|[^ \ta-zA-Z0-9_\x80-\xff])ch d d fd} fd} fd} fd} fd}Gdd }d }g}d g} tj|d s ||}|D]} || | d r|||cS| dr|||cS | |rAd}| ddd| vr|||cS| dr|r|||cS||S)z6return an iterator of individual patches from a streamc|r|drdS|drdS|dd}t|dko d|d vS) N)  T)r-+F: rrr) startswithsplitlen)lineinheaderls 1/usr/lib/python3/dist-packages/mercurial/patch.pyisheaderzsplit..isheaderAsm   66 4 ??- . . 5 JJua 1vv{/t1Q4//cFtd|SNr+)stringiojoin)liness r)chunkzsplit..chunkKs(((r+c3Kd}|D]U}|sd}|s&|dr|Vg}d}||V|r|VdSdS)NTF# HG changeset patch)stripr#append)streamcurr'r&r1s r)hgsplitzsplit..hgsplitNs  D::<< !  0G H H eCjj    JJt      %**       r+c3K|D]U}|dr)t|ddD]}|Vg}||V|r't|ddD]}|VdSdS)NFrom r)r#r$r5)r6r7r&cr1s r) mboxsplitzsplit..mboxsplit^s  Dx(( uuSW~~..AGGGG JJt      55QRR>>**      r+c3HKd}|D]}|| |}tj|}|s||VdSd}|D](}|}||vr||V)dS)Nct}tj|d}|||d|S)NF) mangle_from_r)r.r Generatorflattenseek)mfpgs r)msgfpz'split..mimesplit..msgfplsBBr666A IIaLLL GGAJJJIr+ text/plains text/x-diffs text/x-patch)r5rparse is_multipartwalkget_content_type) r6r7rFr&r;rCok_typespartctr1s r) mimesplitzsplit..mimesplitks     D JJt     E#JJ JqMM~~ "%((NNNNNGH " "**,,X%%eDkk!!!!  " "r+c3Kd}|D]F}|s||r|Vg}d}|r||sd}||G|r|VdSdSNFTr5)r6r7r'r&r1r*s r) headersplitzsplit..headersplits  D x 8 8 eCjj    !x 8 8 !  JJt      %**       r+c3&K|VdSN)r7r1s r) remainderzsplit..remainders!eCjjr+c$eZdZdZdZdZeZdS)split..fiterc||_dSrV)rDselfrDs r)__init__zsplit..fiter.__init__s DGGGr+c|SrVrWr]s r)__iter__zsplit..fiter.__iter__sKr+cJ|j}|st|SrV)rDreadline StopIterationr]r(s r)nextzsplit..fiter.nexts(  ""A $##Hr+N)__name__ __module__ __qualname__r^rarf__next__rWr+r)fiterrZsB          r+rkFs content-typesnextr3r:T:rr--- )r safehasattrr5r#r$lower) r6r8r<rPrTrXrkr'r7 mimeheadersr&r1r*s @@r)r$r$>s"000)))     """""2         H C"#K  FG , ,v , , 4 ??2 3 3 ,763'' ' ' ' __X & & ,9VS)) ) ) ) XdH % % ,Hzz$""1%++--<< y-----=__W % % ,( ,;vs++ + + + 9S>>r+))sDatesdate)sBranchsbranch)sNode IDnodeidc#8Ktjd\}}tj|d} t ||||V|tj|dS#|tj|wxYw)aextract patch from data read from fileobj. patch can be a normal patch or contained in an email message. return a dictionary. Standard keys are: - filename, - message, - user, - date, - branch, - node, - p1, - p2. Any item can be missing from the dictionary. If filename is missing, fileobj did not contain a patch. Caller must unlink filename when done. hg-patch-prefixwbN)rmkstemposfdopen_extractcloseunlink)uifileobjfdtmpnametmpfps r)extractrs$",777KB Ib$  Er7GU33333  '   's A//*Bc J tjdtjtjz}i}t j|}|dot j|d}|dot j|d|d<|s<|ds4dd|Ddz}g}|d} | r1t j| x|d<} | d | z|r}| d r:| d } | d kr|| d zd }tj dd|}| d|z|dr| d|dzd } d} d} |D]}tj|}| d|z|| vrF|d}||}|red}d}d}| d|d z| d z } t+}|d|d D]}| drH|sF| dd}d}|d |d}n |r| dr,|dd|d<| d|dzn| dr0||dd n| drbt4D]Y\}}d |z}| |r:|t7|d||<| d!|||fzZn d}n|d"krd}|s,|s*|||d|} |r?|||ds|d| s| r|d#kr| d|zz } |r| |sd$|| fz} | |d%<||r2| d |d&<|r| d |d'<| r||d(<|S))Ns}^(?:Index:[ \t]|diff[ \t]-|RCS file: |retrieving revision [0-9]+(\.[0-9]+)*$|---[ \t].*?^\+\+\+[ \t]|\*\*\*[ \t].*?^---[ \t])SubjectFromsuser c3pK|]1}dttj|V2dS)r!N)r/mapr strtolocal.0hs r) z_extract..sL<= 3x2A6677r+zX-Mercurial-Noderqs Node ID: %s s[PATCH]rrs\n[ \t]+rs Subject: %s s From: %s rGr+sContent-Type: %s T)decodeFsfound patch at byte %d r3spatch generated by hg export s# User s # Parent # s# %s s%s: %s ---rHs%s %ssmessagesp1sp2sfilename)!recompile MULTILINEDOTALLrrI headdecoder/itemsdebugr#findlstripsubrKrbytestrrL get_payloadsearchstartr. splitlinesrBtruncater5patchheadermapr%writegetvalueendswithr{pop)r}r~rrdiffredatamsgsubjectparentsnodeidpend diffs_seenrMmessagerN content_typepayloadrChgpatch hgpatchheader ignoretextcfpr&headerkeyrus r)rzrzsZ % ry F D *W  C)n@Y!@!@GK@DOCK$@$@DM  4=  JJAD    G # $F ,#'?6#:#::Y& !F*+++-   i ( ( 7<<%%Dqyy!$(**-4466&tW55 !G+,,, G}0 g.///J?HG 1'1''(=(=(?(?@@  &5666 x ' ' ""$"// MM' " " * 'G!MJ HH01771::= > > > !OJ**C !''!** -88:: % %??#:;;&G&HH>???"G$(MHHQKKKLLNNN"GG"&z22 .(,QRRW g!>????66 .tABBx'8'89999//.+9LLKFC%-%6F#v66L,0V,?S "S 7J)J K K K L ). V^^!%J$%Z%IIdOOOIIe$$$llnnG ' G$$$''..'KK&&& ' 'LM,I,I uw &G1w))'221w00D KKMMM)kk!nnU  )!++a..DK$#[ Kr+c<eZdZdZdZdZdZdZdZdZ dZ d S) patchmetaaPatched file metadata 'op' is the performed operation within ADD, DELETE, RENAME, MODIFY or COPY. 'path' is patched file path. 'oldpath' is set to the origin file when 'op' is either COPY or RENAME, None otherwise. If file mode is changed, 'mode' is a tuple (islink, isexec) where 'islink' is True if the file is a symlink and 'isexec' is True if the file is executable. Otherwise, 'mode' is None. cL||_d|_d|_d|_d|_dS)NsMODIFYF)patholdpathmodeopbinary)r]rs r)r^zpatchmeta.__init__cs)    r+c,|dz}|dz}||f|_dS)Ni @)r)r]rislinkisexecs r)setmodezpatchmeta.setmodejs$V$ r+ct|j}|j|_|j|_|j|_|j|_|SrV)rrrrrr)r]others r)copyzpatchmeta.copyos:$)$$  Y 7{  r+cN|dkr |jdkS|d|jp|jzkS)N /dev/nullADDa/)rrr)r]afiles r) _ispatchingazpatchmeta._ispatchingaws3 L 7f$ $!:;;;r+c@|dkr |jdkS|d|jzkS)NrDELETEb/rr)r]bfiles r) _ispatchingbzpatchmeta._ispatchingb|s, L 7i' ' )))r+cV||o||SrV)rr)r]rrs r) ispatchingzpatchmeta.ispatchings)  ''DD,=,=e,D,DDr+c(d|jd|jdS)Nz rr`s r)__repr__zpatchmeta.__repr__s&*gggtyyy99r+N) rgrhri__doc__r^rrrrrrrWr+r)rrXs%%% <<< *** EEE:::::r+rcd}g}|D]}|d}|drXt|}|r;|r|||d}t |}|r|dr||d}|drd|_|dd|_|d r|d d|_ |d rd |_|d d|_4|d r|dd|_ Z|dr d|_x|dr4d|_| t|ddd|dr-| t|ddd|drd|_ !|r|||S)z9extract git-style metadata about patches from N diff --git a/r"rms rename from RENAME s rename to s copy from COPYscopy to s deleted filersnew file mode ris new mode GIT binary patchT) rstripr#gitrematchr5grouprrrrrintr)lrgp gitpatchesr&rCdsts r) readgitpatchrsG BJ ! !{{7## ??+ , , ! D!!A $*%%b)))ggajjs^^  !w'' !!"%%%// !!!"##Y // !rss)// !!"##Y -- !qrr(11 !!!233 ! 3tBCCy!,,----.. ! 3tBCCy!,,----!455 !   " r+c&eZdZdZdZdZdZdS) linereaderc"||_g|_dSrV)rDbufr\s r)r^zlinereader.__init__sr+cB||j|dSdSrV)rr5r]r&s r)pushzlinereader.pushs*   HOOD ! ! ! ! !  r+cp|jr|jd}|jd=|S|jSNr)rrDrcres r)rczlinereader.readlines9 8  A Hw!!!r+c,t|jdSr-)iterrcr`s r)razlinereader.__iter__sDM3'''r+N)rgrhrir^rrcrarWr+r)rrsP""""""(((((r+rc8eZdZdZdZdZdZdZdZdZ dS) abstractbackendc||_dSrV)r})r]r}s r)r^zabstractbackend.__init__s r+ct)zReturn target file data and flags as a (data, (islink, isexec)) tuple. Data is None if file is missing/deleted. NotImplementedErrorr]fnames r)getfilezabstractbackend.getfiles "!r+ct)a Write data to target file fname and set its mode. mode is a (islink, isexec) tuple. If data is None, the file content should be left unchanged. If the file is modified after being copied, copysource is set to the original file name. rr]rrr copysources r)setfilezabstractbackend.setfiles "!r+ct)zUnlink target file.rrs r)r|zabstractbackend.unlinks!!r+cdS)zWrite rejected lines for fname. total is the number of hunks which failed to apply and total the total number of hunks for this files. NrW)r]rfailedtotalr0s r)writerejzabstractbackend.writerejsr+ctrVrrs r)existszabstractbackend.exists!!r+ctrVrr`s r)r{zabstractbackend.closerr+N) rgrhrir^rrr|r rr{rWr+r)rrs}""" """"""   """"""""r+rc<eZdZfdZdZdZdZdZdZxZ S) fsbackendctt||tj||_dSrV)superrr^vfsmodropener)r]r}basedir __class__s r)r^zfsbackend.__init__s6 i''+++j)) r+cB|j|r|j|dfSd} |j|jdzdk}n#t $rYnwxYw |j|d|ffS#t $rYdSwxYw)NTFFrrNN)rrreadlinklstatst_modeFileNotFoundErrorread)r]rrs r)rzfsbackend.getfiles ;  e $ $ @K((//? ? [&&u--5=BFF     D  K$$U++eV_= =    :: s#&A!! A.-A.2B BBc|\}}||j|||dS|r|j||dS|j|||r|j|dddSdSrR)rsetflagssymlinkr)r]rrrrrrs r)rzfsbackend.setfiles < K  7 7 7 F  9 K  e , , , , , K  eT * * * 9 $$UE488888 9 9r+cv|jdd}|j|d|dS)Ns experimentalsremoveemptydirsT) ignoremissingrmdir)r} configboolr unlinkpath)r]rr&s r)r|zfsbackend.unlink s=""?4FGG uDFFFFFr+c|dz}|jtd|||fz||d}|||dS)Ns.rejs7%d out of %d hunks FAILED -- saving rejects to file %s w)r}warnrr writelinesr{)r]rr r r0rDs r)r zfsbackend.writerejsv  I J Jue$ %   [[ % % e  r+c6|j|SrV)rlexistsrs r)rzfsbackend.existss{""5)))r+) rgrhrir^rrr|r r __classcell__rs@r)rrs*****    9 9 9GGG*******r+rc>eZdZfdZdZfdZfdZdZxZS)workingbackendctt|||j||_||_t |_t |_g|_ dSrV) rr2r^rootrepo similaritysetremovedchangedcopied)r]r}r5r6rs r)r^zworkingbackend.__init__sT nd##,,R;;; $uu uu  r+c|jj|js4||r!t t d|zdSdSNs$cannot patch %s: file is not tracked)r5dirstate get_entry any_trackedrPatchApplicationErrorrrs r) _checkknownzworkingbackend._checkknown'ssy!++E22> 4;; D D  (9::UB     r+c||tt|||||||j||f|j|dSrV)rArr2rr:r5r9add)r]rrrrrs r)rzworkingbackend.setfile/sx  nd##++E4zJJJ  ! K   E2 3 3 3 r+c||tt|||j||j|dSrV)rArr2r|r8rCr9)r]rrs r)r|zworkingbackend.unlink6sg  nd##**5111  r+c|jd}t|j}|jD]'\}}t j|j|j|||(|jrT|t|j|jD]%}||jj vr| |&|r t j |j||j t|jSrV)r5r7r9r:r dirstatecopyr}r8forgetsortedr=discard marktouchedr6)r]wctxr9srcrfs r)r{zworkingbackend.close<sydl##  E EHC  $)T3 D D D D < ' KKt|,, - - -\ ' 'DI... OOA&&&  E   7DO D D Ddl###r+) rgrhrir^rArr|r{r/r0s@r)r2r2s          $$$$$$$r+r2c*eZdZddZddZdZdZdS) filestoreNcvd|_i|_d|_||_|jd|_d|_i|_dS)Nri@)rfilescreatedmaxsizesizer)r]rSs r)r^zfilestore.__init__Ps?    < (DL  r+c|jdks t||jz|jkr,|||f|j|<|xjt|z c_dS|j.t jd}tj||_d|j z}|j |||xj dz c_ |||f|j |<dS)Nrrsrt%dr) rSr%rTrrrmkdtemprrrRrrQ)r]rrrr:r4fns r)rzfilestore.setfileZs z%patchfile.findlines.. sCG $4$4r+)r)r}getr%sort)r]r(rcands ` r) findlineszpatchfile.findlinessL y}}Q## t99q== II4444I 5 5 5 r+c|jsdStj|j}d||fzg}|jD]Q}|jD]G}|||dddkr"|dtjzHR|j |jt|j|j |dS)Ns--- %s +++ %s rr) rrxrbasenamerhunkr5r MISSING_NEWLINE_MARKERrxr r%r)r]r]r0rr(s r) write_rejzpatchfile.write_rej s x  Fw ++$d|34 L LAV L L QRSS6U??LL)J!JKKK L dj#dh--UKKKKKr+c T |s]ttd|j|jt |j|jt |j|j fz|xj dz c_ |j r|j |dS|jr|jr|jr0|jtd|jzn/|jtd|jz|j |dSt)|t*rs|jr |j|jnJ||j}||jdd<|xjt |z c_d|_dS|}|jdvs|jd kr|jr|}| dd \}}}}||jz }|}|j!dkrtEj#||j|ry|jr |j|jnP||j||t |z<|xjt |t |z z c_d|_dSi|_$tK|jD]3\} } |j$&| g | 4tO|j(d d dzD]} d D]} | | | \}}}}||jz|j!z}tS|t |j}|r%|*|ddd|} n|g} | D]}|rtEj#||j|r||j||t |z<|xjt |t |z z c_||z |_!d|_||z | z }| rNtd}|+d|j||j|dz| |fzn7td}|j,||j|dz|fz| cccS|+d|jtd|j|fz|j |dS)Nsbad hunk #%d %s (%d %d %d %d)rrs-cannot create %s: destination already exists sfile %s already exists Tr)rorprqFpatchsfuzzrs9Hunk #%d succeeded at %d with fuzz %d (offset %d lines). s,Hunk #%d succeeded at %d (offset %d lines). sHunk #%d FAILED at %d )-completePatchParseErrorrnumberdescr%alenablenbrryrr5rrzrr}r+r isinstancebinhunkr{rxr|newr0rr~rvrw getnormalizedfuzzitrr testhunkr} enumerate setdefaultrange configintminrrr)r]rr(horigoldoldstartrnewstart orig_startrrfuzzlentoponlyrrrs r)applyzpatchfile.applys@zz|| !2338QVSXXqvs13xxHI  a <  HOOA   2 ; 4;  J GHHj!  Q:;;djHIII HOOA   2 a ! ! { " ##DJ////EE$*%% ! 111  s1vv% ! 1 L, , ,|w&&' !!A()xx5'9'9$XsHDK  9>>j1#tz8LL>{ " ##DJ////=@ 8hS&99: s3xx#c((22 ! 1 dj)) 2 2DAq I B ' ' . .q 1 1 1 1TW..xAAAEFF# '# 'G(" '" '/0xx/I/I,XsH#dk1DI=xTZ99&>>#a&*h??DD%:D''A'*"5c4:q"I"I'7: 1q3s88|#34 s3xx#c((':: $% N %) !"Z'!9"J"#!8##C !NN4000 GLL #qxQ&H H#$!8##C!GLL!a%/H)HIII&-''" 'F t  Q122ah 5KKLLL rr+c|jr&||j|j|j|t |jSrV)r~r,rr0rrr%rr`s r)r{zpatchfile.closesF : ? OODJ DI > > > 48}}r+N)rn) rgrhrir^r,rrrrr{rWr+r)rsrss::::xLLL$      LLL iiiVr+rsceZdZdZejdZejdZejdZejdZ ejdZ ejdZ dZ d Z d Zd Zd Zd ZdZdZdZdZdS)rz patch headersdiff --git a/(.*) b/(.*)$sdiff -r .* (.*)$s(?:index|deleted file) s(?:new file|deleted file) s'(?:index|deleted|copy|rename|new mode) s(?:new file|copy to|rename to)c"||_g|_dSrV)rr)r]rs r)r^zheader.__init__s  r+c>td|jDS)Nc3@K|]}|dVdS)index Nr#rs r)rz header.binary..s.@@q1<< **@@@@@@r+anyrr`s r)rz header.binarys!@@DK@@@@@@r+c f|jD]'}|dr%|tddS|j|rN|||r"|tddS|drX|tdt|jtd|jDfzdS||)dS)Nrs-this modifies a binary file (all or nothing) sthis is a binary file rs%d hunks, %d lines changed cBg|]}t|j|jSrW)maxaddedr8rs r) z!header.pretty..s&IIIS!)44IIIr+) rr#rr pretty_rerrr%rsum)r]rDrs r)prettyz header.prettys-  A||I&& LMMNNN~##A&&  ;;==<HHQ9::;;;||F## 566DJIIdjIIIJJ HHQKKKK%  r+c`|d|jdSr-)rr/rr\s r)rz header.writes( $+&&'''''r+cDtfdjDS)Nc3LK|]}j|VdSrV) allhunks_rerrrr]s r)rz"header.allhunks..s4BB4#))!,,BBBBBBr+rr`s`r)allhunkszheader.allhunkss(BBBBdkBBBBBBr+c|j|jd}|r$|\}}||kr|gS||gS|j|jdSr) diffgit_rerrgroupsdiff_re)r]rfromfiletofiles r)rQz header.filess}%%dk!n55  ?$||~~ Hf6!! z!f% %<%%dk!n55<<>> >r+c6|dS)Nr)rQr`s r)filenamezheader.filenameszz||Br+cddtjtj|zS)Nz
r)r/rrapplyfsdecoderQr`s r)rzheader.__repr__s5 HHX_X%6 EE F F  r+cDtfdjDS)Nc3LK|]}j|VdSrV) newfile_rerrs r)rz#header.isnewfile..s3AA4?((++AAAAAAr+rr`s`r) isnewfilezheader.isnewfiles(AAAAT[AAAAAAr+ctjdk}o|}|ptfdjDS)Nr"c3LK|]}j|VdSrV) special_rerrs r)rz!header.special..sD# # )*DO ! !! $ $# # # # # # r+)r%rrr)r] nocontent emptynewfiles` r)specialzheader.specialsn $$) ~~''5I  s# # # # .2k# # #    r+N)rgrhrirrrrrrrrrr^rrrrrQrrrrrWr+r)rrs%899Jbj,--G"*788K 899IFGGJ=>>JAAA*(((CCC???      BBB      r+rcdeZdZdZ d dZdZdZdZdZdZ e Z d Z e j d ZdS) recordhunkzKpatch hunk XXX shouldn't we merge this with the other hunk class? Nc dfd } ||_| |d\} |_|| z|_|| z|_| |d\} |_||_||_||j\|_|_ dS)NFct2t|z }|dkr|r |||dfS||dfSd|fSrr%)r0reversedelta maxcontexts r) trimcontextz(recordhunk.__init__..trimcontextsZ%E Z/1999$eEFFm33$eKZK&888e8Or+T)F) rbeforefromlinetolineafterprocr countchangesrr8) r]rrrrrrrrr trimedbefore _trimedafters ` r)r^zrecordhunk.__init__s       $/K$=$=! dk </ |+ #.;ue#<#< dj  #'#4#4TY#?#?  DLLLr+ct|tsdS|j|jkoS|j|jkoC|j|jko3|j|jkS)NF)rrrrrrrQ)r]vs r)__eq__zrecordhunk.__eq__sw!Z(( 5Vty  :49$ :!*, :""$$(8(88  r+ctt|jt|j|j|jfSrV)r}tuplerrrQrrr`s r)__hash__zrecordhunk.__hash__sIdi  dk''))**      r+cntd|D}td|D}||fS)zhunk -> (n+,n-)c<g|]}|d|S)r rrs r)rz+recordhunk.countchanges..)999all4&8&891999r+c<g|]}|d|S)rrrs r)rz+recordhunk.countchanges..rr+r)r]rrCrems r)rzrecordhunk.countchangessC99d999::99d999::Cxr+c ddddfd|jD}t|j|j|j|j|j||jS)zreturn another recordhunk which is the reverse of the hunk If this hunk is diff(A, B), the returned hunk is diff(B, A). To do that, swap fromline/toline and +/- signs while keep other things unchanged. rr \)r rrcJg|]}d|dd|ddfz S)s%s%srrNrW)rr(rCs r)rz*recordhunk.reversehunk..&s7@@@1QqsV9ae,,@@@r+)rrrrrrrr)r]rrCs @r) reversehunkzrecordhunk.reversehunksbtE 2 2@@@@di@@@ K K M I K  J   r+c t|jt|jz}|jr |jdtjkr|dz}||jz}||jz}|d|j||j ||j o d|j zfz|d |j|j z|jzdS)Nrrs@@ -%d,%d +%d,%d @@%s rr+) r%rrr rr8rrrrrr/r)r]rDrfromlentolens r)rzrecordhunk.write1sDK  3tz??2 : $*R.J,MMM QJE$,& "  &   0tdi/    $+ 1DJ>??@@@@@r+c4|jSrV)rrr`s r)rzrecordhunk.filenameEs{##%%%r+c>d||jfzS)Ns )rrr`s r)rzrecordhunk.__repr__Hs$--//4=!AAAr+rV)rgrhrirr^rrrrrrrr strmethodrrWr+r)rrs@@@@<           &AAA$F&&&BBBBBr+rcdtdtdtdtddtdtdtdtd dtd td td td ddS)Nsapply change %d/%d to '%s'?sdiscard change %d/%d to '%s'?skeep change %d/%d to '%s'?srecord change %d/%d to '%s'?)sapplysdiscardskeeprecordsapply this change to '%s'?sdiscard this change to '%s'?skeep this change to '%s'?srecord this change to '%s'?s0[Ynesfdaq?]$$ &Yes, apply this change$$ &No, skip this change$$ &Edit this change manually$$ &Skip remaining changes to this file$$ Apply remaining changes to this &file$$ &Done, skip remaining changes and files$$ Apply &all changes to all remaining files$$ &Quit, applying no changes$$ &? (display help)s8[Ynesfdaq?]$$ &Yes, discard this change$$ &No, skip this change$$ &Edit this change manually$$ &Skip remaining changes to this file$$ Discard remaining changes to this &file$$ &Done, skip remaining changes and files$$ Discard &all changes to all remaining files$$ &Quit, discarding no changes$$ &? (display help)s-[Ynesfdaq?]$$ &Yes, keep this change$$ &No, skip this change$$ &Edit this change manually$$ &Skip remaining changes to this file$$ Keep remaining changes to this &file$$ &Done, skip remaining changes and files$$ Keep &all changes to all remaining files$$ &Quit, keeping all changes$$ &? (display help)s4[Ynesfdaq?]$$ &Yes, record this change$$ &No, skip this change$$ &Edit this change manually$$ &Skip remaining changes to this file$$ Record remaining changes to this &file$$ &Done, skip remaining changes and files$$ Record &all changes to all remaining files$$ &Quit, recording no changes$$ &? (display help))multiplesinglehelprrWr+r) getmessagesrMs677:;;455899   5669::344788    (   (   (   (  K1 1 ? ? ?r+cdtdfd}t}i}d\}}dtd|D} } |D]} | t| jz } d}d} d| j} | |vr=|| || | }td td d |Dz}tfd |Drd \}}}n||||d\}}}}|s| g|| <| r)|| xx| jz cc<Ft| jD]V\}}|||| dkr$d| z}n@| t| jz |z}d|| | fz}|||||\}}}}|rT| r$tj|}|xj| z c_|| ||P|D]K}|jD]A}| r|xj| z c_|| |BLD| |j|jz z } Xtd|DgifS)z:Interactively filter patch chunks into applied-only chunksNr cd}|||||fS|||||fS d}d||fz}d|dkrN|dD]1\}}d|tj|fz2|d krd} n |dkrd } n|d kr|8t d d|jr9t d d9dt dz} tj dd\} } d} tj tj | d}|j||||dd| D|}d|| fzdid} | d kr=t d| z tj| ~ t-| d}t/} |D]@}tj|}|ds| |A|| d t7| }tj| ~ n#tj| ~ wxYwd } nS|dkrd x} }nH|dkrdx} }n=|dkrd x} }n2|d krdx} }n'|d!kr!t9jt d"| |||fS)#zprompt query, and process base inputs - y/n for the rest of file - y/n for the rest - ? (help) - q (quit) Return True/False and possibly updated skipfile and skipall. NTrs%s (enter ? for help) %srrrs%s - %s rFr"s cannot edit patch for whole files!cannot edit patch for binary filers To remove '-' lines, make them ' ' lines (context). To remove '+' lines, delete them. Lines starting with # will be removed from the patch. If the patch applies cleanly, the edited hunk will immediately be added to the record list. If it does not apply cleanly, a rejects file will be generated: you can use that when you try again. If all lines of the hunk are removed, then the edit is aborted and the hunk is left unchanged. s hg-editor-s.diff)rusuffixrvr+cg|] }d|zdz S)rrrW)ris r)rz/filterpatch..prompt..s!KKK1UQY.KKKr+s%s "%s"sHGUSERs filterpatch)environ blockedtags editor exited with exit code %d rb#rs user quit) promptchoicerextractchoicesr rorrrrrwrnativeeolwriterrxryr/rr{ geteditorsystemusernamer+r|r r. fromnativeeolr#rB parsepatchr CanceledError)skipfileskipallqueryr1 newpatchesrespsrr;tretphelppatchfdpatchfn ncpatchfprMeditorpatchfpr&messages operationr}s r)promptzfilterpatch..prompts%  Hgz9 9  Xw : :Y 6W%i0E <u~ MNNA HHUOOOAvv--e44Q7DDDAqHH\Qq0A0A,BBCCCCaaa=HHQBCCDDDHHUOOO<&&((HHQCDDEEEHHUOOO  " " &.%5(&&&"'! !",RYw-E-EFFAL&&q)))KKNNNGGKK8H8H8J8JKKK GGIII\\^^F))$'88!*BKKMM :#1$C axx"F G G# MNNN Ig&&&! #7D11G ( I '22#1$77#t442%OOD111MMOOONN1%%%!+I!6!6JIg&&&! Ig&&&!MMMMa!&&hha!%%hha %%gga $$gga)!L//:::':5 5s;DM 1BM M7rrc3>K|]}t|jVdSrV)r%rrs r)rzfilterpatch..s*66AG 666666r+rr+sexamine changes to %s?s and c3 K|] }d|zV dS)s'%s'NrWrrMs r)rzfilterpatch..s7> > GaK> > > > > > r+c3BK|]}|VdSrV)exact)rrMrs r)rzfilterpatch..s---!u{{1~~------r+)TNNrr clg|]1}|dst|dk/|2S)rr)rr%rs r)rzfilterpatch..;s4 I I I1AaDLLNN Ic!ffqjjQjjjr+)rr7rr%rr/rrCrrQrallrrrrrr5r8rvalues)r}headersrr6r7seenappliedr'r(posr r fixoffsethdrrQrr,nprr1idxr*newpatchnewhunkr5s` `` @r) filterpatchrJs}}H h6h6h6h6h6h6h6T 55DG"HgC66g66666C 3939 s17|| hhqx   $;;   ? HHRLLL )**Qx[[-=-=> > !&> > > . .   ----u--- - - L-NAw'-vhd'K'K $Ax"  !"  ::<<  AJJLL ! ! !QW , ! ! ! !!'** 9 9HAuGO R   zzy))4u~~7G7GGCLL(1,{+I6NN$$: 06v'300 ,Ax* 9. Ie,,ELLI-LL(()007777' *DDH#+>DD$8#NNi7NN 0 0 2 23::7CCCCDD U]U[88 7 9: I I(( I I I     r+c>eZdZdZdZdZdZdZdZdZ dZ d S) rc||_||_|g|_g|_g|_dx|_|_dx|_|_|0|r| |dS| |dSdSrV) rrrrrstartarstartbrread_context_hunkread_unified_hunk)r]rnumrcontexts r)r^z hunk.__init__Cs  F "&& di"&& di > +&&r*****&&r***** >r+c@d}t|j|jdd}|j|_|j|_|j|_||j|_||j|_|j|_|j|_|j|_|j|_|S)z1Return a copy with line endings normalized to LF.cg}|D]9}|dr |dddz}||:|S)Nrrur)rr5)r0rr&s r) normalizez%hunk.getnormalized..normalizeTsVF $ $==))-9u,D d####Mr+N) rrrrrrMrNrr)r]rUnhs r)rzhunk.getnormalizedQs   $)T[$ 5 5K ))y  y  K K )) r+ct|j}|s$tt d|jz|\|_|_|_ |_ |jd|_nt|j|_|j d|_ nt|j |_ t|j|_t|j |_ tj ||j|j|j |j|jn=#t"j$r+}tt d|j|fzd}~wwxYwt'|jddkrV|jd=|jd=|jd=|xjdzc_|xj dzc_ t'|jddkV||dS)N bad hunk #%drsbad hunk #%d: %srr)unidescrrrrrrrMrrNrrr addlinesrrrr ParseErrorr% _fixnewline)r]rrCes r)rPzhunk.read_unified_hunkis MM$) $ $ D!!O"4"4t{"BCC C9:6 TY TY 9 DIIDIDI 9 DIIDIDI$+&& $+&&  M  DIty$)TVTV     M M M!!$7"8"8DK;K"KLL L M$)B-  A%% " r r IINII IINII $)B-  A%% s62D))E#8&EE#c@ ||_t|j}|s$t t d|jz|\|_}t|j|_||j}t||jz |_ |jr|xj dz c_ t|j D]}|}| dr| |n|dd}| ds| drd|z}nA| drd |z}n&t t d |j|fz|j||j||}| d r=|jd dd }||jd <||jd <|}t|}|s$t t d|jz|\|_}t|j|_||j}t||jz |_|jr|xjdz c_d} t|jD]}|}| d r-|jd dd }||jd <||j| dz <Y|s| |n0|dd}| d s| drd|z}np| drd |z}nUt)|jdkr| |nt t d |j|fz|j| | t)|jkrd} n |j| } | dz } | |krn5| drK|j| dz | |jsN|jD]F}| ds| d r|j|G|jsV|jD]N}| ds| d r"|j|ddOd|j|j |j|jfz|_|j|jd<||dS)NrXrrr"s- s! rs rsbad hunk #%d old text line %d\ rs+ r rTr+s@@ -%d,%d +%d,%d @@ )rcr contextdescrrrrrrMrrrr#rrr5rrNrrr%insertr\) r]rrCaendrr(rubendhunkirs r)rOzhunk.read_context_hunkskKKMM   di ( ( D!!O"4"4t{"BCC CHHJJ T$+&& <;DII + ;  IINIIty!!  A A||F##  !""A||E"" all5&9&9 1He$$ 1H%6774;:JJ FMM!    I  Q     KKMM <<   r 3B3ADF2JDIbM A   a  D!!O"4"4t{"BCC CHHJJ T$+&& <;DII + ;  IINIIty!!( ( A A||F## F2JssOr '( %!)$  !""A||E"" all5&9&9 1He$$ 1HTV!! %6774;:JJ FMM!    C NN**AA %(A 66\\$''I$$UQY222v %Y % %<<%%%d););%FMM!$$$v )Y ) )<<%%)d););)FMM!ABB%(((, K I K I 0   y !  r+c|}|dr'tj|j|j|jdS||dS)Nr_)rcr#r fixnewlinerrrr)r]rr(s r)r\zhunk._fixnewlinesW KKMM <<     !$)TVTV < < < < < GGAJJJJJr+cvt|j|jkot|j|jkSrV)r%rrrrr`s r)rz hunk.completes+46{{di'DCKK49,DDr+c&t|t|}|rd}d}t|j}t|dz D]+}|j|dzdr|dz }+|sAt|dz D].}|j||z dz dr|dz }.t||}t||}||t||z ||t||z |fS||dfS)Nrrr)rr%rrr#) r]rrfuzzrtopbothlenrs r)_fuzzitz hunk._fuzzits04S""  MCCty>>D4!8__  9QU#..t441HCC taxAya0;;DAAqdC..CdC..CsSXX^+,c#C32F.GL LC{r+c||j|j||\}}}|j|z}|j|z}|jr |dkr|dz}|jr |dkr|dz}||||fS)Nrr)rnrrrMrNrr)r]rjrrrrkrrs r)rz hunk.fuzzits TVTVT7CC S#;$;$ 9 A MH 9 A MHHc8++r+N) rgrhrir^rrPrOr\rrnrrWr+r)rrBs + + +0>kkkZEEE6 , , , , ,r+rc*eZdZdZdZdZdZdZdS)rzA binary patch file.cjd|_d|_dg|_||_||dS)NFsGIT binary patch )textrr_fname_read)r]rrs r)r^zbinhunk.__init__)s4  *+   2r+c|jduSrV)rrr`s r)rzbinhunk.complete0sy$$r+cr|jr)t|jd|gS|jgSr-)r applybindeltarrr/)r]r0s r)rz binhunk.new3s5 : ?!$)SXXe__==> > {r+cd} |||j}|s$ttd|jz|dr*t |dd}nG|dr1t |dd}d|_ng}|||j}t|dkr|d d}|d kr)|d kr#t|td z dz}n"t|td z d z} | tj |ddd|nJ#t$r=}ttd|jtj|fzd}~wwxYw|||j}t|dkt!jd|}t||kr4ttd|jt||fz||_dS)Nc~|}|||dS)Nr)rcr5r)rrr(s r)getlinezbinhunk._read..getline9s0 A KKNNN88G$$ $r+Ts"could not extract "%s" binary datasliteral rsdelta rrrZAas&could not decode "%s" binary patch: %sr+s%"%s" length is %d bytes, should be %d)rrrrsr#rrrr%ordr5r b85decode ValueErrorr forcebytestrzlib decompressr/rr) r]rrzr&rTdecr(r]rrs r)rtz binhunk._read8sp % % % 72ty))D %;<$qrr(33BQB78888   %?@@{J$;A$>$>?@  72ty))D$ii!mmsxx}}-- t99  !:;;;D 401  s7E== G8F??GN)rgrhrirr^rrrtrWr+r)rr&sV%%% )))))r+rc|ddd}|d}|dkr|d}|dkr|S|d|S)Nrrrrr)rr)strrrs r) parsefilenamerds] ABBwA u A1uu FF4LL q55H RaR5Lr+cg}|D]@}tj|dr|}||A|S)areverse the signs in the hunks given as argument This function operates on hunks coming out of patch.filterpatch, that is a list of the form: [header1, hunk1, hunk2, header2...]. Example usage: >>> rawpatch = b"""diff --git a/folder1/g b/folder1/g ... --- a/folder1/g ... +++ b/folder1/g ... @@ -1,7 +1,7 @@ ... +firstline ... c ... 1 ... 2 ... + 3 ... -4 ... 5 ... d ... +lastline""" >>> hunks = parsepatch([rawpatch]) >>> hunkscomingfromfilterpatch = [] >>> for h in hunks: ... hunkscomingfromfilterpatch.append(h) ... hunkscomingfromfilterpatch.extend(h.hunks) >>> reversedhunks = reversehunks(hunkscomingfromfilterpatch) >>> from . import util >>> fp = util.stringio() >>> for c in reversedhunks: ... c.write(fp) >>> fp.seek(0) or None >>> reversedpatch = fp.read() >>> print(pycompat.sysstr(reversedpatch)) diff --git a/folder1/g b/folder1/g --- a/folder1/g +++ b/folder1/g @@ -1,4 +1,3 @@ -firstline c 1 2 @@ -2,6 +1,6 @@ c 1 2 - 3 +4 5 d @@ -6,3 +5,2 @@ 5 d -lastline s reversehunk)rrnrr5)rnewhunksr;s r) reversehunksrosUpH   A~ . .  A Or+cGfdd}|}t}|d||dd}t |D]H\}} |j||||n"#t $rtd||fzwxYw|}I~|S)aDpatch -> [] of headers -> [] of hunks If maxcontext is not None, trim context lines if necessary. >>> rawpatch = b'''diff --git a/folder1/g b/folder1/g ... --- a/folder1/g ... +++ b/folder1/g ... @@ -1,8 +1,10 @@ ... 1 ... 2 ... -3 ... 4 ... 5 ... 6 ... +6.1 ... +6.2 ... 7 ... 8 ... +9''' >>> out = util.stringio() >>> headers = parsepatch([rawpatch], maxcontext=1) >>> for header in headers: ... header.write(out) ... for hunk in header.hunks: ... hunk.write(out) >>> print(pycompat.sysstr(out.getvalue())) diff --git a/folder1/g b/folder1/g --- a/folder1/g +++ b/folder1/g @@ -2,3 +2,2 @@ 2 -3 4 @@ -6,2 +5,4 @@ 6 +6.1 +6.2 7 @@ -8,1 +9,2 @@ 8 +9 cxeZdZdZdZdZfdZdZdZdZ dZ eeeed eeee d eeed eed d e idZ dS)parsepatch..parserzpatch parsing state machinecvd|_d|_d|_d|_g|_g|_g|_g|_dS)Nrr+)rrrrrRrrr@r`s r)r^z#parsepatch..parser.__init__s>DMDKDIDKDLDKDIDLLLr+c|g|\}}}}}t||_t||_||_dSrV) addcontextrrrr)r]limits fromstartfromendtostarttoendrs r)addrangez#parsepatch..parser.addrangesI OOB   7= 4Iw NNDMg,,DKDIIIr+c |jrt|j|j|j|j|j|j|}|jj||xjt|j|j zz c_|xjt|j|j zz c_g|_g|_||_ dSrV) rrrrrrrrr5r%r8rrR)r]rRrrs r)rz%parsepatch..parser.addcontextsy KMKIKI   !((+++ T[!1!1AI!==  s4;//!'99    "DLLLr+c|jr|j|_g|_|jr|g||_dSrV)rRrrr)r]rs r)addhunkz"parsepatch..parser.addhunksC| ""l ! y $###DIIIr+c|gt|}|j|||_dSrV)rrr@r5)r]rErs r)newfilez"parsepatch..parser.newfile s@ OOB   s A L   " " "DKKKr+cdSrVrWrs r)addotherz#parsepatch..parser.addothers Dr+c:|g|jSrV)rr@r`s r)finishedz#parsepatch..parser.finisheds OOB   < r+)contextfilehunkrange)rrrother)rrr)rrr)rrrrrN) rgrhrirr^rrrrrr transitions)rsr)parserrs))       # # # # #&             '  " ! "" ' " $.@@*'  r+rr+rrsunhandled transition: %s -> %s) r.rr/rB scanpatchrKeyErrorrr)originalchunksrrprDstatenewstaters ` r)r%r%sXP P P P P P P P P P d A BHHSXXn % %&&&GGAJJJ E#B--$  *AM%  *1d 3 3 3 3   !1UH4EE   ::<<s =BB:ct|}d}|dkrd||zfS|}|dkr|d|}|dkr"tt d|||fz|dz }||dz kr0|||dzdkr|dz }||dz kr|||dzdk|dz}|dk|d||||dzfS)aturn a path from a patch into a path suitable for the repository prefix, if not empty, is expected to be normalized with a / at the end. Returns (stripped components, path in repository). >>> pathtransform(b'a/b/c', 0, b'') ('', 'a/b/c') >>> pathtransform(b' a/b/c ', 0, b'') ('', ' a/b/c') >>> pathtransform(b' a/b/c ', 2, b'') ('a/b/', 'c') >>> pathtransform(b'a/b/c', 0, b'd/e/') ('', 'd/e/a/b/c') >>> pathtransform(b' a//b/c ', 2, b'd/e/') ('a//b/', 'd/e/c') >>> pathtransform(b'a/b/c', 3, b'') Traceback (most recent call last): PatchApplicationError: unable to strip away 1 of 3 dirs from a/b/c rr+/rs*unable to strip away %d of %d dirs from %srN)r%rrr@rr)rr4rupathlenrcounts r) pathtransformr?s2*$iiG A zzFT[[]]*** E !)) IIdA   77'?@@%&'  Q'A+oo$q1q5y/T"9"9 FA'A+oo$q1q5y/T"9"9   !)) 8??  ftABBx'8'88 88r+c<|dk}|dk}|o|jdko |jdk}|o|jdko |jdk} t |||\} } | o|| } t |||\} }| |kr| }n| o||}| o| o| }| d| ddz}|d|ddz}|r5||kr/| |r|jdkr|jdkrd}d}| | ko|| }d}|s| r |r|r| }n|}n| r| }|s+|s|r| }n$|}n!|s| }nttdt|}|rd|_ n | rd |_ |S) NrrrrTFs&undefined source and destination filesrr) rMrrNrrrrfindr#rrrr)rx afile_orig bfile_origrr4runullanullbrzr{abasergoodabbasergoodbryabasedirbbasedirisbackuprrs r) makepatchmetarhs: , &E , &E  :t{a' :DINF  :t{a' :DINF UF;;LE5I /'..//E UF;;LE5 ~~ 3gnnU33i4I4f*G,u{{4((1,,-H,u{{4((1,,-H    U # # ! K1   INN ~9%"2"25"9"9H E   U    E  P P  PEE!!$M"N"NOO O 5  B   Ir+c# Ktjd}t| fd}t jdD]*}|ds|drpd}|||} }|dr }|||gz }n |d|fV|d rd d || fd fV|d rd d|| fdfV||}|rd|fV$d|fV,dS)zlike patch.iterhunks, but yield different events - ('file', [header_lines + fromfile + tofile]) - ('context', [context_lines]) - ('hunk', [hunk_lines]) - ('range', (-start,len, +start,len, proc)) s'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)c|g}tjdD]8}||r||#||S)zscan lr while predicate holdsr+)rrcr5r)firstrr0r&rs r) scanwhilezscanpatch..scanwhilesac**  Dqww  T""""  r+r+rsdiff -r cH|dd}| p |ddvS)Nrr)rdiff)r$)r&rs r) notheaderzscanpatch..notheaders,JJtQ''u=!,= ==r+rrr)rrrc.|SrVrr(css r)rzscanpatch..s R8H8Hr+)rr )rr rrc.|SrVrrs r)rzscanpatch..sQ\\"5E5Er+rrN) rrrrrcr#rrr) rDlines_rerr&rrrrrCrrs @@r)rrszEFFH BB     R[#&&%% ??+ , , % 0L0L % > > >YtY//F{{}}H""6** "8V,,!!!6/ ! ! ! ! __T " " %Bii.H.H.H.HIII I I I I __\ * * %$B99T+E+E+E+EFFF F F F Ft$$A % *****n$$$$5%%r+cJd} |j}|j}n6#t$r)t|j}YnwxYwt |}||t|}|||S)a Git patches can emit: - rename a to b - change b - copy a to c - change c We cannot apply this sequence as-is, the renamed 'a' could not be found for it would have been renamed already. And we cannot copy from 'b' instead because 'b' would have been changed already. So we scan the git patch for copy and rename commands so we can perform the copies ahead of time. r) rDtellIOErrorr.r rrrrB)r firstlinerCrDgitlrrs r) scangitpatchrs C$ejjll U $$$ bejjll # #$ rNNE JJye$$JGGCLLL s %0AAc#hKd}d}d}d}dx}}d}d}d} t|} t| jdD]} ||kr| s| ds.| dur| ds| drd} |r0|d ||r|} | drt | | j} n.| | drd } t| |dz| | } |dz }|r"d}d ||| | r| pdffVd | fVn| d r@t | d}|sT|4t| | }dd|DfV|d|dz}d|dz}|rz|d ||s^|} d d| jzd| jzd| ffV|r|d ||^|s't!t#d|ddzd }nD| drc| }|ds| |d }d} t'| }t'|}n| dr| }|ds| |0| }| ||ds| |d }d } t'| }t'|}|rd}d }|}d}|rD|} d d| jzd| jzd| ffV|BdSdS)aDRead a patch and yield the following events: - ("file", afile, bfile, firsthunk): select a new target file. - ("hunk", hunk): a new hunk is ready to be applied, follows a "file" event. - ("git", gitchanges): current diff is in git format, gitchanges maps filenames to gitpatch records. Unique event. r+NrFr@s***************rrTrrrrgitcHg|]}|jdv | S))rr)rr)rrEs r)rziterhunks.."s4!"AD> \\$// u$$6H)I)I$||/00%B &jn77uEE &^^%%||/00 6B((?q||4F'G'G?"GGaKW55 qLG K ua1A 1ITJJJJJ1*     \\* + +2 & AHHW--..A !)"a00 &0""$$$AGGAJJ&EAGGAJJ&E Z^%>%>ue%L%L ^^%%BGOBGOGGII   Z^%>%>ue%L%L  %@AAE!""IMGG \\& ! ! &B==((  GG!!$$E!"%%EE \\& ! ! &B==((  B GGBKKK==!344  GG!!$$E!"%%E  GHEG K ^^  $ JJJJJ KKKKKr+cd}d}||}||d}||}||d}d}|t|krt|||dz}|dz }|dzr9d}d}|dzrt|||dz}|dz }|dzr%|t|||dzdzz}|dz }|d zr%|t|||dzd zz}|dz }|dzr%|t|||dzd zz}|dz }|d zrt|||dz}|dz }|d zr%|t|||dzdzz}|dz }|d zr%|t|||dzd zz}|dz }|dkrd}||z} |||| z }n:|dkr||z} |||| z }||z }nttd|t|k|S)z_Apply a binary delta hunk The algorithm used is the algorithm from git's patch-delta.c cnd}tj|D]}|dz }t|dzs|cS|S)Nrr)rrr)binchunkrr;s r) deltaheadz applybindelta..deltahead_sO !(++  A FAFFTM  r+r+Nrrrr"rr risunexpected delta opcode 0)r%rr@r) rrroutrrcmdrrT offset_ends r)rwrwZs  C (A|H (A|H A c(mm  (1q1u9%&& Q :! IFDTz Xa!a%i011QTz #hq1q5y122a77QTz #hq1q5y122b88QTz #hq1q5y122b88QTz 8AAI.//QTz HQQY/00A55QTz HQQY/00B66Qqyy$J 4z)* *CC AXXSJ 8AjL) )C HAA'*F(G(GHH HI c(mm  J Jr+r+rnc :t||t|||||S)aNReads a patch from fp and tries to apply it. Returns 0 for a clean patch, -1 if any rejects were found and 1 if there was any fuzz. If 'eolmode' is 'strict', the patch content and patched file are read in binary mode. Otherwise, line endings are ignored when patching then normalized according to 'eolmode'. r4rurv) _applydiffrs)r}rDrxrbr4rurvs r) applydiffrs3        r+cz|r8tj|j||}|dkr|dz }|S)Nr+r)r canonpathr4getcwd)r5rus r) _canonprefixrs? #DIt{{}}fEE S== dNF Mr+c t|jfd}d} d} d} t|D]\} } | dkr!| s| | }|dkrd} -| dkr| r| | z } d} | \}}}}|r2||j|_|jr||j|_nt||||}|jdkr| |j|s |jdkr| |jd\}}|jd vrK| |jdd \}}|$ttd |jz|j r|j }|jd krd }|s|ri|jdvr>||jr$ttd|jz||j|||j ||||||} #t $r<}|t%j|dzd} | dz } Yd}~#d}~wwxYw| dkrI| D]D}||j}| |\}}|-||||Ezt)jtd| z| r| | z } | rdS| S)Nc8t|dz dS)Nr)r)rrur4s r)pstripz_applydiff..pstripsQ 622155r+rrrrrrr)rrr"ssource file '%s' does not existrr+)rrrs,cannot create %s: destination already exists)rvrrunsupported parser state: %sr)rr5rrr{rrrrr|rr@rrrr PatchErrorr+rrrAbort)r}rDpatcherrxrbr4rurvrrejectserr current_filerr?r.rr first_hunkrrrinstrs `` r)rrs', / /F666666G CL"2IJIJ v G   $$V,,CQww g   $<--///# +1 (E5*b  &//:4!' !3!3BJ"UE:ufu !!rz*** 5I%%NN27+++' d5000!&rz!:!:2A2!>JD$|3@AABJN7#7Du # E4 Eu <<<BB<4!2!g &OOBGT4DDD &wr2wwOOO     /55=>>># 1    f__ 4 4vbj))$__T22 d< MM$d3333 4+a ?@@5HII I(<%%'''r JsH I1IIcd}g}|j} | r*|dtj| zd|d||tj|fz} |d| ztj| d} | D]?} | } || dz| dr,tj | } d}| | p| d d kr7d }|s|| dzd }|| dz| d d kr|| dz| d d kr4|s|| dzd }|| dzA |rtj|||n#|rtj|||wwxYw| }|r1t%t'dtj|z|S)ztuse to apply to the working directory. returns whether patch was applied with fuzz factor.Fs-d %ss%s %s -p%d < %srsUsing external patch tool: %s rbrspatching file s with fuzzrTssaving rejects to filesFAILEDspatch command failed: %s)r4r5r shellquoter/rpopenrrr#rparsepatchoutputrCrr+rrJr{r@r explainexit)r}r5r patchnamer4rQr6rjargscwdrrDr&pf printed_filecodes r)_externalpatchr  s D D )C 9 Hx23777888  $ I&&   C HH /# 5666 U # #B9 & &D;;==D GGD5L ! ! !011 &*400$  " <((A--#(GGBJ'''#'Lu %%%%455::u %%%%9%%**#(GGBJ'''#'Lu %%%' &*  9  eZ 8 8 8  9  eZ 8 8 8 8 9 88::D  # ) * *X-A$-G-G G    Ks EG11H c :|t}||dd}|tvr$t jt d|z|}t} t|d}n#t$r|}YnwxYw t|||||||} ||kr| | | | nZ#||kr| | | | wxYw| dkrtt d| dkS)Nrseols!unsupported line endings type: %srrrspatch failed to apply)r7configroeolmodesrrrrOr TypeErrorrr{updater@) r}rxpatchobjr4rurQrvrbrDr.s r) patchbackendrC s }))Hf--}}h&&k!@AAGKLLLmmooG KKE (E " "   GU%    >> HHJJJ W]]__%%%  >> HHJJJ W]]__%%%  Qww#A&>$?$?@@@ 7Ns B B+*B+/DAE2c Nt|||}t|||||||S)zwuse builtin patch to apply to the working directory. returns whether patch was applied with fuzz factor.)r2r) r}r5rr4rurQrvr6rxs r) internalpatchra s/Rz22G GXufeW M MMr+c Pt||||} t|| |||||SrV)r_r) r}r5rarbrr4rurQrvrxs r) patchreporq s1"dC//G GXufeW M MMr+c |dd}|t}|rt|||||||St||||||||S)aApply to the working directory. 'eolmode' specifies how end of lines should be handled. It can be: - 'strict': inputs are read in binary mode, EOLs are preserved - 'crlf': EOLs are ignored when patching and reset to CRLF - 'lf': EOLs are ignored when patching and reset to LF - None: get it from user settings, default to 'strict' 'eolmode' is ignored when using an external patcher program. Returns whether patch was applied with fuzz factor. suir)r r7r r) r}r5rr4rurQrvr6rs r)patchrx ss*iix((G }  gy%      D)UFE7J  r+c t||j}t||}t|d5}t }t |D]\}} |dkr| \} } } } | rPt | j|dz |d| _| jr$t | j|dz |d| _nt|| | | ||} | | j| j dkr| | j|dvr$tj td|z|cdddS#1swxYwYdS)Nrrrr)rrr)rr4rr r7rrrrrrCrrrr)r}r5 patchpathr4rurxrDr9rr?rrrrs r) changedfilesr sDI&&G $ ' 'F i  2%%&r]] N NME6/5,uj" +BGUQYGGJBGz%2J 6&&& 'z5&B BG$$$5I%%KK +++///k!$C"D"Du"LMMM0)sDEE EceZdZdS)GitDiffRequiredN)rgrhrirWr+r)rr sDr+rc #K|s|s|j}||} ||} t|| | |||||||  D]w\} }}}| | Jd| ||}dd|D}|r/|st |dkrd|dzV|r|VxdS)ayields diff of changes to files between two nodes, or node and working directory. if node1 is None, use first dirstate parent instead. if node2 is None, compare node1 with working directory. losedatafn(**kwarg) is a callable run when opts.upgrade=True and every time some change cannot be represented with the current patch format. Return False to upgrade to git patch format, True to accept the loss or raise an exception to abort the diff. It is called with the name of current file being diffed as 'fn'. If set to None, patches will always be upgraded to git format when necessary. prefix is a filename prefix that is prepended to all filenames on display (used for subrepos). relroot, if not empty, must be normalized with a trailing /. Any match patterns that fall outside it will be ignored. copy, if not empty, should contain mappings {dst@y: src@x} of copy information. if copysourcematch is not None, then copy sources will be filtered by this matcher hunksfilterfn, if not None, should be a function taking a filectx and hunks generator that may yield filtered hunks. ) ctx1ctx2rchangesopts losedatafnpathfnrcopysourcematchNs-fctx2 unexpectly None in diff hunks filteringr+c3FK|]\}}d|VdS)r+Nr/)rhrangehliness r)rzdiff.. s2EE^VV((EEEEEEr+rr)r=p1 diffhunksr/r%)r5node1node2rrr r!r"rr# hunksfilterfnrrfctx1fctx2rErrrs r)diffr/ s(T ##   "" ;D ;D$-    ' % % % uc5  $ !!?"!!!M%//ExxEEuEEEEE  *D *CHHqLL**S//E) ) ) )  JJJ1r+c  | tj}d} | |s|}t|tr|dd\n|j|j|jcsssgSjj rtntfd  fD'i|j s|jrtj| r fdjDt%} t%} t%} D]0}|vr*| || |1D]}|vr| |t+| t+| t+| t jD] \}}|vr|= t-jt | | z| z}|f|fg}t-j|f d}|jrj|j sc fd}t ||d |S#t6$r#||d dcYSwxYw||dS) zYield diff of changes to files in the form of (`header`, `hunks`) tuples where `header` is a list of diff headers and `hunks` is an iterable of (`hunkrange`, `hunklines`) tuples. See diff() for the meaning of parameters. Nc@itjfd}|S)Nc8|||}|vr@tdkr=||<n|||S)N)filelog)filectxrr%popleftr3r{r5)rMraricacheorders r) getfilectxz4diffhunks..lrugetfilectx..getfilectx! s;;q%))A,,;77D~~u::??emmoo.<<>>a Q LLOOOKr+) collectionsdeque)r9r7r8s @@r) lrugetfilectxz diffhunks..lrugetfilectx s=!##      r+)rrc*g|]}||SrWrW)rnodehexfuncs r)rzdiffhunks..B s& I I IdD IGGDMM I I Ir+c2i|]\}}|||SrWrW)rrrLr#s r) zdiffhunks..L s.NNNXS#9M9MNSNNNr+c8 t  || SrV)trydiff) r losedatarrrrr9modifiedr"r8r5revss r)difffnzdiffhunks..difffnn s9               r+c2r |stdS)N)rX)r)rXr!s r)rDzdiffhunks..losedata s/!*r):):):*))**r+F)gitT)r defaultoptsstatusrlistrErr8r} debugflagrrr>rIupgrader pathcopiesrr7r{rCrHr matchfilesrev prefetchfilesrr)r5rrrrr r!r"rr#r< modifiedsetaddedset removedsetrMrrL prefetchmatch revmatchesrGrDrr9r?rEr8rFs``` ```` @@@@@@r)r)r) s& | "J 1++d%+00'4   #*2A2; %   M O !% E'  w I I I Ityy{{DIIKK&@ I I ID | 8 >t| >$T4u===DOONNNNNNh--K5zzHWJ  D==   q ! ! ! LLOOO !! D==   a k""H 8  EZ  G&&S d??S & d;)J677M ]# ]#J $ +++               | "DH " 5 * * * * * tyyUy33X>>?? ? 5 5 56$)))--t44 4 4 4 5vdD!!!s31J%%*KKc#K|D]}|d}|}|drd}n/|drd}ntjd|zt|D]$}|dr|dfV||fV%||kr|t |d d fV||kr|t |d d fVd S) z1yield tokens for a list of lines in a single hunkrr diff.deletedr diff.insertedunexpected hunk line: %srdiff.tabNdiff.trailingwhitespacer+)rr#rProgrammingError tabsplitterfindallr%) hunklinesr& chompline striplinelabeltokens r)diffsinglehunkrf sF00KK(( $$&& ??4  M#EE __T " " M$EE()Dt)KLL L ((33 % %E&& %k*****en$$$$  ! !S^^--.0JK K K K   I(()3/ / / /)00r+c#Kt}t}|D]P}|dddkr||ddz }|dddkr||ddz }:tjd|z|r|st|D]}|VdStt |}tt |}d|D}d|D}d |} d |} g} g} tj | | || } | D]\\}}}}}|d k}tj d |||D]}| ||ftj d |||D]}| ||fdd | fdd | ffD]\}}}d}|D]\}}|r||fVd}| d}|rk|dd}| dr |dd}|t|d}|}|t|d}t|D]&}d|ddkrd}n |r|dz}n|dz}||fV'|r|r|dfV|d fVd}dS)zEyield tokens for a list of lines in a single hunk, with inline colorsrrrNr r[c(g|]}|dkr|n|dzSrrWrrs r)rz(diffsinglehunkinline.. ( 6 6 6aU 11E 6 6 6r+c(g|]}|dkr|n|dzSrirWrjs r)rz(diffsinglehunkinline.. rkr+r+)lines1lines2!rYrZTFrr rr\s.changeds .unchangedr]) bytearrayrr^rf wordsplitterr`bytesr/r allblocksr|r5rr%rr_)rarrr&r-alblalnblnanbnatokensbtokensblocksa1a2b1b2btyper9rerurdtokens nextisnewline isendoflinechomp endofline endspacesmaybetab currentlabels r)diffsinglehunkinliner s  A AMM !9   abbMAA !A#Y$   abbMAA()Dt)KLL L A **  AGGGG   eAhh ' 'B   eAhh ' 'B 6 62 6 6 6C 6 62 6 6 6C #B #BGG _RC < < >%(('!#2#JE!#e**,,/  !#e**,,/ '//66 / /HQqSM))#.LL=',{': ',}'< ..... %B$&@AAAA #&&&& $ 7 % % %r+c/<K|dr|djrtntgd}dg}d}gfd}||i|D]K}|d}t |} t |D]\} } |r| drd}n| r| dsd }d} |s| r| d rd } |} |r|} | r&| }| d z| kr|dz }||D]}|V| }| D]C\}}||r)||fV| |kr| t |d d fVnD| dfV| d z| krdV|D]}|VMd S)z@yields 2-tuples of (output, label) based on the output of func()r ) )rs diff.diffline)copy diff.extended)renamer)soldr)snewr)sdeletedr)sindexr)s similarityr)rs diff.file_a)rs diff.file_b)rs diff.hunkFc3FKrD]}|Vgdd<dSdSrVrW)re dodiffhunk hunkbuffers r)consumehunkbufferz$difflabel..consumehunkbuffer sN  #J//   JqqqMMM  r+rr)rr rrrT)r rrNr]r+rr+) rworddiffrrfr$r%rr#r5r)funcrkw headprefixes textprefixesheadrr1r0 linecountrr&difflineprefixes bufferedlinerercrurdrrs @@r) difflabelr s vvf~~$"V*-$) #    L L DJ t"r"",, E""JJ  ''' '' 'GAt ??4((! D 3!!  DH D T__\%B%B #H (' '# q59$$ E)L!!,/////.00  EKKKK KKMM %- & &MFE ++F33(%00009,, $S^^%5%5 6 :# +%%%q59$$&&&&&&((  EKKKK W,,r+c,ttg|Ri|S)zBlike diff(), but yields 2-tuples of (output, label) for ui.write())rr/)rrs r)diffuir> s T 'D ' ' 'B ' ''r+c#Kt}d|jD}t|t|}}t||z|zD]y} d} | | } } | |vr8d} | |vr1|jr*|| } | |vr| |vrd} || n1d} n.| |vr*d} |jr!| |vr|| |vr||| | krr| | | fVzdS)agenerates tuples (f1, f2, copyop), where f1 is the name of the file before and f2 is the the name after. For added files, f1 will be None, and for removed files, f2 will be None. copyop may be set to None, 'copy' or 'rename' (the latter two only if opts.git is set).ci|]\}}|| SrWrW)rkrs r)rAz_filepairs..J s , , ,tq!a , , ,r+Nrr)r7rrHrIrC) rErr8rr gonecopytorTrUrMcopyopf1f2s r) _filepairsrC s0 55D , ,ztz|| , , ,Fu::s7||jH Hu$w. / /AB ==BDyy8)aBZ''BdNN!* !( *__Bx KKq X--VAY1,,"fn/r+c|sd}t|}tjd|z}||t |S)Nr+sblob %d)r%rsha1rrdigest)rrr(rs r) _gitindexrh sQ  D A lQ&''AHHTNNN qxxzz??r+s120000s100755s100644)rerfr+c #K| jrdx} } nd} d} d}d}tj|}tj|}| sd} t ||||| D]\}}}d}d}d}d}d}d}|r*|||}| js| r||}|r*|||}| js| r||}| jrd}ntd ||fD}| rB| js;|s,||vs(|s ||s||r|r|s|s |r|r||kr | |p|| |p|}| |p|}g}| jr3| d | || |fz|s%| d t|zn|s$| d t|znt|t|} }|| kr0| d |z| d| z|w| j r.diffline.. s<<<X^<<.diffline s1))<.isempty st|/tyy{{a//r+c|SrVrW)rMs r)rztrydiff.. s1r+NFc3BK|]}||VdSrV)isbinaryr:s r)rztrydiff.. s*OO!OOr+sdiff --git %s%s %s%ssnew file mode %ssdeleted file mode %ss old mode %ss new mode %sdssimilarity index %d%%s %s from %ss%s to %ss)noprefixrdatestrdaterrIrhrrrr5_gitmodeshowsimilarityrscorenobinaryindexcmpr diffcontent)$r5rFrrrErr8rr9r r!r"aprefixbprefixrrdate1date2rrrcontent1content2r-r.flag1flag2rpath1path2rmode1mode2simdata1data2s$ r)rCrCt s, }'',,,000  TYY[[ ) )E  TYY[[ ) )E $XugtTJJd>d>B  'Jr4((Ex ': ' 2  'Jr4((Ex ': ' 2 9 PFFOOu~OOOOOF  %dh % %d $GENN   )+ " %~~ 28$$$rxR  rxR   8 1 MM'7E7E*JJ    A 1HUOCDDDD A 5GHHHH'uE>>MM.5"8999MM.5"8999%*F%mDKeEEK &>&DEEEMM-65/"ABBBMM+"?@@@  1 MM((5$// 0 0 0  ( (!X (*.- (@D  (    $UYYu-=-=$$HH&H  ::<<  ::<<ueUHe<ueUHe<%======Id>d>r+c V|\}}}}} } |\} } } }}}||vrt| n tj}| | vrt|n tj}|rF|jr?|js8t j| |}|r|d||fzd|gff}n|jrQ|jdkrF|}||}|d|d|j|d|jt|fzt j | | |||| ||\}}| ||| ||fS)aOdiffs two versions of a file. data1 and data2 are tuples containg: * ctx: changeset for the file * fctx: file context for that file * path1: name of the file * flag: flags of the file * content: full content of the file (can be null in case of binary) * date: date of the changeset header: the patch header binary: whether the any of the version of file is binary or not opts: user passed options It exists as a separate function so that extensions like extdiff can wrap it and use the file content directly. s index %s..%sNrsindex %s..%s %s)rr ) rrnullhexrIrrb85diffr5rrunidiffextend)rrrrr rr-rrrrrr.rrrrindex1index2rrrflaguheaderss r)rr s(27.D%x16.D%x$)TMMYx 7H7PF$)TMMYx 7H7PF  $( 4= }Xx00  > MM/VV,<< = = =! 8  QD| MM"1tz>*1tz>*TN    -          %  h % &&r+cd\}}}}}|D]J\}}}} t|tj|}t|||z}||z }||z }|p| }K|||||fS)N)rrrrF)rr colwidth) statsmaxfilemaxtotaladdtotal removetotalrrMrr,rs r) diffstatsumr= s7H4GXxf 1agx03344xQ''A q 1 Hh V ;;r+c^ tjd}g d\ fd}d}|D]q}|dr|d}d\|dr.t|d m|d r(||d |d rd}|d r|sd z |dr|sd z |ds|drd+|dr |ddL|drd|ddzz s| S)Ns^diff .*-r [a-z0-9]+\s(.*)$)NrrFcBrfdSdSrVrS)addsrrremovesresultssr) addresultzdiffstatdata..addresultO s9  @ NNHdGX> ? ? ? ? ? @ @r+FrT)rrFrr"sdiff -rrs@@r rrs Binary files rename fromrs rename tos => %sr)rrr#rrr) r0rrr'r&rrrrrs @@@@@r) diffstatdatarI s Z7 8 8FG(9%HdGX@@@@@@@@@H.. ??7 # # . IKKKH&1 #D'8/00 8 <<--33A66,, 8!==..44Q77 __U # # .HH __T " " .8 . AIDD __T " " .8 . qLGG __0 1 1 .T__ 6 6  .HH __^ , , .BCCyHH __\ * * .  DI- -H IKKK Nr+Pc :g}t|}t|\}}}}tt}|r|dkrd}||z |z dz dkrdfd} |D]f\} } } } | rd}nd| | zz}d| | z}d| | z}|d | d |t j| z z||||fzg|r5|td t|||fzd |S) Nrrrctkr|St|zztt|SrV)rrbool)r graphwidthrs r)scalezdiffstat..scale s: z ! !H1z>X-s477||<<rrrrr r r r r rrrrrrrrrutilsrrrrr.rrr_rrrrr@r$rcontextmanagerrrzrrrrrr2rOr_rYr`r rsrrrrJrrrrr%rrrrrrwrrrr rrrrr Exceptionr diffalloptsdiffoptsdifffeatureoptsr/r)rfrrrrrrrCrrrrrrWr+r)r s   = /00bj)** rzA   '3 BBBN 4nnnb-:-:-:-:-:-:-:-:`***Z((((((((* " " " " " " " "F.*.*.*.*.*.*.*.*b.$.$.$.$.$Y.$.$.$b#,#,#,#,#,#,#,#,L*+*+*+*+*+/*+*+*+\ "*C D DbjKLL / / /ddddddddNM M M M M M M M `kBkBkBkBkBkBkBkB\@@@Fooooda,a,a,a,a,a,a,a,H;;;;;;;;|===@MMMM`&9&9&9R:::z0%0%0%f6dKdKdKN888v,CL\\\\~...d?HF    N N N N"HQNNNN   B4     i     " *       HHHH^     C"C"C"C"L0002E%E%E%PMMM`((( """J99 = =M>M>M>`6'6'6'r < < <***Z----`r+