o ^UbY@s\ddlmZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z mZmZmZmZddlmZmZmZddlmZejZejZejZejZejZejZejZej Z ej!Z!ej"Z"ej#Z#ej$Z$ej%Z%ej&Z&ej'Z'z,ddl(Z(ddl)Z(ddl*Z(ddl+Z(ddl,Z(dd lm-Z-ddl.Z.e.j/d d e0d e(j1j2Wn e3ydZ(Ynwda4d dZ5ddZ6ddZ7ddZ8Gddde9Z:ddZ;ddZGdd d e?Z@ ! "d=d#d$ZAd%d&ZBGd'd(d(e?ZCGd)d*d*eDZEd+d,ZFd-d.ZGeGeGeFd/ZHGd0d1d1e9ZId2d3ZJd4d5ZKGd6d7d7e!ZLd8ZMd9d:ZNGd;d<d)absolute_importN)_)open)encodingerrorpycompatutilvfs)dateutilprocutil stringutil)common) transportignorezsvn.core)modulecategorycCsptdurdStjr dantttjpdaWdn1s#wYt tj att dj ka dS)Nmbcsz ISO-8859-1utf-8) fsencodingr iswindowsr with_lc_ctypelocale nl_langinfoCODESETcodecslookupnamefsencoding_is_utf8rr:/usr/lib/python3/dist-packages/hgext/convert/subversion.pyinit_fsencodingLs  r!cCstr|S|tdS)Nr)rdecoderencodesrrr fs2svn]sr&cC t|dS)Ns%Y-%m-%dT%H:%M:%S.000000Z)r datestr)daterrr formatsvndateds r*cCst|ddddgS)Ns UTCs%Y-%m-%dT%H:%M:%S)r parsedater$rrr parsesvndatehsr-c@ eZdZdS)SvnPathNotFoundN__name__ __module__ __qualname__rrrr r/or/cCs|dd}d}t|dkrt|d}|ddd}d}d}t|dkr;|ddr;|ddd}d|d}|||fS) aParse a revision string and return (uuid, path, revnum). >>> revsplit(b'svn:a2147622-4a9f-4db4-a8d3-13562ff547b2' ... b'/proj%20B/mytrunk/mytrunk@1') ('a2147622-4a9f-4db4-a8d3-13562ff547b2', '/proj%20B/mytrunk/mytrunk', 1) >>> revsplit(b'svn:8af66a51-67f5-4354-b62c-98d67cc7be1d@1') ('', '', 1) >>> revsplit(b'@7') ('', '', 7) >>> revsplit(b'7') ('', '', 0) >>> revsplit(b'bad') ('', '', 0) @r r/ssvn:N)rsplitlenintsplit startswith)revpartsrevnumuuidmodrrr revsplitss     rCcCr')Ns!$&'()*+,-./:=@_~)urlreqquoter$rrr rEs rEcCsz tjtjt|WStjjyYnwtj |r.receiverurlr)rSvnRaTransportrFraget_logIOErrorrcrd Exceptionr forcebytestrflushrL_exit) rnrrrjstartendlimitdiscover_changed_pathsstrict_node_historyrptinstrrmr get_log_childs.    rcKsdt$tdurttdt|j}t |j g|RWddS1s+wYdS)ziFetch SVN log in a subprocess and channel them back to parent to avoid memory collection issues. Ns5debugsvnlog could not load Subversion python bindings) rrrFrAbortr decodeargsfinreadrfout)uioptsargsrrr debugsvnlogs "rc@s(eZdZdZddZddZddZdS) logstreamz$Interruptible revision log iterator.cCs ||_dSrS)_stdout)r^stdoutrrr r` zlogstream.__init__c cs zt|j}Wntyttdwz |\}}}}}Wnttfy;|dur2YdSttd|w|Vq)NT>Mercurial failed to run itself, check hg executable is in PATHslog stream exception '%s') rcloadrEOFErrorrrr TypeError ValueError)r^entryrfr@rgr)rhrrr __iter__s( zlogstream.__iter__cCs|jr |jd|_dSdSrS)rcloser^rrr rs  zlogstream.closeN)r1r2r3__doc__r`rrrrrr rs  rc@s(eZdZdZ   d ddZddZd S) directlogstreamzDirect revision log iterator. This can be used for debugging and development but it will probably leak memory and is not suitable for real conversions.rTFc s8fdd}tj|d} tj| j|||||||dS)Nc sDi}|durt|D] \}}t|||<q |||||fdSrS)rrbrZappendrerrr rp*s z*directlogstream.__init__..receiverrq)rrsrFrtru) r^rrrjr{r|r}r~rrprrrr r` s zdirectlogstream.__init__cCsdSrSrrrrr r?szdirectlogstream.closeNrTF)r1r2r3rr`rrrrr rs  rcCs*dD]}tjtj||sdSqdS)N)slockshookssformatdbFT)rLrMexistsjoin)rrMprotoxrrr filecheckFs rc Cszt}|td||fd}|}Wd|vStjyH}z!|jdkr6| t dWYd}~dS|j }WYd}~d|vSd}~wt yQYdSw)Ns%s://%s/!svn/ver/0/.svnsrbiswsvn: cannot probe remote repository, assume it could be a subversion repository. Use --source-type if you know better. TFs#) rD buildopenerrrstrurlrurlerr httperrorcodewarnrrnrw)rrMropenerrspdatarrrr httpcheckPs*   r)httpshttpsfilec@r.)NonUtf8PercentEncodedBytesNr0rrrr rpr4rcCsPtjrt|}d|vrt|St|d}z|dWSty'tw)Nu�r)rispy3rD url2pathnamerr#r"UnicodeDecodeError) unicodepathrrr url2pathname_like_subversionvs   rc Cszv|dd\}}|dkrutjr8|dddkr8|ddr8|dddkr8|ddd|dd}z|t}WntyV|t d t tYWd Swzt |}Wnt yo|t d YWd Sw| t}Wn/tyd}t|}z|tWnty|t d t tYYd SwYnw|dkrt|}n|d vrt|s|t dd St|dd}d|vr||||rdS|ddd}d|vsd S)Ns://r rr6s%3a/s:/sfSubversion requires that file URLs can be converted to Unicode using the current locale encoding (%s) FsISubversion does not support non-UTF-8 percent-encoded bytes in file URLs sbSubversion requires that paths can be converted to Unicode using the current locale encoding (%s) )rhttpsscSubversion sources don't support non-ASCII characters in HTTP(S) URLs. Please percent-encode them. cWdS)NFr)rrrr szissvnurl..Tr)r<rrisalphalowerr"rrrrsysbytesrrr#rrrPpconvertr isasciistrprotomapgetr9)rrrrrMrcheckrrr issvnurls          rcseZdZd8fdd ZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ d9ddZ ddZddZddZd8dd Zd!d"Zd8d#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd8d/d0Zd8d1d2Z 3 4 5d:d6d7ZZS); svn_sourceNc stt|j||||dt|ds7|ds7tj|r*tjtj|ds7t ||s7t t d|t durGt t dt ddzt jjt jjf}|d krbt t d |t d d Wntyvt t d t d d wi|_d}z|d}|dkrt||dd}|d|}Wn tyYnwt||_d|_zStEtj|jd|_|jj|_|jj|_t j |j|_!t"#|jt$|j!d|_%d|_&|j%|_'i|_(i|_)t j*|j|_+Wdn1swYWn&t jj,y"|-dt jjt jjt jj.f}t t d|j|fw|rPt$|dkr4t/0t dzt|d}WntyOt/0t d|dw|j12dd} | dur^d} | 3d|_4|j12dd|_5zt|j5|_5|j5dkr|d|_5Wntyt/0t d|j5wzt|6|j%||_7Wdn 1swYWn t8yd|_7Ynw|j7st/0t d|j%|9|j7|_:d|_;tjtj|dr||_superrr`r!r=rLrMrrrNoReporrF MissingToolrI SVN_VER_MAJOR SVN_VER_MINORAttributeErrorlastrevsrfindr;rrRrrrrrrrsrtrGctxget_repos_rootbaseurlrDunquoter:r prevmodule rootmodulecommitsrjget_uuidrArK traceback SVN_VER_MICROrrrconfigstrip trunknamestartrevlatestheadr/r@ last_changed _changescachewc convertfp) r^rrepotyperrrversionrat svnversiontrunkcfg __class__rr r`s                        zsvn_source.__init__cCst|_|jdSrS)rr __enter__rrrr beforecs zsvn_source.beforecCs|jddddSrS)r__exit__rrrr aftergszsvn_source.aftercCsBi}|D]}t|\}}}|||}||kr|||<q||_dSrS)rC setdefaultr)r^revmaprrevidrArr@ lastrevnumrrr setrevmapjs  zsvn_source.setrevmapcCsHztj|jddt||d|jWdStjjy#YdSw)Nr6FT) rFrGlsrrrstriprErrIrK)r^rMrYrrr rsszsvn_source.existsc sfdd}fdd}tj}d}|d|}|d|_|d|}|rIjp)d}jd |7_jj_jsIttd jjg_ jdur]d |jpYdf_|rj d }t j |d t||d j}t|D]9} d ||| f} || jsqy| j} | sjtd| qyjtd| | fj | qyjrވj rtj dkrttdj d} | jkrttdjj S)Ncs||}|tjjkSrS) _checkpathrFrI svn_node_dir)rMr@rVrrr rNs  z"svn_source.getheads..isdircsjdd|}|dur|dkrdS|p|d}||s=j|r.|dkr.dS|r;ttd||fdSj td|t |f|S)Nrssvn.r7r6rs&expected %s to be at %r, but not foundsfound %s at %r ) rrrrrendswithrrrnoterbytestr)rr>cfgpathrMrrr getcfgpaths$ z'svn_source.getheads..getcfgpathr7rstagssbranchesr6rs%s/%sFs%s/%s/%ssignoring empty branch %s sfound branch %s at %d r s>svn: start revision is not supported with more than one branchrs.svn: no revision found after start revision %d)rYrtagsrrrrrrheadsrrrrFrGrrErsortedrrr@rrr:) r^rNrr> oldmoduletrunkbranchesrpath branchnamesbranchrbrevidr@rrr getheadssh                zsvn_source.getheadsc Cs|j|\}}i}|r||||\}|_}|s|s@t|\}}} tj|jt|t | d|j } ddt | D}t |_|t ||gt|}||fS)NTcSs"g|] \}}|jtjjkr|qSrrVrFrI svn_node_file).0nerrr s z*svn_source._getchanges..)rj expandpathsremovedrCrFrGrrrErYrrrbsetsortziplistr:) r^r>fullrjparentscopiesfilesrArr@entriesrrr _getchangess zsvn_source._getchangescCsF|jd|kr|s|jd\}}n |||\}}|j|=||tfS)Nrr )rrrjr)r^r>rrrrrr getchangess  zsvn_source.getchangescCs,||d\}}|||ff|_dd|DS)NFcSg|]}|dqSrrr frrr rz.svn_source.getchangedfiles..)rr)r^r>irrrrr getchangedfilesszsvn_source.getchangedfilescCs||jvr7t|\}}}||_|||j|d}||kr#|d}|||||jvr7tt d||j|}|j|=|S)Nrr ssvn: revision %s not found) rrCrreparentrr_fetch_revisionsrrr)r^r>rArr@stop revcommitrrr getcommits     zsvn_source.getcommit splicemapcCs&td|sttd||fdS)z:fails if revision format does not match the correct formatsWsvn:[0-9a-f]{8,8}-[0-9a-f]{4,4}-[0-9a-f]{4,4}-[0-9a-f]{4,4}-[0-9a-f]{12,12}(.*)@[0-9]+$s.%s entry %s is not a valid revision identifierN)rematchrrr)r^revstrmapnamerrr checkrevformatszsvn_source.checkrevformatcCst|jddd|jS)Nr5r )r;rr9rrrrr numcommitsszsvn_source.numcommitsc s4i}|jdur |Sg}|j}tj|j}||jg||j}z|D]}|\}}} } } |s/g}ddt|D} | jdd|} | rQ| dd|krQ| d} | D]7\}}}| |ds`qS|D]}|d |r||dt |d}||g|dd<n qb| |||gqSd d t|D}t }|D] }|D]\}}}| |dr| ||drq||q|D] fd d|D}qg}|D];\}}}|dd}| | r| |||gq||vrqz|||}|r||vr|||<WqtyYqw|}| }q"W||S|w) NcSs$g|]\}}|jr|j|j|fqSr)r[r\r r_rrrr r8s  z&svn_source.gettags..T)reverserarrr6cSs(i|]\}}|jdkr|jr||jqS)A)r]r[r0rrr Ws z&svn_source.gettags..cs.g|]}|dkr|dds|qS)rr6)r=)r r_badrootrr rgs )rrFrtget_latest_revnum_getlogrrrbrpopr=r:rraddr<rr/r)r^rpendingstagspathr{streamr origpathsr@rgr)rhr srctagspathsource sourcerevdesttagtagpathaddedsbadrootsdestroot renamingstagnametagidrr4r gettagss          R zsvn_source.gettagsc Cs\|jsdS|jdurttj|jddd|_|jtd|| |f|j dS)Nr hg-shamapsabs%s %d ) rrrrLrMrwriter tonativeeolr@ry)r^r>destrevrrr converteds zsvn_source.convertedcCsd|j|p|j|fS)Ns svn:%s%s@%d)rAr)r^r@rrrr rzsvn_source.revidcCst|ddS)Nr5ra)r;r<r^r>rrr r@zsvn_source.revnumcsd fdd }|jsjd|dS|dur"tjj}zd}tjj| d|}|Wn tj j yGd}Ynw|sTt t d||f||||j\}}|durv|||\}}|durvjd|dS|jsjd|dS||S) a]Find the latest revid affecting path, up to stop revision number. If stop is None, default to repository latest revision. It may return a revision in a different module, since a branch may be moved without a change being reported. Return None if computed module does not belong to rootmodule subtree. Nc s|g||pd}zU|D]E}|\}}}}} |dur|rn5|dur(||kr(n+|D]'} || r6|| js7q*|| j|t| d} jd|| |f| }q |sWd}||fW|S|w)Nr s#branch renamed from %s to %s at %d )r7r=r[r:rdebugr) rMr{r&r<rrjr@rgr)rhr_newpathrrr findchangess0 z&svn_source.latest..findchangessignoring foreign branch %r r7r6s%s not found up to revision %dsignoring empty branch %r rS)r=rrrSrFrtr6r$statrrIrKr/r created_revr)r^rMr&rUrdirentr@realpathrrr rs6    zsvn_source.latestcCsX|j|kr|S|jt|}|j}|durd}|jd|tj|j|||_|S)z:Reparent the svn transport and return the previous parent.Nr7sreparent to %s )rrrErrSrFrtr$)r^rsvnurlrrrr r$s zsvn_source.reparentcCstt}}i}t|dd\}}||jkr!||_||j|jjtdtdt|d} t|D]\} \} } | j | | d| | } | | |}|t j jkr||| | jr`|saq4t|ddd\}}| j|krsq4| | j|}|s}q4|jd| || jf||||| <q4|dkr |jd| jt|ddd\}}|d | }| | ||}|t j jkr||| q4|t j jkr|d }| d }|||}|D]}|||}| d ||}|r|||qq4|jd || fq4|t j jkr| jd krq4| jd krf|rft|ddd\}}| | ||}|t j jkrC||| n#|t j jkrf|||D]}| d |}|rd|||qP|| |D]}| d |}|r|||ql| jr|sq4t|ddd\}}| j|krq4| | j|}|sq4|jd | || jf|| j| j}|D])}| d ||}|s͐q| |t|d}| |}|||||<qq4| | |t|||fS)Nr sscanning pathsspaths)unittotal)itemrscopied to %s from %s@%d s gone from %d r6s unknown path in revision %d: %s MRsmark %s came from %s:%d )rrCrr$r makeprogressrr: enumerateupdate getrelpathrrFrIr r9recoder[r\rSrr _iterfilesreplacer]completelist)r^r>rjrchangedrr new_moduler@progressr"rMent entrypathrVpmoduleprevnumr[ parentpathfromkindorootnrootchildren childpathpkind copyfrompath copytopathrrr rs                      zsvn_source.expandpathsc s|kr |}d_fdd}jtdj|fzd}d}jg|}z>|D]5}|\}} } } } | jkrDd}n$|sUjd| |pS| dk}q2||| | | | \} }| rc| }|rgnq2W|n|w|s|r|j sz' |j }|dkr j|d}|r|j |WWdSWWdSWWdStyYWdSwWdSWdSWdStjjy}z|j\}}|tjjkrttd d}~ww) Ncsjd|t|fd}|}|jvs|kr d|fSg}tt|}fdd|D}|r}|d\} } | jrwd}| jj t| d} | | j } | durvt | dd\} }|j krv| g}jtd j || fnjd g}|D]\} } | durq|| | fqt|}jd d rt|d }|r|}nd}|r|}nd}zj dd}|jkrd}Wn tyd}Ynwt|t|d||||d}|j|<||jfj|<jrjjs|gjjdd<|_||fS)zlReturn the parsed commit object or None, and True if the revision is a branch root. s!parsing revision %d (%d changes) FNcs$g|]\}}j|r||fqSr)rr=r0rrr r{s zFsvn_source._fetch_revisions..parselogentry..raTr s$found parent of branch %s at %d: %s s)no copyfrom path, don't know what to do. rs localtimezonerr7r6s%Y-%m-%d %H:%M:%S %1%2)rgr)descrrr>)rrSr:rrrrrbr[rrr\rCrrrrcrr- configboolmakedatetimestamprdr<r IndexErrorcommitr r(rrj child_cset)rfr@rgr)rhbranchedr>r root_pathsrMrlrTprevidrrorjlogrcsetr^ to_revnumrr parselogentrygs               z2svn_source._fetch_revisions..parselogentrys-fetching revision log for "%s" from %d to %d FTsrevision %d has no entries rr ssvn: branch has no revision %s)r~rrrrr7rrSrrr@r>rrr/rFrIrKrSVN_ERR_FS_NO_SUCH_REVISIONrr)r^ from_revnumrr firstcset lastonbranchr<rrjr@rgr)rhr firstrevnumrxxx_todo_changemernumrrr r%asn W         zsvn_source._fetch_revisionsc Cs||jvrdSzHt|dd\}}|j|kr ||_||jt}tj|j|||}|}| t |t r>|d}d|vrDdpEd}d|vrLdpM|}Wn#tj j yr} ztj jtj jf} | j| vrmWYd} ~ dSd} ~ ww|dkrd } || r|t| d}||fS) Nrr rasvn:executablexr7s svn:speciallslink )rrCrr$stringiorFrtget_filegetvaluer isinstancerhrIrKSVN_ERR_FS_NOT_FOUNDSVN_ERR_RA_DAV_PATH_NOT_FOUNDapr_errr=r:) r^filer>rjr@ioinformodernotfound link_prefixrrr getfiles:      zsvn_source.getfilecsldtj}d|jtgd}tj|t |d|j |}r*d7fddt |DS)z3Enumerate all files in path at revnum, recursively.r6Tc3s*|]\}}|jtjjkr|VqdSrSr r0rQrr sz(svn_source._iterfiles..) rrFrIPoolrrrErGrrYrrrb)r^rMr@rirrrrQr res   zsvn_source._iterfilescCst|dur|j}||r(|dt|d}|dr"|ddS|dkr(|S|jdt|t|fdS)Nr6r r7s%r is not under %r, ignoring )rr=rr:rrSrr)r^rMrrelativerrr rc s   zsvn_source.getrelpathc Csd|dur|d}|d|}ztj|j|d|W|dur&||SS|dur1||ww)Nr7r6)r$rFrt check_pathr)r^rMr@rrrrr r7s    zsvn_source._checkpathrTFcCsg}|D]}|ds|jd|}||dq|j||||||g} |jdds0t| St| } t } dt | } t | \} }| | z | Wt|Stybttdw)Nr6rssvn.debugsvnlogs%s debugsvnlogr)r=rrrrrrzr encodeargsr hgexecutable shellquotepopen2rLrrvrrrr)r^rjr{r|r}r~rrelpathsr_rarghgexecmdstdinrrrr r7Cs<      zsvn_source._getlogrS)r)r)r1r2r3r`rrrrr rrr#r(r.r/rJrOrr@rr$rr%rrercrr7 __classcell__rrrr rs>  T   j  M l!  rs#!/bin/sh REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5" %(rules)s echo "Changing prohibited revision property" >&2 exit 1 cCs6g}|D] \}}|d||fqtdd|iS)Ns>if [ "$ACTION" = "%s" -a "$PROPNAME" = "%s" ]; then exit 0; fisrules )rpre_revprop_change_templater)prop_actions_allowedrulesr]propnamerrr gen_pre_revprop_change_hooks rc@seZdZedejZedejZddZddZ ddZ d d Z d d Z d dZ ddZeddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)S)*svn_sinksCommitted revision (\d+).sRepository UUID:\s*(\S+)cCs|jr t|jdSdSrS)rrLchdirrrrr prerunzsvn_sink.preruncCs|jr t|jdSdSrS)rrLrcwdrrrr postrunrzsvn_sink.postruncCstj|jd|S)NrrLrMrr)r^rrrr rrRz svn_sink.joincC |dS)NrKrrrrr revmapfilerzsvn_sink.revmapfilecCr)Ns hg-authormaprrrrr authorfilerzsvn_sink.authorfilec CsPtjdddtjdddt||||t||dg|_g|_g|_g|_d|_ t |_ d}t jt j|ddrLt j||_ |dnrtd |st j|}t jt j|rt jt j|d d s|td t j|t|dd ||}t|}|dsd|}d|}t jt t j|d}|tdt j||d||||_ t|j |_ t|j |_!t"||d|_#t$|j rtj%|_&nd|_&|rgd}|j'(ddr|)dt j|dd}t*|d}|+t,||-t.|dd|d} |j/| 0d1|_2dS)Nssvns subversion)debnamessvnadminFrsentriessupdates"^(file|http|https|svn|svn\+ssh)://rsfs-types!initializing svn repository '%s' screater6sfile://s-wcs#initializing svn working copy '%s' scheckouts hg-childmap))r^ssvn:log)r2hg:convert-branch)r2hg:convert-revrsvn.dangerous-set-commit-dates)r^svn:daterspre-revprop-changeswbTsinfor )3r checktoolconverter_sinkr` commandlinedeletesetexecdelexecrrrgetcwdrrLrMisfilerrYrun0r*searchrNdirnamerstatusrbasenamerrOr=vfsmodr rwopenermapfilechildmap checkexecisexecis_execrrzrrrLrrsetflagsuuid_regrouprrA) r^rrrMcreatedwcpathrhookrnoutputrrr r`sx             zsvn_sink.__init__cGstjj|jg|RSrSr)r^namesrrr wjoinrPzsvn_sink.wjoincCst}|jdddd}tjj|}|dD]'}|jD]!}|j|j ks)|j dkr*qd dd|jD}| t |q|S) NslsT) recursivexmlrrcss"|] }|j|jkr|jVqdSrS)nodeType TEXT_NODEr)r crrr rsz$svn_sink.manifest..)rrrdomminidom parseStringgetElementsByTagName childNodesr ELEMENT_NODEtagNamerr9r unitolocal)r^mrdocrrrrrr manifests  zsvn_sink.manifestcCsd|vr |j||dSztj||rt|Wn ty&Ynw|jr=d}tj ||r=|||}|j |||jrl|rTd|vrS|j |n d|vr^|j |t||dd|vdSdS)NrFr)rsymlinkrLrMislinkrunlinkOSErrorrrrLrrrrr)r^filenameflagsrwasexecrrr putfiles.    zsvn_sink.putfilecCs||}tj|}|r*tjdtj|d\}}t|t|t ||z+| d||W|j ||rTzt|Wn t yKYnwt ||dSdS|j ||rvzt|Wn t ynYnwt ||ww)Nshg-copy-)prefixdirscopy)rrLrMlexistsrmkstemprrrrenamerrr9r)r^r?rAwdestrfdtempnamerrr _copyfile"s:          zsvn_sink._copyfilecsdt}|D]*tj|r|ttfdddD] |dq#q|S)NcsddS)Nr6r)rrr r"rr r@sz"svn_sink.dirs_of..ra)rrLrMrNrr9r:iter)r^rdirsrrr dirs_of:s zsvn_sink.dirs_ofcsBfddt|D}|rj|j|dddd|S)Ncg|] }|jvr|qSrr)r drrr rEsz%svn_sink.add_dirs..addT) non_recursivequiet)rrrrbxargs)r^radd_dirsrrr r Ds   zsvn_sink.add_dirscs6fdd|D}|rj|j|ddd|S)Ncrrrrrrr rNsz&svn_sink.add_files..r T)r )rrbr )r^rrrr add_filesMs  zsvn_sink.add_filescCs||j|<dSrS)r)r^parentchildrrr addchildTzsvn_sink.addchildcCsd|j|fS)Ns svn:%s@%s)rArQrrr rWrzsvn_sink.revidc  Cs|D]} z ||j| WStyYqw|D],\} } || | \} } | dur2|j| q|| | | | |vrG|j|| | gq|rV|jt |j |dd|D}t |j}t |}||| ||jr|jD] \}}|||qwg|_|jr||jd|jD]} |j | qg|_||| ||jr||jddg|_|jr||jdddg|_tjdd \}}t|d }|t|j|z|jd t !|j"|d d }z |j#$|%d}Wn1t&y+|s|r |dndYWt'|S|j()t*d|j()|t+,t*dw|j-r;|j.dd|j-d|d|j/rP|j/dkrP|j.dd|j/d|d|j(0ddrpt12|j3}|ddf}|j.ddt4|d|d|D] } |5| |qr||Wt'|St'|w)NcSrrrrrrr rnr!z&svn_sink.putcommit..sdeletespropdelrspropset*s hg-convert-)rwbscommitsutf-8)usernamerrr rsNonesunexpected svn output: sunable to cope with svn outputrT)revproprevisionsdefaultrrrr)6rrKeyErrorrrrrrextendrr differencer frozensetrbr rr removerrrrrrLfdopenrLrrMryrrr shortuserrg commit_rerrrrrrrrrr>runrrzr r,r)r*r)r^rrrr}r?rrcleanp2rr rlrrrr%rr messagefilernrr>r)rrr putcommitZs       )    zsvn_sink.putcommitcCs|jtddS)Ns/writing Subversion tags is not yet implemented r)rrr)r^rrrr puttagsszsvn_sink.puttagscCr)NTrrQrrr hascommitfrommapszsvn_sink.hascommitfrommapcCs ||jvrdSttd|)NTs_splice map revision %s not found in subversion child map (revision lookups are not implemented))rrrrrQrrr hascommitforsplicemaps zsvn_sink.hascommitforsplicemapN)r1r2r3r*compileMrrrrrrrr`r propertycacherrrrr rrrr#r$r%r&rrrr rs.J   d rr)P __future__rrrrLr*xml.dom.minidomrmercurial.i18nrmercurial.pycompatr mercurialrrrrr rmercurial.utilsr r r rrrcrr)rrDrr}rconverter_sourcerrr{rrrrF svn.clientsvn.coresvn.ra svn.deltarwarningsfilterwarningsDeprecationWarningrIrK ImportErrorrr!r&r*r-rwr/rCrErRrYobjectrZrrrrhrrrrrrrrrrrrrrr s           /+ U