Cfc5(dZddlmZddlZ ddlmZmZmZmZm Z m Z m Z m Z m Z mZdZeeZdZdZGdd eZGd d eZGd d eZedk(r.edZedj;ej=yy#e$rYjwxYw)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. )PathN) AnyBinaryIODict GeneratorIOIteratorListNoReturnOptionalUnions! <s` ceZdZdZy)ArErrorz@ Common base for all exceptions raised within the arfile module N)__name__ __module__ __qualname____doc__//usr/lib/python3/dist-packages/debian/arfile.pyrr5sJrrcneZdZdZ ddZdZdZdZdZe eZ dZ d Z d Z d Zd Zd Zy)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() Ncg|_i|_||_||_|xst j |_|d}||_|dk(r|jyy)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)selffilenamemodefileobjencodingerrorss r__init__zArFile.__init__Cs_    "Ac&?&?&A >&F 3;  " rc|jr1t|jd5}|j|dddy|jr|j|jyt d#1swYyxYw)NrbzUnable to open valid file)ropen_ArFile__collect_membersr r)r&fps r__index_archivezArFile.__index_archive`sf <<dllD) +R&&r* + + ^^  " "4>> 256 6  + +s A11A:c|jttk7r td tj ||j |j|j}|sy|jj|||j|j<|jdzdk(r|j|jdn|j|jdzd)NzUnable to find global header)r*r+r)readGLOBAL_HEADER_LENGTH GLOBAL_HEADERrArMember from_filerr#r$rappendrnamesizeseek)r&r1 newmembers r__collect_memberszArFile.__collect_membersjs 77' (M 989 9 **2t||48OO26--+AI NN ! !) ,2;D    /~~!Q& * *A.rc |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. )rr&r<s r getmemberzArFile.getmember|s""4((rc|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. )rr&s r getmemberszArFile.getmemberss~~rcT|jDcgc]}|jc}Scc}w)z3 Return a list of all member names in the archive. )rr<)r&fs rgetnameszArFile.getnamess !%/1///s%ctz Not (yet) implemented. NotImplementedErrorrEs r extractallzArFile.extractall "!rctrKrL)r&memberpaths rextractzArFile.extractrOrc|jD]B}t|tr|j|jk(r|cS||jk(s@|cSy)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 isinstancer9r<)r&rQms r extractfilezArFile.extractfilesK A&(+&++0E   rc,t|jS)z5 Iterate over the members of the present ar archive. )iterrrEs r__iter__zArFile.__iter__sDNN##rc$|j|S)z Same as .getmember(name). )rCrBs r __getitem__zArFile.__getitem__s~~d##r)NrNNN)rrrrr,r%r0rCrFpropertymembersrIrNrSrWrZr\rrrrr9s[ #:7/$)z"G0 " " .$ $rrceZdZdZdZe ddZddZddZddZ ddZ d Z d Z d Z d Zd ZedZedZedZedZedZedZedZy)r9a 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 namecd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ y)Nr) _ArMember__name_ArMember__mtime_ArMember__owner_ArMember__group_ArMember__fmode_ArMember__size_ArMember__fname _ArMember__fp_ArMember__offset_ArMember__end_ArMember__currEs rr,zArMember.__init__sQ           rNc|jt}|syt|tkr td|ddtk7r td|t j }|d}t}|ddjd dj}|j|||_ t|dd |_ t|d d |_t|d d |_|d d |_t|d d|_||_|s||_|j)|_|j*|j"z|_|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:rzIncorrect file magicrr/"(0)r6FILE_HEADER_LENGTHlenIOError FILE_MAGICr!r"r9splitstripdecoderbintrcrdrerfrgrhritellrjrkrl)r1fnamer*r+bufrHr<s rr:zArMember.from_files>gg() s8( (34 4 r": #01 1  002H >&F J1Ryt$Q'--/;;x0Br O Br O Br O 2J s2bz? AFWWY **qxx'**rc|j2|j tdt|jd|_|jj |j d|cxkr|j |j z kr?nn<|jj|}|jj|_|S|j |j k\s|j |jkry|jj|j |j z }|jj|_|S)N'Cannot have both fp and fname undefinedr.rr) rirh ValueErrorr/r>rlrkr6r}rjr&r=rs rr6z ArMember.read.s 99 ||# !JKKT\\40DI tzz" t .tzzDJJ. .))..&C)DJJ :: #tzzDMM'AiinnTZZ$**45YY^^%  rc"|j2|j tdt|jd|_|jj |j |V|jj |}|jj|_|j |jkDry|S|jj }|jj|_|j |jkDry|S)Nrr.r) rirhrr/r>rlreadliner}rkrs rrzArMember.readlineBs 99 ||# !JKKT\\40DI tzz"  ))$$T*C)DJzzDJJ&Jii  "YY^^% :: " rcZd}g} |j}|s |S|j|'N)rr;)r&sizehintrliness r readlineszArMember.readlinesXs<--/C  LL  rcR|j|jkr|j|_|dkr*||jz|jkrtd|z|dk(r|j|z|_y|dk(r|j|z|_y|dk(r|j|z|_yy)Nr4zCan't seek at %dr5r)rlrjrwrk)r&offsetwhences rr>z ArMember.seekes :: %DJ A:&4::- =,v56 6 Q;f,DJ q[/DJ q[f,DJrch|j|jkry|j|jz S)Nr)rlrjrEs rr}z ArMember.tellts( :: %zzDMM))rcy)NTrrEs rseekablezArMember.seekablezsrcz|j/|j"|jjd|_yyyr)rirhcloserEs rrzArMember.close~s2 99 T\\%= IIOO DI&> rc"|jSrrrEs rnextz ArMember.nexts}}rc.fd}t|S)Nc3<Kj}|r|yywrr)liner&s rnextlinez#ArMember.__iter__..nextlines==?D s)rY)r&rs` rrZzArMember.__iter__s  HJrc|jSr)rbrEs rzArMember. rc|jSr)rcrEs rrzArMember. $,,rc|jSr)rdrEs rrzArMember.rrc|jSr)rerEs rrzArMember.rrc|jSr)rfrEs rrzArMember.rrc|jSr)rgrEs rrzArMember.rrc|jSr)rhrEs rrzArMember.rr)NN)rr)rrrrr, staticmethodr:r6rrr>r}rrrrZr]r<mtimeownergroupfmoder=r~rrrr9r9s !2 88z(,  -*    , -D . /E . /E . /E . /E , -D . /Err9__main__ztest.ar )rpathlibrr!typingrrrrrr r r r r ImportErrorr8rvr7rurx Exceptionrobjectrr9raprintjoinrIrrrrs.     " =)  KiKL$VL$^P0vP0f z yA $))AJJL !" e   sB BB