ó ’gdSc@sÆdZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z e eddƒZ e eddƒZ e eddƒZ e eddƒZd Zd „Zd „Zd „Zeed „Zd„Zd„Zd„Zd„ZejdƒZd„ZejdkrEd„Zn ejZdd„Z!d„Z"d„Z#ej$ƒpej%ƒZ&ejdkrœe'Z(ne(Z(d„Z)dS(sŻ sphinx.util.osutil ~~~~~~~~~~~~~~~~~~ Operating system-related utility functions for Sphinx. :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. i’’’’N(tpathtEEXISTitENOENTtEPIPEtEINVALt/cCs|jttjƒS(N(treplacetSEPRtsep(t canonicalpath((ssphinx/util/osutil.pytos_path#scCsß|jtƒr|S|jtƒ}|jtƒ}xOt|d |d ƒD]6\}}||krePn|jdƒ|jdƒqIW||kr“dSt|ƒdkr¼|dgkr¼dtSdtt|ƒdtj|ƒS(s.Return a relative URL from ``base`` to ``to``.i’’’’itit.s..(t startswithRtsplittziptpoptlentjoin(tbasettotb2tt2txty((ssphinx/util/osutil.pyt relative_uri's$   !cCsFytj|ƒWn.tk rA}|jdtgkrB‚qBnXdS(sEnsure that a path exists.iN(tostmakedirstOSErrorterrnoR(Rterr((ssphinx/util/osutil.pyt ensuredir>s c cs-tj|ƒ}gg}}x~|D]v}ytj||ƒ}Wn+tk rltjd|tfIJq#nXtj|ƒrŒ|j |ƒq#|j |ƒq#W|r“|||fVnx[|D]S}tj||ƒ}|sétj |ƒ r»x"t |||ƒD] }|VqüWq»q»W|s)|||fVndS(sRBackport of os.walk from 2.6, where the *followlinks* argument was added. sU%s:: ERROR: non-ASCII filename not supported on this filesystem encoding %r, skipped.N( RtlistdirRRt UnicodeErrortsyststderrt fs_encodingtisdirtappendtislinktwalk( ttopttopdownt followlinkstnamestdirstnondirstnametfullpathR((ssphinx/util/osutil.pyR(Hs,     ccsx†|D]~}xutj|ƒD]d\}}}xR|D]J}|j|ƒr3ytjtj||ƒƒVWq}tk ryq}Xq3q3WqWqWdS(N(RR(tendswithRtgetmtimeRtEnvironmentError(tdirnamestsuffixtdirnametrootR-tfilestsfile((ssphinx/util/osutil.pytmtimes_of_filesgs   cCsNtjj|ƒr:ytj|ƒWq:tk r6q:Xntj||ƒdS(s3Move a file, removing the destination if it exists.N(RRtexiststunlinkRtrename(tsourcetdest((ssphinx/util/osutil.pytmovefilers  cCsAtj|ƒ}ttdƒr=tj||j|jfƒndS(s!Copy a file's modification times.tutimeN(RtstatthasattrRAtst_atimetst_mtime(R>R?tst((ssphinx/util/osutil.pyt copytimes|scCs9tj||ƒyt||ƒWntk r4nXdS(s4Copy a file and its modification times, if possible.N(tshutiltcopyfileRGR(R>R?((ssphinx/util/osutil.pyRIƒs  s[^a-zA-Z0-9_-]cCstjd|ƒpdS(NR tsphinx(tno_fn_retsub(tstring((ssphinx/util/osutil.pyt make_filenamesicGsDtjtjƒdpd}tjt|ƒj|ƒ|Œj|ƒS(Nisutf-8(tlocalet getlocaletLC_TIMEttimetstrftimetunicodetencodetdecode(tformattargstenc((ssphinx/util/osutil.pyt ustrftime”scCs:ddlm}y|||ƒSWntk r5|SXdS(Ni’’’’(trelpath(tsphinx.util.pycompatR[t ValueError(RtstartR[((ssphinx/util/osutil.pyt safe_relpaths  cCs)|r|jtdƒd}n|}|S(Nii(RR(tdocnamet compactiontret((ssphinx/util/osutil.pyt find_catalog¤sc Cs’ddlm}|o|s gSt||ƒ}g|D]*}tj|tj||ƒ|gƒ^q6}g|D]} | rm|| |ƒ^qm}|S(Ni’’’’(R[(R\R[RctgettexttfindRR( R`tsrcdirt locale_dirstlangRaR[tdomaintdir_R8tf((ssphinx/util/osutil.pytfind_catalog_files­s 4(cCs4tj|ƒ}t|tƒr0|jtƒ}n|S(N(Rtabspatht isinstancetbytesRVR$(tpathdir((ssphinx/util/osutil.pyRmĀs(ii(ii(*t__doc__RtreR"RRRRORHRdRtgetattrRRRRRR RRtTruetFalseR(R:R@RGRItcompileRKRNt version_infoRZRStNoneR_RcRltgetfilesystemencodingtgetdefaultencodingR$tstrRoRm(((ssphinx/util/osutil.pyt sF