o ]LbЍ@sddlmZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z mZddlmZmZmZejZGdddeZGd d d eZd d ZdddZGdddeZdddZddZdS))absolute_importN)_)open)encodingerrorhookpycompatutil)dateutilprocutil stringutilc@ eZdZdZddZddZdS)logentryaClass logentry has the following attributes: .author - author name as CVS knows it .branch - name of branch this revision is on .branches - revision tuple of branches starting at this revision .comment - commit message .commitid - CVS commitid or None .date - the commit date as a (time, tz) tuple .dead - true if file revision is dead .file - Name of file .lines - a tuple (+lines, -lines) or None .parent - Previous revision of this entry .rcs - name of file as returned from CVS .revision - revision number as tuple .tags - list of tags on the file .synthetic - is this a synthetic "file ... added on ..." revision? .mergepoint - the branch that has been merged from (if present in rlog output) or None .branchpoints - the branches that start at the current entry or empty cKsd|_|j|dSNF) synthetic__dict__updateselfentriesr5/usr/lib/python3/dist-packages/hgext/convert/cvsps.py__init__4szlogentry.__init__c0fddtjD}dtjd|fS)Nc3"|] }d|j|fVqdS)z%s=%rNr.0krrr 9s z$logentry.__repr__..z%s(%s)z, sortedrtype__name__joinritemsrrr__repr__8szlogentry.__repr__Nr$ __module__ __qualname____doc__rr(rrrrrs rc@s eZdZdS)logerrorN)r$r*r+rrrrr-=sr-cCsH|d}|dd}d}|dkr|}|d|dd|d}|S)a^Return the repository path from a CVS path. >>> getrepopath(b'/foo/bar') '/foo/bar' >>> getrepopath(b'c:/foo/bar') '/foo/bar' >>> getrepopath(b':pserver:10/foo/bar') '/foo/bar' >>> getrepopath(b':pserver:10c:/foo/bar') '/foo/bar' >>> getrepopath(b':pserver:/foo/bar') '/foo/bar' >>> getrepopath(b':pserver:c:/foo/bar') '/foo/bar' >>> getrepopath(b':pserver:truc@foo.bar:/foo/bar') '/foo/bar' >>> getrepopath(b':pserver:truc@foo.bar:c:/foo/bar') '/foo/bar' >>> getrepopath(b'user@server/path/to/repository') '/path/to/repository' :@r/N)splitfind)cvspathparts atpositionstartrepopathrrr getrepopathAs r9Tc6 s ifdd|tdg}td}td}td}td} td} td } td } td } td }td }td}td}td}d}|durz*ttjddd}| }Wdn1stwY|}|dkrd}Wn t yt tdw|r| t js|t j7}zttjddd }Wn t yYnw|stjdd}g}d}|rtjd}tj|st||d|dg}dd|D}tj|ddd|D}|d krjzD|td!|tt|d}|D]#}t|d"r&t|d#r&t|d$s1|td%g}nq|td&t|Wnty[}z|td'|WYd}~nd}~ww|rj|d(j}t|d)}d*d+g}|r| d,|t!t"|}| d-s|d-7}|r|t!|}n|}| d.d/g||r| d0|| |i}ii}d1}d2}d3d|D}|td4d5||#d6|||ft$%d5|d} t&| '}! |!}"|"dkrnt&| '}!|" d8r|"dd(}"|d1kr|(|"}#|#rW|#)d9}$i}|rSt!|$dd:}%|%*|r0|%t|d}%|%*d-r<|%d9d}%|%*d;rI|%d}qd9}q|(|"}#|#rft |#)d9|(|"}#|#rut |#)d>| (|"rt |"nP|d9kr| (|"}#|#sJtd?t!|#)d9}%d>}n1|d>kr| (|"rid@}n |d@kr%| (|"}#|#rdAd|#)d>dD}&t|&}'|'d@kr|'d>d1kr|&d:d1kr|&dd:|&d(d}&t,|&}&|&|vrg||&<||& |#)d9|#)d>|#)d9<n| (|"rdB}n|(|"r#d1}n|dCkrB| (|"r4dB}n|(|"r@JtdDn|dBkrw|(|"}#|#sUJtdEt-|$|%t,dFd|#)d9dDgdddt.dG}d<}nZ|dd-krdI|(}(t|(d@kr|(dJ}(t/|(gdK|_|#)d>|_0|#)d@1dLk|_2|#)dBr|#)d<rt3|#)dBt3|#)d<f|_4nt3|#)dBd1f|_4n|#)d<rd1t3|#)d<f|_4nd|_4|#)dMr |#)dN|_5|#)dOrN|#)dPdtd>kr"dQ|_6n,ddd:dRd:gfdSdD})t|)d9ksIJdT|j6|)d1|_6g|_7dM}n}|dMkr|(|"}*|*rrdUd|*)d9dVD|_8dN}n_| (|"r|(|!rdB}d7}nN|(|"rd1}d7}nC|j7 |"n<|dNkr| (|"r|!}+|+ d8r|+dd(}+|(|+rdB}d7}n|j7 |"n|(|"rd1}d7}n|j7 |"|r|j2r|j9d(d9krt|j7d9kr|(|j7d1r|#dW|j:|j7d1fd7|_;|rd2}t<fdXd||j9gD|_=d8|j7|_7t|j9}'|'d@krA|'d>d1krA||j9dd(dgd1|_>nd|_>t.},t ?D]K\}-}.t,dYd|.dD}/t|/d>kreqL|/d:d1kr|/d(d>d1kr|/dd:|j9kr|,@|-qL|/dZkr|/|j8vr|,@|-qL|,|_A| ||j:||j:+d=d-<t|d[d1kr|tBCd\t||jDfd]d8q|jEd^d_d`i}0t<|dad_d`D]#}|j:+d=d-}$|$|vr||$|_:|j9dd(}-|j9|0|j:|-f<q|D]*}|j9dd(}-|0|j:|-fd}|dur|j9dd:}||_F|j9|0|j:|-f<q|re|rc|jEdbd_d`|rL|d(j|d1jkrLt tdc||}|tdd|tG|t|den|}|tdft||Hdgdh}1|1rdidj}2|D]b}3|3j7}4|1D]F}z!|4It J|Kdk|3_7|jLr|#dl||2|3j9|3jDfWn6tMyYqtNy}5z tOjPt Q|5tdmdnd}5~5wwtOjPtdo|2|3j9|3jDftdmdnqtRjR|ddpd7|dq|S)rzCollect the CVS rlogcs ||S)z#return a shared version of a string) setdefault)s)_scacherrscacheps zcreatelog..scachescollecting CVS rlog sRCS file: (.+)$scvs \[r?log aborted\]: (.+)$scvs (r?log|server): (.+) $s>(Cannot access.+CVSROOT)|(can't create temporary directory.+)$sWorking file: (.+)$ssymbolic names:s (.+): ([\d.]+)$s----------------------------$sN=============================================================================$s(revision ([\d.]+)(\s+locked by:\s+.+;)?$sdate:\s+(.+);\s+author:\s+(.+);\s+state:\s+(.+?);(\s+lines:\s+(\+\d+)?\s+(-\d+)?;)?(\s+commitid:\s+([^;]+);)?(.*mergepoint:\s+([^;]+);)?sbranches: (.+);$s+file [^/]+ was (initially )?added on branchr:NsCVSs Repositorysrb.snot a CVS sandboxsRootsCVSROOTs ~/.hg.cvspsr.scachecSs"g|] }|rdtd|qS)-s\w+)r%refindallrr<rrr s"zcreatelog..cSsg|]}|r|qSrrrCrrrrDupdatesreading cvs log cache %s s branchpointsscommitids mergepointsignoring old cache scache has %d log entries serror reading cache: %r r/%Y/%m/%d %H:%M:%S %1%2scvss-qs-d%sr1slogsrlogs-d>%srFcSsg|]}t|qSr)r shellquote)rargrrrrDs running %s  sprefix=%r directory=%r root=%r T sAttic/s/Attic/s)RCS file must be followed by working filecSg|]}t|qSrintrxrrrrD1rEs!must have at least some revisionssexpected revision numbercSrRrrSrUrrrrDUrE)rcsfilerevisionbranchesparentcommitid mergepoint branchpointss&revision must be followed by date lines19s UTC)s%y/%m/%d %H:%M:%Ss%Y/%m/%d %H:%M:%Ss%Y-%m-%d %H:%M:%Ssdead HEAD0csg|] }|kr|qSrr)rb) branchmapmyrevrrrDssunknown branch: %scSs(g|]}tdd|dDqS)cSrRrrS)ryrrrrDrEz(createlog...r?)tuplestripr2rUrrrrDs;s#found synthetic revision in %s: %r csg|]}|qSrrrU)r>rrrDrEcSrRrrS)rirrrrDrE)rMrMrMd%d %sPcS |j|jfSNrYr[rVrrr zcreatelog..keycSrrrsrtrurrrrvrwcSs|jSrs)daterurrrrvss>log cache overlaps with new log entries, re-run without cache.swriting cvs log cache %s swbs%d log entries sconvertscvsps.logencodingcSsdttj|S)Nr?)r%rmaplistbytestr)rrrrrevstrszcreatelog..revstrzutf-8stranscoding by %s: %s of %s s-check convert.cvsps.logencoding configuration)hints6no encoding can transcode CVS log message for %s of %sscvslog)log)SstatusrrAcompilerospathr%readrlIOErrorr-endswithrosseprenvironget expanduserexistsmkdirr2notepickleloadr safehasattrlen Exceptionrzr datestrappendnormpathr9debugr popen fromnativeeolreadlinematchgroup startswithreplacerkrset parsedateauthorlowerdeadrTlinesr^r_commentr\r[rYrr"tagsbranch iteritemsaddr`r ellipsisrZsortr]dump configlistdecodesysstrencode debugflagUnicodeDecodeError LookupErrorrAbortr|r)6ui directoryrootrlogcacherre_00re_01re_02re_03re_10re_20re_30re_31re_32re_50re_60re_70 file_added_reprefixfoldlogrzcachedir cachefileecmdprrcsmapstatestorepfppeeklinerrYfilenamerevrevndr\mcpeekr`rr[revpartsversions encodingsr~entryrinstr)r=rhrir>r createlogis                                                 &                             "        u    rc@r ) changesetaClass changeset has the following attributes: .id - integer identifying this changeset (list index) .author - author name as CVS knows it .branch - name of branch this changeset is on, or None .comment - commit message .commitid - CVS commitid or None .date - the commit date as a (time,tz) tuple .entries - list of logentry objects in this changeset .parents - list of one or two parent changesets .tags - list of tags on this changeset .synthetic - from synthetic revision "file ... added on branch ..." .mergepoint- the branch that has been merged from or None .branchpoints- the branches that start at the current entry or empty cKsd|_d|_|j|dSr)idrrrrrrrrVszchangeset.__init__cr)Nc3r)s%s=%rNrrrrrr \s z%changeset.__repr__..s%s(%s), r!r&rrrr([s zchangeset.__repr__Nr)rrrrrFs r<c sv|tdi|D]}|jr(|jvr|j|j<q t|j|j|j<q |jfdddg}t}dt|D]\}}r|jjkr|jdurU|jjks|jdus_jdur|j j kr|j j kr|j j krjdjd|jd|jdkrjdjd|krnn|j |vst |j |j |j |jg|j|j|jd|t}t|d dkrd t|t|j dd f} |t| d d j|||j |j_q>|D]tjdkojdj_qdd} |D] jjt| dqtfdd} |jt| di|D]jD]}|jD]} | <q1q,q'|D] t} jD] }| |jqGtfdd| D_q?|durgd}|rot|}|durvd}|r~t|}i}i}t|}d}||kr||jD] }|||j|jf<qd}j |vr|j }nt !|D]}j ||jvr|durnq|}qg_"|dur||}|jrt|j"dksJtd|j"r|j"d}nd}n|js|durj"|jrjdkrd_j"||j|rl|#j }|rl|$d}|dkr5d}z|||}Wnt%yV|&tdt '|j fYnw||vrlj |krl|jslj"||r|#j }|r|(r|$d}|dkrd}nd}||vrňj |krt j |jdj gg|||gd}|)|d||d||<|d7}|d7}q||j <|d7}||ksd}|t|kr||jr||=n|d7}|t|kst|D] \}|d_*qr$D]\}}|j*dur"|j*dur"|&td|j*|j*fq|tdt|t+j+|ddd|d |S)!zConvert log into changesets.screating changesets cs0|jd|jp d|j|j|jpd|j|jfS)N)r/rr:)rr^rrrrzr`ru)mindaterrrvrs z!createchangeset..rxNrrM)rrrrzrr_r`r^rorpr/rqrLcSs|jd}|jd}t|}t|}t||}t|D]2}|d|kr,||kr,dS|d|kr9||kr9dS||||krDdS||||krOdSqdS)zMimic cvsps sorting orderr1rMr/r)rZr2rminrange)lr}nlnrnrnrrr entitycompares    z&createchangeset..entitycomparecs(t|jt|j}|r|Si}|jD]}|j||j<qi}|jD]}|j||j<q!d}|jD]}||jd|jkrC|r?Jd}nq/|jD]}||jd|jkr`|r\||fd}nqGdd}|sr|t|jt|j}|s|dd|jDdd|jD}|s|t|j t|j }|S)NrrMr/cSs||k||kSrsr)rVrjrrrrvsz0createchangeset..cscmp..cSsg|]}|jqSr)rZ)rrrrrrD sz2createchangeset..cscmp..) sumrzrr[rYrr]rrr`)rr}rlerrAc)oddrrcscmps>    "zcreatechangeset..cscmpc3s |] }|ur|VqdSrsr)rtag)r globaltagsrrr "sz"createchangeset..s{{mergetobranch ([-\w]+)}}s{{mergefrombranch ([-\w]+)}}s0synthetic changeset cannot have multiple parentsresBwarning: CVS commit message references non-existent branch %r: %s s&convert-repo: CVS merge from branch %s)rrrzrrrparentsrPs)changeset %d is both before and after %d s%d changeset entries s cvschangesetsT) changesets),rrr^rzrrr enumerater`rrrrZrr_rrreprr rrrr functools cmp_to_keyrrr"rArrYr[rxrangersearchrKeyErrorwarnr|groupsinsertrr)rrfuzz mergefrommergetorrfilesrntrrrrrr\rrr candidaterccrr}r)rrrrrcreatechangesetbsd              0                            b   rc Ost|}|dr d}n |drd}nd}|d}z!|r0g}|D]}|t|||d|d7}q n t||d|d}WntyT}z|d |WYd}~dSd}~wwt|||d }~t|} i} i} |D]} |d r| j| vr| jr| jd j r|| jd j d j| jd j f| | j<| j | | j<|dr| jpd|dvrqh| s|d|d| j |dt | j d|d| j |d| jpd|dddgt| jd kd| jpdf| jr|ddt| j|dr(| jr(t| jd kr|dddd | jDn |d!| jd j |d rZ| j} g}| rM| | \} }|d"| pBd|| | f| s5|rZ|d#d||d$|d%| j|d&| jD]=}|j}||d'r|t|d'd}|d(|d)d*d |jDpd+d)d,d |jDdd-g|jfqo|d.|r| r|d d/| j ks|d | jvrd0} t|d kr| s|d d/| j ks|d | jvrdSqhdS)1zRead CVS rlog for current directory or named path in repository, and convert the log to changesets based on matching commit log entries and dates. s new_cacheswrites update_cacherFNs revisionssroot)rrs%r sfuzzs ancestorsrrMsbranchesres--------------------- s PatchSet %d s Date: %s rGs Author: %s s Branch: %s s Tag%s: %s r:s,s(none)sBranchpoints: %s rsparentss Parents: %s cSsg|]}d|jqS%d)r)rrrrrrDrJzdebugcvsps..s Parent: %d s%s:%d:%dsAncestors: %s sLog: s%s s Members: sprefixs %s:%s->%s%s r?cSg|]}d|qSr rrUrrrrDrEsINITIALcSr r rrUrrrrD rEs(DEAD)rLr F)r byteskwargsrr-writerrrrrr rrzrrr%r` writenoi18nr"rrrrZrr]r[r)rargsoptsr revisionsrrrroffr\ ancestorscsrgr}rrfnrrr debugcvspss              $$r)Nr:TN)rNN) __future__rrrrAmercurial.i18nrmercurial.pycompatr mercurialrrrrr mercurial.utilsr r r robjectrrr-r9rrrrrrrrs*    (`  S