/usr/lib/python2.6/site-packages/yum
NameSizeModeActions
callbacks.py46660755editdlrm
callbacks.pyc52780644editdlrm
callbacks.pyo52780644editdlrm
comps.py207700755editdlrm
comps.pyc175680644editdlrm
comps.pyo175680644editdlrm
config.py372920755editdlrm
config.pyc374700644editdlrm
config.pyo374700644editdlrm
constants.py46980755editdlrm
constants.pyc35750644editdlrm
constants.pyo35750644editdlrm
depsolve.py655120755editdlrm
depsolve.pyc396440644editdlrm
depsolve.pyo395860644editdlrm
Errors.py37800755editdlrm
Errors.pyc81850644editdlrm
Errors.pyo81850644editdlrm
failover.py33720755editdlrm
failover.pyc35910644editdlrm
failover.pyo35910644editdlrm
history.py624680755editdlrm
history.pyc549850644editdlrm
history.pyo547690644editdlrm
i18n.py206830755editdlrm
i18n.pyc165160644editdlrm
i18n.pyo165160644editdlrm
logginglevels.py79860755editdlrm
logginglevels.pyc66200644editdlrm
logginglevels.pyo66200644editdlrm
mdparser.py64080755editdlrm
mdparser.pyc78180644editdlrm
mdparser.pyo78180644editdlrm
metalink.py95060755editdlrm
metalink.pyc91470644editdlrm
metalink.pyo90770644editdlrm
misc.py367160755editdlrm
misc.pyc369260644editdlrm
misc.pyo368850644editdlrm
packages.py824890755editdlrm
packages.pyc796130644editdlrm
packages.pyo795720644editdlrm
packageSack.py418790755editdlrm
packageSack.pyc433720644editdlrm
packageSack.pyo433720644editdlrm
parser.py78070755editdlrm
parser.pyc65450644editdlrm
parser.pyo65450644editdlrm
pgpmsg.py544200755editdlrm
pgpmsg.pyc395980644editdlrm
pgpmsg.pyo395980644editdlrm
pkgtag_db.py49550755editdlrm
pkgtag_db.pyc52110644editdlrm
pkgtag_db.pyo52110644editdlrm
plugins.py250830755editdlrm
plugins.pyc263840644editdlrm
plugins.pyo263840644editdlrm
repoMDObject.py100840755editdlrm
repoMDObject.pyc86170644editdlrm
repoMDObject.pyo86170644editdlrm
repos.py143020755editdlrm
repos.pyc158340644editdlrm
repos.pyo157850644editdlrm
rpmsack.py687620755editdlrm
rpmsack.pyc584470644editdlrm
rpmsack.pyo583080644editdlrm
rpmtrans.py250040755editdlrm
rpmtrans.pyc235000644editdlrm
rpmtrans.pyo234430644editdlrm
sqlitesack.py713790755editdlrm
sqlitesack.pyc557780644editdlrm
sqlitesack.pyo553500644editdlrm
sqlutils.py64220755editdlrm
sqlutils.pyc57890644editdlrm
sqlutils.pyo57890644editdlrm
transactioninfo.py320070755editdlrm
transactioninfo.pyc297180644editdlrm
transactioninfo.pyo297180644editdlrm
update_md.py247140755editdlrm
update_md.pyc212960644editdlrm
update_md.pyo212960644editdlrm
yumRepo.py759780755editdlrm
yumRepo.pyc596180644editdlrm
yumRepo.pyo596180644editdlrm
__init__.py2392050755editdlrm
__init__.pyc1565380644editdlrm
__init__.pyo1563650644editdlrm
Edit: /usr/lib/python2.6/site-packages/yum/parser.py (7807B)
#! /usr/bin/python -tt import re import urlparse import urlgrabber import os.path import Errors _KEYCRE = re.compile(r"\$(\w+)") def varReplace(raw, vars): '''Perform variable replacement @param raw: String to perform substitution on. @param vars: Dictionary of variables to replace. Key is variable name (without $ prefix). Value is replacement string. @return: Input raw string with substituted values. ''' if not vars: return raw done = [] # Completed chunks to return while raw: m = _KEYCRE.search(raw) if not m: done.append(raw) break # Determine replacement value (if unknown variable then preserve # original) varname = m.group(1).lower() replacement = vars.get(varname, m.group()) start, end = m.span() done.append(raw[:start]) # Keep stuff leading up to token done.append(replacement) # Append replacement value raw = raw[end:] # Continue with remainder of string return ''.join(done) class ConfigPreProcessor: """ ConfigParser Include Pre-Processor File-like Object capable of pre-processing include= lines for a ConfigParser. The readline function expands lines matching include=(url) into lines from the url specified. Includes may occur in included files as well. Suggested Usage:: cfg = ConfigParser.ConfigParser() fileobj = confpp( fileorurl ) cfg.readfp(fileobj) """ def __init__(self, configfile, vars=None): # put the vars away in a helpful place self._vars = vars # used to track the current ini-section self._section = None # set some file-like object attributes for ConfigParser # these just make confpp look more like a real file object. self.mode = 'r' # first make configfile a url even if it points to # a local file scheme = urlparse.urlparse(configfile)[0] if scheme == '': # check it to make sure it's not a relative file url if configfile[0] != '/': configfile = os.getcwd() + '/' + configfile url = 'file://' + configfile else: url = configfile # these are used to maintain the include stack and check # for recursive/duplicate includes self._incstack = [] self._alreadyincluded = [] # _pushfile will return None if he couldn't open the file fo = self._pushfile( url ) if fo is None: raise Errors.ConfigError, 'Error accessing file: %s' % url def readline( self, size=0 ): """ Implementation of File-Like Object readline function. This should be the only function called by ConfigParser according to the python docs. We maintain a stack of real FLOs and delegate readline calls to the FLO on top of the stack. When EOF occurs on the topmost FLO, it is popped off the stack and the next FLO takes over. include= lines found anywhere cause a new FLO to be opened and pushed onto the top of the stack. Finally, we return EOF when the bottom-most (configfile arg to __init__) FLO returns EOF. Very Technical Pseudo Code:: def confpp.readline() [this is called by ConfigParser] open configfile, push on stack while stack has some stuff on it line = readline from file on top of stack pop and continue if line is EOF if line starts with 'include=' then error if file is recursive or duplicate otherwise open file, push on stack continue else return line return EOF """ # set line to EOF initially. line='' while len(self._incstack) > 0: # peek at the file like object on top of the stack fo = self._incstack[-1] line = fo.readline() if len(line) > 0: m = re.match( r'\s*include\s*=\s*(?P.*)', line ) if m: url = m.group('url') if len(url) == 0: raise Errors.ConfigError, \ 'Error parsing config %s: include must specify file to include.' % (self.name) else: # whooohoo a valid include line.. push it on the stack url = varReplace(url, self._vars) fo = self._pushfile( url ) else: # check if the current line starts a new section secmatch = re.match( r'\s*\[(?P
.*)\]', line ) if secmatch: self._section = secmatch.group('section') # line didn't match include=, just return it as is # for the ConfigParser break else: # the current file returned EOF, pop it off the stack. self._popfile() # at this point we have a line from the topmost file on the stack # or EOF if the stack is empty return varReplace(line, self._vars) def _absurl( self, url ): """ Returns an absolute url for the (possibly) relative url specified. The base url used to resolve the missing bits of url is the url of the file currently being included (i.e. the top of the stack). """ if len(self._incstack) == 0: # it's the initial config file. No base url to resolve against. return url else: return urlparse.urljoin( self.geturl(), url ) def _pushfile( self, url ): """ Opens the url specified, pushes it on the stack, and returns a file like object. Returns None if the url has previously been included. If the file can not be opened this function exits. """ # absolutize this url using the including files url # as a base url. absurl = self._absurl(url) # get the current section to add it to the included # url's name. includetuple = (absurl, self._section) # check if this has previously been included. if self._isalreadyincluded(includetuple): return None try: fo = urlgrabber.grabber.urlopen(absurl) except urlgrabber.grabber.URLGrabError, e: fo = None if fo is not None: self.name = absurl self._incstack.append( fo ) self._alreadyincluded.append(includetuple) else: raise Errors.ConfigError, \ 'Error accessing file for config %s' % (absurl) return fo def _popfile( self ): """ Pop a file off the stack signaling completion of including that file. """ fo = self._incstack.pop() fo.close() if len(self._incstack) > 0: self.name = self._incstack[-1].geturl() else: self.name = None def _isalreadyincluded( self, tuple ): """ Checks if the tuple describes an include that was already done. This does not necessarily have to be recursive """ for etuple in self._alreadyincluded: if etuple == tuple: return 1 return 0 def geturl(self): return self.name