U oÏ aÔiã @sNddlmZdZdZdZdZdZdZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZzddlZddlZWnek r”dZZYnXeefZzeef7ZWnek rÀYnXd d d d gZejdd kræddlZnddlZejZdZdZedZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1d Z2d!Z3d"Z4dZ5d#Z6d$Z7e6Z8e&e'e(e)e,e-e.e*e+e/e0e1f Z9e&e'e.e1fZ:e/e0e1fZ;d%Ze?e?e?e@e@e@d'œZAd(ZBd)ZCd*ZDd+ZEd,ZFd-ZGd.ZHd/ZIdZJd0ZKd1ZLd2ZMd3ZNd4ZOd5ZPd6ZQd$ZRd#ZSe jTd7krd8ZUne V¡ZUd9d:„ZWd;d<„ZXd=d>„ZYd5e8fd?d@„ZZdAdB„Z[dzdCdD„Z\eBdEfeCdFfeDdGfeEdHfeFdIfeGdJffeKdKffeLdLffeMeHBdMfeHdNfeMdOffeNdKffeOdLffePeIBdMfeIdNfePdOffeQdKffeRdLffeSeJBdPfeJdQfeSdOfff Z]dRdS„Z^GdTd „d e_ƒZ`GdUdV„dVe`ƒZaGdWdX„dXe`ƒZbGdYdZ„dZe`ƒZcGd[d\„d\e`ƒZdGd]d^„d^e`ƒZeGd_d`„d`eeƒZfGdadb„dbeeƒZgGdcdd„ddeeƒZhGdedf„dfeeƒZiGdgdh„dheeƒZjGdidj„djekƒZlGdkdl„dlekƒZmGdmdn„dnekƒZnGdodp„dpekƒZoGdqdr„drekƒZpGdsdt„dtekƒZqGdud „d ekƒZrGdvd „d ekƒZsGdwdx„dxekƒZtdyd „ZueZvesjZdS){é)Úprint_functionz $Revision$z0.9.0u"Lars Gustäbel (lars@gustaebel.de)z5$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $z?$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.NÚTarFileÚTarInfoÚ is_tarfileÚTarErroréóéésustar sustar00édé›ó0ó1ó2ó3ó4ó5ó6ó7óLóKóSóxógóXéé)ÚpathÚlinkpathÚsizeÚmtimeÚuidÚgidÚunameÚgname)rrr#r$)ÚatimeÚctimer r!r"ri i€i`é@i iiééé€é@é ééé)ÚntZcezutf-8cCs(| ||¡}|d|…|t|ƒtS)z8Convert a string to a null-terminated bytes object. N)ÚencodeÚlenÚNUL)ÚsÚlengthÚencodingÚerrors©r8úfC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-6mt8ur68\pip\_vendor\distlib\_backport\tarfile.pyÚstn¹s r:cCs*| d¡}|dkr|d|…}| ||¡S)z8Convert a null-terminated bytes object to a string. réÿÿÿÿN)ÚfindÚdecode)r4r6r7Úpr8r8r9Únts¿s  r?cCs„|dtdƒkrJztt|ddƒp"ddƒ}Wq€tk rFtdƒ‚Yq€Xn6d}tt|ƒdƒD] }|dK}|t||dƒ7}q^|S) z/Convert a number field to a python number. rr*ÚasciiÚstrictÚ0r.zinvalid headerr)ÚchrÚintr?Ú ValueErrorÚInvalidHeaderErrorÚranger2Úord)r4ÚnÚir8r8r9ÚntiÇsrKcCs¼d|krd|dkrÚrÚwr4ÚSÚxÚtÚTcCsJg}tD]6}|D]"\}}||@|kr| |¡qq| d¡qd |¡S)zcConvert a file's mode to a string of the form -rwxrwxrwx. Used by TarFile.list() riÚ)Úfilemode_tableÚappendÚjoin)ÚmodeÚpermÚtableÚbitÚcharr8r8r9Úfilemode8s    r{c@seZdZdZdS)rzBase exception.N©Ú__name__Ú __module__Ú __qualname__Ú__doc__r8r8r8r9rGsc@seZdZdZdS)Ú ExtractErrorz%General exception for extract errors.Nr|r8r8r8r9rJsrc@seZdZdZdS)Ú ReadErrorz&Exception for unreadable tar archives.Nr|r8r8r8r9r‚Msr‚c@seZdZdZdS)ÚCompressionErrorz.Exception for unavailable compression methods.Nr|r8r8r8r9rƒPsrƒc@seZdZdZdS)Ú StreamErrorz=Exception for unsupported operations on stream-like TarFiles.Nr|r8r8r8r9r„Ssr„c@seZdZdZdS)Ú HeaderErrorz!Base exception for header errors.Nr|r8r8r8r9r…Vsr…c@seZdZdZdS)ÚEmptyHeaderErrorzException for empty headers.Nr|r8r8r8r9r†Ysr†c@seZdZdZdS)ÚTruncatedHeaderErrorz Exception for truncated headers.Nr|r8r8r8r9r‡\sr‡c@seZdZdZdS)ÚEOFHeaderErrorz"Exception for end of file headers.Nr|r8r8r8r9rˆ_srˆc@seZdZdZdS)rFzException for invalid headers.Nr|r8r8r8r9rFbsrFc@seZdZdZdS)ÚSubsequentHeaderErrorz3Exception for missing and invalid extended headers.Nr|r8r8r8r9r‰esr‰c@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) Ú _LowLevelFilez‰Low-level file object. Supports reading and writing. It is used instead of a regular file object for streaming access. cCsFtjtjtjBtjBdœ|}ttdƒr2|tjO}t ||d¡|_dS)N)rlrmÚO_BINARYi¶) ÚosÚO_RDONLYÚO_WRONLYÚO_CREATÚO_TRUNCÚhasattrr‹ÚopenÚfd)ÚselfÚnamervr8r8r9Ú__init__rsþý  z_LowLevelFile.__init__cCst |j¡dS©N)rŒÚcloser“©r”r8r8r9r˜{sz_LowLevelFile.closecCst |j|¡Sr—)rŒr_r“©r”rr8r8r9r_~sz_LowLevelFile.readcCst |j|¡dSr—)rŒr`r“©r”r4r8r8r9r`sz_LowLevelFile.writeN)r}r~rr€r–r˜r_r`r8r8r8r9rŠls  rŠc@steZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z ddd„Z ddd„Z dd„Zdd„ZdS)Ú_Streama˜Class that serves as an adapter between TarFile and a stream-like object. The stream-like object only needs to have a read() or write() method and is accessed blockwise. Use of gzip or bzip2 compression is possible. A stream-like object could be for example: sys.stdin, sys.stdout, a socket, a tape device etc. _Stream is intended to be used only internally. cCsRd|_|dkrt||ƒ}d|_|dkr6t|ƒ}| ¡}|p„Z(d?d@„Z)dAdB„Z*dCdD„Z+dEdF„Z,dGdH„Z-dIdJ„Z.dKdL„Z/dMdN„Z0dOdP„Z1dQdR„Z2dSdT„Z3dUS)WraInformational class which holds the details about an archive member given by a tar header block. TarInfo objects are returned by TarFile.getmember(), TarFile.getmembers() and TarFile.gettarinfo() and are usually created internally. )r•rvr!r"rr ÚchksumÚtypeÚlinknamer#r$ÚdevmajorÚdevminorrÝrìÚ pax_headersrírïÚ_sparse_structsÚ _link_targetrrcCsj||_d|_d|_d|_d|_d|_d|_t|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_i|_dS)zXConstruct a TarInfo object. name is the optional name of the member. i¤rrrN)r•rvr!r"rr rÚREGTYPErrr#r$rrrÝrìrír©r”r•r8r8r9r–©s"zTarInfo.__init__cCs|jSr—©r•r™r8r8r9Ú_getpathÃszTarInfo._getpathcCs ||_dSr—r r r8r8r9Ú_setpathÅszTarInfo._setpathcCs|jSr—©rr™r8r8r9Ú _getlinkpathÉszTarInfo._getlinkpathcCs ||_dSr—r)r”rr8r8r9Ú _setlinkpathËszTarInfo._setlinkpathcCsd|jj|jt|ƒfS)Nz<%s %r at %#x>)Ú __class__r}r•Úidr™r8r8r9Ú__repr__ÏszTarInfo.__repr__cCsl|j|jd@|j|j|j|j|j|j|j|j |j |j |j dœ }|dt krh|d d¡sh|dd7<|S)z9Return the TarInfo's attributes as a dictionary. éÿ) r•rvr!r"rr rrrr#r$rrrr•ú/)r•rvr!r"rr rrrr#r$rrÚDIRTYPEr¿)r”Úinfor8r8r9Úget_infoÒs"ózTarInfo.get_infoÚsurrogateescapecCsT| ¡}|tkr| |||¡S|tkr4| |||¡S|tkrH| ||¡Stdƒ‚dS)zq*z|| dd ¡Wn$tk rv||||<Yq*YnXt||ƒ|kr*||||<q*d D]`\}}||kr´d ||<qš||}d |krØd |d krænn t|t ƒršt |ƒ||<d ||<qš|r|  |t |¡} nd} | |  |tdd¡S)z³Return the object as a ustar header block. If it cannot be represented this way, prepend a pax extended header sequence with supplement information. r r•rrr)r#r#r,)r$r$r,r@rA))r!r.)r"r.)ré )r r+rr.rržr¸)r"rÚcopyr$r#r1ÚUnicodeEncodeErrorr2Ú isinstanceÚfloatÚstrÚ_create_pax_generic_headerÚXHDTYPEr&r) r”rr6rr•Úhnamer5rUÚvalr[r8r8r9rs8 þ   *  zTarInfo.create_pax_headercCs| |td¡S)zAReturn the object as a pax global header block sequence. Úutf8)r1ÚXGLTYPE)Úclsrr8r8r9Úcreate_pax_global_headerDsz TarInfo.create_pax_global_headercCsj|dtd…}|r.|ddkr.|dd…}q|t|ƒd…}|dd…}|rZt|ƒtkrbtdƒ‚||fS)zUSplit a name longer than 100 chars into a prefix and a name part. Nrr;rzname is too long)Ú LENGTH_PREFIXr2r$rE)r”r•r!r8r8r9r%Js zTarInfo._posix_split_namecCsVt| dd¡d||ƒt| dd¡d@d|ƒt| dd¡d|ƒt| d d¡d|ƒt| d d¡d |ƒt| d d¡d |ƒd | dt¡t| dd¡d||ƒ| dt¡t| dd¡d||ƒt| dd¡d||ƒt| dd¡d|ƒt| dd¡d|ƒt| dd¡d||ƒg}t dtd |¡¡}t |t d…ƒd}|dd…d|  d¡|dd…}|S)z„Return a header block. info is a dictionary with file information, format must be one of the *_FORMAT constants. r•rrr rvrrr.r!r"rr+r s rrr r#r,r$rrr!r z%dsržNi”þÿÿz%06or@i›þÿÿ) r:ÚgetrWr r"rPrRrÓrur^r1)rrVr6r7Úpartsr[rr8r8r9r&Ys(  ñ&zTarInfo._create_headercCs.tt|ƒtƒ\}}|dkr*|t|t7}|S)zdReturn the string payload filled with zero bytes up to the next 512 byte border. r)rar2rÓr3)Úpayloadrerfr8r8r9Ú_create_payloaduszTarInfo._create_payloadcCsR| ||¡t}i}d|d<||d<t|ƒ|d<t|d<| |t||¡| |¡S)zTReturn a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence for name. z ././@LongLinkr•rrr )r1r3r2r'r&rr=)r7r•rr6r7rr8r8r9r(s ÿzTarInfo._create_gnu_long_headerc Cs2d}| ¡D]8\}}z| dd¡Wq tk rBd}YqFYq Xq d}|rV|d7}| ¡D]\}}| d¡}|r‚| |d¡}n | d¡}t|ƒt|ƒd}d } } |tt| ƒƒ} | | krÂqÈ| } q¨|tt| ƒd ƒd |d |d 7}q^i} d| d<|| d<t|ƒ| d<t| d<| | td d¡|  |¡S)z¡Return a POSIX.1-2008 extended or global header sequence that contains a list of keyword, value pairs. The values must be strings. Fr5rATržs21 hdrcharset=BINARY rrrr@ó ó=rõz././@PaxHeaderr•rrr r¸) Úitemsr1r-r2r0Úbytesr"r&rr=) r7rrr6ÚbinaryÚkeywordÚvalueÚrecordsrMrIr>rr8r8r9r1s<  ( ÿz"TarInfo._create_pax_generic_headerc Csvt|ƒdkrtdƒ‚t|ƒtkr(tdƒ‚| t¡tkr>tdƒ‚t|dd…ƒ}|t|ƒkrbt dƒ‚|ƒ}t |dd…||ƒ|_ t|dd …ƒ|_ t|d d …ƒ|_ t|d d …ƒ|_t|d d …ƒ|_t|d d…ƒ|_||_|dd …|_t |d d…||ƒ|_t |dd…||ƒ|_t |dd…||ƒ|_t|dd…ƒ|_t|dd…ƒ|_t |dd…||ƒ}|jtkr†|j  d¡r†t|_|jtkr8d}g}tdƒD]l} z0t|||d…ƒ} t||d|d…ƒ} Wntk rôYqYnX| | | f¡|d7}q¢t|dƒ} t|dd…ƒ} || | f|_ | !¡rP|j  "d¡|_ |rr|jt#krr|d|j |_ |S)zAConstruct a TarInfo object from a 512 byte bytes object. rz empty headerztruncated headerzend of file headerrXrYz bad checksumr élété|éˆéii i)iIiQiYiôri‚r/r+éiâiãiï)$r2r†rÓr‡Úcountr3rˆrKr^rFr?r•rvr!r"rr rrrr#r$rrÚAREGTYPEr¿rÚGNUTYPE_SPARSErGrErtÚboolrÚisdirÚrstripÚ GNU_TYPES)r7r[r6r7rÚobjr!r¨ÚstructsrJrÝÚnumbytesÚ isextendedÚorigsizer8r8r9ÚfrombufÃsZ         zTarInfo.frombufcCs8|j t¡}| ||j|j¡}|j ¡t|_| |¡S)zOReturn the next TarInfo object from TarFile object tarfile. ) r¦r_rÓrXr6r7rÍrÝÚ _proc_member)r7rïr[rSr8r8r9Ú fromtarfiles zTarInfo.fromtarfilecCsT|jttfkr| |¡S|jtkr,| |¡S|jtttfkrF|  |¡S|  |¡SdS)zYChoose the right processing method depending on the type and call it. N) rr*r)Ú _proc_gnulongrNÚ _proc_sparser2r6ÚSOLARIS_XHDTYPEÚ _proc_paxÚ _proc_builtin©r”rïr8r8r9rYs    zTarInfo._proc_membercCsR|j ¡|_|j}| ¡s$|jtkr4|| |j¡7}||_|  |j |j |j ¡|S)zfProcess a builtin type or an unknown type which will be treated as a regular file. ) r¦rÍrìÚisregrÚSUPPORTED_TYPESÚ_blockrrÝÚ_apply_pax_inforr6r7)r”rïrÝr8r8r9r_$s zTarInfo._proc_builtincCs†|j | |j¡¡}z| |¡}Wntk r>tdƒ‚YnX|j|_|jt krft ||j |j ƒ|_ n|jtkr‚t ||j |j ƒ|_|S)zSProcess the blocks that hold a GNU longname or longlink member. ú missing or bad subsequent header)r¦r_rcrrZr…r‰rÝrr*r?r6r7r•r)r)r”rïr[Únextr8r8r9r[5s  zTarInfo._proc_gnulongc CsÚ|j\}}}|`|rª|j t¡}d}tdƒD]n}z0t|||d…ƒ}t||d|d…ƒ} Wntk rzYqœYnX|r’| r’| || f¡|d7}q,t|dƒ}q||_ |j  ¡|_ |j |  |j ¡|_||_ |S)z8Process a GNU sparse header plus extra headers. rér+rKiø)rr¦r_rÓrGrKrErtrOrírÍrìrcrrÝ) r”rïrTrVrWr[r¨rJrÝrUr8r8r9r\Ks(      zTarInfo._proc_sparsecCs|j | |j¡¡}|jtkr&|j}n |j ¡}t  d|¡}|dk rX|  d¡  d¡|d<|  d¡}|dkrr|j }nd}t d¡}d}| ||¡}|s˜q&| ¡\} } t| ƒ} || d ¡d| d¡| d…} | | dd|j¡} | tkr| | ||j |j¡} n| | dd|j¡} | || <|| 7}q„z| |¡} Wntk rRtd ƒ‚YnXd |krl| | |¡nHd |kr†| | ||¡n.|  d ¡dkr´|  d¡dkr´| | ||¡|jttfkr|  ||j |j¡|j | _ d|kr| j!} |  "¡s| jt#kr| |  | j¡7} | |_ | S)zVProcess an extended or global header as described in POSIX.1-2008. s\d+ hdrcharset=([^\n]+)\nNrr5Ú hdrcharsetÚBINARYs(\d+) ([^=]+)=rrreúGNU.sparse.mapúGNU.sparse.sizezGNU.sparse.majorÚ1zGNU.sparse.minorrBr)$r¦r_rcrrr6rr,ÚreÚsearchÚgroupr=r:r6ÚcompileÚmatchÚgroupsrDÚendréÚ_decode_pax_fieldr7ÚPAX_NAME_FIELDSrZr…r‰Ú_proc_gnusparse_01Ú_proc_gnusparse_00Ú_proc_gnusparse_10r2r]rdrÝrìrarb)r”rïr[rrqrhr6Úregexr¨r5rCrDrfrÝr8r8r9r^gsd       $ ÿ  ÿ ÿ     zTarInfo._proc_paxcCshg}t d|¡D]}| t| d¡ƒ¡qg}t d|¡D]}| t| d¡ƒ¡q:tt||ƒƒ|_dS)z?Process a GNU tar extended sparse header, version 0.0. s\d+ GNU.sparse.offset=(\d+)\nrs\d+ GNU.sparse.numbytes=(\d+)\nN)rmÚfinditerrtrDroÚlistÚziprí)r”rfrr[ÚoffsetsrqrUr8r8r9rwÍszTarInfo._proc_gnusparse_00cCs@dd„|d d¡Dƒ}tt|ddd…|ddd…ƒƒ|_dS)z?Process a GNU tar extended sparse header, version 0.1. cSsg|] }t|ƒ‘qSr8)rD)Ú.0ror8r8r9Ú Ûsz.TarInfo._proc_gnusparse_01..rjú,Nrr)Úsplitr{r|rí)r”rfrrír8r8r9rvØszTarInfo._proc_gnusparse_01cCs¨d}g}|j t¡}| dd¡\}}t|ƒ}t|ƒ|dkrtd|krT||j t¡7}| dd¡\}}| t|ƒ¡q,|j ¡|_t t |ddd…|ddd…ƒƒ|_ dS)z?Process a GNU tar extended sparse header, version 1.0. Nrõrr) r¦r_rÓrrDr2rtrÍrìr{r|rí)r”rfrrïÚfieldsrír[Únumberr8r8r9rxÞs  zTarInfo._proc_gnusparse_10c CsÂ| ¡D]ª\}}|dkr&t|d|ƒq|dkr@t|dt|ƒƒq|dkrZt|dt|ƒƒq|tkr|tkr”zt||ƒ}Wntk r’d}YnX|dkr¦| d¡}t|||ƒq| ¡|_dS) zoReplace fields with supplemental information from a previous pax extended or global header. zGNU.sparse.namerrkrzGNU.sparse.realsizerrN) r@ÚsetattrrDÚ PAX_FIELDSÚPAX_NUMBER_FIELDSrErQr,r)r”rr6r7rCrDr8r8r9rdîs"  zTarInfo._apply_pax_infocCs4z| |d¡WStk r.| ||¡YSXdS)z1Decode a single field from a pax record. rAN)r=ÚUnicodeDecodeError)r”rDr6Úfallback_encodingÚfallback_errorsr8r8r9rtszTarInfo._decode_pax_fieldcCs"t|tƒ\}}|r|d7}|tS)z_Round up a byte count by BLOCKSIZE and return it, e.g. _block(834) => 1024. r)rarÓ)r”rLrerfr8r8r9rc szTarInfo._blockcCs |jtkSr—)rÚ REGULAR_TYPESr™r8r8r9rasz TarInfo.isregcCs| ¡Sr—)rar™r8r8r9ÚisfileszTarInfo.isfilecCs |jtkSr—)rrr™r8r8r9rPsz TarInfo.isdircCs |jtkSr—)rÚSYMTYPEr™r8r8r9Úissymsz TarInfo.issymcCs |jtkSr—)rÚLNKTYPEr™r8r8r9Úislnksz TarInfo.islnkcCs |jtkSr—)rÚCHRTYPEr™r8r8r9Úischr sz TarInfo.ischrcCs |jtkSr—)rÚBLKTYPEr™r8r8r9Úisblk"sz TarInfo.isblkcCs |jtkSr—)rÚFIFOTYPEr™r8r8r9Úisfifo$szTarInfo.isfifocCs |jdk Sr—)rír™r8r8r9Úissparse&szTarInfo.issparsecCs|jtttfkSr—)rrr’r”r™r8r8r9Úisdev(sz TarInfo.isdevN)rr)4r}r~rr€Ú __slots__r–r r ÚpropertyrrrrrrÚDEFAULT_FORMATÚENCODINGrrrrÚ classmethodr8r%Ú staticmethodr&r=r(r1rXrZrYr_r[r\r^rwrvrxrdrtrcrar‹rPrrr‘r“r•r–r—r8r8r8r9r›sf    1     2 >  f  c @sŒeZdZdZdZdZdZdZeZ e Z dZ e ZeZdVdd „Zedddefd d „ƒZedWd d „ƒZedXdd„ƒZedYdd„ƒZddddœZdd„Zdd„Zdd„Zdd„ZdZdd „Zd[d"d#„Zd\d$d%„Zd]d&d'„Z d^d)d*„Z!d_d,d-„Z"d.d/„Z#d`d0d1„Z$d2d3„Z%d4d5„Z&d6d7„Z'd8d9„Z(d:d;„Z)dd?„Z+d@dA„Z,dBdC„Z-dDdE„Z.dadFdG„Z/dHdI„Z0dbdJdK„Z1dLdM„Z2dNdO„Z3dPdQ„Z4dRdS„Z5dTdU„Z6dS)crz=The TarFile Class provides an interface to tar archives. rFrNrlrc  Csšt|ƒdks|dkrtdƒ‚||_ddddœ||_|sn|jdkrZtj |¡sZd |_d|_t||jƒ}d |_n0|d kr†t |d ƒr†|j }t |d ƒr˜|j|_d|_|r®tj  |¡nd |_ ||_ |d k rÈ||_ |d k rÖ||_|d k rä||_|d k rò||_|d k r||_| |_| d k r&|j tkr&| |_ni|_| d k r<| |_| d k rL| |_d |_g|_d |_|j  ¡|_i|_zþ|jdkrŽd |_| ¡|_|jdkr"|j  |j¡z|j  |¡}|j !|¡WnXt"k rî|j  |j¡Yq"Yn0t#k r} zt$t%| ƒƒ‚W5d } ~ XYnXqš|jdkrld|_|jrl|j &|j '¡¡}|j  (|¡|jt|ƒ7_Wn&|jsˆ|j  )¡d|_‚YnXd S)aÖOpen an (uncompressed) tar archive `name'. `mode' is either 'r' to read from an existing archive, 'a' to append data to an existing file or 'w' to create a new file overwriting an existing one. `mode' defaults to 'r'. If `fileobj' is given, it is used for reading or writing data. If it can be determined, `mode' is overridden by `fileobj's mode. `fileobj' is not closed, when TarFile is closed. rrÚúmode must be 'r', 'a' or 'w'Úrbzr+bÚwb)rlÚarmr¡rmFNr•rvTrlÚaw)*r2rErvÚ_moderŒrÚexistsÚ bltn_openr¢r‘r•Úabspathr¦rVrðÚ dereferenceÚ ignore_zerosr6r7rrÚdebugÚ errorlevelr©ÚmembersÚ_loadedrÍrÝÚinodesÚ firstmemberrfrÎrZrtrˆr…r‚r0r8r,r`r˜)r”r•rvr¦rVrðr§r¨r6r7rr©rªÚer[r8r8r9r–Fs‚            "   zTarFile.__init__c Ks¸|s|stdƒ‚|dkr¨|jD]|}t||j|ƒ}|dk rB| ¡}z||d|f|ŽWSttfk r˜} z|dk r€| |¡WY¢qW5d} ~ XYqXqtdƒ‚nd|kr | dd¡\} }| pÈd} |pÐd}||jkrît||j|ƒ}n td |ƒ‚||| |f|ŽSd |kr| d d¡\} }| p,d} |p6d}| d krJtd ƒ‚t|| |||ƒ} z||| | f|Ž} Wn|   ¡‚YnXd | _ | S|dkr¬|j |||f|ŽStdƒ‚dS)a|Open a tar archive for reading, writing or appending. Return an appropriate TarFile class. mode: 'r' or 'r:*' open for reading with transparent compression 'r:' open for reading exclusively uncompressed 'r:gz' open for reading with gzip compression 'r:bz2' open for reading with bzip2 compression 'a' or 'a:' open for appending, creating the file if necessary 'w' or 'w:' open for writing without compression 'w:gz' open for writing with gzip compression 'w:bz2' open for writing with bzip2 compression 'r|*' open a stream of tar blocks with transparent compression 'r|' open an uncompressed stream of tar blocks for reading 'r|gz' open a gzip compressed stream of tar blocks 'r|bz2' open a bzip2 compressed stream of tar blocks 'w|' open an uncompressed stream for writing 'w|gz' open a gzip compressed stream for writing 'w|bz2' open a bzip2 compressed stream for writing znothing to open)rlzr:*Nrlz%file could not be opened successfullyú:rrÁzunknown compression type %rú|Úrwúmode must be 'r' or 'w'Fr¢zundiscernible mode) rEÚ OPEN_METHrÖrÍr‚rƒrÎrrœr˜r¢Útaropen) r7r•rvr¦r§Úkwargsr¥ÚfuncÚ saved_posr¯r{Ústreamrpr8r8r9r’±sN           z TarFile.opencKs,t|ƒdks|dkrtdƒ‚||||f|ŽS)zCOpen uncompressed tar archive name for reading or writing. rrÚrž)r2rE)r7r•rvr¦r¶r8r8r9rµýszTarFile.taropenrµc Ksèt|ƒdks|dkrtdƒ‚zddl}|jWn ttfk rNtdƒ‚YnX|dk }z*| ||d||¡}|j|||f|Ž}WnZtk r¼|s¦|dk r¦|  ¡|dkr°‚t dƒ‚Yn"|sÖ|dk rÖ|  ¡‚YnX||_ |S) zkOpen gzip compressed tar archive name for reading or writing. Appending is not allowed. rr²r³rNzgzip module is not availablergrÅ) r2rEÚgzipÚGzipFiler«ÚAttributeErrorrƒrµrbr˜r‚r¢) r7r•rvr¦Ú compresslevelr¶rºZ extfileobjrpr8r8r9Úgzopens.    zTarFile.gzopenc Ks´t|ƒdks|dkrtdƒ‚z ddl}Wntk rDtdƒ‚YnX|dk rZt||ƒ}n|j|||d}z|j|||f|Ž}Wn(tt fk r¨|  ¡t dƒ‚YnXd |_ |S) zlOpen bzip2 compressed tar archive name for reading or writing. Appending is not allowed. rr²zmode must be 'r' or 'w'.rNr¡)r½znot a bzip2 fileF) r2rEr r«rƒrÕÚBZ2FilerµrbÚEOFErrorr˜r‚r¢)r7r•rvr¦r½r¶r rpr8r8r9Úbz2open$s   zTarFile.bz2openrµr¾rÁ)rÁrŸr cCs€|jr dS|jdkrf|j ttd¡|jtd7_t|jtƒ\}}|dkrf|j tt|¡|j sv|j  ¡d|_dS)zlClose the TarFile. In write-mode, two finishing zero blocks are appended to the archive. Nr¢rrT) r©rvr¦r`r3rÓrÝraÚ RECORDSIZEr¢r˜)r”rerfr8r8r9r˜Hs  z TarFile.closecCs"| |¡}|dkrtd|ƒ‚|S)aReturn a TarInfo object for member `name'. If `name' can not be found in the archive, KeyError is raised. If a member occurs more than once in the archive, its last occurrence is assumed to be the most up-to-date version. Nzfilename %r not found)Ú _getmemberÚKeyError)r”r•rðr8r8r9Ú getmember\s  zTarFile.getmembercCs| ¡|js| ¡|jS)zŽReturn the members of the archive as a list of TarInfo objects. The list has the same order as the members in the archive. )Ú_checkr¬Ú_loadr«r™r8r8r9Ú getmembersgszTarFile.getmemberscCsdd„| ¡DƒS)z‹Return the members of the archive as a list of their names. It has the same order as the list returned by getmembers(). cSsg|] }|j‘qSr8r )r~rðr8r8r9rusz$TarFile.getnames..)rÈr™r8r8r9ÚgetnamesqszTarFile.getnamesc Csl| d¡|dk r|j}|dkr$|}tj |¡\}}| tjd¡}| d¡}| ¡}||_ |dkrŠt tdƒr~|j s~t  |¡}q˜t  |¡}nt | ¡¡}d}|j}t  |¡r |j|jf} |j sò|jdkrò| |jkrò||j| kròt} |j| }nt} | drt||j| <nht  |¡rt} nVt  |¡r0t} nDt  |¡rLt} t |¡}n(t  |¡r^t } nt  !|¡rpt"} ndS||_||_#|j$|_%|j&|_'| tkr¤|j(|_)nd|_)|j*|_+| |_,||_-t.ròzt. /|j%¡d|_0Wnt1k rðYnXt2r&zt2 3|j'¡d|_4Wnt1k r$YnX| t t"fkrht tdƒrht td ƒrht 5|j6¡|_7t 8|j6¡|_9|S) aOCreate a TarInfo object for either the file `name' or the file object `fileobj' (using os.fstat on its file descriptor). You can modify some of the TarInfo's attributes before you add it using addfile(). If given, `arcname' specifies an alternative name for the file in the archive. r¢NrÚlstatrrrrÚmajorÚminor):rÆr•rŒrÚ splitdriver¸ÚsepÚlstriprðrïr‘r§rÊÚstatÚfstatÚfilenoÚst_modeÚS_ISREGÚst_inoÚst_devÚst_nlinkr­rŽr ÚS_ISDIRrÚS_ISFIFOr”ÚS_ISLNKrŒÚreadlinkÚS_ISCHRrÚS_ISBLKr’rvÚst_uidr!Úst_gidr"Úst_sizerÚst_mtimer rrÚpwdÚgetpwuidr#rÄÚgrpÚgetgrgidr$rËÚst_rdevrrÌr) r”r•Úarcnamer¦ÚdrvrðÚstatresrÚstmdÚinoderr8r8r9Ú gettarinfows„      ÿ ÿ           zTarFile.gettarinfoTcCs| ¡|D]ö}|rªtt|jƒddtd|jp4|j|jp>|jfdd| ¡sZ|  ¡rxtdd|j |j fddntd|j ddtdt  |j¡dd …ddt|j| ¡r¼d nd dd|rü| ¡rätd |jdd| ¡rütd |jddtƒq dS)z¼Print a table of contents to sys.stdout. If `verbose' is False, only the names of the members are printed. If it is True, an `ls -l'-like output is produced. ú )rsz%s/%sz%10sz%d,%dz%10dz%d-%02d-%02d %02d:%02d:%02dNrÇrrrz->zlink to)rÆÚprintr{rvr#r!r$r"r‘r“rrrr½Ú localtimer r•rPrrr)r”Úverboserðr8r8r9r{Ùs8 ÿÿ ÿÿÿÿz TarFile.listc Csn| d¡|dkr|}|dk rPddl}| dtd¡||ƒrP| dd|¡dS|jdk r€tj |¡|jkr€| dd|¡dS| d|¡|  ||¡}|dkr´| dd |¡dS|dk rà||ƒ}|dkrà| dd|¡dS|  ¡r t |d ƒ}|  ||¡|  ¡n`| ¡r`|  |¡|rjt |¡D].}|jtj ||¡tj ||¡|||d q.n |  |¡dS) a~Add the file `name' to the archive. `name' may be any type of file (directory, fifo, symbolic link, etc.). If given, `arcname' specifies an alternative name for the file in the archive. Directories are added recursively by default. This can be avoided by setting `recursive' to False. `exclude' is a function that should return True for each filename to be excluded. `filter' is a function that expects a TarInfo object argument and returns the changed TarInfo object, if it returns None the TarInfo object will be excluded from the archive. r¢Nrzuse the filter argument insteadrztarfile: Excluded %rztarfile: Skipped %rrztarfile: Unsupported type %rrŸ)Úfilter)rÆÚwarningsÚwarnÚDeprecationWarningÚ_dbgr•rŒrr¦rìrar¥Úaddfiler˜rPÚlistdirÚaddru) r”r•rçÚ recursiveÚexcluderñròrðÚfr8r8r9røösN ÿ        ÿ z TarFile.addcCs´| d¡t |¡}| |j|j|j¡}|j |¡|jt |ƒ7_|dk r¤t ||j|j ƒt |j t ƒ\}}|dkr’|j tt |¡|d7}|j|t 7_|j |¡dS)a]Add the TarInfo object `tarinfo' to the archive. If `fileobj' is given, tarinfo.size bytes are read from it and added to the archive. You can create TarInfo objects using gettarinfo(). On Windows platforms, `fileobj' should always be opened with mode 'rb' to avoid irritation about the file size. r¢Nrr)rÆr,rrVr6r7r¦r`rÝr2rhrrarÓr3r«rt)r”rðr¦r[rerfr8r8r9rö4s   zTarFile.addfileÚ.c Csòg}|dkr|}|D]<}| ¡r:| |¡t |¡}d|_|j||| ¡ dq|jdd„d| ¡|D]~}tj  ||j ¡}z(|  ||¡|  ||¡|  ||¡Wqntk rê}z"|jdkrÊ‚n| dd|¡W5d}~XYqnXqndS) aMExtract all members from the archive to the current working directory and set owner, modification time and permissions on directories afterwards. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned by getmembers(). NéÀ©Ú set_attrscSs|jSr—r )r¡r8r8r9Údržz$TarFile.extractall..)Úkeyrú tarfile: %s)rPrtr,rvÚextractÚsortÚreverserŒrrur•ÚchownÚutimeÚchmodrrªrõ)r”rr«Ú directoriesrðÚdirpathr¯r8r8r9Ú extractallNs*     zTarFile.extractallrrc Cs | d¡t|tƒr | |¡}n|}| ¡r>tj ||j¡|_ z |j |tj ||j ¡|dWn¦t k rÄ}zH|j dkr~‚n6|jdkrœ| dd|j¡n| dd|j|jf¡W5d}~XYnBtk r}z"|j dkrä‚n| dd|¡W5d}~XYnXdS)axExtract a member from the archive to the current working directory, using its full name. Its file information is extracted as accurately as possible. `member' may be a filename or a TarInfo object. You can specify a different directory using `path'. File attributes (owner, mtime, mode) are set unless `set_attrs' is False. rlrþrNrrztarfile: %s %r)rÆr.r0rÅrrŒrrurrÚ_extract_memberr•ÚEnvironmentErrorrªÚfilenamerõÚstrerrorr)r”Úmemberrrÿrðr¯r8r8r9rts(   ÿ   ( zTarFile.extractcCsŽ| d¡t|tƒr | |¡}n|}| ¡r8| ||¡S|jtkrN| ||¡S| ¡s^|  ¡r†t|j t ƒrtt dƒ‚qŠ|  | |¡¡SndSdS)aëExtract a member from the archive as a file object. `member' may be a filename or a TarInfo object. If `member' is a regular file, a file-like object is returned. If `member' is a link, a file-like object is constructed from the link's target. If `member' is none of the above, None is returned. The file-like object is read-only and provides the following methods: read(), readline(), readlines(), seek() and tell() rlz'cannot extract (sym)link as file objectN)rÆr.r0rÅraÚ fileobjectrrbrrr¦rœr„Ú extractfileÚ_find_link_target)r”rrðr8r8r9r—s        zTarFile.extractfilecCsR| d¡}| dtj¡}tj |¡}|r>tj |¡s>t |¡| ¡sN|  ¡rh|  dd|j |j f¡n|  d|j ¡|  ¡rŒ| ||¡nŽ| ¡r¢| ||¡nx| ¡r¸| ||¡nb| ¡sÈ| ¡rÖ| ||¡nD| ¡sæ|  ¡rô| ||¡n&|jtkr| ||¡n | ||¡|rN| ||¡|  ¡sN| ||¡| ||¡dS)z\Extract the TarInfo object tarinfo to a physical file called targetpath. rrz%s -> %sN)rQr¸rŒrÎrÚdirnamer¤Úmakedirsrrrõr•rraÚmakefilerPÚmakedirr•Úmakefifor‘r“ÚmakedevÚmakelinkrrbÚ makeunknownrrr)r”rðÚ targetpathrÿÚ upperdirsr8r8r9r ½s4        zTarFile._extract_memberc CsFzt |d¡Wn0tk r@}z|jtjkr0‚W5d}~XYnXdS)z,Make a directory called targetpath. rýN)rŒÚmkdirr ÚerrnoÚEEXIST©r”rðrr¯r8r8r9rís  zTarFile.makedircCs||j}| |j¡t|dƒ}|jdk rN|jD]\}}| |¡t|||ƒq,nt|||jƒ| |j¡| ¡| ¡dS)z'Make a file called targetpath. r N) r¦rÎrìr¥rírhrÚtruncater˜)r”rðrÚsourceÚtargetrÝrr8r8r9røs     zTarFile.makefilecCs"| ||¡| dd|j¡dS)zYMake a file from a TarInfo object with an unknown type at targetpath. rz9tarfile: Unknown file type %r, extracted as regular file.N)rrõr©r”rðrr8r8r9r s ÿzTarFile.makeunknowncCs"ttdƒrt |¡ntdƒ‚dS)z'Make a fifo called targetpath. Úmkfifozfifo not supported by systemN)r‘rŒr&rr%r8r8r9r s  zTarFile.makefifocCs^ttdƒrttdƒstdƒ‚|j}| ¡r6|tjO}n |tjO}t ||t  |j |j ¡¡dS)zt k rŠ| ¡r€tj  tj  |j ¡|j¡}n|j}Yn6Xz| |  |¡|¡Wntk r¾tdƒ‚YnXdS)zµMake a (symbolic) link called targetpath. If it cannot be created (platform limitation), we try to make a copy of the referenced file instead of a link. z%unable to resolve link inside archiveN)rrŒÚsymlinkrrr¤rÚlinkr rÚsymlink_exceptionrurr•rÄr)r”rðrrr8r8r9r' s( ÿÿ  ÿzTarFile.makelinkc Csèträttdƒrät ¡dkräzt |j¡d}Wntk rH|j}YnXzt  |j ¡d}Wntk rx|j }YnXz>|  ¡ržttdƒržt  |||¡ntjdkr¶t |||¡Wn*tk râ}z tdƒ‚W5d}~XYnXdS)z6Set owner of targetpath according to tarinfo. ÚgeteuidrrÚlchownZos2emxzcould not change ownerN)râr‘rŒr-räÚgetgrnamr$rÄr"Úgetpwnamr#r!rr.ÚsysÚplatformrr r)r”rðrÚgÚur¯r8r8r9rD s    z TarFile.chownc CsLttdƒrHzt ||j¡Wn*tk rF}z tdƒ‚W5d}~XYnXdS)zASet file permissions of targetpath according to tarinfo. rzcould not change modeN)r‘rŒrrvr rr!r8r8r9rZ s  z TarFile.chmodc CsVttdƒsdSzt ||j|jf¡Wn*tk rP}z tdƒ‚W5d}~XYnXdS)zBSet modification time of targetpath according to tarinfo. rNz"could not change modification time)r‘rŒrr r rr!r8r8r9rc s  z TarFile.utimec CsÂ| d¡|jdk r$|j}d|_|S|j |j¡d}z|j |¡}Wq tk rœ}z6|jrŒ|  dd|j|f¡|jt 7_WY¢q6W5d}~XYnþt k r}zN|jrâ|  dd|j|f¡|jt 7_WY¢q6n|jdkrøt t |ƒƒ‚W5d}~XYn’tk r0|jdkr,t dƒ‚Ynjtk rj}z|jdkrZt t |ƒƒ‚W5d}~XYn0tk r˜}zt t |ƒƒ‚W5d}~XYnXq q6|dk r¸|j |¡nd|_|S)z¨Return the next member of the archive as a TarInfo object, when TarFile is opened for reading. Return None if there is no more available. ÚraNrz0x%X: %srz empty fileT)rÆr®r¦rÎrÝrðrZrˆr¨rõrÓrFr‚r0r†r‡r‰r«rtr¬)r”Úmrðr¯r8r8r9rfn sD        z TarFile.nextcCsn| ¡}|dk r"|d| |¡…}|r2tj |¡}t|ƒD].}|rRtj |j¡}n|j}||kr:|Sq:dS)z}Find an archive member by name from bottom to top. If tarinfo is given, it is used as the starting point. N)rÈÚindexrŒrÚnormpathÚreversedr•)r”r•rðÚ normalizer«rÚ member_namer8r8r9rß s  zTarFile._getmembercCs| ¡}|dkrqqd|_dS)zWRead through the entire archive file and look for readable members. NT)rfr¬©r”rðr8r8r9rǶ sz TarFile._loadcCs:|jrtd|jjƒ‚|dk r6|j|kr6td|jƒ‚dS)znCheck if TarFile is still open, and if the operation's mode corresponds to TarFile's mode. z %s is closedNzbad operation for mode %r)r©rbrr}rv)r”rvr8r8r9rÆÀ szTarFile._checkcCsX| ¡r&tj |j¡d|j}d}n |j}|}|j||dd}|dkrTtd|ƒ‚|S)zZFind the target member of a symlink or hardlink member in the archive. rNT)rðr:zlinkname %r not found)rrŒrrr•rrÃrÄ)r”rðrÚlimitrr8r8r9rÉ s zTarFile._find_link_targetcCs|jrt|jƒSt|ƒSdS)z$Provide an iterator object. N)r¬Úiterr«ÚTarIterr™r8r8r9rÿÜ s zTarFile.__iter__cCs||jkrt|tjddS)z.Write debugging output to sys.stderr. )ÚfileN)r©rîr1Ústderr)r”ÚlevelÚmsgr8r8r9rõä s z TarFile._dbgcCs | ¡|Sr—)rÆr™r8r8r9Ú __enter__ê szTarFile.__enter__cCs,|dkr| ¡n|js"|j ¡d|_dSrñ)r˜r¢r¦r©)r”rrDÚ tracebackr8r8r9Ú__exit__î s   zTarFile.__exit__) NrlNNNNNNrNNN)rlN)rlNrµ)rlNrµ)NNN)T)NTNN)N)rüN)rrT)T)NF)N)7r}r~rr€r©r§r¨rªršrVr›r6r7rrðrërr–rœrÂr’rµr¾rÁr´r˜rÅrÈrÉrìr{rørör rrr rrrrrrrrrrfrÃrÇrÆrrÿrõrDrFr8r8r8r9r,s|þ kK   ý    b  >  & #& 0   1  c@s,eZdZdZdd„Zdd„Zdd„ZeZdS) r?zMIterator Class. for tarinfo in TarFile(...): suite... cCs||_d|_dS)z$Construct a TarIter object. rN)rïr7r`r8r8r9r– szTarIter.__init__cCs|S)z Return iterator object. r8r™r8r8r9rÿ szTarIter.__iter__cCsb|jjs$|j ¡}|sPd|j_t‚n,z|jj|j}Wntk rNt‚YnX|jd7_|S)z€Return the next item using TarFile's next() method. When all members have been read, set TarFile as _loaded. Tr)rïr¬rfÚ StopIterationr«r7Ú IndexErrorr<r8r8r9Ú__next__ s  zTarIter.__next__N)r}r~rr€r–rÿrIrfr8r8r8r9r?ù s r?cCs2zt|ƒ}| ¡WdStk r,YdSXdS)zfReturn True if name points to a tar archive that we are able to handle, else return False. TFN)r’r˜r)r•rpr8r8r9r# s )N)wÚ __future__rÚ __version__ÚversionÚ __author__Ú__date__Z __cvsid__Ú __credits__r1rŒrÐrr½rPr,rmrärâr«r¼ÚNotImplementedErrorr,Ú WindowsErrorÚ NameErrorÚ__all__Ú version_infoÚ __builtin__Úbuiltinsr’Ú_openr3rÓrÂr'r"r$r#r9r rMrŽrŒrr’rr”ÚCONTTYPEr*r)rNr2r6r]rrOrršrbrŠrRr…Úsetrur/rDr†ÚS_IFLNKÚS_IFREGr(ÚS_IFDIRr)ÚS_IFIFOZTSUIDZTSGIDZTSVTXZTUREADZTUWRITEZTUEXECZTGREADZTGWRITEZTGEXECZTOREADZTOWRITEZTOEXECr•r›Úgetfilesystemencodingr:r?rKrWr^rhrsr{Ú Exceptionrrr‚rƒr„r…r†r‡rˆrFr‰ÚobjectrŠrœr£rÕrÜrërrr?rr¥r8r8r8r9ÚsZ   üÿÿú   û þ þ þêi?KT*