Hi list:
How about a verbose option "-v"? On the one hand it is very useful for the impatient user that needs some sort of immediate feedback. on the other hand it could be useful for other applications that might need to analyze pungis output (like revisor). The idea is to have the option off by defect and when the user specifies "-v" at the command line, all the logging information is showed. With the output I did a very simple progress bar and every thing seem to work correctly (the progress bar example is not attached, it works but its not pretty :). The verbose option contains the logging patch I posted earlier.
The diffs are attached.
--- gather.py-original 2007-05-03 18:35:02.000000000 +0200 +++ gather.py-JG 2007-05-04 17:25:21.000000000 +0200 @@ -16,6 +16,9 @@ import os import shutil import sys +import logging + +log = logging.getLogger("pungi")
class Gather(yum.YumBase): def __init__(self, config, pkglist): @@ -46,7 +49,6 @@ #self.doSackSetup(arches) self.doSackSetup(archlist=arches) # work around temp break in yum api self.doSackFilelistPopulate() - self.logger = yum.logging.getLogger("yum.verbose.pungi") self.pkglist = pkglist self.polist = [] self.srpmlist = [] @@ -56,15 +58,8 @@ self.compsobj.add(self.config.get('default', 'comps'))
def doLoggingSetup(self, debuglevel, errorlevel): - """Setup the logging facility.""" - - - logdir = os.path.join(self.config.get('default', 'destdir'), 'logs') - if not os.path.exists(logdir): - os.makedirs(logdir) - logfile = os.path.join(logdir, '%s.%s.log' % (self.config.get('default', 'flavor'), - self.config.get('default', 'arch'))) - yum.logging.basicConfig(level=yum.logging.DEBUG, filename=logfile) + # We want to use our own logger. + pass
def doFileLogSetup(self, uid, logfile): # This function overrides a yum function, allowing pungi to control @@ -76,8 +71,7 @@ transaction info"""
- if not self.config.has_option('default', 'quiet'): - self.logger.info('Checking deps of %s.%s' % (po.name, po.arch)) + log.info('Checking deps of %s.%s' % (po.name, po.arch))
reqs = po.requires provs = po.provides @@ -93,13 +87,12 @@
deps = self.whatProvides(r, f, v).returnPackages() if deps is None: - self.logger.warning("Unresolvable dependency %s in %s.%s" % (r, po.name, po.arch)) + log.warning("Unresolvable dependency %s in %s.%s" % (r, po.name, po.arch)) continue
for dep in deps: self.tsInfo.addInstall(dep) - if not self.config.has_option('default', 'quiet'): - self.logger.info('Added %s.%s for %s.%s' % (dep.name, dep.arch, po.name, po.arch)) + log.info('Added %s.%s for %s.%s' % (dep.name, dep.arch, po.name, po.arch))
self.resolved_deps[req] = None
@@ -124,7 +117,7 @@
# Check if we have the group if not self.compsobj.has_group(group): - self.logger.error("Group %s not found in comps!" % group) + log.error("Group %s not found in comps!" % group) return packages
# Get the group object to work with @@ -175,22 +168,18 @@ for line in self.pkglist: line = line.strip() if line.startswith('#'): - if not self.config.has_option('default', 'quiet'): - self.logger.info('Skipping comment: %s' % line) + log.info('Skipping comment: %s' % line) continue if line.startswith('@'): - if not self.config.has_option('default', 'quiet'): - self.logger.info('Adding group: %s' % line) + log.info('Adding group: %s' % line) grouplist.append(line.strip('@')) continue if line.startswith('-'): - if not self.config.has_option('default', 'quiet'): - self.logger.info('Adding exclude: %s' % line) + log.info('Adding exclude: %s' % line) excludelist.append(line.strip('-')) continue else: - if not self.config.has_option('default', 'quiet'): - self.logger.info('Adding package: %s' % line) + log.info('Adding package: %s' % line) addlist.append(line)
# First remove the excludes @@ -219,12 +208,10 @@ mysack = yum.packageSack.ListPackageSack(matches) for match in mysack.returnNewestByNameArch(): self.tsInfo.addInstall(match) - if not self.config.has_option('default', 'quiet'): - self.logger.info('Found %s.%s' % (match.name, match.arch)) + log.info('Found %s.%s' % (match.name, match.arch))
for pkg in unmatched: - if not pkg in matchdict.keys(): - self.logger.warn('Could not find a match for %s' % pkg) + log.warn('Could not find a match for %s' % pkg)
if len(self.tsInfo) == 0: raise yum.Errors.MiscError, 'No packages found to download.' @@ -262,7 +249,7 @@ for pkg in self.polist: downloads.append('%s.%s' % (pkg.name, pkg.arch)) downloads.sort() - self.logger.info("Download list: %s" % downloads) + log.info("Download list: %s" % downloads)
# Package location within destdir, name subject to change/config pkgdir = os.path.join(self.config.get('default', 'destdir'), self.config.get('default', 'version'), @@ -282,8 +269,7 @@ if (os.path.exists(local) and str(os.path.getsize(local)) == pkg.packagesize):
- if not self.config.has_option('default', 'quiet'): - self.logger.info("%s already exists and appears to be complete" % local) + log.info("%s already exists and appears to be complete" % local) target = os.path.join(pkgdir, os.path.basename(remote)) if os.path.exists(target): os.remove(target) # avoid traceback after interrupted download @@ -292,8 +278,7 @@
# Disable cache otherwise things won't download repo.cache = 0 - if not self.config.has_option('default', 'quiet'): - self.logger.info('Downloading %s' % os.path.basename(remote)) + log.info('Downloading %s' % os.path.basename(remote)) pkg.localpath = local # Hack: to set the localpath to what we want.
# do a little dance for file:// repos... @@ -348,19 +333,16 @@ local = os.path.join(self.config.get('default', 'cachedir'), local) if os.path.exists(local) and str(os.path.getsize(local)) == pkg.packagesize:
- if not self.config.has_option('default', 'quiet'): - self.logger.info("%s already exists and appears to be complete" % local) + log.info("%s already exists and appears to be complete" % local) if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and str(os.path.getsize(os.path.join(pkgdir, os.path.basename(remote)))) == pkg.packagesize: - if not self.config.has_option('default', 'quiet'): - self.logger.info("%s already exists in tree and appears to be complete" % local) + log.info("%s already exists in tree and appears to be complete" % local) else: os.link(local, os.path.join(pkgdir, os.path.basename(remote))) continue
# Disable cache otherwise things won't download repo.cache = 0 - if not self.config.has_option('default', 'quiet'): - self.logger.info('Downloading %s' % os.path.basename(remote)) + log.info('Downloading %s' % os.path.basename(remote)) pkg.localpath = local # Hack: to set the localpath to what we want.
# do a little dance for file:// repos...
--- pungi.py-original 2007-05-03 18:34:48.000000000 +0200 +++ pungi.py-JG 2007-05-04 17:33:30.000000000 +0200 @@ -21,12 +21,16 @@ import shutil import re
-log = logging.getLogger("pypungi.pungi") +log = logging.getLogger("pungi")
class Pungi: def __init__(self, config): self.config = config self.prodpath = 'Fedora' # Probably should be defined elsewhere + #self.config.set('default', 'destdir', os.path.join(int(time()), + # self.config.get('default','destdir'))) + #import pdb + #pdb.set_trace() self.destdir = self.config.get('default', 'destdir') self.archdir = os.path.join(self.destdir, self.config.get('default', 'version'),
--- pungi-original 2007-05-03 18:34:32.000000000 +0200 +++ pungi-JG 2007-05-04 17:36:38.000000000 +0200 @@ -16,6 +16,7 @@ import pypungi.gather import pypungi.pungi import yum +import logging
from ConfigParser import SafeConfigParser
@@ -79,6 +80,19 @@
destdir = config.get('default', 'destdir')
+ if not config.has_option('default', 'quiet'):quiet=False + else:quiet=True + config.set('default','quiet',str(quiet)) + + config.set('default','verbose',str(opts.verbose)) + + # initialize logging. + initLogger(config.get('default', 'destdir'), + '%s.%s.log' % (config.get('default', 'flavor'), config.get('default', 'arch')), + quiet=quiet, + useVerboseMode= opts.verbose) + log = logging.getLogger("pungi") + if not os.path.exists(destdir): try: os.makedirs(destdir) @@ -157,6 +171,8 @@ help="Flag to enable processing the SplitTree stage") parser.add_option("-I", action="store_true", default=False, dest="do_createiso", help="Flag to enable processing the CreateISO stage") + parser.add_option("-v", action="store_true", default=False, dest="verbose", + help="Flag to enable verbose mode")
(opts, args) = parser.parse_args() @@ -180,4 +195,31 @@ manifestfile.close() return pkglist
+ def initLogger(path, filename, quiet=True, useVerboseMode=False): + """Initialize the log stuff so other files can use it. + + path - Is the directory where the log will be located + filename - Is the log files name + useLogFile - Whether to log to the file or not + useVerboseMode - Whether to output stuff to pungis stdout + """ + logger = logging.getLogger("pungi") + if not quiet: + logdir = os.path.join(path , 'logs') + if not os.path.exists(logdir): + os.makedirs(logdir) + logfile = os.path.join(logdir, filename) + + fileHandler = logging.FileHandler(logfile) + fileHandler.setLevel(logging.DEBUG) + logger.addHandler(fileHandler) + + if useVerboseMode: + stdoutHandler = logging.StreamHandler(sys.stdout) + stdoutHandler.setLevel(logging.INFO) + logger.addHandler(stdoutHandler) + + logger.setLevel(logging.DEBUG) + if quiet and not useVerboseMode:logger.disabled=1 + main()
On Friday 04 May 2007 11:39:21 Joel Andres Granados wrote:
How about a verbose option "-v"? On the one hand it is very useful for the impatient user that needs some sort of immediate feedback. on the other hand it could be useful for other applications that might need to analyze pungis output (like revisor). The idea is to have the option off by defect and when the user specifies "-v" at the command line, all the logging information is showed. With the output I did a very simple progress bar and every thing seem to work correctly (the progress bar example is not attached, it works but its not pretty :). The verbose option contains the logging patch I posted earlier.
I like the idea, but I think a verbose mode should both echo to the cli as well as log to the file.
buildsys@lists.fedoraproject.org