Qc@sddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZejdkrddlZn ddlZejZejZddZdZdZdZd Zd efd YZ d efd YZ!defdYZ"de"fdYZ#e#Z$defdYZ%de"e%fdYZ&e&Z'de"e%fdYZ(ddZ)e*de*dZ+dZ,da-dZ.ddZ/dZ0dZ1d Z2d!Z3gie*d"d#Z4gie*d"d$Z d%Z5d&Z6giddd'Z7e*dd(Z8d)Z9d*efd+YZ:d,efd-YZ;d.efd/YZ<ej=e d.r e j<Z<nd0Z>dS(1i(t_(tnullrevNtntcCsg}|rnx_|D]T}||kr+qn||}|jtjkr|j r|j|qqWn|r|jtdt|n|jtddS(sjReport no changes for push/pull, excluded is None or a list of nodes excluded from the push/pull. s0no changes found (ignored %d secret changesets) sno changes found N(tphasetphasestsecrettextincttappendtstatusRtlen(tuitrepotexcludedt secretlisttntctx((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytnochangesfounds   "cCs|d kr(tjtd|nx6d D].}||kr/tjtd |q/q/Wy#t|tjtd Wntk rnXdS( Nttipt.tnullsthe name '%s' is reservedt:ts s s%r cannot be used in a namescannot use an integer as a name(RRR(Rss s (tutiltAbortRtintt ValueError(R tlbltkindtc((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt checknewlabel+s      cCs8d|ksd|kr4tjtd|ndS(sFCheck that the filename f is an acceptable filename for a tracked files s s)'\n' and '\r' disallowed in filenames: %rN(RRR(tf((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt checkfilename9scCst|t|\}}|s(|rtj|}|rd||f}|retj|n|jtd|qndS(sECheck if filename f is portable and warn or abort depending on configs%s: %rs warning: %s N(RtcheckportabilityalertRtcheckwinfilenameRtwarnR(R RtabortR"tmsg((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt checkportable>s  cCs|jddd}|j}tj|}tjdkpH|dk}|pZ|dk}|dkr|p~|p~|dk rtjt d|n||fS( s_check if the user's config requests nothing, a warning, or abort for non-portable filenamesR tportablefilenamesR"RR#tignores,ui.portablefilenames value is invalid ('%s')N( tconfigtlowerRt parsebooltostnametNoneterrort ConfigErrorR(R tvaltlvaltbvalR#R"((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR Js %tcasecollisionauditorcBseZdZdZRS(cCs^||_||_dj|j}ttj|jd|_||_ t|_ dS(NR( t_uit_aborttjoint_maptsettencodingR)tsplitt _loweredfilest _dirstatet _newfiles(tselfR R#tdirstatetallfiles((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt__init__Xs   ! cCstj|}||jkr||jkr||jkrtd|}|jrgtj|n|j j td|n|jj ||jj |dS(Ns&possible case-folding collision for %ss warning: %s ( R9R)R;R<R=RR5RRR4R"tadd(R>RtflR$((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt__call__cs (t__name__t __module__RARD(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR3Ws t pathauditorcBs,eZdZddZdZdZRS(sensure that a filesystem path contains no banned components. the following properties of a path are checked: - ends with a directory separator - under top-level .hg - starts at the root of a windows drive - contains ".." - traverses a symlink (e.g. a/symlink_here/b) - inside a nested repository (a callback can be used to approve some nested repositories, e.g., subrepositories) cCskt|_t|_||_||_tjj|r[tj | r[tj |_ n d|_ dS(NcSs|S(N((tx((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyts( R8tauditedt auditeddirtroottcallbackR+tpathtlexistsRt checkcasetnormcase(R>RLRM((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRA{s    "cCs<tj|}|j|}||jkr1dStj|r\tjtd|ntj|}tj j |ds|dj d kstj |krtjtd|nd|j kr^g|D]}|j ^q}xhd D]]}||dkr|j |}tj j|| }tjtd ||fqqWntj|}t|t|kst|j|jg} xp|rtjj|} tjj|} | |jkrPntj j|j| } ytj| } Wn:tk rL}|jtjtjtjfkrqnXtj| jrtjtd || fnrtj| jrtj jtj j| dr|j s|j |  rtjtd || fqn| j!| |j|jqW|jj"||jj#| dS( sPCheck the relative path. path may contain a pattern (e.g. foodir/**.txt)Ns$path ends in directory separator: %sis.hgs.hg.ts#path contains illegal component: %sis"path '%s' is inside nested repo %rs"path %r traverses symbolic link %r(s.hgs.hg.RR(s.hgs.hg.($Rt localpathRQRJt endswithsepRRt splitpathR+RNt splitdriveR)tpardirtindexR6R tAssertionErrortpoptsepRKRLtlstattOSErrorterrnotENOENTtENOTDIRtEINVALtstattS_ISLNKtst_modetS_ISDIRtisdirRMRRBtupdate(R>RNtnormpathtpartstptlpartstpostbaset normpartstprefixestprefixt normprefixtcurpathtstterr((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRDsb    !  !  cCs4y||tSWnttjfk r/tSXdS(N(tTrueR]RRtFalse(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytchecks  N(RERFt__doc__R-RARDRw(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRGns  @t abstractvfscBseZdZdZdZdZdZdZddZ ddZ ddZ de d Z ddd Zdd Zdddd Zd ZdZdZddZRS(s+Abstract base class; cannot be instantiatedcOs tdtt|dS(s7Prevent instantiation; don't call this from subclasses.sattempted instantiating N(tNotImplementedErrortstrttype(R>targstkwargs((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAscCsCy|j|SWn+tk r>}|jtjkr?q?nXdS(s3gracefully return an empty string for missing filesRR(treadtIOErrorR^R_(R>RNtinst((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyttryreads  cCs/||d}z|jSWd|jXdS(Ntrb(Rtclose(R>RNtfp((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCs2||d}z|j|SWd|jXdS(Ntwb(twriteR(R>RNtdataR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCs2||d}z|j|SWd|jXdS(Ntab(RR(R>RNRR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstjj|j|S(N(R+RNtexistsR6(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstjj|j|S(N(R+RNRfR6(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRfscCstjj|j|S(N(R+RNtislinkR6(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstj|j||S(N(RtmakedirR6(R>RNt notindexed((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstj|j||S(N(RtmakedirsR6(R>RNtmode((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstj|j|S(N(R+tmkdirR6(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstj|j|||S(N(tosutiltlistdirR6(R>RNRbtskip((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytreaddirscCs"tj|j||j|S(N(RtrenameR6(R>tsrctdst((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstj|j|S(N(R+treadlinkR6(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR scCstj|j|||S(N(RtsetflagsR6(R>RNtlRH((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR scCstj|j|S(N(R+RbR6(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRbsN(RERFRxRARRRRR-RRfRRuRRRRRRRRb(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRys"           tvfscBseZdZeeedZdZdZeeeZ e j dZ e j dZ dZdeedZd Zd ZRS( sOperate files relative to a base directory This class is used to hide the details of COW semantics and remote file access from higher level code. cCs_|rtj|}n|r3tjj|}n||_|j|d|_d|_ dS(N( Rt expandpathR+RNtrealpathRmt _setmustauditR-t createmodet _trustnlink(R>RmtauditRR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAs   cCs|jS(N(t_audit(R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt _getmustaudit"scCs4||_|r$t|j|_n tj|_dS(N(RRGRmRRtalways(R>tonoff((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR%s cCstj|jS(N(Rt checklinkRm(R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt _cansymlink.scCstj|jS(N(Rt checkexecRm(R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt_chmod2scCs8|jdks|j rdStj||jd@dS(Ni(RR-RR+tchmod(R>R,((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt _fixfilemode6strc Cs.|jr=tj|}|r=tjd||fq=n|j||j|}| ryd|kry|d7}nd}|d krtj|\}} | r|rtj||jtj |||jSycd|krtj |d}n=tj |} tj |}|dkr-d }n| j WnJttfk r} | jtjkrhnd}tj||jnX|dkr|jdkr|dkptj||_n|dks|j rtjtj||qqqntj ||} |dkr*|j|n| S( Ns%s: %rtbiRRtwiii(Rsrb(RRtcheckosfilenameRRR6R:t ensuredirsRtatomictempfiletunlinkt posixfiletnlinksRR]RR^R_RR-t checknlinkRt mktempcopyR( R>RNRttextt atomictempRRtnlinktdirnametbasenametfdteR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRD;sL          !% cCs|j||j|}ytj|Wntk r@nXtjtjj||j |j rytj ||Wqtk r}t|j t d||jf|qXn|j||dS(Nscould not symlink to %r: %s(RR6R+RR]RRRNRRRtsymlinkR^RtstrerrorR(R>RRtlinknameRt((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRjs   cCs'|rtjj|j|S|jSdS(N(R+RNR6Rm(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR6}s(RERFRxRuRvRARRtpropertyt mustauditRt propertycacheRRRRDRR6(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs   / tauditvfscBs2eZdZdZdZeeeZRS(cCs ||_dS(N(R(R>R((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAscCs |jjS(N(RR(R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCs||j_dS(N(RR(R>R((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs(RERFRARRRR(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs   t filtervfscBs)eZdZdZdZdZRS(s4Wrapper vfs for filtering filenames with a function.cCstj||||_dS(N(RRAt_filter(R>Rtfilter((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAscOs|j|j|||S(N(RR(R>RNR}R~((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRDscCs3|r|jj|j|S|jj|SdS(N(RR6R(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR6s(RERFRxRARDR6(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs  t readonlyvfscBs#eZdZdZddZRS(s#Wrapper vfs preventing any writing.cCstj||dS(N(RRA(R>R((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAsRcOs4|dkrtjdn|j||||S(NRRsthis vfs is read only(Rsrb(RRR(R>RNRR}tkw((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRDs (RERFRxRARD(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs c Cstj|r|}n |tj}|}tjj|sXtjj|||}ntjj|}|dkrt |}n||kr|j |r|t |}||tj |S||krdSg}xt rytj||}Wntk rt}nX|rY|s&dS|jtjj|}||tj |Stj|\}} |j| ||krPn|}qWtjtd||fdS(s7return the canonical path of myname, given cwd and rootRRs%s not under root '%s'N(RRTR+R[RNtisabsR6RhR-RGt startswithR tpconvertRutsamefileR]RvtreverseR:RRR( RLtcwdtmynametauditortrootsepR,treltsRR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt canonpathsD               c#sfd}ttjdd|rHdk rHfd}nt}|dkrv|rvg}||nx:tjdtd|D]\}}}|jd|kr|Vtjj|dd} tjj tjj| dr| Vn|r|j dqg|(q|rg} xy|D]q} tjj|| } ||| r0tjj | rx/t | t|D] } | VqWq| j | q0q0W| |(qqWdS( syield every hg repository under path, always recursively. The recurse flag will only control recursion into repo working dirscs|jkr|ndS(N(tfilename(Rt(RN(s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt errhandlerstsamestatcsZt}tj|}x'|D]}||rt}PqqW|sU|j|n| S(N(RvR+RbRuR(tdirlstRtmatchtdirstatt lstdirstat(R(s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytadddirs ttopdowntonerrors.hgtpatchesN(tgetattrR+RNR-RvtwalkRutsortR6RftremoveRt walkreposR(RNt followsymt seen_dirstrecurseRRRLtdirstfilestqroottnewdirstdtfnamethgname((RNRs5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs8 +  !   cCsBt}|jtg|D]}tjj|^q }|S(s+return default os-specific hgrc search path(t systemrcpathtextendt userrcpathR+RNRh(RNR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytosrcpath s %cCstdkrdtjkrgaxtjdjtjD]}|sMq;ntj|}tjj |rx[t j |D]:\}}|j dr~tj tjj||q~q~Wq;tj |q;WqtantS(sreturn hgrc search path. if env var HGRCPATH is set, use it. for each item in path, if directory, use files ending in .rc, else use item. make HGRCPATH empty to only look in .hg/hgrc of current repo. if no HGRCPATH, use default os-specific path.tHGRCPATHs.rcN(t_rcpathR-R+tenvironR:tpathsepRRRNRfRRtendswithRR6R(RjRR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytrcpaths  & RcCsV|s||St||g}t|dkrJtjtdn||dS(Nisempty revision seti(trevrangeR RRR(R trevspectdefaultR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt revsingle.s cCs|s|jjdfSt||}t|dkrk|rXtjtdn|jjdfSt|dkrt|dkrt|dkr|j |ddfS|j |d|j |dfS(Nisempty revision rangeii( R?tp1R-RR RRRt _revrangeseptlookup(R trevsR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytrevpair7s4Rc CsOd}tg}}x/|D]'}|rB| rBt|}nyt|trt|j||j|w nt|krv|jtd\}}|||d}|||t|d}|tkr|dkrt}n|j j ||}| r| rt |}w nt|} |rK| j ||j | n| }|jt| d||kw nV|r||kr|||d} | |krw n|j| |j| w nWntjk rnXtj|j|} g| |t |D]} | |kr| ^q} |j| |j | q W|S(sAYield revision as strings from a list of revision specifications.cSs1| r#|dkr#|dk r#|S||jS(Ni(R-trev(R R0tdefval((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytrevfixLsiiRN(R8t isinstanceRRBRRR:R Rt changelogRtlisttdifference_updateRgRtsortedR-R.tRepoLookupErrortrevsetRR (R RRtseenRtspectstarttendt rangeitertnewrevsRtmRtdl((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRIsR              4 cCstjst|Sg}x|D]}tj|d\}}|dkrytj|}Wntjk r||g}nX|r|j |q qn|j |q W|S(N( Rt expandglobsRtmatchmodt _patsplitR-tglobtreR.RR(tpatstretRjRR,tglobbed((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt expandpatss       trelpathcs|dkrg}n| r=|dkr=t|p4g}nj||jd|jd|fd}|_|fS(NRRRtincludetexcludecs*jjjdj||fdS(Ns%s: %s (t_repoR R"R(RR$(RR(s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytbadfns(RR(RRtgettbad(RRtoptsRRR"((RRs5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt matchandpatss  !  cCst|||||dS(Ni(R&(RRR%RR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRscCstj|j|jS(N(RRRLtgetcwd(R ((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytmatchallscCstj|j|j|S(N(RtexactRLR'(R R((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt matchfilessc s|dkr|jd}n|dkrHt|jdp?d}nggggf\}}}}t|j} t|d||} gfd| _|d} |j} | j| t | j t t } x| j D]\}}| |}|dkr%| j|r%|j|q|dkrH| rH|j|q|dkrd|j|q|dkr|j|qqWt|}|j}|j|xt |D]}|jjs| j| r| j|}||krtd|r|p |}ntd |r'|p*|}|jj|qqWi}|dkrxtj||||||D]\}}}|jjs| j| s| j| r|jjtd | j|| j||d fn|||eZedZdZdZdZedZRS(cCsd||_d|_d|_|r`tj|j|_|jrT|jj|_q`d|_ndS(N(RNR-t cachestatt _cacheableR\Rbt cacheable(R>RNRb((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAs    cCs(|jr$tj|j|_ndS(N(R_R\RbRNR](R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytrefreshs cCs|jdk r|jStS(N(R^R-Ru(R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR_"scCsz|jstStj|j}|rV|jdkrV|j|_|jsVtSn|j|krr||_tStSdS(N( R_RuR\RbRNR^R-R]Rv(R>tnewstat((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytchanged)s   cCsCytj|SWn+tk r>}|jtjkr?q?nXdS(N(RR]R]R^R_(RNR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRb>s ( RERFRuRAR`R_Rbt staticmethodRb(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR\s     t filecachecBsGeZdZdZdZdZddZdZdZ RS(s?A property like decorator that tracks a file under .hg/ for updates. Records stat info when called in _filecache. On subsequent calls, compares old stat info with new info, and recreates the object when needed, updating the new stat info in _filecache. Mercurial either atomic renames or appends for files under .hg, so to ensure the cache is reliable we need the filesystem to be able to tell us if a file has been replaced. If it can't, we fallback to recreating the object on every call (essentially the same behaviour as propertycache).cCs ||_dS(N(RN(R>RN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRASscCs |j|S(sUsed to compute the runtime path of the cached file. Users should subclass filecache and provide their own version of this function to call the appropriate join function on 'obj' (an instance of the class that its member function was decorated). (R6(R>tobjR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyR6VscCs||_|j|_|S(N(tfuncRER,(R>Rf((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRD_s  cCs|j|jkrA|j|jks3t|j|j|jS|jj|j}|r|jr|j||_qnC|j||j }t |}|j||_||j|j<|j|j|j<|jS(N( R,t__dict__t _filecacheRYR#RbRfReR6RNR\(R>ReR|tentryRN((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt__get__ds!  cCsp|j|jkrCt|j||jt}||j|jRetvaluetce((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt__set__|s  cCs8y|j|j=Wn tk r3t|jnXdS(N(RgR,tKeyErrortAttributeError(R>Re((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt __delete__s N( RERFRxRAR6RDR-RjRmRp(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRdFs     RcBs>eZdZddZdZdZdZdZRS(s9a multiset of directory names from a dirstate or manifestcCsi|_|j}tj|drm|dk rmxU|jD])\}}|d|kr=||q=q=Wnx|D]}||qtWdS(NR3i(t_dirstaddpathRt safehasattrR-R3(R>tmapRRrRR((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRAs   cCsN|j}x>t|D]0}||kr<||cd7RNRRm((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRrs   cCsO|j}x?t|D]1}||dkr@||cd8RNRRm((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pytdelpaths  cCs |jjS(N(Rqtiterkeys(R>((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt__iter__scCs ||jkS(N(Rq(R>R((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyt __contains__sN( RERFRxR-RARrRvRxRy(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRs    ccsD|jd}x.|dkr?|| V|jdd|}qWdS(Nt/ii(trfind(RNRl((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyRus (?ti18nRtmercurial.nodeRRR.RR R6R9RtparsersRRR+R^RRbRR,t scmwindowst scmplatformtscmposixRRR-RRRR%R tobjectR3RGRyRRWRRt filteropenerRRRvRRRRRRRRRR&R(R*RJRRR[R\RdRRsRu(((s5/sys/lib/python2.7/site-packages/mercurial/scmutil.pyts\` <       ^Fq  .0    :    A 7H$