a —+«bWxã@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ú6/usr/lib64/python3.9/site-packages/hgext/transplant.pyr4srsships-with-hg-coreó transplantófilter)Údefaultólogc@seZdZdd„ZdS)ÚtransplantentrycCs||_||_dS©N)ÚlnodeÚrnode)Úselfr'r(rrr Ú__init__Psztransplantentry.__init__N)rrrr*rrrr r%Osr%c@s>eZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „ZdS)Ú transplantsNcCs<||_||_||_|s$t |j¡|_i|_d|_| ¡dS©NF)ÚpathÚtransplantfileÚopenerÚvfsmodrr+ÚdirtyÚread)r)r-r.r/rrr r*Vsztransplants.__init__cCsrtj |j|j¡}|jrntj |¡rn|j |j¡ ¡D]6}tt |  d¡ƒ\}}|j   |g¡}|  t||ƒ¡q6dS)Nó:)Úosr-Újoinr.Úexistsr/r2Ú splitlinesÚmaprÚsplitr+Ú setdefaultÚappendr%)r)ÚabspathÚliner'r(Úlistrrr r2as ztransplants.readcCsŽ|jr„|jr„tj |j¡s&t |j¡| |jd¡}t |j ¡D]:}|D]0}t t |j |j fƒ\}}| |d|d¡qHq@| ¡d|_dS)Nówr3ó F)r1r.r4r-ÚisdirÚmkdirr/rZ itervaluesr+r8rr'r(ÚwriteÚclose)r)Úfpr>ÚtÚlÚrrrr rCis  ztransplants.writecCs|j |¡pgSr&)r+Úget)r)r(rrr rIusztransplants.getcCs(|j |g¡}| t||ƒ¡d|_dS©NT)r+r:r;r%r1)r)r'r(r>rrr Úsetxsztransplants.setcCs(|j |j¡}|r$|| |¡=d|_dSrJ)r+rIr(Úindexr1)r)Ú transplantr>rrr Úremove}s ztransplants.remove)NNN) rrrr*r2rCrIrKrNrrrr r+Us   r+c@s’eZdZdd„Zdd„Zd#dd„Zdd „Zd$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¡}tjfd|it ˆ¡¤ŽS)Nr!Úeditform)r Z mergeeditformÚgetcommiteditorrZ strkwargs)rP©ÚoptsÚreporr rQŽs ÿÿz.transplanter.__init__..getcommiteditor) ÚuirTrr5r-r0r/r+rQ)r)rUrTrSrQrrRr r*…s ÿztransplanter.__init__c Cs¬t||ƒr|j |¡}t||ƒrL|j |¡}|jj|g|dd}||vrLdS|j |¡D]N}t||jƒsz|j |¡dS|j |j¡}||jj|g|ddvrXdSqXdS)zmreturns True if a node is already an ancestor of parent or is parent or has already been transplantedT)Z inclusiveF)ÚhasnodeÚ changelogÚrevÚ ancestorsr+rIr'rN) r)rTÚnodeÚparentZ parentrevrXZ reachablerFZlnoderevrrr Úapplied–s&    ÿ  ÿztransplanter.appliedNc Cs¦|dur i}t|ƒ}|j ¡}g}t |j|¡} d| _d} } z,| ¡} | d¡} |D]¨} || } d| t | ƒf}|  || |¡rš|j  t dƒ|¡qX|j  | ¡}| d¡s| d¡s|d|krÚ| | ¡| }qX|r||krütj|| ¡|d t ||d ¡|j ¡}g}d }| |vrPd}t|| ƒsPtj|| ¡| gd d }|d |jkrÊ| d ¡s’|j t dƒ| t | ƒf¡d}n6| |d ¡}||vrÒt t dƒt |ƒt | ƒf¡‚n|d}|rÞd}nLtjdd\}}t |d¡}tj ||| | d}|D]}| !|¡q| "¡|| =|s:|rXz´z0|j#|| |j  $| ¡||| d¡| d¡d}Wnt%yŠ|  "¡‚Yn0|r¶|r¶|j &t dƒ|t |ƒf¡n&|rÜ|j &t dƒt | ƒt |ƒf¡W|rt '|¡qX|rt '|¡0qX|  "¡|r8tj|| ¡|d t ||d ¡W| (||¡|j) !¡| r^|  *¡| r¢|  *¡n4| (||¡|j) !¡| r’|  *¡| r |  *¡0dS)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)rS)rÚlogÚfilters%s merged at %s s%s transplanted to %s )+ÚsortedÚdirstateÚp1rZdifffeatureoptsrUÚgitÚlockZ transactionrr\ÚwarnrrWÚparentsrIr;r ZpullÚpeerrÚupdaterVÚnullidÚnoteÚlookupr ÚAbortrÚmkstempr4ÚfdopenÚdiffrCrDÚapplyoner2rÚstatusÚunlinkÚ saveseriesr+Úrelease)r)rTÚsourceÚrevmapÚmergesrSÚrevsrjZpullsZdiffoptsrlÚtrrXrZZrevstrrnZdomergeZ skipmerger[Ú patchfileÚfdrEÚgenÚchunkÚnrrr Úapply®sÖ    ÿ        ÿÿ ÿÿ   ù  ÿÿÿ ÿ   û  ztransplanter.applyc Cs |j tdƒ|¡|d|d|d}}}tjdd\}} t |d¡} |  d¡|  d |¡|  d |¡|  |d ¡|  ¡zl|jj d |t   | ¡t   |¡f|dt |ƒd œt jtdƒdd| t| dƒ¡dd…\}}}Wt | ¡n t | ¡0|||fS)z0arbitrarily rewrite changeset before applying its filtering %s r_éérbrcres# HG changeset patch ó # User %s s # Date %d %d r@s%s %s %s)sHGUSERs HGREVISIONs filter failedstransplant_filter)ÚenvironZonerrZ errprefixZ blockedtagsrb)rUryrrrur4rvrCrDÚsystemrZ shellquoterr rtÚparselogrrz) r)rgrZrWr‚ÚuserÚdateÚmsgrƒZ headerfilerErrr rg$s6  ýÿþó ztransplanter.filterFc Csî|dd…\}} \} } } } d| | f}d|i}|rH| ||||¡\} }} |r\| dt|ƒ7} |j tdƒt|ƒ¡|j d| || f¡|s |s t tdƒ¡‚|rfz(t ƒ} t j |j||| dd t | ƒ} Wn”t yb}zzt j |jd ¡}t j |¡rt  |¡|j ¡}|}|j| || |||d |j t |¡d ¡ttd ƒƒ‚WYd}~n d}~00nd} |r|j ¡}| ||¡t ¡}n t | ¡}|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)ÚfilesZeolmodeóseries)rr@s=fix up the working directory and run hg transplant --continue)ÚextrarÚeditorsskipping emptied changeset %s )!rgrrUryrrrrr rtrKrr>Ú Exceptionr4r-r5r6rzrirjrfrCrZ forcebytestrrÚ setparentsrÚalwaysÚexactÚcommitrQrmr+)r)rTrZZclr‚rrfrgZmanifestrŽÚtimeÚtimezoner“Úmessagerr•ÚinstÚ seriespathrjÚp2Úmr†rrr rxGsb    ÿÿ    úztransplanter.applyonecCstj tj |jd¡¡S©Nójournal)r4r-r6r5©r)rrr Ú canresume†sztransplanter.canresumec CsÞtj tj |jd¡¡rj| |||¡\}}|rP|j tdƒt|ƒt|ƒf¡n|j tdƒt|ƒf¡tj |jd¡}tj |¡s”|j   ¡dS|  ¡\}}i} |D]}|| |j   |¡<q¨t |¡| ||| ||¡dS)z7recover last transaction and apply remaining changesetsr¤s%s transplanted as %s s%s skipped due to empty diff r”N)r4r-r6r5ÚrecoverrUryrrr+rCÚ readseriesrWrXrzr‡) r)rTr}rSr†rZr Únodesrr~rrr Úresume‰s&ÿÿ    ztransplanter.resumecCsv| ¡\}}}}}d} |r*|r*|r*|ds8t tdƒ¡‚|d} t|ƒdkr| d¡rŒ| |d¡} | |vrt tdƒt| ƒt|ƒf¡‚nd} d|i} zÖ|j  ¡} | | krÂt td ƒt | ƒ¡‚| rÖ|  | |d¡|  ¡} | j | j| j| jf\}}}}| s|s|s|s|rZ|j|||| | ¡d }|sDt td ƒ¡‚| s^|j ||¡nd }| ¡||fWS0d S) z/commit working directory using journal metadataFrstransplant log file is corruptr_r`raTr’s-working directory not at transplant parent %s)r•r–s commit failedN)Úreadlogr rtrÚlenrIrsrrirjrr˜ryÚmodifiedÚaddedÚremovedÚdeletedr›rQr+rKÚunlog)r)rTr}rSrZrŽrržrnrr[r•rjÚstr­r®r¯r°r†rrr r§¡s`  ÿÿ ÿÿü û ztransplanter.recovercCsV| ¡rR|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¦rZ clean_updateryrrr±)r)rUrTZstartctxrrr ÚstopÜs ÿztransplanter.stopcCsHg}g}|}|j d¡ ¡D]"}| d¡r0|}q| t|ƒ¡q||fS)Nr”s# Merges)r/r2r7Ú startswithr;r)r)r©rZcurr=rrr r¨ès ztransplanter.readseriescCsˆ|sdStj |j¡s"t |j¡| dd¡}t|ƒD]}| t||ƒd¡q6|r|| d¡|D]}| t|ƒd¡qd| ¡dS)Nr”r?r@s # Merges ) r4r-rArBr/rhrCrrD)r)r~rZseriesrXr¢rrr r{ôs    ztransplanter.saveseriesc Csòg}g}|jj}d}d}d}| ¡ ¡D]š}|r<| |¡q(| d¡rT|dd…}q(| d¡rl|dd…}q(| d¡rˆt|dd…ƒ}q(| d¡rª| t|dd…ƒ¡q(| d ¡s(d }| |¡q(d||fvrÞt t d ƒ¡‚|||d   |¡|fS) NFs# User és# Date s # Node ID é ó # Parent é s# Ts,filter corrupted changeset (no user or date)r@) rTrqr2r7r;r¶rr rtrr5) r)rErnržrZZinmsgrŽrr=rrr rs2        ÿztransplanter.parselogcCs¢tj |j¡st |j¡| dd¡}| d|¡| d|¡| dt|ƒ¡| dt|ƒd¡|r„| 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/rCrÚrstriprD)r)rŽrržrjr¡rrErrr rfs  ztransplanter.logcCs| | d¡¡Sr£)rr/r¥rrr r«-sztransplanter.readlogcCs*tj |jd¡}tj |¡r&t |¡dS)zremove changelog journalr¤N)r4r-r5r6rz)r)Zabsdstrrr r±0s ztransplanter.unlogcs‡‡‡‡fdd„}|S)Ncs`ˆ ˆ|ˆ¡rdSˆj |¡dˆjkr,dSˆj |¡d}| d¡}|r\ˆ ˆ|ˆ¡r\dSdS)NFr_r‘r’T)r\rWrnrqr2rI)rZr•Zcnode©rTÚrootr)r}rr Úmatchfn7s z.transplanter.transplantfilter..matchfnr)r)rTr}r½r¾rr¼r Útransplantfilter6s ztransplanter.transplantfilter)N)FFN)F)rrrr*r\r‡rgrxr¦rªr§rµr¨r{rrfr«r±r¿rrrr rO„s" v$ÿ ?;   rOcCs.z|j |¡duWStjy(YdS0dSr,)rWrXr Z StorageError)rTrZrrr rVEsrVcCs,t |||¡}g}g}tdƒ}|D]ø}| ||¡d} | sÊ| |¡} d| | d…} | dkrŽ| |¡dD]\} } | d| | f¡qld} q8| dkr8|j |¡d} t   || |¡D]}| |¡q´d} q8| d krÞ|  |¡q"| d krò|  |¡q"| d krqq"| d kr"d }d }qq"|  ¡||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?r_ó?s%s: %s ópróyómócóqr) r ZchangesetdisplayerrZshowZ promptchoiceZextractchoicesrCrWrnrrwr;rD)rUrTr©rSZ displayerr+rÚpromptrZÚactionÚchoiceÚcrFr[r…rrr Ú browserevsLsBÿ      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 REVr`s)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]...)Z helpcategorycOsD| ¡(t||g|¢Ri|¤ŽWdƒS1s60YdS)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)rUrTr€rSrrr rMxsj rMc sltjfdd„}tjfdd„}dd„}t |¡}|||ƒ| d¡sR| dd¡|d<| d ¡sl| dd ¡|d <t|||ƒ}|j ¡}t |ƒd kr¦||j kr¦t   t d ƒ¡‚| d ¡rÈ| ¡sÆt  t d ƒ¡‚n@| d¡rô| ¡sèt  t dƒ¡‚| ||¡St |¡t |¡| d¡} | r°t d||| ¡d } t ||| ¡} t | j| dd¡¡} t| ƒ} |D]2}z|  |  |¡¡Wnt jyŠYn0q\tj||| t| ƒdd\‰}}n|‰t ˆj| dd¡¡} d}zˆ| d ¡rþ|  |ˆ|¡W|rú|ƒdS| !|ˆ|¡‰| d¡rH‡fdd„t" #ˆ| d¡¡Dƒ‰‡‡fdd„}nˆ}t ˆj| dd¡¡}i}|r–t" #ˆ|¡D]}ˆ| $¡|t%|ƒ<qxn†| d¡s¨|sˆ|krÂ|ˆ||d}n|ˆ|| |d}| d¡rä|}nt&|ˆ||ƒ\}}| '|¡|D]}||ˆj( )|¡<q|D]}||ˆj( )|¡<q | *|ˆ|||¡W|rh|ƒn|rf|ƒ0dS)Ncss|D]}||ƒr|VqdSr&r)rTÚcsetsrrZrrr Úincwalkçsz_dotransplant..incwalkcssd|s | ¡}g}||}|D]}| | ||¡ ¡¡q|j ||¡dD]}||ƒrL|VqLdS)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)r]r;ZancestorrZrWZ nodesbetween)rTÚdestr]rrYÚctxÚheadrZrrr Útransplantwalkìsz%_dotransplant..transplantwalkcSs¨| d¡r t |dgd¢¡dS| d¡r@t |dgd¢¡dS| d¡sp|sp| d¡sp| d¡spt tdƒ¡‚| d¡r¤| d¡s’t td ƒ¡‚|r¤t td ƒ¡‚dS) 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)rIr Zcheck_incompatible_argumentsr rtr)rSr€rrr Ú checkoptsús<  ÿ  ÿÿþýüÿÿ  ÿz _dotransplant..checkoptsr$r!r"rsno revision checked outrÖsno transplant to continuerÕsno interrupted transplant foundrÌrÏrT)Z onlyheadsÚforcerÒcsh|]}ˆ| ¡’qSr)rZ©Ú.0rH)r}rr Ú Msÿz _dotransplant..csˆ|ƒo|ˆvSr&r)Úx)ÚpruneÚtfrr ÚQrÍz_dotransplant..rÓrÑ)r)+rr™rZ byteskwargsrIZconfigrOrirjr¬rqr rtrr¦Z StateErrorrµr ZcheckunfinishedZ bailifchangedrZget_unique_pull_pathr roZmaplistrsrKÚaddZ RepoErrorrZgetremotechangesrhrªr¿r ZrevrangerZÚintrÊÚextendrWrXr‡)rUrTr€rSrÚrÞrßÚtprjZ sourcerepoÚuror]ÚtargetrHrÙZ cleanupfnr¾rr~ZalltransplantsZ newmergesr)rår}rær rØæsš             ÿ #Ü  þ ÿ  ÿrØcCsF| ¡*t||iƒ}| ||i¡WdƒS1s80YdS)zAlogic to resume an interrupted transplant using 'hg continue'N)r×rOrª)rUrTrërrr Ú continuecmdps  rîstransplanted([set])cs0|rt ˆ||¡}n|}t ‡fdd„|Dƒ¡S)z?Transplanted changesets in set, or all transplanted changesets.cs"g|]}ˆ| ¡ d¡r|‘qS)r’)r•rIrá©rTrr Ú ƒrÍz&revsettransplanted..)rZgetsetrZbaseset)rTZsubseträÚsrrïr Úrevsettransplanted{s ÿròs transplantedóctx)ZrequirescCs*| |d¡}| ¡ d¡}|r&t|ƒp(dS)zEString. The node identifier of the transplanted changeset if any.rór’rÍ)Úresourcer•rIr)ÚcontextÚmappingrÜr†rrr ÚkwtransplantedŠs r÷cCs"tjdddttdƒtdƒddS)Nr!stransplant/journalTsMTo continue: hg transplant --continue To stop: hg transplant --stops8use 'hg transplant --continue' or 'hg transplant --stop')ÚfnameZ clearableZ continuefuncZ statushintZcmdhint)ÚstatemodZ addunfinishedrîr)rUrrr Úextsetup“sÿ÷rú):Ú__doc__Z __future__rr4Zmercurial.i18nrZmercurial.pycompatrZmercurial.noderrrZ mercurialrr r r r r rrrrrrrrrùrrr0Zmercurial.utilsrrrrtrZcmdtableZcommandZ testedwithZ configtableZ configitemÚobjectr%r+rOrVrÊZCATEGORY_CHANGE_MANAGEMENTrMrØrîZrevsetpredicateròZtemplatekeywordr÷rúZ i18nfunctionsrrrr Ús´   H  ýý/D,ûûüûüûÙ/ÿË7 7