o ]LbE@s*ddlmZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZmZmZmZddlmZmZdZejrldd lmZmZmZmZmZmZdd l mZmZmZ m!Z!m"Z"m#Z$ee%ee%e%e%ffZ&d d Z'd dZ(dddZ)d ddZ*ddZ+ddZ,ddZ-d!ddZ.ddZ/dS)")absolute_importN)_)getattr)configerror filemergepathutilphasespycompatutil) stringutilurlutil)rsempty)AnyDictListOptionalSetTuple)context localrepomatchscmutilsubrepouic s&tdfdd dvrddD]\}}d||d|q i}dvrz>tdD]1\}}|}|sMqBz | dd\}}Wnt ynt t d d|dfw|||<qBWnty}z |jtjkrWYd}~nd}~wwfd d } i} d D]t\}}d } |drd|vrt t d| dd\} }| dd} |}t|stdd} | rt| } t| jpd || _t| j| _t| } | | }|| kr| |}n|}| |}|||d | f| t |<q| S)zreturn a state dict, mapping subrepo paths configured in .hgsub to tuple: (source from .hgsub, revision from .hgsubstate, kind (key in types dict)) Nc s|vr>z|}Wn&ty2}z|jtjkrtd|WYd}~dSd}~ww||||dSt td|)Ns*warning: subrepo spec file '%s' not found s subrepo spec file '%s' not found) dataIOErrorerrnoENOENTwarnrpathtoparserAbort)fsectionsremaprerrctxpreadrepor7/usr/lib/python3/dist-packages/mercurial/subrepoutil.pyr+?s$  zstate..read.hgsubsubpaths .hgsubstate rs8invalid subrepository revision specifier in '%s' line %dc sdD]9\}}t|}tdd|}z t|||d}Wqtjy>}zttdd|t |fd}~ww|S)Nr0s \\\\([0-9]+)s\\\1rs#bad subrepository pattern in %s: %s) itemsr escapestrresubrr#rsource forcebytestr)srcpatternreple)r*r-r.r&ns   zstate..remaprshg[]s!missing ] in subrepository sourceFabort)NN)!rr, configitemsset configsource enumerater splitlineslstripsplit ValueErrorrr#rr!rrrr3 startswithrurlisabs _abssource posixpathjoinpathnormpathbytesstripgetr pconvert)r)rrOr9revilrevisionr'r&statekindparentjoinedremappedr-r(r.rY6sr          "rYcs.fddtD}|dd|ddS)z=rewrite .hgsubstate in (outer) repo with these subrepo statescs4g|]}|dtdkrd|d|fqS)rs%s %s ) nullstate.0srYr-r. s zwritestate..r1rN)sortedwwriterN)r,rYlinesr-rbr. writestates rgcs||kr|}|j}|j}|j}i} jd|||fdfdd } t|} tt|D]D\} } | | t }| }| |  rO| d| ddf}||krU|}| }| |d<| |vr=|| }||ksn||krs| | | <q1||kr| | d || |  |||| | <q1|d|dkr| d|d <|d|d <jtd |dr| | d || |  |||| | <q1|d|dkr| | d|| |  |||| | <q1| | d| | }|| d|d<||d|d<jtd|d}|dkr| | || | | <| | d|q1|dkr)| | | <| | d| q1| |  |||| | <| | d|q1||krO| | d| | q1|t kr^| | d| | | <q1jtd|drv| | d| | q1t|D]T\} }| |vrq}| |vr| | d|| |  ||| | <q}||| kr| }| |d<jtd|ddkr| | d|| |  ||| | <q}t| | S)z{delegated from merge.applyupdates: merging of .hgsubstate file in working context, merging context and ancestor contextssubrepo merge %s %s %s rcs&|rd|}jd|||fdS)Ns%s:%s:%ss subrepo %s: %s %s )rdebug)ramsgrr,r-r.rhszsubmerge..debugrr+ssother changed, getslosros subrepository sources for %(s)s differ you can use (l)ocal%(l)s source (%(lo)s) or (r)emote%(o)s source (%(ro)s). what do you want to do?$$ &Local $$ &Remotesprompt changed, getsother side changed, getsboth sides changedsslssrs subrepository %(s)s diverged (local revision: %(sl)s, remote revision: %(sr)s) you can (m)erge, keep (l)ocal%(l)s or keep (r)emote%(o)s. what do you want to do?$$ &Merge $$ &Local $$ &Remotes merge withskeep local subrepo revisionsget remote subrepo revisionsremote removed, removeslocal added, keepsz local%(l)s changed subrepository %(s)s which remote%(o)s removed use (c)hanged version or (d)elete?$$ &Changed $$ &Deletes prompt removesremote added, getsz remote%(o)s changed subrepository %(s)s which local%(l)s removed use (c)hanged version or (d)elete?$$ &Changed $$ &Deletesprompt recreateN)r)p1substaterrhr partextrasrdr iteritemsrSr^r6dirtycopy promptchoicershortidmergeremover3rg)r,wctxmctxactx overwritelabelss1s2sasmrh promptssrcrarWaldpromptsrjsrepooptionr-rkr.submerges                           rFcsg}t}|jd|vr|j|j|jfD] }d|vr!|dq|j}t D]e} | sI| |vr>|| | <q-|sIt t d| | | d} | rm|ddsbt j | t dd|| || q-| | } | d | | d f| <|| d d | kr|| q-|D]} fd d| jD} |fdd| D7}q|r͈dsd||vrt t d|jd dnd|jvrd|vrd|j|j|jvr|jd d||fS)ayCalculate .hgsubstate changes that should be applied before committing Returns (subs, commitsubs, newstate) where - subs: changed subrepos (including dirty ones) - commitsubs: dirty subrepos which the caller needs to commit recursively - newstate: new state dict which the caller must write to .hgsubstate This also updates the given status argument. r/r1s#commit with new subrepo %s excludedTsuiscommitsubreposs#use --subrepos for recursive commit)hintr)NNNrcsg|]}|vr|qSr-r-r_)newstater-r.rcozprecommit..csg|]}|r|qSr-r-r_)rr-r.rcprs$can't commit subrepos without .hgsub)rBrorsmodifiedaddedremovedrwrnrdkeysrr#rr6 dirtyreason configboolappendadd basestaterSparentsinsert)rrxstatusrforcesubs commitsubscoldstaterarbsr*rjr-)rrr. precommit;s`               rcCsf|}g}t|dr%t|j}|t||rn |j}t|ds | t j |}t |S)zRreturn the source of this repo Either absolute or relative the outermost repo _subparent) r safehasattrrrJ _subsourcerrQrK _subparentreverserMrNrP)r,r[chunksr7rOr-r-r.repo_rel_or_abs_sources     rcCs<|}t|dr|j}t|ds|jtt|jdS)z9return path to this (sub)repo as seen from outermost reporN)r rrrootlenr normasprefix)r,r[r-r-r. reporelpaths   rcCs|jS)z7return path to this subrepo as seen from outermost repo)_relpath)r6r-r-r. subrelpathsrTcCsDt|drDt|j}|rt|St|j |_ t |j |dd}|rCtt |}t |j p3d|j |_ t|j |_ t|SnSd}t|drP|j}n+|ra|jddra|jdd}n|jdd rp|jdd }n |r{tj |jS|rt|rt|d ks|d d d vrt|}|S|rttd dS)zreturn pull/push path of repo - either based on parent repo .hgsub info or on the top repo config. Abort or return None if no source found.rFr?rNs _subtoppathspathss default-pushsdefaultrs\/s(default path for subrepository not found)r rrrJrrKrQrMrPrOrLrrTrN _subtoppathrrsharedosdirname sharedpathhasdriveletterrabspathrr#r)r,pushr@r7r[rOr-r-r.rLs:     rLc Cst|}t|dd}|s|S|dd}|dvr"ttd||dkr(|Stj}d}t|D]}| |}| ||d} || krI| }|}q1||krt|dkrdttd tj |tj ||f| td tj ||f|S|S) Nrosphasess checksubrepos)ignoresfollowaborts.invalid phases.checksubrepos configuration: %srrrs=can't commit in %s phase conflicting %s from subrepository %ssAwarning: changes are committed in %s phase from subrepository %s ) r newcommitphaserrrr#rpublicrdr6phase phasenamesr ) rr) commitphaserocheckmaxphasemaxsubrar6subphaser-r-r.rsR        r)N)F)FT)0 __future__rrrrMr5i18nrr rrrrr r r utilsr rr^ TYPE_CHECKINGtypingrrrrrrrrrmatchmodrrruimodrQSubstaterYrgrrrrrrLrr-r-r-r.s0   $    m  G  1