o ö]LbWxã@sddZddlmZddlZddlmZddlmZddlm Z m Z m Z ddl m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlm Z m!Z!m"Z"Gd d „d ej#ƒZ$iZ%e &e%¡Z&d Z'iZ(e )e(¡Z)e)d d dde)d dddGdd„de*ƒZ+Gdd„de*ƒZ,Gdd„de*ƒZ-dd„Z.dd„Z/e&d dddedƒedƒfdd ged!ƒed"ƒfd#d$ded%ƒfd&d'ged(ƒed"ƒfd)d*ged+ƒed"ƒfdd,ded-ƒed"ƒfd.d/d0ed1ƒfddded2ƒfdd3d0ed4ƒfd5d6ded7ƒfdd ded8ƒed9ƒfg ed:ƒe&j0d;dd?„Z2d@dA„Z3e 4¡Z4e4dBƒdCdD„ƒZ5e 6¡Z6e6dEdFhdGdHdI„ƒZ7dJdK„Z8e5e7gZ9dS)LaVcommand 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. é)Úabsolute_importN)Ú_)Úopen)ÚbinÚhexÚshort)Ú bundlerepoÚcmdutilÚerrorÚexchangeÚhgÚ logcmdutilÚmatchÚmergeÚpatchÚpycompatÚ registrarÚrevsetÚsmartsetÚstateÚutilÚvfs)ÚprocutilÚ stringutilÚurlutilc@s eZdZdS)ÚTransplantErrorN)Ú__name__Ú __module__Ú __qualname__©rrú2/usr/lib/python3/dist-packages/hgext/transplant.pyr4srsships-with-hg-coreó transplantófilter)Údefaultólogc@seZdZdd„ZdS)ÚtransplantentrycCs||_||_dS©N)ÚlnodeÚrnode)Úselfr'r(rrr Ú__init__Ps ztransplantentry.__init__N)rrrr*rrrr r%Os r%c@s>eZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „ZdS)Ú transplantsNcCs<||_||_||_|st |j¡|_i|_d|_| ¡dS©NF)ÚpathÚtransplantfileÚopenerÚvfsmodrr+ÚdirtyÚread)r)r-r.r/rrr r*Vs ztransplants.__init__cCsztj |j|j¡}|jr7tj |¡r9|j |j¡ ¡D]}tt |  d¡ƒ\}}|j   |g¡}|  t||ƒ¡qdSdSdS)Nó:)Úosr-Újoinr.Úexistsr/r2Ú splitlinesÚmaprÚsplitr+Ú setdefaultÚappendr%)r)ÚabspathÚliner'r(Úlistrrr r2asüztransplants.readcCsŽ|jrB|jrBtj |j¡st |j¡| |jd¡}t |j ¡D]}|D]}t t |j |j fƒ\}}| |d|d¡q$q | ¡d|_dS)Nówr3ó F)r1r.r4r-ÚisdirÚmkdirr/rÚ itervaluesr+r8rr'r(ÚwriteÚclose)r)Úfpr>ÚtÚlÚrrrr rDis  þ ztransplants.writecCs|j |¡pgSr&)r+Úget)r)r(rrr rJuóztransplants.getcCs(|j |g¡}| t||ƒ¡d|_dS©NT)r+r:r;r%r1)r)r'r(r>rrr Úsetxs ztransplants.setcCs,|j |j¡}|r|| |¡=d|_dSdSrL)r+rJr(Úindexr1)r)Ú transplantr>rrr Úremove}s   þztransplants.remove)NNN) rrrr*r2rDrJrMrPrrrr r+Us    r+c@s”eZdZdd„Zdd„Zd#dd„Zdd „Z d$d d „Zd d„Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zd%dd„Zdd„Zdd „Zd!d"„ZdS)&Ú transplantercsT||_ˆ|_ˆj d¡|_t |j¡|_t|jd|jd|_‡‡fdd„}||_dS)Nr!s transplants)r/cs*t ˆdd¡}tjdd|it ˆ¡¤ŽS)Nr!Úeditformr)r Ú mergeeditformÚgetcommiteditorrÚ strkwargs)rR©ÚoptsÚreporr rTŽs ÿÿz.transplanter.__init__..getcommiteditor) ÚuirXrr5r-r0r/r+rT)r)rYrXrWrTrrVr r*…s ÿ ztransplanter.__init__c Cs¬t||ƒr |j |¡}t||ƒr&|j |¡}|jj|g|dd}||vr&dS|j |¡D]'}t||jƒs=|j |¡dS|j |j¡}||jj|g|ddvrSdSq,dS)zmreturns True if a node is already an ancestor of parent or is parent or has already been transplantedT)Ú inclusiveF)ÚhasnodeÚ changelogÚrevÚ ancestorsr+rJr'rP) r)rXÚnodeÚparentÚ parentrevr]Ú reachablerGÚlnoderevrrr Úapplied–s(    ÿ  ÿýztransplanter.appliedNc Cs–|duri}t|ƒ}|j ¡}g}t |j|¡} d| _d} } z| ¡} | d¡} |D]J} || } d| t | ƒf}|  || |¡rM|j  t dƒ|¡q,|j  | ¡}| d¡s‹| d¡s‹|d|krk| | ¡| }q,|r‹||kr{tj|| ¡|d t ||d ¡|j ¡}g}d }| |vr£d}t|| ƒs£tj|| ¡| gd d }|d |jkrÝ| d ¡sÂ|j t dƒ| t | ƒf¡d}n| |d ¡}||vrÜt t dƒt |ƒt | ƒf¡‚n|d}|ræd}n%tjdd\}}t |d¡}tj ||| | d}|D]}| !|¡qÿ| "¡|| =|s|rwzXz|j#|| |j  $| ¡||| d¡| d¡d}Wn t%y:|  "¡‚w|rP|rP|j &t dƒ|t |ƒf¡n|rc|j &t dƒt | ƒt |ƒf¡W|rlt '|¡q,|rvt '|¡wwq,|  "¡|r’tj|| ¡|d t ||d ¡W| (||¡|j) !¡| r¥|  *¡| r®|  *¡dSdS| (||¡|j) !¡| rÂ|  *¡| rÊ|  *¡ww)z:apply the revisions in revmap one by one in revision orderNTr!s%d:%ss%skipping already applied revision %s r"r$r)ÚheadséÿÿÿÿFéóparentsskipping merge changeset %d:%s ó%s is not a parent of %sóhg-transplant-©ÚprefixÚwb)rW)rÚlogÚfilters%s merged at %s s%s transplanted to %s )+ÚsortedÚdirstateÚp1rÚdifffeatureoptsrYÚgitÚlockÚ transactionrrdÚwarnrr\ÚparentsrJr;r ÚpullÚpeerrÚupdater[ÚnullidÚnoteÚlookupr ÚAbortrÚmkstempr4ÚfdopenÚdiffrDrEÚapplyoner2rÚstatusÚunlinkÚ saveseriesr+Úrelease)r)rXÚsourceÚrevmapÚmergesrWÚrevsrrÚpullsÚdiffoptsruÚtrr]r_ÚrevstrrxÚdomergeÚ skipmerger`Ú patchfileÚfdrFÚgenÚchunkÚnrrr Úapply®sè    ÿ       ÿÿÿÿÿ     ù ü ÿÿÿ€ €ÿ ÿå€   ÿ ü  ÿztransplanter.applyc Cs |j tdƒ|¡|d|d|d}}}tjdd\}} t |d¡} |  d¡|  d |¡|  d |¡|  |d ¡|  ¡z6|jj d |t   | ¡t   |¡f|dt |ƒd œt jtdƒdd| t| dƒ¡dd…\}}}Wt | ¡nt | ¡w|||fS)z0arbitrarily rewrite changeset before applying its filtering %s rgéérjrkrms# HG changeset patch ó # User %s s # Date %d %d r@s%s %s %s)sHGUSERs HGREVISIONs filter failedstransplant_filter)ÚenvironÚonerrÚ errprefixÚ blockedtagsrb)rYr„rrr€r4rrDrEÚsystemrÚ shellquoterr rÚparselogrr…) r)ror_r\r’ÚuserÚdateÚmsgr“Ú headerfilerFrrr ro$s6  ýÿþó  ztransplanter.filterFc CsÔ|dd…\}} \} } } } d| | f}d|i}|r$| ||||¡\} }} |r.| dt|ƒ7} |j tdƒt|ƒ¡|j d| || f¡|sP|sPt tdƒ¡‚|r©zt ƒ} t j |j||| dd t | ƒ} WnDt y¨}z6t j |jd ¡}t j |¡rt  |¡|j ¡}|}|j| || |||d |j t |¡d ¡ttd ƒƒ‚d}~wwd} |r½|j ¡}| ||¡t ¡}nt | ¡}|j| | |||| ¡d}|sß|j tdƒt|ƒ¡dS|sè|j   ||¡|S)z>apply the patch in patchfile to the repository as a transplantNés%d %dótransplant_sources (transplanted from %s)s applying %s s %s %s %s s"can only omit patchfile if merging)ÚfilesÚeolmodeóseries)rr@s=fix up the working directory and run hg transplant --continue)ÚextrarÚeditorsskipping emptied changeset %s )!rorrYr„rrr}r rrMrr>Ú Exceptionr4r-r5r6r…rqrrrnrDrÚ forcebytestrrÚ setparentsrÚalwaysÚexactÚcommitrTrwr+)r)rXr_Úclr’rrnroÚmanifestr¢ÚtimeÚtimezoner¨Úmessager£r«ÚinstÚ seriespathrrÚp2Úmr–rrr rƒGsf     ÿÿ€ø    úztransplanter.applyonecCstj tj |jd¡¡S©Nójournal)r4r-r6r5©r)rrr Ú canresume†sztransplanter.canresumec CsÞtj tj |jd¡¡r5| |||¡\}}|r(|j tdƒt|ƒt|ƒf¡n |j tdƒt|ƒf¡tj |jd¡}tj |¡sJ|j   ¡dS|  ¡\}}i} |D] }|| |j   |¡<qTt |¡| ||| ||¡dS)z7recover last transaction and apply remaining changesetsr½s%s transplanted as %s s%s skipped due to empty diff rªN)r4r-r6r5ÚrecoverrYr„rrr+rDÚ readseriesr\r]r…r—) r)rXrˆrWr–r_r¹ÚnodesrŠr‰rrr Úresume‰s&ÿÿ    ztransplanter.resumecCsd| ¡\}}}}}d} |r|r|r|dst tdƒ¡‚|d} t|ƒdkrH| d¡rF| |d¡} | |vrEt tdƒt| ƒt|ƒf¡‚nd} d|i} zd|j  ¡} | | krat td ƒt | ƒ¡‚| rk|  | |d¡|  ¡} | j | j| j| jf\}}}}| s‡|s‡|s‡|s‡|r¦|j|||| | ¡d }|sœt td ƒ¡‚| s¥|j ||¡nd }| ¡||fWSw) z/commit working directory using journal metadataFrstransplant log file is corruptrgrhriTr§s-working directory not at transplant parent %s)r«r¬s commit failedN)Úreadlogr rrÚlenrJr~rrqrrrr¯r„ÚmodifiedÚaddedÚremovedÚdeletedr²rTr+rMÚunlog)r)rXrˆrWr_r¢r£r·rxrr`r«rrÚstrÆrÇrÈrÉr–rrr rÀ¡sd  ÿÿÿ ÿÿ üû€ztransplanter.recovercCsV| ¡r)|d}t |¡| tdƒ¡| tdƒ| ¡dd…¡| ¡dSdS)z'logic to stop an interrupted transplantó.s#stopped the interrupted transplant sworking directory is now at %s Né r)r¿rÚ clean_updater„rrrÊ)r)rYrXÚstartctxrrr ÚstopÜs ÿøztransplanter.stopcCsHg}g}|}|j d¡ ¡D]}| d¡r|}q| t|ƒ¡q||fS)Nrªs# Merges)r/r2r7Ú startswithr;r)r)rÂrŠÚcurr=rrr rÁès ztransplanter.readseriescCsˆ|sdStj |j¡st |j¡| dd¡}t|ƒD] }| t||ƒd¡q|r>| d¡|D] }| t|ƒd¡q2| ¡dS)Nrªr?r@s # Merges ) r4r-rArBr/rprDrrE)r)r‰rŠÚseriesr]r»rrr r†ôs     ztransplanter.saveseriesc Csòg}g}|jj}d}d}d}| ¡ ¡D]M}|r| |¡q| d¡r*|dd…}q| d¡r6|dd…}q| d¡rDt|dd…ƒ}q| d¡rU| t|dd…ƒ¡q| d ¡sad }| |¡qd||fvrot t d ƒ¡‚|||d   |¡|fS) NFs# User és# Date s # Node ID é ó # Parent é s# Ts,filter corrupted changeset (no user or date)r@) rXr|r2r7r;rÑrr rrr5) r)rFrxr·r_Úinmsgr¢r£r=rrr r¡s4       € ÿztransplanter.parselogcCs¢tj |j¡s t |j¡| dd¡}| d|¡| d|¡| dt|ƒ¡| dt|ƒd¡|rB| dt|ƒd¡| | ¡d¡| ¡dS) z,journal changelog metadata for later recoverr½r?ršs # Date %s s # Node ID %s rÖr@N) r4r-rArBr/rDrÚrstriprE)r)r¢r£r·rrrºrrFrrr rns   ztransplanter.logcCs| | d¡¡Sr¼)r¡r/r¾rrr rÄ-rKztransplanter.readlogcCs.tj |jd¡}tj |¡rt |¡dSdS)zremove changelog journalr½N)r4r-r5r6r…)r)Úabsdstrrr rÊ0s ÿztransplanter.unlogcs‡‡‡‡fdd„}|S)Ncs`ˆ ˆ|ˆ¡r dSˆj |¡dˆjkrdSˆj |¡d}| d¡}|r.ˆ ˆ|ˆ¡r.dSdS)NFrgr¦r§T)rdr\rxr|r2rJ)r_r«Úcnode©rXÚrootr)rˆrr Úmatchfn7s z.transplanter.transplantfilter..matchfnr)r)rXrˆrÝrÞrrÜr Útransplantfilter6s ztransplanter.transplantfilterr&)FFN)F)rrrr*rdr—rorƒr¿rÃrÀrÐrÁr†r¡rnrÄrÊrßrrrr rQ„s$ v$ ÿ?;    rQcCs*z |j |¡duWStjyYdSwr,)r\r]r Ú StorageError)rXr_rrr r[Es ÿr[cCs&t |||¡}g}g}tdƒ}|D]y}| ||¡d} | sf| |¡} d| | d…} | dkrG| |¡dD] \} } | d| | f¡q6d} n| dkrd|j |¡d} t   || |¡D]}| |¡qZd} | r| d krp|  |¡q| d krz|  |¡q| d kr€n | d krŠd }d }nq|  ¡||fS)z#interactively transplant changesetssÓapply changeset? [ynmpcq?]:$$ &yes, transplant this changeset$$ &no, skip this changeset$$ &merge at this changeset$$ show &patch$$ &commit selected changesets$$ &quit and cancel transplant$$ &? (show this help)Nsynmpcq?rgó?s%s: %s ópróyómócóqr) r ÚchangesetdisplayerrÚshowÚ promptchoiceÚextractchoicesrDr\rxrr‚r;rE)rYrXrÂrWÚ displayerr+rŠÚpromptr_ÚactionÚchoiceÚcrGr`r•rrr Ú browserevsLsFÿ   õ  ýrðósósourceóstransplant changesets from REPOsREPOóbóbranchs!use this source changeset as headsREVóaóalls0pull all changesets up to the --branch revisionsrâóprunes skip over REVräómerges merge at REVrhs)parent to choose when transplanting mergeóeseditFs invoke editor on commit messagess%append transplant info to log messageóstopsstop interrupted transplantråócontinues7continue last transplant session after fixing conflictss!filter changesets through commandsCMDsChg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]...)Ú helpcategorycOsD| ¡t||g|¢Ri|¤ŽWdƒS1swYdS)aîtransplant changesets from another branch Selected changesets will be applied on top of the current working directory with the log of the original changeset. The changesets are copied and will thus appear twice in the history with different identities. Consider using the graft command if everything is inside the same repository - it will use merges and will usually give a better result. Use the rebase extension if the changesets are unpublished and you want to move them instead of copying them. If --log is specified, log messages will have a comment appended of the form:: (transplanted from CHANGESETHASH) You can rewrite the changelog message with the --filter option. Its argument will be invoked with the current changelog message as $1 and the patch as $2. --source/-s specifies another repository to use for selecting changesets, just as if it temporarily had been pulled. If --branch/-b is specified, these revisions will be used as heads when deciding which changesets to transplant, just as if only these revisions had been pulled. If --all/-a is specified, all the revisions up to the heads specified with --branch will be transplanted. Example: - transplant all changes up to REV on top of your current revision:: hg transplant --branch REV --all You can optionally mark selected transplanted changesets as merge changesets. You will not be prompted to transplant any ancestors of a merged transplant, and you can merge descendants of them normally instead of transplanting them. Merge changesets may be transplanted directly by specifying the proper parent changeset by calling :hg:`transplant --parent`. If no merges or revisions are provided, :hg:`transplant` will start an interactive changeset browser. If a changeset application fails, you can fix the merge by hand and then resume where you left off by calling :hg:`transplant --continue/-c`. N)ÚwlockÚ _dotransplant)rYrXr‹rWrrr rOxs j$ÿrOc sftjfdd„}tjfdd„}dd„}t |¡}|||ƒ| d¡s)| dd¡|d<| d ¡s6| dd ¡|d <t|||ƒ}|j ¡}t |ƒd krS||j krSt   t d ƒ¡‚| d ¡rd| ¡sct  t d ƒ¡‚n | d¡rz| ¡stt  t dƒ¡‚| ||¡St |¡t |¡| d¡} | rÔt d||| ¡d } t ||| ¡} t | j| dd¡¡} t| ƒ} |D]}z |  |  |¡¡Wq­t jyÃYq­wtj||| t| ƒdd\‰}}n|‰t ˆj| dd¡¡} d}zÇ| d ¡rú|  |ˆ|¡W|rø|ƒdSdS| !|ˆ|¡‰| d¡r‡fdd„t" #ˆ| d¡¡Dƒ‰‡‡fdd„}nˆ}t ˆj| dd¡¡}i}|rFt" #ˆ|¡D] }ˆ| $¡|t%|ƒ<q7nC| d¡sO|s‰ˆ|kr\|ˆ||d}n|ˆ|| |d}| d¡rm|}nt&|ˆ||ƒ\}}| '|¡|D] }||ˆj( )|¡<q}|D] }||ˆj( )|¡<q‹| *|ˆ|||¡W|r©|ƒdSdS|r²|ƒww)Ncss|D] }||ƒr |VqdSr&r)rXÚcsetsrr_rrr Úincwalkçs €€þz_dotransplant..incwalkcssf|s| ¡}g}||}|D]}| | ||¡ ¡¡q|j ||¡dD] }||ƒr0|Vq'dS)z’Yield all nodes that are ancestors of a head but not ancestors of dest. If no heads are specified, the heads of repo will be used.rN)rer;Úancestorr_r\Ú nodesbetween)rXÚdestrerr^ÚctxÚheadr_rrr Útransplantwalkìs€€þz%_dotransplant..transplantwalkcSs¬| d¡rt |dgd¢¡dS| d¡r t |dgd¢¡dS| d¡s8|s8| d¡s8| d¡s8t tdƒ¡‚| d¡rR| d¡sIt td ƒ¡‚|rTt td ƒ¡‚dSdS) Nrü)rõr÷rùrûròrùrõs9no source URL, branch revision, or revision list providedr÷s --all requires a branch revisions*--all is incompatible with a revision list)rJr Úcheck_incompatible_argumentsr rr)rWr‹rrr Ú checkoptsús@  ÿ  ÿÿþýüÿÿ  ÿüz _dotransplant..checkoptsr$r!r"rsno revision checked outrüsno transplant to continuerûsno interrupted transplant foundròrõrT)Ú onlyheadsÚforcerøcsh|]}ˆ| ¡’qSr)r_©Ú.0rI)rˆrr Ú Ms ÿÿz _dotransplant..csˆ|ƒo|ˆvSr&r)Úx)ÚpruneÚtfrr ÚQsz_dotransplant..rùr÷)r)+rr°rÚ byteskwargsrJÚconfigrQrqrrrÅr|r rrr¿Ú StateErrorrÐr ÚcheckunfinishedÚ bailifchangedrÚget_unique_pull_pathr rzÚmaplistr~rMÚaddÚ RepoErrorrÚgetremotechangesrprÃrßr Úrevranger_ÚintrðÚextendr\r]r—)rYrXr‹rWrrr ÚtprrÚ sourcerepoÚurzreÚtargetrIrÚ cleanupfnrÞrŠr‰ÚalltransplantsÚ newmergesr)rrˆrr rÿæs¢       ÿ     ÿÿ # ÿß  þÿ ÿ    ÿÿrÿcCsF| ¡t||iƒ}| ||i¡WdƒS1swYdS)zAlogic to resume an interrupted transplant using 'hg continue'N)rþrQrÃ)rYrXr rrr Ú continuecmdps   $þr'stransplanted([set])cs0|r t ˆ||¡}n|}t ‡fdd„|Dƒ¡S)z?Transplanted changesets in set, or all transplanted changesets.cs"g|] }ˆ| ¡ d¡r|‘qS)r§)r«rJr ©rXrr Ú ƒs"z&revsettransplanted..)rÚgetsetrÚbaseset)rXÚsubsetrÚsrr(r Úrevsettransplanted{s ÿr.s transplantedóctx)ÚrequirescCs*| |d¡}| ¡ d¡}|rt|ƒpdS)zEString. The node identifier of the transplanted changeset if any.r/r§ró)Úresourcer«rJr)ÚcontextÚmappingrr–rrr ÚkwtransplantedŠs r4cCs"tjdddttdƒtdƒddS)Nr!stransplant/journalTsMTo continue: hg transplant --continue To stop: hg transplant --stops8use 'hg transplant --continue' or 'hg transplant --stop')ÚfnameÚ clearableÚ continuefuncÚ statushintÚcmdhint)ÚstatemodÚ addunfinishedr'r)rYrrr Úextsetup“sÿ ÷r<):Ú__doc__Ú __future__rr4Úmercurial.i18nrÚmercurial.pycompatrÚmercurial.noderrrÚ mercurialrr r r r r rrrrrrrrr:rrr0Úmercurial.utilsrrrrrÚcmdtableÚcommandÚ testedwithÚ configtableÚ configitemÚobjectr%r+rQr[rðÚCATEGORY_CHANGE_MANAGEMENTrOrÿr'Úrevsetpredicater.Útemplatekeywordr4r<Ú i18nfunctionsrrrr Ús¶   H  ýý/D,ûûüûüûÙ/ÿË 77