o ]Lbb@sddlmZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZmZmZmZmZmZmZmZmZmZddlmZejZdd lm Z e j!Z!e j"Z"e#d Z$Gd d d e j%Z&Gd dde j'Z(dS))absolute_importN)_)open)binhexsha1nodeconstants) bookmarkscontexterrorexchangehglock logcmdutilmerge mergestatephasespycompatutil)dateutil)commons\b[0-9a-f]{12,40}\bc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdS) mercurial_sinkc CsVtj|||||dd|_|dd|_|dd|_d|_t j |r`t t |dkr`zt|j||_|jsFttd|WnUtjy_}z |t|jdd}~wwz(|td|tj|j|dd |_|jsttd||j|Wntjy|ttd |wd|_d|_d |_i|_dS) Nconvertshg.usebranchnamesshg.clonebranchess hg.tagsbranchr&%s is not a local Mercurial repositorys'initializing destination %s repository Tcreates)could not create hg repository %s as sinkF) rconverter_sink__init__ configbool branchnames clonebranchesconfig tagsbranch lastbranchospathisdirlenlistdirr repositoryuirepolocalNoReporr RepoError tracebackargsstatuscreatedappendr wlock filemapmode subrevmaps)selfr*repotyper%errr:2/usr/lib/python3/dist-packages/hgext/convert/hg.pyr;sH      zmercurial_sink.__init__cCs(|jd|j|_|j|_dS)Ns"run hg sink pre-conversion action )r*debugr+r4r r7r:r:r;before^s  zmercurial_sink.beforecCs4|jd|jr|j|jr|jdSdS)Ns#run hg sink post-conversion action )r*r<r releaser4r=r:r:r;aftercs  zmercurial_sink.aftercC|jjdS)Nshamapr+vfsjoinr=r:r:r; revmapfilejzmercurial_sink.revmapfilecCrA)Ns authormaprCr=r:r:r; authorfilemrGzmercurial_sink.authorfilec sj|jsdS||jk}||_|sd}dd|D}tj|j|}|rH|z t|j||_ Wnt yCtj|j|dd|_ Ynw| i}|D]"}z |j |dWqLt yn| |dg|dYqLw|r|tt|D]0\}}tj|j|} t|ji| |jtd||ftj|j fd d|Dd q|| dSdS) NdefaultcSs(g|]}|d|dr|dpdfqS)rrrIr:).0br:r:r; xs(z,mercurial_sink.setbranch..Trrrspulling from %s into %s csg|]}|qSr:)lookuprJhprepor:r;rLs)heads)r r#r$r%rEr@r r)r*r+ Exceptionr>rM setdefaultr3sortedr iteritemspeernoterr pull) r7branch pbranches setbranch branchpathmissingsrKpbranchrR pbranchpathr:rPr;r\psH    zmercurial_sink.setbranchcCst}|D]U}|dd}t|dkr'|jtd||d|q|| |d}|sQ|dt j kr?|d}n|jtd||d|q|d||dfq| S) N rsinvalid tag entry: "%s" s%s rsmissing tag entry: "%s" %s %s ) stringio splitlinessplitr'r*warnrwriteget lookuprevrnullhexgetvalue)r7sourcerevmapdatafplinesrevidr:r:r; _rewritetagss     zmercurial_sink._rewritetagsc Cst}|D]|}|dd}t|dkrq|d}|d}|tjkrz|j|}|dur^t|j |j |d}||j|<t d} t|dkr^|j j |d} |j j | r^|j | |||} | sxt|dkrw|j t d||fn| }|d ||fq|S) Nrarrbrs .hg/shamaps/no ".hgsubstate" updates will be made for "%s" s.hgs!%s is missing from %s/.hg/shamap rc)rdrerfr'rrkr6rimapfiler*r+wjoinrwvfsreljoinexistsrgrhrl) r7rmrorprqrrrssubpathrnmsgsubnewidr:r:r;_rewritesubstates>         zmercurial_sink._rewritesubstatec cs||g}tj|j|||ddddd}|D]'\}\}}} ||r&q|tjvr7t t d|||f|tj kr=q|VqdS)aRCalculates the files from p2 that we need to pull in when merging p1 and p2, given that the merge is coming from the given source. This prevents us from losing files that only exist in the target p2 and that don't come from the source repo (like if you're merging multiple repositories together). TF) branchmergeforce acceptremote followcopiesseunable to convert merge commit since target parents do not merge cleanly (file %s, parents %s and %s)N) ancestormergemodcalculateupdatesr+filemaptargetfilebelongstosourcerCONVERT_MERGE_ACTIONSr Abortr ACTION_KEEP) r7rmp1ctxp2ctxancmresultfileactioninfor{r:r:r;_calculatemergedfiless6    z$mercurial_sink._calculatemergedfilesc # stfdd} g} |D] } | | vr| | q| }t|} jr>| dkr>jjt|dd} |d}t|dkrK|jjt|dkrX|jj| d}|j }t t |}|D]}|}|}|dur|||dt|}qh|j}jjdd}|r||d<d D])}||}|durq|d krt|}|}|dur|d krt|}|||<qjr|jr|j|d <|jr|jr|j|d <|r|}| d}j|}d|jjkrj|t}|r |j||j|r)t||D] }|||qtj||f||| |j |j!|}jj"d dt#j$|j%dj&dA}jjddr\|j'}nd}tjj(||d}|j|krj|}|%t#j)krt#*j|t#j)|gWdn 1swYd}|}|s݈jr| dkr܈jj+,d} jjt|d}!d|jv}"|"s| -| | .|!s܈j/t0djj1dd|S|S)Nc sr#|vr#|vr#jd|z|WStjy"YdSwz|}Wn ty3YdSw||\}}|durBdS|dkrM|}|dkrW|}t j |||d|vd|v |S)Nsreusing %s from p2 .hgtagss .hgsubstatelx) r*r<r ManifestLookupErrorKeyErrorgetfilertr~r memfilectxr+ri)r+memctxfvromodecopiesfilesrp2filesrnr7rmr:r; getfilectx s8    z,mercurial_sink.putcommit..getfilectxrrrbrs hg.sourcenamesconvert_source)ssourcetransplant_sources rebase_sourcesintermediate-sourcerbranchsconvert_revisionsphasess new-commitshg.preserve-hash)origctxs(octopus merge fixup) sclosesfiltering out empty revision T)r)2dictr3r'r5r+ changelogreadrnullidpopdescrefindallsha1rerjrireplaceextracopyr*r!rrrZrevsaverevsetupdateraddr rauthordate setconfigr phasenamesphase transactionctx commitctxdraft registernew manifestlog getstoragecmprevisionr1rrollback)#r7rrparentscommitrmrnfullcleanp2rplpnparentsm1nodeparentp2textsha1ssha1oldrevnewrevr sourcenamelabelnodep1rfilesetrrtrrmanmnodeclosedr:rr; putcommits                       : zmercurial_sink.putcommitc s|jj|jdd}|p|jj}t}t|jD]!\}}|D]}d|j|vr:|t|j|d dq qt t |}t fddD}||krSdSt}t} |D]} | dd} t| d krlq[|| dq[|D] } | dd} t| d krqv| d|vr| | d qv| sdSd |fd d } |jtd dttt} d|ji}t|j|dfddg| d| |}|j|}t|t|fS)NT) ignoremissingrcsg|] }d||fqS)rcr:)rJtag)tagsr:r;rLsz*mercurial_sink.puttags..NNrarrbrc st|||dddS)NF)r r)r+rr)ror:r;rz*mercurial_sink.puttags..getfilectxsupdating tags s%d 0rs update tagss convert-repo)r+ branchtipr"rrrrV branchmaprrorerUliststriprfr'rrEr*r1rinttimemktimegmtimer rrr)r7r tagparentoldlinesrZrRrOnewlinesoldtagsnewtagsrqrrrrrrrr:)rorr;puttagss`         zmercurial_sink.puttagscCs ||_dSN)r5)r7activer:r:r;setfilemapmode zmercurial_sink.setfilemapmodec stsdSd}}}z;|j}|j}|jd}|jtd|jj}fddD}| |j||| Wt |||dSt |||w)Nsbookmarksupdating bookmarks csg|] }|t|fqSr:)r)rJbookmarkupdatedbookmarkr:r;rLsz/mercurial_sink.putbookmarks..) r'r+r4r rr*r1r _bookmarks applychangescloselockmodr?)r7rr4r r destmarkschangesr:rr; putbookmarkss      "zmercurial_sink.putbookmarkscCs||jvp|jSr)r+r r7rr:r:r;hascommitfrommapzmercurial_sink.hascommitfrommapcCs,||jvr|jrttd|||jvS)Nserevision %s not found in destination repository (lookups with clonebranches=true are not implemented))r+r r rrrr:r:r;hascommitforsplicemaps z$mercurial_sink.hascommitforsplicemapN)__name__ __module__ __qualname__rr>r@rFrHr\rtr~rrrrrrrr:r:r:r;r:s"#)*."8 rc@seZdZd+ddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd,d)d*ZdS)-mercurial_sourceNc stj|||||dd_t_|dd_zt j |_ j s-t jWnt jyB|ttd|wd_d_d_d_|dd}|dd}|dur|durzj |}Wnt jy|t td|wj j|}|d i}j j|gD] } d |j j| <q|j_ntj _|rfd d |D_!dSj "_!dS|s|durt td t} t} t#$j |gD]} j | } | %| | &d d| 'Dq| j_| | _!dS)Nrshg.ignoreerrorss hg.saverevrrs hg.startrevshg.revss %s is not a valid start revisionrcsg|]}j|qSr:)r+rM)rJrr=r:r;rL+sz-mercurial_source.__init__..s4hg.revs cannot be combined with hg.startrev or --revcss|]}|VqdSr)rrJrr:r:r; ;z,mercurial_source.__init__..)(rconverter_sourcerr ignoreerrorsrignoredrr r)r*r+r,r r.r/r-rlastrevlastctx _changescache convertfpr!rMrrr descendantsr __contains__keepralways_headsrRrrevrangerrr) r7r*r8r%revs startnodehgrevsstartrevchildrenr nodesrrr:r=r;rsf       zmercurial_source.__init__cCs"|j|kr|j||_||_|jSr)rr+rrr:r:r; _changectx?s  zmercurial_source._changectxcsfdd|DS)Ncs"g|] }|r|r|qSr:)rrr r=r:r;rLFs"z-mercurial_source._parents..)r)r7rr:r=r;_parentsErzmercurial_source._parentscsfddjDS)Ncsg|] }|rt|qSr:rrrNr=r:r;rLIz-mercurial_source.getheads..)rr=r:r=r;getheadsHszmercurial_source.getheadscCs8z|||}||fWStjyYdSw)Nr)r roflagsr LookupError)r7namerfctxr:r:r;rKs zmercurial_source.getfilec Csjgg}}|j}|j}||}t|D]\}\\} } \} } | dur,||q||q||fSr)r3manifestdiffrrV) r7ctx1ctx2mar maappendrappenddrnode1flag1node2flag2r:r:r; _changedfilesRs   zmercurial_source._changedfilescs}|}|s|s|}}|r7jdkr%jd\}}n |d|\}}|s5||}|}|||} t} t|dkrg|dj|dd} t | D] \} } | durf| | qYfdd|D}| || | fS)NrrrbT)cleancsg|] }|jvr|fqSr:rrJrrr7r:r;rLtr#z/mercurial_source.getchanges..) r r!r)rr5 _getcopiesrr'r*rrVrsort)r7rrrrr copyfilesr-r rrr0rvaluerr:r9r; getchanges^s,      zmercurial_source.getchangesc si}|D]X}||jvr qz!|||jvrWqtfdd|Ds(Wq||<Wqty6Yqtjy\}z|jsB|j||j t d|WYd}~qd}~ww|S)Nc3s|]}|vVqdSrr:r  copysourcer:r;r r z.mercurial_source._getcopies..s ignoring: %s ) rfilectxr@any TypeErrorr r&rrr*rgr)r7rrrrr'er:r?r;r:xs*      zmercurial_source._getcopiescs||}||ddD}fdd|D}|}tj|t|d| |||| | | |j ||d S)NcSsg|]}|qSr:rr r:r:r;rLsz.mercurial_source.getcommit..cs g|] }|r|vr|qSr:rEr r!r:r;rLs s%Y-%m-%d %H:%M:%S %1%2) rrrrr optparentsrZrsortkeyrrr)r r!rrruserrdatestrr descriptionrZrrrr)r7rrrrGcrevr:rFr; getcommits&  zmercurial_source.getcommitcCs t|jSr)r'r+r=r:r:r; numcommitsrzmercurial_source.numcommitscs*fddjD}fdd|DS)Ncs$g|]}j|ddkr|qS)rsglobal)r+tagtype)rJtr=r:r;rLs z,mercurial_source.gettags..cs$i|]\}}|r|t|qSr:r")rJr'rr=r:r; s$z,mercurial_source.gettags..)r+tagslist)r7rr:r=r;gettagss zmercurial_source.gettagscs|}|}|s|durd}|g}}n|pd}|||\}}fdd||fD\}}|dkrB|||ff_||S)Nrcsg|] }fdd|DqS)csg|] }|jvr|qSr:r7r8r=r:r;rLsz?mercurial_source.getchangedfiles...r:)rJlr=r:r;rLr#z4mercurial_source.getchangedfiles..)r r!r)keysr5r)r7rirrr-r r:r=r;getchangedfiless   z mercurial_source.getchangedfilescCsH|jdurt|jjdd|_|jtd||f|jdS)NrBsabrc) rrr+rDrErhr tonativeeolflush)r7rdestrevr:r:r; converteds zmercurial_source.convertedcC|jddS)Ns$run hg source pre-conversion action r*r<r=r:r:r;r>zmercurial_source.beforecCr\)Ns%run hg source post-conversion action r]r=r:r:r;r@r^zmercurial_source.aftercCdSNTr:r=r:r:r;hasnativeorderzmercurial_source.hasnativeordercCr_r`r:r=r:r:r;hasnativecloserbzmercurial_source.hasnativeclosec Cs0z t|j|WStjtjfyYdSwr)rr+rMr r.r&rr:r:r;rjs zmercurial_source.lookuprevcCs t|jSr)r listbookmarksr+r=r:r:r; getbookmarkss zmercurial_source.getbookmarks splicemapcCs|||dS)z+Mercurial, revision string is a 40 byte hexN)checkhexformat)r7revstrmapnamer:r:r;checkrevformatrzmercurial_source.checkrevformatr)rf)rrrrr r!r$rr5r>r:rMrNrSrWr[r>r@rarcrjrerjr:r:r:r;rs* 9  r)) __future__rr$rrmercurial.i18nrmercurial.pycompatrmercurial.noderrr mercurialrr r r r r rrrrrrrrmercurial.utilsrrdrrur-compilerrrr rr:r:r:r;s&   8   N