;ò *ÂFCc@s5dZdZdddfZdieeeƒƒZdkZdkZdk Z dk Z dk Z dk Z dk Z dkZdkZdefd„ƒYZdfd „ƒYZnoeeiƒZneeiƒZd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zdfd„ƒYZdS(s« An OO interface to 'p4' (the Perforce client command line app). Usage: import p4lib p4 = p4lib.P4() result = p4.() For more information see the doc string on each command. For example: print p4lib.P4.opened.__doc__ Implemented commands: add (limited test suite), branch, branches, change, changes (no test suite), client, clients, delete, describe (no test suite), diff, edit (no test suite), files (no test suite), filelog (no test suite), flush, have (no test suite), label, labels, opened, print (as print_, no test suite), resolve, revert (no test suite), submit, sync, where (no test suite) Partially implemented commands: diff2 Unimplemented commands: admin, counter, counters, depot, depots, dirs, fix, fixes, fstat, group, groups, help (no point), integrate, integrated, job, jobs, jobspec, labelsync, lock, obliterate, passwd, protect, rename (no point), reopen, resolved, review, reviews, set, triggers, typemap, unlock, user, users, verify XXX Describe usage of parseForm() and makeForm(). s/$Id: p4lib.py 434 2005-08-20 03:28:30Z trentm $ii s.Ns P4LibErrorcBstZRS(N(s__name__s __module__(((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys P4LibError=ss_LoggercBs}tZedƒ\ZZZZZee i d„Z d„Z d„Z d„Zd„Zd„Zd„Zd „Zd „ZRS( NicCsq|tjo|i|_n ||_t|ƒtijot|dƒ|_ d|_ n||_ d|_ dS(Nswii( s thresholdsNonesselfsWARNstypesstreamOrFileNamestypess StringTypesopensstreams_opennedStream(sselfs thresholdsstreamOrFileName((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys__init__Fs    cCs|io|iiƒndS(N(sselfs_opennedStreamsstreamsclose(sself((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys__del__Qs cCsNh|id<|id<|id<|id<|id<}||SdS(NsDEBUGsINFOsWARNsERRORsCRITICAL(sselfsDEBUGsINFOsWARNsERRORsCRITICALs levelNameMapslevel(sselfslevels levelNameMap((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys _getLevelNameTsBcGsd||ijodSnd|i|ƒiƒ}|||d}|ii |ƒ|ii ƒdS(Ns%s: s ( slevelsselfs thresholds _getLevelNameslowersmessagesmsgsargssstreamswritesflush(sselfslevelsmsgsargssmessage((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyslog]s cGs|i|i||ŒdS(N(sselfslogsDEBUGsmsgsargs(sselfsmsgsargs((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysdebugdscGs|i|i||ŒdS(N(sselfslogsINFOsmsgsargs(sselfsmsgsargs((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysinfofscGs|i|i||ŒdS(N(sselfslogsWARNsmsgsargs(sselfsmsgsargs((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyswarnhscGs|i|i||ŒdS(N(sselfslogsERRORsmsgsargs(sselfsmsgsargs((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyserrorjscGs|i|i||ŒdS(N(sselfslogsCRITICALsmsgsargs(sselfsmsgsargs((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysfatalls(s__name__s __module__srangesDEBUGsINFOsWARNsERRORsCRITICALsNonessyssstderrs__init__s__del__s _getLevelNameslogsdebugsinfoswarnserrorsfatal(((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys_LoggerDs      icCs|iddƒSdS(s5Escape the given command line argument for the shell.s"s\"N(sargsreplace(sarg((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys _escapeArgwscCs‰d}xZ|D]R}d|jp d|jo|dt|ƒ7}n|t|ƒ7}|d7}q W|idƒo|d }n|SdS(s•Join an arglist to a string appropriate for running. >>> import os >>> _joinArgv(['foo', 'bar "baz']) 'foo "bar \\"baz"' ss s*s"%s"iÿÿÿÿN(scmdstrsargvsargs _escapeArgsendswith(sargvscmdstrsarg((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys _joinArgvsc CsÉt|ƒtitifjot|ƒ}n|}tid|ƒt i i dƒoTt i |ƒ\}}}|iƒ} |iƒ}|iƒ|iƒ|iƒ} n¸dk}|i|dƒ}|i|i|if\}}}|iƒ} |iƒ}|iƒ|iƒ|iƒ|iƒ}t i|ƒot i|ƒ} nt d||fƒ‚| ot d||| fƒ‚ntid| ƒtid|ƒtid | ƒ| || fSdS( s¿Prepare and run the given arg vector, 'argv', and return the results. Returns (, , ). Note: 'argv' may also just be the command string. sRunning '%s'...swinNis3Error running '%s', it did not exit properly: rv=%ds*Error running '%s': error='%s' retval='%s's output='%s's error='%s's retval='%s'(!stypesargvstypessListTypes TupleTypes _joinArgvscmdslogsdebugssyssplatforms startswithsosspopen3sisosesreadsoutputserrorsclosesretvalspopen2sPopen3spstochilds fromchildschilderrswaitsrvs WIFEXITEDs WEXITSTATUSs P4LibError( sargvsrvsesiscmdspspopen2soserrorsoutputsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys_run’s<     !      cCsf||jo ||jot||ƒSn8||jodSn#||jodSnt||ƒSdS(sQA cmp-like function, sorting in alphabetical order with 'special's last. iiÿÿÿÿN(sasspecialssbscmp(sasbsspecials((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys _specialsLast»s  c KsÀx|iƒD]\}}|djoUd}x>|D]6}|idƒo|d|7}q3|d|7}q3W|||ïss is%s: s s%s: %s N(skwargssitemsskeysvaluesstrvalsfshas_keysstrsformsspecialsskeysssortsNoneslenssplits capitalizesline( skwargssstrvalskeysformsfskeyssvaluesspecialssline((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysmakeFormÌsD         c CsËt|ƒtijo|idƒ}n|}h} t}x+|D]#}|i ƒi dƒoqBn|o‚|i dƒo| |c|d7//.+?) # (?P\w+)$sCInternal error: could not parse P4 form 'Files:' section line: '%s'N(stypescontentstypess StringTypess splitlinesslinessspecsNonescurrkeyslinesstrips startswithsendswithssplitskeys remainderslowersitemssvaluesints ValueErrorsrescompilesfileResmatchsappends groupdictsAttributeErrorspprintserrs P4LibError( scontentserrs remainderslinessvaluescurrkeysmatchskeyslinesfileResspec((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys parseFormsl           cKsg}xÿ|iƒD]ñ\}}|tjoqn|djo|idƒn§|djo|idƒn‰|djo|idƒnk|djo|idƒnM|d jo|id ƒn/|d jo|id ƒntd |ƒ‚|i|ƒqW|SdS(sCreate a p4 option vector from the given p4 option dictionary. "options" is an option dictionary. Valid keys and values are defined by what class P4's constructor accepts via P4(**optd). Example: >>> makeOptv(client='swatter', dir='D:\trentm') ['-c', 'client', '-d', 'D:\trentm'] >>> makeOptv(client='swatter', dir=None) ['-c', 'client'] sclients-csdirs-dshosts-Hsports-pspasswords-Psusers-usUnexpected keyword arg: '%s'N(soptvsoptionssitemsskeysvalsNonesappends P4LibError(soptionssoptvsvalskey((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysmakeOptv]s*         cCs1ti|dƒ\}}h}x|D]\}}|dddfjotd|ƒ‚q%|ddfjoti d|ƒq%|d jo||d >> parseP4Optv(['-c', 'swatter', '-d', 'D:\trentm']) {'client': 'swatter', 'dir': 'D:\trentm'} shVc:d:H:p:P:u:x:Gss-hs-Vs-xs3The '%s' p4 option is not appropriate for p4lib.P4.s-Gs-ssIgnoring '%s' option.s-csclients-dsdirs-Hshosts-psports-Pspasswords-ususerN( sgetoptsoptvsoptlistsdummysoptdsoptsoptargs P4LibErrorslogsinfo(soptvsoptsdummysoptdsoptlistsoptarg((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys parseOptv~s,        sP4cBs tZdZdd„Zd„Zgdedd„Zgdd„Zgdd„Zdddd „Z eeeddd „Z gddeedd „Z gdddd „Z eedd „Z eedd„Zdd„Zddedd„Zedd„Zgddeddd„Zd„Zdddd„Zgeddd„Zgddddddd„Zeeedd„Zedd„Zeeddd„Zdd„Zeeddd„Zdd„Zgdddd„Zeeddd„Zdd„ZRS( s(A proxy to the Perforce client app 'p4'.sp4cKs(||_||_t|i|_dS(sCreate a 'p4' proxy object. "p4" is the Perforce client to execute commands with. Defaults to 'p4'. Optional keyword arguments: "client" specifies the client name, overriding the value of $P4CLIENT in the environment and the default (the hostname). "dir" specifies the current directory, overriding the value of $PWD in the environment and the default (the current directory). "host" specifies the host name, overriding the value of $P4HOST in the environment and the default (the hostname). "port" specifies the server's listen address, overriding the value of $P4PORT in the environment and the default (perforce:1666). "password" specifies the password, overriding the value of $P4PASSWD in the environment. "user" specifies the user name, overriding the value of $P4USER, $USER, and $USERNAME in the environment. N(sp4sselfsoptionssoptdsmakeOptvs_optv(sselfsp4soptions((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys__init__¨s  cKsX|o&|i}|i|ƒt|}n |i}|ig||}t |ƒSdS(sÓRun the given p4 command. The current instance's p4 and p4 options (optionally overriden by **p4options) are used. The 3-tuple (, , ) is returned. N( s p4optionssselfsoptdsdsupdatesmakeOptvsp4optvs_optvsp4sargvs_run(sselfsargvs p4optionssp4optvsd((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys_p4runÁs   icKsng}|o|dg7}n|o|dt|ƒg7}nt|ƒtijo |g}ndg|} hdd<dd<dd<}|o•d }xÅt dt |ƒ|ƒD]n}| ||||!} |i| |\}}}|dc|7<|dc|7<|dc|pd7, 'stderr': , 'retval': } s-as-csopenedsstdoutssstderrsretvalii sŽ^ (?P.*?)\#(?P\d+) # //depot/foo.txt#1 \s-\s(?P\w+) # - edit \s(default\schange|change\s(?P\d+)) # change 12345 \s\((?P[\w+]+)\) # (text+w) (\sby\s)? # by ((?P[^\s@]+)@(?P[^\s@]+))? # trentm@trentm-pliers isWInternal error: 'p4 opened' regex did not match '%s'. Please report this to the author.srevschangesdefaultN(&soptvs allClientsschangesstrstypesfilesstypess StringTypessargvsresultssSET_SIZEsrangeslensisset_argvsselfs_p4runs p4optionssstdoutsstderrsretvals_rawsrescompilesVERBOSEslineRes splitlinesslinessearchsmatchs P4LibErrors groupdictsfilesintskeysskeysNonesappend(sselfsfiless allClientsschanges_raws p4optionssstdoutsresultssfilesset_argvslineResmatchsargvskeyslinesisSET_SIZEsstderrsoptvsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysopenedÑsV  !      cKst|ƒtijo |g}ndg}|o||7}n|i||\} }}|o#hd| <d|<d|, 'stderr': , 'retval': } swheresstdoutsstderrsretvaliiÿÿÿÿs s-sminusis//is depotFileswins:s-Current parsing cannot handle this line '%s'.s /s clientFiles localFileN(stypesfilesstypess StringTypessargvsselfs_p4runs p4optionssoutputserrorsretvals_rawsresultss splitlinesslinesfiles startswithsfindsdepotFileStartsclientFileStartssyssplatformsAssertionErrorslocalFileStartsappend(sselfsfiless_raws p4optionsslocalFileStartsretvalserrorsresultssargvsclientFileStartsdepotFileStartsfilesoutputsline((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyswhere"s>  #  (c Ks-t|ƒtijo |g}ndg}|o||7}n|i||\} }}|o#hd| <d|<d|, 'stderr': , 'retval': } shavesstdoutsstderrsretvaliiÿÿÿÿs s#s depotFiles - srevs localFileN(stypesfilesstypess StringTypessargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitss splitlinesslineshitssplitsintsappend( sselfsfiless_raws p4optionsshitsshitsretvalserrorsargvsoutputsline((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyshave[s(  # scKsm|dddddfjotd|ƒ‚ng}|o|id|ƒn|o|idƒnd g|t|ƒg}|i ||\}}}|o#hd |<d |<d |) is a flag to pass to the built-in diff routine to control the output format. Valid values are '' (plain, default), 'n' (RCS), 'c' (context), 's' (summary), 'u' (unified). "shortForm" (-s) specifies to exclude the diff from the description. Returns a dict representing the change description. Keys are: 'change', 'date', 'client', 'user', 'description', 'files', 'diff' (the latter is not included iff 'shortForm'). If '_raw' is true then the return value is simply a dictionary with the unprocessed results of calling p4: {'stdout': , 'stderr': , 'retval': } ssnscsssus Incorrect diff format flag: '%s's-d%ss-ssdescribesstdoutsstderrsretvalis#sW^Change (?P\d+) by (?P[^\s@]+)@(?P[^\s@]+) on (?P[\d/ :]+)$ischangesAffected files ... s descriptionisDifferences ... sfiless5^... (?P.+?)#(?P\d+) (?P\w+)$srevsdiffN(#s diffFormats P4LibErrorsoptvsappends shortFormsstrschangesargvsselfs_p4runs p4optionssoutputserrorsretvals_rawsdescs splitlinessliness_[1]slinesstrips startswithsrescompileschangeResmatchs groupdictsintsindexsfilesIdxslensdiffsIdxsfileResfiles_parseDiffOutput(sselfschanges diffFormats shortForms_raws p4optionssdiffsIdxsfilesargvsfileResfilesIdxslinesdescschangeResliness_[1]serrorsoutputsoptvsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysdescribe€sH#B  cKsØt} z²t|ƒtijo |g}nt}|o|tjo| oE|od}ddt |ƒg}qvd}ddt |ƒg}nä|ot dƒ‚n|o°d}|id|ƒ}|tjonc|gjog|dgi}|iƒD]}|hd |d <ƒq~}nO|gjon>gi}|i|ƒD]}|hd |d <ƒqá~}td|d |dd ƒ} n t d ƒ‚tiƒ} t| dƒ} | i| ƒ| iƒddd| g}|i||\}}}|o#hd|<d|<d|], "change description") OR p4.change(description="change description for all opened files") Updating a pending changelist: p4.change(description="change description", change=) OR p4.change(files=[], change=) Deleting a pending changelist: p4.change(change=, delete=1) Getting a change description: ch = p4.change(change=) Returns a dict. When getting a change desc the dict will include 'change', 'user', 'description', 'status', and possibly 'files' keys. For all other actions the dict will include a 'change' key, an 'action' key iff the intended action was successful, and possibly a 'comment' key. If '_raw' is true then the return value is simply a dictionary with the unprocessed results of calling p4: {'stdout': , 'stderr': , 'retval': } Limitations: The -s (jobs) and -f (force) flags are not supported. sdeleteschanges-dsgets-os=Cannot specify 'delete' with either 'files' or 'description'.supdatesfiless depotFiles descriptionscreatesnewsIncomplete/missing arguments.sws-is^Change (?P\d+) (?Pcreated|updated|deleted)\.$s?^Change (?P\d+) (?Pcreated) (?P.+?)\.$s@^Change (?P\d+) (?Pupdated), (?P.+?)\.$s+^Change (?P\d+) (?P.+?)\.$is8Internal error: could not parse change '%s' output: '%s's'Internal error: unexpected action: '%s'N(0sNonesformfilestypesfilesstypess StringTypessactionschanges descriptionsdeletesstrsargvs P4LibErrorsselfschsappends_[1]swheresfs depotfilessmakeFormsformsopenedstempfilesmktempsopensfoutswritescloses_p4runs p4optionssoutputserrorsretvals_raws parseForms splitlinesslinessrescompiles resultRessresultResmatchs groupdictsintserrsossremove(sselfsfiless descriptionschangesdeletes_raws p4optionsschs resultRessformfilesfoutsresultResmatchsformserrorsargvs depotfilesserrsfsliness_[1]sactionsoutputsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyschangeºs~"   =  > =    # 6   cKsÂ|tj ot|ƒtijo td|t|ƒfƒ‚n|tj o|ddfjotd|ƒ‚nt|ƒtijo |g}ng}|o|i dƒn|o|i dƒn|tj o|dt |ƒg7}n|tj o|d|g7}nd g|} |o| |7} n|i| |\}}} |o#hd |<d |<d | , 'stderr': , 'retval': } s>Incorrect 'max' value. It must be an integer: '%s' (type '%s')spendings submittedsIncorrect 'status' value: '%s's-is-ls-ms-sschangessstdoutsstderrsretvalsU^Change (?P\d+) on (?P[\d/]+) by (?P[^\s@]+)@(?P[^\s@]+)$is iÿÿÿÿs descriptionschangess{^Change (?P\d+) on (?P[\d/]+) by (?P[^\s@]+)@(?P[^\s@]+) (\*pending\* )?'(?P.*?)'$s>Internal error: could not parse 'p4 changes' output line: '%s'N("smaxsNonestypestypessIntTypes P4LibErrorsstatussfiless StringTypessoptvsfollowIntegrationssappends longOutputsstrsargvsselfs_p4runs p4optionssoutputserrorsretvals_rawschangessrescompileschangeRes splitlinesslinesstrips startswithsmatchs groupdictschangesint(sselfsfilessfollowIntegrationss longOutputsmaxsstatuss_raws p4optionsschangesmatchsargvslineschangeResretvalserrorsoutputsoptvschanges((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyschangesCsZ#      #  cKsOt|ƒtijo |g}ng}|o|idƒn|o|idƒndg|} hdd<dd<dd<}|o•d }xÅt dt |ƒ|ƒD]n}| ||||!} |i| |\}}}|dc|7<|dc|7<|dc|pd7| i!ƒ}t#|dƒ|d, 'stderr': , 'retval': } s-fs-nssyncsstdoutssstderrsretvalii s4^(?P.+?)#(?P\d+) - (?P.+?)$is... s - iÿÿÿÿsnotessrevs:Internal error: could not parse 'p4 sync'output line: '%s'N(%stypesfilesstypess StringTypessoptvsforcesappendsdryrunsargvsresultssSET_SIZEsrangeslensisset_argvsselfs_p4runs p4optionssstdoutsstderrsretvals_rawshitssrescompileslineRes splitlinesslines startswithssplitsstripsnotesmatchs groupdictshitsints P4LibError(sselfsfilessforcesdryruns_raws p4optionssstdoutsresultsshitsset_argvsnoteslineResmatchsargvslineshitssisSET_SIZEsstderrsoptvsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyssync’sT  !       cKstt|ƒtijo |g}ng}|o|dt|ƒg7}n|o|d|g7}ndg||} |i | |\} } } |o#hd| <d| <d| , 'stderr': , 'retval': } s-cs-tseditsstdoutsstderrsretvals3^(?P.+?)#(?P\d+) - (?P.*)$is...s - iÿÿÿÿsnotessrevN(stypesfilesstypess StringTypessoptvschangesstrsfiletypesargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitssrescompileslineRes splitlinesslines startswithssplitsstripsnotesappendsmatchs groupdictshitsint(sselfsfilesschangesfiletypes_raws p4optionsshitsslineReshitsretvalserrorsargvsnotesoutputslinesoptv((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyseditÛs0 #  cKs¦t|ƒtijo |g}ng}|o|dt|ƒg7}n|o|d|g7}ndg||} |i | |\}} }|o#hd|<d| <d|, 'stderr': , 'retval': } s-cs-tsaddsstdoutsstderrsretvals8^(?P//.+?)(#(?P\d+))? - (?P.*)$isrevsnotess...s - iÿÿÿÿN( stypesfilesstypess StringTypessoptvschangesstrsfiletypesargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitssrescompileshitRes splitlinesslinesmatchs groupdictshitsNonesintsappends startswithssplitsstripsnote(sselfsfilesschangesfiletypes_raws p4optionssnotesmatchshitsargvslineshitsshitReserrorsoutputsoptvsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysadds8 #    c Kst|ƒtijo |g}n| otdƒ‚ndg|}|i||\} }}|o#hd| <d|<d|, 'stderr': , 'retval': } s"Missing/wrong number of arguments.sfilessstdoutsstderrsretvalsa^(?P//.*?)#(?P\d+) - (?P\w+) change (?P\d+) \((?P[\w+]+)\)$isrevschangeN(stypesfilesstypess StringTypess P4LibErrorsargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitssrescompilesfileRes splitlinesslinesmatchs groupdictshitsintsappend( sselfsfiless_raws p4optionsshitsshitsretvalserrorsargvsfileResmatchsoutputsline((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysfilesKs&   # cKsé|tj ot|ƒtijo td|t|ƒfƒ‚nt|ƒtijo |g}n| otdƒ‚ng}|o|i dƒn|o|i dƒn|tj o|dt |ƒg7}ndg||} |i| |\}} }|o#hd|<d| <d |, 'stderr': , 'retval': } sBIncorrect 'maxRevs' value. It must be an integer: '%s' (type '%s')s"Missing/wrong number of arguments.s-is-ls-msfilelogsstdoutsstderrsretvals¦^... #(?P\d+) change (?P\d+) (?P\w+) on (?P[\d/]+) by (?P[^\s@]+)@(?P[^\s@]+) \((?P[\w+]+)\)( '(?P.*?)')?$is//s depotFilesrevss... ... iÿÿÿÿsnotesis... sschangesrevsInternal parsing error: '%s's s descriptions$Unexpected 'p4 filelog' output: '%s'N("smaxRevssNonestypestypessIntTypes P4LibErrorsfiless StringTypessoptvsfollowIntegrationssappends longOutputsstrsargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitssrescompilesrevRes splitlinesslinesstrips startswithshitsmatchs groupdictsdsint(sselfsfilessfollowIntegrationss longOutputsmaxRevss_raws p4optionssmatchshitsargvslineshitssdserrorsoutputsoptvsretvalsrevRe((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysfilelognsT#   #+$cKsnt|ƒtijo |g}n| otdƒ‚ng}|o|d|g7}n|o|idƒn|o&|i } | i |ƒt| }n |i}|idg|dg||} t| ƒ}tid|ƒti|ƒ\}}} g} tidƒ} y:d}x-no%t!i"|ƒ}|d d jo^| i$|d ƒ}|i%ƒ}t'|d ƒ|d //.*?)#(?P\d+) - (?P\w+) change (?P\d+) \((?P[\w+]+)\)$iscodesinfosdataschangesrevistextiÿÿÿÿN(+stypesfilesstypess StringTypess P4LibErrorsoptvs localFilesquietsappends p4optionssselfsoptdsdsupdatesmakeOptvsp4optvs_optvsp4sargvs _joinArgvscmdslogsdebugsosspopen3sisoseshitssrescompilesfileResstartHitWithNextNodesmarshalsloadsnodesmatchs groupdictshitsintshas_keysNonesEOFError(sselfsfiless localFilesquiets p4optionssnodesp4optvsmatchshitsargvsfileResdshitssesiscmdsosstartHitWithNextNodesoptv((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysprint_¸sX     "    *cKs¶t|ƒtijo |g}n|dddddfjotd|ƒ‚n|tj o|ddd d fjotd |ƒ‚ng}|o|i d |ƒn|o|i d |ƒn|o|i dƒn|o|i dƒndg||} |i| |\}} } |o#hd|<d| <d| ) is a flag to pass to the built-in diff routine to control the output format. Valid values are '' (plain, default), 'n' (RCS), 'c' (context), 's' (summary), 'u' (unified). "force" (-f) forces a diff of every file. "satifying" (-s) limits the output to the names of files satisfying certain criteria: 'a' Opened files that are different than the revision in the depot, or missing. 'd' Unopened files that are missing on the client. 'e' Unopened files that are different than the revision in the depot. 'r' Opened files that are the same as the revision in the depot. "text" (-t) forces diffs of non-text files. Returns a list of dicts representing each file diff'd. If "satifying" is specified each dict will simply include a 'localFile' key. Otherwise, each dict will include 'localFile', 'depotFile', 'rev', and 'binary' (boolean) keys and possibly a 'text' or a 'notes' key iff there are any differences. Generally you will get a 'notes' key for differing binary files. If '_raw' is true then the return value is simply a dictionary with the unprocessed results of calling p4: {'stdout': , 'stderr': , 'retval': } ssnscsssus Incorrect diff format flag: '%s'sasdsesrs!Incorrect 'satisfying' flag: '%s's-d%ss-s%ss-fs-tsdiffsstdoutsstderrsretvalis localFileiÿÿÿÿN(stypesfilesstypess StringTypess diffFormats P4LibErrors satisfyingsNonesoptvsappendsforcestextsargvsselfs_p4runs p4optionssoutputserrorsretvals_raws_[1]s splitlinesslineshitss_parseDiffOutput(sselfsfiless diffFormatsforces satisfyingstexts_raws p4optionssoptvserrorshitssargvs_[1]sretvalsoutputsline((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysdiffûs0 &# Ac Cs|t|ƒtijo|idƒ}n|}g}tidƒ}tidƒ}x|D]} |i | ƒ}|i | ƒ}|o1|iƒ}t|dƒ|d<|i|ƒqZ|oA|iƒ}t|dƒ|d<|d |d<|i|ƒqZ|didƒ o | djo| g|dd //.*?)#(?P\d+) \((?P\w+)\) ====$sZ^==== (?P//.*?)#(?P\d+) - (?P.+?) ====(?P \(binary\))?$srevsbinaryiÿÿÿÿstexts(... files differ ...) snotess(stypesoutputstypess StringTypess splitliness outputLinesshitssrescompiles header1Res header2Reslinesmatchsheader1sheader2s groupdictshitsintsappendshas_key( sselfsoutputshitsshits header1Res header2Resheader2sheader1s outputLinessline((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pys_parseDiffOutput9s2  "cKs…|dddddfjotd|ƒ‚ng}|o|id|ƒn|o|idƒn|o|id ƒn|o&|i} | i |ƒt | } n |i } |id g| d g|||g} t| ƒ}ti|ƒ\}}}h}tid ƒ}yNxGno?ti|ƒ} | ddjo| ddjo>|i dƒo|di| dƒqa| dg|d) is a flag to pass to the built-in diff routine to control the output format. Valid values are '' (plain, default), 'n' (RCS), 'c' (context), 's' (summary), 'u' (unified). "quiet" (-q) suppresses some meta information and all information if the files do not differ. Returns a dict representing the diff. Keys are: 'depotFile1', 'rev1', 'type1', 'depotFile2', 'rev2', 'type2', 'summary', 'notes', 'text'. There may not be a 'text' key if the files are the same or are binary. The first eight keys will not be present if 'quiet'. Note that the second 'p4 diff2' style is not supported: p4 diff2 [ -d -q -t ] -b branch [ [ file1 ] file2 ] ssnscsssus Incorrect diff format flag: '%s's-d%ss-qs-ts-Gsdiff2sŽ^==== (?P.+?)#(?P\d+) \((?P[\w+]+)\) - (?P.+?)#(?P\d+) \((?P[\w+]+)\) ==== (?P\w+)$iscodesinfosdatas(... files differ ...)snotessrev1srev2stextN(&s diffFormats P4LibErrorsoptvsappendsquietstexts p4optionssselfsoptdsdsupdatesmakeOptvsp4optvs_optvsp4sfile1sfile2sargvs _joinArgvscmdsosspopen3sisosesdiffsrescompilesinfoResmarshalsloadsnodeshas_keysmatchs groupdictsintsNonesEOFError(sselfsfile1sfile2s diffFormatsquietstexts p4optionssdiffsinfoResp4optvsmatchsnodesargvsdsesiscmdsosoptv((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysdiff2dsR   ( " "!cKs€t|ƒtijo |g}ng} |o| dt|ƒg7} n|o| dg7} n| o| otdƒ‚ndg| |}|i ||\}} }|o#hd|<d| <d|, 'stderr': , 'retval': } s-cs-as"Missing/wrong number of arguments.srevertsstdoutsstderrsretvals8^(?P//.+?)(#(?P\w+))? - (?P.*)$isrevsInternal parsing error: '%s'N(stypesfilesstypess StringTypessoptvschangesstrs unchangedOnlys P4LibErrorsargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitssrescompileshitRes splitlinesslinesmatchs groupdictshitsints ValueErrorsappend(sselfsfilesschanges unchangedOnlys_raws p4optionssmatchshitsargvslineshitssoptvshitReserrorsoutputsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysrevert¬s8 # cKs‚t|ƒtijo |g}ng}|tjotdƒ‚n|d|g7}|o|dg7}n|o|dg7}n|o|dg7}n|o|dg7}ndg|}hdd <d d <d d <} |o•d }xÅtd t|ƒ|ƒD]n}|||||!}|i||\} }}| dc| 7<| d c|7<| d c|pd 7, 'stderr': , 'retval': } sw'autoMode' must be non-None, otherwise 'p4 resolve' may initiate command line interaction, which will hang this method.s-a%ss-fs-ns-ts-vsresolvesstdoutssstderrsretvalii sE^(?P.+?) - (merging|vs) (?P//.+?)#(?P\d+)$sw^Diff chunks: (?P\d+) yours \+ (?P\d+) theirs \+ (?P\d+) both \+ (?P\d+) conflicting$s.^(?P//.+?) - (?P.+?)(\.)?$isrevs!parsed resolve 'intro' line: '%s'syoursstheirssboths conflictingiÿÿÿÿs diff chunkss parsed resolve 'diff' line: '%s's"parsed resolve 'action' line: '%s'sKInternal error: could not parse 'p4 resolve' output line: line='%s' argv=%sN(,stypesfilesstypess StringTypessoptvsautoModesNones P4LibErrorsforcesdryrunstextsverbosesargvsresultssSET_SIZEsrangeslensisset_argvsselfs_p4runs p4optionssstdoutsstderrsretvals_rawshitssrescompilesintroResdiffResactionRes splitlinesslinesmatchs groupdictshitsintsappendslogsinfosstripsdiffsupdate(sselfsfilessautoModesforcesdryrunstextsverboses_raws p4optionssstdoutsresultssactionResdiffshitsset_argvsmatchsargvsintroReslineshitssoptvsisdiffResSET_SIZEsstderrsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysresolveàs|&   !      cKs\t}z6t|ƒtijo |g}n|o | o| oddt|ƒg}n| o|tj o|oæ| o>gi }|i ƒD]}|hd|d<ƒq”~}n>gi }|i|ƒD]}|hd|d<ƒqÕ~}tiƒ}td|d|ddƒ} t|dƒ} | i| ƒ| iƒdd d |g}n td ƒ‚|i||\}}}|o#hd |<d |<d|, 'stderr': , 'retval': } ssubmits-cs depotFilesfiless descriptionschangesnewsws-is\w+) (?P//.+?)#(?P\d+)$s/^Change (?P\d+) (?Psubmitted)\.isrevsparsed submit 'file' line: '%s's!parsed submit 'result' line: '%s'sparsed submit 'skip' line: '%s'sUUnrecognized output line from running %s: '%s'. Please report this to the maintainer.N(3sNonesformfilestypesfilesstypess StringTypesschanges descriptionsstrsargvsappends_[1]sselfsopenedsfswherestempfilesmktempsmakeFormsformsopensfoutswritescloses P4LibErrors_p4runs p4optionssoutputserrorsretvals_rawsrescompilesskipRessfileResresultResresults splitlinesslinesmatchs groupdictsfilesintslogsinfosstripsupdatesskipReswarnsossremove(sselfsfiless descriptionschanges_raws p4optionssfilesformfilesresultsfoutslinesresultResmatchsformsargvsfileResskipRessfsskipRes_[1]serrorsoutputsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pyssubmitjsl >=     #*      cKsCt|ƒtijo |g}ng} |o| dt|ƒg7} ndg| |}|i ||\} } }|o#hd| <d| <d|, 'stderr': , 'retval': } s-csdeletesstdoutsstderrsretvals6^(?P.+?)(#(?P\d+))? - (?P.*)$isrevs`Internal error: could not parse 'p4 delete' output line: '%s'. Please report this to the author.N(stypesfilesstypess StringTypessoptvschangesstrsargvsselfs_p4runs p4optionssoutputserrorsretvals_rawshitssrescompileshitRes splitlinesslinesmatchs groupdictshitsNonesintsappends P4LibError(sselfsfilesschanges_raws p4optionssmatchshitsargvslineshitssoptvshitReserrorsoutputsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysdeleteãs, # cKsEt}zt}|o6d}|tjotdƒ‚ndd|g} nî|tjo6d}|tjotdƒ‚ndd|g} n«d}|idƒo|d}n|tj o|id |ƒ}nh}|i |ƒt |} tiƒ}t|d ƒ}|i| ƒ|iƒdd d |g} |i| |\}}}|o#hd |<d|<d|) OR p4.client(name=, client=) Returns a dictionary of the following form: {'client': , 'action': } Deleting a client spec: p4.client(name=, delete=1) Returns a dictionary of the following form: {'client': , 'action': 'deleted'} Getting a client spec: ch = p4.client(name=) Returns a dictionary describing the client. For example: {'access': '2002/07/16 00:05:31', 'client': 'trentm-ra', 'description': 'Created by trentm.', 'host': 'ra', 'lineend': 'local', 'options': 'noallwrite noclobber nocompress unlocked nomodtime normdir', 'owner': 'trentm', 'root': 'c:\trentm\', 'update': '2002/03/18 22:33:18', 'view': '//depot/... //trentm-ra/...'} If '_raw' is true then the return value is simply a dictionary with the unprocessed results of calling p4: {'stdout': , 'stderr': , 'retval': } Limitations: The -f (force) and -t (template) flags are not supported. However, there is no strong need to support -t because the use of dictionaries in this API makes this trivial. sdeletesFIncomplete/missing arguments: must specify 'name' of client to delete.sclients-dsgetsCIncomplete/missing arguments: must specify 'name' of client to get.s-os create/updatesnamesws-is[^\s@]+) (?Pnot changed|deleted|saved)\.$is6Internal error: could not parse p4 client output: '%s's'Internal error: unexpected action: '%s'N(&sNonesformfilesactionsdeletesnames P4LibErrorsargvsclientshas_keysselfsclsupdatesmakeFormsformstempfilesmktempsopensfoutswritescloses_p4runs p4optionssoutputserrorsretvals_raws parseFormsrvs splitlinesslinessrescompilesresultResmatchs groupdictserrsossremove(sselfsnamesclientsdeletes_raws p4optionssclsformfilesfoutsrvsresultResmatchsformsargvserrslinesserrorsactionsoutputsretval((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysclientsZ%         #  c KsÈdg}|i||\}}} |o#hd|<d|<d| , 'stderr': , 'retval': } sclientssstdoutsstderrsretvalsY^Client (?P[^\s@]+) (?P[\d/]+) root (?P.*?) '(?P.*?)'$is>Internal error: could not parse 'p4 clients' output line: '%s'N(sargvsselfs_p4runs p4optionssoutputserrorsretvals_rawsrescompilesclientResclientss splitlinesslinesmatchs groupdictsclientsappends P4LibError( sselfs_raws p4optionssclientssargvsclientserrorsoutputslinesretvalsclientResmatch((s5/mnt/gmirror/ports/devel/py-px/work/px-0.9.1/p4lib.pysclientsus # cKsEt}zt}|o6d}|tjotdƒ‚ndd|g} nî|tjo6d}|tjotdƒ‚ndd|g} n«d}|idƒo|d}n|tj o|id |ƒ}nh}|i |ƒt |} tiƒ}t|d ƒ}|i| ƒ|iƒdd d |g} |i| |\}}}|o#hd |<d|<d|) OR p4.label(name=, label=