ó çƒQc@s€dZddlmZddlZddlZddlmZddlmZm Z m Z m Z ddlm Z m Z mZmZmZmZddlmZmZdejfd „ƒYZiZejeƒZd Zd efd „ƒYZd efd„ƒYZdefd„ƒYZd„Zd„Zeddddedƒedƒfddgedƒedƒfddeedƒfd d!ged"ƒedƒfd#d$ged%ƒedƒfdd&ded'ƒedƒfd(d)e ed*ƒfdd+eed,ƒfd-d.eed/ƒfdd0ded1ƒed2ƒfg ed3ƒƒd4„ƒZ!d5„Z"d6„Z#d7„Z$e"e#gZ%dS(8sVcommand to transplant changesets from another branch This extension allows you to transplant changes to another parent revision, possibly in another repository. The transplant is done using 'diff' patches. Transplanted patches are recorded in .hg/transplant/transplants, as a map from a changeset hash to its hash in the source repository. iÿÿÿÿ(t_N(tshort(t bundlerepothgtmergetmatch(tpatchtrevlogtscmutiltutilterrortcmdutil(trevsett templatekwtTransplantErrorcBseZRS((t__name__t __module__(((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRstinternalttransplantentrycBseZd„ZRS(cCs||_||_dS(N(tlnodetrnode(tselfRR((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyt__init__ s (RRR(((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRst transplantscBsGeZdddd„Zd„Zd„Zd„Zd„Zd„ZRS(cCsY||_||_||_|s9tj|jƒ|_ni|_t|_|jƒdS(N(tpathttransplantfiletopenerRRtFalsetdirtytread(RRRR((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR%s     cCs¯tjj|j|jƒ}|jr«tjj|ƒr«xr|jj|jƒjƒD]R}tt j |j dƒƒ\}}|j j |gƒ}|jt||ƒƒqRWndS(Nt:(tosRtjoinRtexistsRRt splitlinestmapRtbintsplitRt setdefaulttappendR(RtabspathtlineRRtlist((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR0s "!cCsÑ|jrÄ|jrÄtjj|jƒs:tj|jƒn|j|jdƒ}xe|jjƒD]T}xK|D]C}t t j |j |j fƒ\}}|j|d|dƒqlWq_W|jƒnt|_dS(NtwRs (RRRRtisdirtmkdirRRt itervaluesR#RthexRRtwritetcloseR(RtfpR*tttltr((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR08s $! cCs|jj|ƒpgS(N(Rtget(RR((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR6DscCs8|jj|gƒ}|jt||ƒƒt|_dS(N(RR&R'RtTrueR(RRRR*((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytsetGscCs;|jj|jƒ}|r7||j|ƒ=t|_ndS(N(RR6RtindexR7R(Rt transplantR*((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytremoveLsN( RRtNoneRRR0R6R8R;(((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR$s    t transplantercBs•eZd„Zd„Zid„Zd„Zeedd„Zd„Z d„Z d„Z d„Z d „Z ed „Zd „Zd „Zd „ZRS(cCs[||_|jdƒ|_tj|jƒ|_t|jdd|jƒ|_d|_dS(NR:RR(tuiR RRRRR<teditor(RR>trepo((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRSs  c Csút||ƒr$|jj|ƒ}nt||ƒrv|jj|ƒ}|jj|g|dtƒ}||krvtSnx}|jj|ƒD]i}t||jƒsµ|jj|ƒt S|jj|jƒ}||jj|g|dtƒkr‰tSq‰Wt S(smreturns True if a node is already an ancestor of parent or is parent or has already been transplantedt inclusive( thasnodet changelogtrevt ancestorsR7RR6RR;R( RR@tnodetparentt parentrevRDt reachableR3tlnoderev((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytapplied[s"   cCs¹t|ƒ}|jjƒ\}}g} tj|j|ƒ} t| _d} } } z|j ƒ} |j ƒ} |j dƒ} x£|D]›}||}d|t |ƒf}|j |||ƒrß|jjtdƒ|ƒq„n|jj|ƒ}|jdƒp |jdƒs¤|d|kr8| j|ƒ|}q„n| r¤||krf|j|jƒd| ƒntj|| dttdƒ|jjƒ\}}g} q¤nt}||krçt}t||ƒsç|j|d|gƒqçnt}|d tjkrŽ|jd ƒs>|jjtd ƒ|t |ƒfƒt}q˜|j|d ƒ}||kr˜tjtd ƒt |ƒt |ƒfƒ‚q˜n |d}|r§d}nmtj d dƒ\}}t!j"|dƒ}tj#|||d| ƒ}x|D]}|j$|ƒqóW|j%ƒ||=|s'|r„zÛyL|j&|||jj'|ƒ|d|d|jdƒd|jdƒƒ}Wnt(k r–| j%ƒ‚nX|rÌ|rÌ|jj)tdƒ|t |ƒfƒn5|r|jj)tdƒt |ƒt |ƒfƒnWd|rt!j*|ƒnXq„q„W| j%ƒ| rl|j|jƒd| ƒtj|| dttdƒnWd|j+||ƒ|j,j$ƒ| r | j-ƒn| j-ƒ| j-ƒXdS(s:apply the revisions in revmap one by one in revision orderR:s%s:%ss%skipping already applied revision %s tfiltertlogitheadsiÿÿÿÿiRGsskipping merge changeset %s:%s s%s is not a parent of %stprefixshg-transplant-R+toptsRs%s merged at %s s%s transplanted to %s N(.tsortedtdirstatetparentsRtdiffoptsR>R7tgitR<twlocktlockt transactionRRKtwarnRRCR6R'tpulltpeerRtupdateRRBRtnullidtnotetlookupR tAbortttempfiletmkstempRtfdopentdiffR0R1tapplyoneRRtstatustunlinkt saveseriesRtrelease(RR@tsourcetrevmaptmergesRPtrevstp1tp2tpullsRTRWRVttrRDRFtrevstrRStdomerget skipmergeRGt patchfiletfdR2tgentchunktn((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytapplyqs¨            "            $   c Csc|jjtdƒ|ƒ|d|d|d}}}tjddƒ\}} tj|dƒ} | jdƒ| jd |ƒ| jd |ƒ| j|d ƒ| jƒz—t j d |t j | ƒt j |ƒfd i|dd6t j |ƒd6dt jdtdƒd|jjƒ|jt| ƒƒdd!\}}}Wdtj| ƒX|||fS(s0arbitrarily rewrite changeset before applying its filtering %s iiiROshg-transplant-R+s# HG changeset patch s # User %s s # Date %d %d s s%s %s %stenvirontHGUSERt HGREVISIONtonerrt errprefixs filter failedtoutN(R>RfRRaRbRRcR0R1R tsystemt shellquoteRR/R`tfouttparselogtfileRg( RRLRFRCRutusertdatetmsgRvt headerfileR2((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRLÛs&    )c Cs²|d \}} \} } } } d| | f}i|d6}|rf|j||||ƒ\} }} n|r†| dtj|ƒ7} n|jjtdƒt|ƒƒ|jjd| || fƒ| ré| rétj tdƒƒ‚n|rÝy;t ƒ} t j |j||d| d dƒt | ƒ} Wqãtk rÙ}tjj|jd ƒ}tjj|ƒrvtj|ƒn|jjƒ}|}|j| || ||d |ƒ|jjt|ƒd ƒttd ƒƒ‚qãXnd} |r&|jjƒ\}}|j||ƒtj|jdƒ}ntj|jd| ƒ}|j | | |d|d|d|j!ƒ}|s’|jj"tdƒt|ƒƒdS|s®|j#j ||ƒn|S(s>apply the patch in patchfile to the repository as a transplantis%d %dttransplant_sources (transplanted from %s)s applying %s s %s %s %s s"can only omit patchfile if mergingtfilesteolmodetseriesRs s1fix up the merge and run hg transplant --continuettextraRR?sskipping emptied changeset %s N($RLRR/R>RfRRR^R R`R8RR<R*t ExceptionRRR R!RgRRRnRMR0tstrRRSt setparentsRtalwaystroottexacttcommitR?RYR(RR@RFtclRuRRMRLtmanifestR†ttimettimezoneR‹tmessageR‡Rtinstt seriespathRnRotmRy((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyReösN $  "  c Cstjjtjj|jdƒƒrn|j|||ƒ\}}|jjtdƒt|ƒt|ƒfƒntjj|jdƒ}tjj|ƒs©|j j ƒdS|j ƒ\}}i} x$|D]}|| |j j |ƒRfRRRR0t readseriesRCRDRgRz( RR@RjRPRyRFRtnodesRlRk((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytresume*s$   c Csá|jƒ\}}}}}t} | sA| sA| sA|d rYtjtdƒƒ‚n|d} t|ƒdkrÝ|jdƒrÔ|j|dƒ} | |krÚtjtdƒt| ƒt|ƒfƒ‚qÚqÝt } ni|d6} |j ƒ} zÙ|j j ƒ\} }| | kr?tjtdƒt j| ƒƒ‚n| r\|j| |dƒn|j|||d| d |jƒ}|sžtjtd ƒƒ‚n| sº|jj||ƒn|jƒ||fSWd | jƒXd S( s/commit working directory using journal metadataistransplant log file is corruptiRGs%s is not a parent of %sRŠs'working dir not at transplant parent %sRR?s commit failedN(treadlogRR R`RtlenR6R_RR7RVRRRSRR/R’R–R?RR8tunlogRi(RR@RjRPRFR†R‡R›RSRRGRRVRnRoRy((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR <s>   "       cCspg}g}|}xQ|jjdƒjƒD]7}|jdƒrL|}q+n|jtj|ƒƒq+W||fS(NRs# Merges(RRR"t startswithR'RR$(RR¢RltcurR)((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR¡dscCsÈ|s dStjj|jƒs2tj|jƒn|jddƒ}x2t|ƒD]$}|jtj||ƒdƒqQW|rº|jdƒx+|D] }|jtj|ƒdƒq“Wn|j ƒdS(NRR+s s # Merges ( RRR,R-RRQR0RR/R1(RRkRlRRDRž((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRhps"  !c CsNg}g}tj}t}d}d}xÞ|jƒjƒD]Ê}|rV|j|ƒq:|jdƒrr|d}q:|jdƒrŽ|d}q:|jdƒr³tj|dƒ}q:|jdƒrß|jtj|dƒƒq:|jdƒs:t }|j|ƒq:q:Wd||fkr2t j t d ƒƒ‚n|||d j |ƒ|fS( Ns# User is# Date s # Node ID i s # Parent i s# s,filter corrupted changeset (no user or date)s (RR]RR<RR"R'R§R$R7R R`RR ( RR2RSR›RFtinmsgR†R‡R)((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR„s.   cCsàtjj|jƒs(tj|jƒn|jddƒ}|jd|ƒ|jd|ƒ|jdtj|ƒƒ|jdtj|ƒdƒ|r»|jdtj|ƒdƒn|j|jƒdƒ|j ƒdS( s,journal changelog metadata for later recoverRŸR+s # User %s s # Date %s s # Node ID %s s # Parent s N( RRR,R-RR0RR/trstripR1(RR†R‡R›RnRoRR2((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRM˜s!cCs|j|jdƒƒS(NRŸ(R„R(R((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR¤§scCs>tjj|jdƒ}tjj|ƒr:tj|ƒndS(sremove changelog journalRŸN(RRR R!Rg(Rtabsdst((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR¦ªscs‡‡‡‡fd†}|S(Ncs„ˆjˆ|ˆƒrtSˆjj|ƒdtjkr<tSˆjj|ƒd}|jdƒ}|r€ˆjˆ|ˆƒr€tStS(NiiRŠ( RKRRCRSRR]RR6R7(RFRtcnode(R@R”RRj(s4/sys/lib/python2.7/site-packages/hgext/transplant.pytmatchfn±s((RR@RjR”R­((R@R”RRjs4/sys/lib/python2.7/site-packages/hgext/transplant.pyttransplantfilter°s N(RRRRKRzRLRR<ReR£R R¡RhR„RMR¤R¦R®(((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyR=Rs   j  3  (     cCs6y|jj|ƒdk SWntjk r1tSXdS(N(RCRDR<R t RevlogErrorR(R@RF((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyRB¾sc Cs‹d„}tj|||ƒ}g}g}xJ|D]B}|j||ƒd } x¾| s|jtdƒƒ} | dkr‹||ƒd } qQ| dkrã|jj|ƒd} x*tj || |ƒD]} |j | ƒqÃWd } qQ| d krQ|j td ƒƒd } qQqQW| dkr+|j |ƒq1| dkrG|j |ƒq1| d krWPq1| d kr1d}d}Pq1q1W|j ƒ||fS(s#interactively transplant changesetscSs|jtdƒƒdS(Ns¢y: transplant this changeset n: skip this changeset m: merge at this changeset p: show patch c: commit selected changesets q: cancel transplant ?: show this help (R0R(R>((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyt browsehelpÆssapply changeset? [ynmpcq?]:t?tpityRyRžtctqsno such option N(R³RyRžR´Rµ((( R tshow_changesettshowR<tpromptRRCRSRRdR0R'R1( R>R@R¢RPR°t displayerRRlRFtactionRGRx((s4/sys/lib/python2.7/site-packages/hgext/transplant.pyt browserevsÄs@               R:tsRjRŽstransplant changesets from REPOtREPOtbtbranchs!use this source changeset as headtREVtatalls0pull all changesets up to the --branch revisionsR²tprunes skip over REVRžRs merge at REVRGs)parent to choose when transplanting mergetetedits invoke editor on commit messagesRMs%append transplant info to log messageR´tcontinues7continue last transplant session after fixing conflictsRLs!filter changesets through commandtCMDsChg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]...c s=tjd„}tjd„}d„}|||ƒ|jdƒs\|jddƒ|d| räˆ|krb|ˆ|d|ƒ}n|ˆ||d|ƒ}|jdƒr’|}n(t|ˆ||ƒ\}}|j |ƒx'|D]} | |ˆj!j"| ƒ|scsˆ|ƒo|ˆkS(N((tx(RÃttf(s4/sys/lib/python2.7/site-packages/hgext/transplant.pyt~sRRÂR(((($R R“R6tconfigR=R tcommitforceeditorR?RRRSR¥RR]R`RRfRR[t expandpathR#R_RtgetremotechangesR7R<R£R®R8RtrevrangetintR»textendRCRDRz(R>R@RmRPRÉRÎRÏttpRnRoRžRÁR5tdt sourcerepoR[RNRÈt cleanupfnR­RlRktalltransplantst newmerges((RÃRjRÔs4/sys/lib/python2.7/site-packages/hgext/transplant.pyR:ïsxC  !"       cCsT|rtj|||ƒ}n|}g|D]%}||jƒjdƒr+|^q+S(s```transplanted([set])`` Transplanted changesets in set, or all transplanted changesets. RŠ(R tgetsetRR6(R@tsubsetRÓR¼R5((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytrevsettransplanted›scKs.|jƒjdƒ}|r*tj|ƒp-dS(sT:transplanted: String. The node identifier of the transplanted changeset if any.RŠRŽ(RR6RR/(R@tctxtargsRy((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytkwtransplanted¥scCsttjd((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytextsetup«s (&t__doc__tmercurial.i18nRRRatmercurial.nodeRt mercurialRRRRRRRR R R R R R`Rtcmdtabletcommandt testedwithtobjectRRR=RBR»R<RR:RåRèRìt i18nfunctions(((s4/sys/lib/python2.7/site-packages/hgext/transplant.pytsD"..ÿm  +  ž