o a5@sdZddlZzddlmZmZmZmZmZmZm Z m Z m Z Wn e y'YnwdZ ee ZdZdZGdddeZGd d d eZGd d d eZed kr]edZededSdS)z Representation of ar archives for use with Debian binary packages These classes are primarily intended to be used with the :class:`debian.debfile.DebFile` class for working with Debian binary packages. N) AnyBinaryIODict GeneratorIOIteratorListNoReturnOptionals! <s` c@seZdZdZdS)ArErrorz@ Common base for all exceptions raised within the arfile module N)__name__ __module__ __qualname____doc__rr//usr/lib/python3/dist-packages/debian/arfile.pyr 3sr c@s|eZdZdZ     dddZddZdd Zd d Zd d Ze eZ ddZ ddZ ddZ ddZddZddZdS)ArFilea Representation of an ar archive, see man 1 ar. The interface of this class tries to mimic that of the TarFile module in the standard library. ArFile objects have the following (read-only) properties: - members same as getmembers() NrcCsPg|_i|_||_||_|pt|_|durd}||_|dkr&|dSdS)a Build an ar file representation starting from either a filename or an existing file object. The only supported mode is 'r'. The encoding and errors parameters control how member names are decoded into Unicode strings. Like tarfile, the default encoding is sys.getfilesystemencoding() and the default error handling scheme is 'surrogateescape'. Nsurrogateescaper) _ArFile__members_ArFile__members_dict_ArFile__fname_ArFile__fileobjsysgetfilesystemencoding_ArFile__encoding_ArFile__errors_ArFile__index_archive)selffilenamemodefileobjencodingerrorsrrr__init__As zArFile.__init__cCs`|jr!t|jd}||WddS1swYdS|jr,||jdStd)NrbzUnable to open valid file)ropen_ArFile__collect_membersrr )rfprrr__index_archive^s "zArFile.__index_archivecCs|ttkr td tj||j|j|jd}|sdS|j |||j |j <|j ddkr7||j dn ||j ddq )NzUnable to find global headerT)r#r$r)readGLOBAL_HEADER_LENGTH GLOBAL_HEADERr ArMember from_filerrrrappendrnamesizeseek)rr) newmemberrrr__collect_membershs   zArFile.__collect_memberscCs |j|S)a Return the (last occurrence of a) member in the archive whose name is 'name'. Raise KeyError if no member matches the given name. Note that in case of name collisions the only way to retrieve all members matching a given name is to use getmembers. )rrr3rrr getmemberzs zArFile.getmembercC|jS)z Return a list of all members contained in the archive. The list has the same order of members in the archive and can contain duplicate members (i.e. members with the same name) if they are duplicate in the archive itself. rrrrr getmembersszArFile.getmemberscCsdd|jDS)z3 Return a list of all member names in the archive. cSsg|]}|jqSr)r3).0frrr sz#ArFile.getnames..r;r<rrrgetnamesszArFile.getnamescCtz Not (yet) implemented. NotImplementedErrorr<rrr extractallzArFile.extractallcCrBrCrD)rmemberpathrrrextractrGzArFile.extractcCs@|jD]}t|tr|j|jkr|S||jkr|SqdS)z Return a file object corresponding to the requested member. A member can be specified either as a string (its name) or as a ArMember instance. N)r isinstancer0r3)rrHmrrr extractfiles  zArFile.extractfilecCs t|jS)z5 Iterate over the members of the present ar archive. )iterrr<rrr__iter__ zArFile.__iter__cCs ||S)z Same as .getmember(name). )r9r8rrr __getitem__rPzArFile.__getitem__)NrNNN)r rrrr%rr(r9r=propertymembersrArFrJrMrOrQrrrrr7s&      rc@seZdZdZddZe  d"ddZd#dd Zd$d d Zd#d d Z d#ddZ ddZ ddZ ddZ ddZddZeddZeddZeddZeddZeddZed dZed!dZdS)%r0a Member of an ar archive. Implements most of a file object interface: read, readline, next, readlines, seek, tell, close. ArMember objects have the following (read-only) properties: - name member name in an ar archive - mtime modification time - owner owner user - group owner group - fmode file permissions - size size in bytes - fname file namecCsFd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ dS)Nr) _ArMember__name_ArMember__mtime_ArMember__owner_ArMember__group_ArMember__fmode_ArMember__size_ArMember__fname _ArMember__fp_ArMember__offset_ArMember__end_ArMember__curr<rrrr%s zArMember.__init__NcCs|t}|s dSt|tkrtd|ddtkrtd|dur't}|dur-d}t}|ddd d }| |||_ t |dd |_ t |d d |_t |d d |_|d d |_t |d d|_||_|sw||_||_|j|j|_|j|_|S)zfp is an open File object positioned on a valid file header inside an ar archive. Return a new ArMember on success, None otherwise. NzIncorrect header length:r zIncorrect file magicrr/"(0)r-FILE_HEADER_LENGTHlenIOError FILE_MAGICrrr0splitstripdecoderUintrVrWrXrYrZr[r\tellr]r^r_)r)fnamer#r$bufr?r3rrrr1s4    zArMember.from_filercCs|jdur|jdurtdt|jd|_|j|jd|kr*|j|jkr:nn|j|}|j|_|S|j|jksF|j|j krHdS|j|j|j}|j|_|S)N'Cannot have both fp and fname undefinedr&r) r\r[ ValueErrorr'r5r_r^r-ror]rr4rqrrrr-,s      z ArMember.readcCs|jdur|jdurtdt|jd|_|j|j|dur6|j|}|j|_|j|jkr4dS|S|j}|j|_|j|jkrIdS|S)Nrrr&rs) r\r[rtr'r5r_readlineror^rurrrrv@s        zArMember.readlinecCs(d}g} |}|s |S||qN)rvr2)rsizehintrqlinesrrr readlinesVs zArMember.readlinescCs|j|jkr |j|_|dkr||j|jkrtd||dkr(|j||_dS|dkr4|j||_dS|dkr@|j||_dSdS)Nr+zCan't seek at %dr,r)r_r]rir^)roffsetwhencerrrr5cs  z ArMember.seekcCs|j|jkrdS|j|jS)Nr)r_r]r<rrrrors  z ArMember.tellcCsdS)NTrr<rrrseekablexszArMember.seekablecCs0|jdur|jdur|jd|_dSdSdSrw)r\r[closer<rrrr~}s  zArMember.closecCs|Srwrvr<rrrnextsz ArMember.nextcsfdd}t|S)Nc3s}|r |VdSdSrwr)liner<rrnextlines  z#ArMember.__iter__..nextline)rN)rrrr<rrOs  zArMember.__iter__cCr:rw)rUr<rrrzArMember.cCr:rw)rVr<rrrrrcCr:rw)rWr<rrrrrcCr:rw)rXr<rrrrrcCr:rw)rYr<rrrrrcCr:rw)rZr<rrrrrcCr:rw)r[r<rrrrr)NN)rrw)r rrrr% staticmethodr1r-rvrzr5ror}r~rrOrRr3mtimeownergroupfmoder4rprrrrr0s. =        r0__main__ztest.ar )rrtypingrrrrrrrr r ImportErrorr/rhr.rgrj Exceptionr objectrr0r aprintjoinrArrrrs(0 U