V Qc@sYdZddlZddlZddlZddlZddlZdddYZdS(sRCS interface module. Defines the class RCS, which represents a directory with rcs version files and (possibly) corresponding work files. iNtRCScBseZdZejejdZdZdZddZ dZ dZ dZ d Z d dd Zddd Zdd ZdZdZdZdZdZdddZdZdZdZddZdZdZRS(s7RCS interface class (local filesystem version). An instance of this class represents a directory with rcs version files and (possible) corresponding work files. Methods provide access to most rcs operations such as checkin/checkout, access to the rcs metadata (revisions, logs, branches etc.) as well as some filesystem operations such as listing all rcs version files. XXX BUGS / PROBLEMS - The instance always represents the current directory so it's not very useful to have more than one instance around simultaneously s-_=+cCsdS(s Constructor.N((tself((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyt__init__&scCsdS(s Destructor.N((R((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyt__del__*stcCsi|j|d|}|j}|j|}|rH|d|}n|ddkre|d }n|S(smReturn the full log text for NAME_REV as a string. Optional OTHERFLAGS are passed to rlog. srlog s%s: %sis (t_opentreadt _closepipe(Rtname_revt otherflagstftdatatstatus((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pytlog0s  cCs|j|}|dS(s%Return the head revision for NAME_REVthead(tinfo(RRtdict((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyR?sc Cs|j|d}i}x||j}|s1Pn|ddkrGqntj|d}|dkr|| tj||d}}|||" if None); or the file description if this is a new file. The optional OTHERFLAGS argument is passed to ci without interpretation. Any output from ci goes to directly to stdout. sis s-usci %s%s -t%s %s %ss([\"$`])s\\\1sci %s%s -m"%s" %s %s( t _unmangletisvalidttempfiletNamedTemporaryFiletwritetflushRtretsubR( RRtmessageR RRtnewR#R R((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pytcheckins"      cCstjtj}t|j|}tjjdrdtjd}t|j|}||}nt|j|}|j ||S(s=Return a list of all version files matching optional PATTERN.R( tostlistdirtcurdirtfiltert_isrcstpathtisdirtmaptrealnamet_filter(Rtpattfilestfiles2((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyt listfiless cCs@|j|}tjj|p?tjjtjjd|S(s0Test whether NAME has a version file associated.R(trcsnameR0R5tisfiletjoin(RRtnamev((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyR&scCs|j|r|}n |d}tjj|r8|Stjjdtjj|}tjj|ro|Stjjdrtjjd|S|SdS(sReturn the pathname of the version file for NAME. The argument can be a work file name or a version file name. If the version file does not exist, the name of the version file that would be created by "ci" is returned. s,vRN(R4R0R5R?R@tbasenameR6(RRRA((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyR>s  !cCsN|j|r|d }n|}tjj|r8|Stjj|}|S(sReturn the pathname of the work file for NAME. The argument can be a work file name or a version file name. If the work file does not exist, the name of the work file that would be created by "co" is returned. i(R4R0R5R?RB(RRAR((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyR8s cCs|j|d}|j}|j|}|r?t|n|sIdS|ddkrf|d }n|j||j|kS(sTest whether FILE (which must have a version file) is locked. XXX This does not tell you which revision number is locked and ignores any revision you may pass in (by virtue of using rlog -L -R). s rlog -L -Ris N(RRRRtNoneR8(RRR RR ((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pytislockeds   cCsD|j|\}}|j|s:tjd|fn||fS(s}Normalize NAME_REV into a (NAME, REV) tuple. Raise an exception if there is no corresponding version file. snot an rcs file %r(R%R&R0terror(RRRR((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyRssco -ps-rcCsV|j|\}}|j|}|r?|d||}ntjd||fS(sINTERNAL: open a read pipe to NAME_REV using optional COMMAND. Optional FLAG is used to indicate the revision (default -r). Default COMMAND is "co -p". Return a file object connected by a pipe to the command's output. t s%s %r(RR>R0tpopen(RRRtrflagRRRA((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyRs cCsmt|tdkr1|df}\}}n |\}}x)|D]!}||jkrDtdqDqDW|S(sINTERNAL: Normalize NAME_REV argument to (NAME, REV) tuple. Raise an exception if NAME contains invalid characters. A NAME_REV argument is either NAME string (implying REV='') or a tuple of the form (NAME, REV). Rsbad char in rev(ttypetokcharst ValueError(RRRRtc((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyR%s   cCs|j}|sd St|d\}}|dkrAd|fS|d@}|dkrfd}|}nd}|d@r|d}n||fS( s:INTERNAL: Close PIPE and print its exit status if nonzero.iitexititstoppedtkilledis (coredump)N(tcloseRCtdivmod(RR tststdetailtreasontsignaltcode((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyRs       cCs3|d}tj|}|r/td|ndS(s{INTERNAL: run COMMAND in a subshell. Standard input for the command is taken from /dev/null. Raise IOError when the exit status is not zero. Return whatever the calling method should return; normally None. A derived class may override this method and redefine it to capture stdout/stderr of the command and return it. s R8RDRRR%RRR9R]R4(((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyRs0       !          ((R`RXR0R+RR'R(((s)/usr/lib64/python2.7/Demo/pdist/rcslib.pyts