Move utility functions to util.py; call appropriately.
Also fix some whitespace issues (hey, it's my project, I can do whitespace changes)
This commit is contained in:
parent
a9249e3c31
commit
a81ead6181
@ -18,7 +18,7 @@ import re
|
||||
import shutil
|
||||
import sys
|
||||
import gzip
|
||||
import pypungi
|
||||
import pypungi.util
|
||||
import logging
|
||||
import urlgrabber.progress
|
||||
import subprocess
|
||||
@ -46,7 +46,7 @@ class PungiBase(object):
|
||||
|
||||
logdir = os.path.join(self.config.get('default', 'destdir'), 'logs')
|
||||
|
||||
_ensuredir(logdir, None, force=True) # Always allow logs to be written out
|
||||
pypungi.util._ensuredir(logdir, None, force=True) # Always allow logs to be written out
|
||||
|
||||
if self.config.get('default', 'flavor'):
|
||||
logfile = os.path.join(logdir, '%s.%s.log' % (self.config.get('default', 'flavor'),
|
||||
@ -60,82 +60,13 @@ class PungiBase(object):
|
||||
filename=logfile)
|
||||
|
||||
|
||||
def _doRunCommand(command, logger, rundir='/tmp', output=subprocess.PIPE, error=subprocess.PIPE, env=None):
|
||||
"""Run a command and log the output. Error out if we get something on stderr"""
|
||||
|
||||
|
||||
logger.info("Running %s" % subprocess.list2cmdline(command))
|
||||
|
||||
p1 = subprocess.Popen(command, cwd=rundir, stdout=output, stderr=error, universal_newlines=True, env=env)
|
||||
(out, err) = p1.communicate()
|
||||
|
||||
if out:
|
||||
logger.debug(out)
|
||||
|
||||
if p1.returncode != 0:
|
||||
logger.error("Got an error from %s" % command[0])
|
||||
logger.error(err)
|
||||
raise OSError, "Got an error from %s: %s" % (command[0], err)
|
||||
|
||||
def _link(local, target, logger, force=False):
|
||||
"""Simple function to link or copy a package, removing target optionally."""
|
||||
|
||||
if os.path.exists(target) and force:
|
||||
os.remove(target)
|
||||
|
||||
try:
|
||||
os.link(local, target)
|
||||
except OSError, e:
|
||||
if e.errno != 18: # EXDEV
|
||||
logger.error('Got an error linking from cache: %s' % e)
|
||||
raise OSError, e
|
||||
|
||||
# Can't hardlink cross file systems
|
||||
shutil.copy2(local, target)
|
||||
|
||||
def _ensuredir(target, logger, force=False, clean=False):
|
||||
"""Ensure that a directory exists, if it already exists, only continue
|
||||
if force is set."""
|
||||
|
||||
# We have to check existance of a logger, as setting the logger could
|
||||
# itself cause an issue.
|
||||
def whoops(func, path, exc_info):
|
||||
message = 'Could not remove %s' % path
|
||||
if logger:
|
||||
logger.error(message)
|
||||
else:
|
||||
sys.stderr(message)
|
||||
sys.exit(1)
|
||||
|
||||
if os.path.exists(target) and not os.path.isdir(target):
|
||||
message = '%s exists but is not a directory.' % target
|
||||
if logger:
|
||||
logger.error(message)
|
||||
else:
|
||||
sys.stderr(message)
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(target):
|
||||
os.makedirs(target)
|
||||
elif force and clean:
|
||||
shutil.rmtree(target, onerror=whoops)
|
||||
os.makedirs(target)
|
||||
elif force:
|
||||
return
|
||||
else:
|
||||
message = 'Directory %s already exists. Use --force to overwrite.' % target
|
||||
if logger:
|
||||
logger.error(message)
|
||||
else:
|
||||
sys.stderr(message)
|
||||
sys.exit(1)
|
||||
|
||||
class CallBack(urlgrabber.progress.TextMeter):
|
||||
"""A call back function used with yum."""
|
||||
|
||||
def progressbar(self, current, total, name=None):
|
||||
return
|
||||
|
||||
|
||||
class PungiYum(yum.YumBase):
|
||||
"""Subclass of Yum"""
|
||||
|
||||
@ -163,6 +94,7 @@ class PungiYum(yum.YumBase):
|
||||
# the logging.
|
||||
pass
|
||||
|
||||
|
||||
class Pungi(pypungi.PungiBase):
|
||||
def __init__(self, config, ksparser):
|
||||
pypungi.PungiBase.__init__(self, config)
|
||||
@ -186,7 +118,7 @@ class Pungi(pypungi.PungiBase):
|
||||
self.topdir = os.path.join(self.archdir, 'os')
|
||||
self.isodir = os.path.join(self.archdir, self.config.get('default','isodir'))
|
||||
|
||||
pypungi._ensuredir(self.workdir, self.logger, force=True)
|
||||
pypungi.util._ensuredir(self.workdir, self.logger, force=True)
|
||||
|
||||
self.common_files = []
|
||||
self.infofile = os.path.join(self.config.get('default', 'destdir'),
|
||||
@ -461,9 +393,9 @@ class Pungi(pypungi.PungiBase):
|
||||
# Ensure the pkgdir exists, force if requested, and make sure we clean it out
|
||||
if relpkgdir.endswith('SRPMS'):
|
||||
# Since we share source dirs with other arches don't clean, but do allow us to use it
|
||||
pypungi._ensuredir(pkgdir, self.logger, force=True, clean=False)
|
||||
pypungi.util._ensuredir(pkgdir, self.logger, force=True, clean=False)
|
||||
else:
|
||||
pypungi._ensuredir(pkgdir, self.logger, force=self.config.getboolean('default', 'force'), clean=True)
|
||||
pypungi.util._ensuredir(pkgdir, self.logger, force=self.config.getboolean('default', 'force'), clean=True)
|
||||
|
||||
probs = self.ayum.downloadPkgs(polist)
|
||||
|
||||
@ -483,7 +415,7 @@ class Pungi(pypungi.PungiBase):
|
||||
|
||||
# Link downloaded package in (or link package from file repo)
|
||||
try:
|
||||
pypungi._link(local, target, self.logger, force=True)
|
||||
pypungi.util._link(local, target, self.logger, force=True)
|
||||
continue
|
||||
except:
|
||||
self.logger.error("Unable to link %s from the yum cache." % po.name)
|
||||
@ -518,7 +450,7 @@ class Pungi(pypungi.PungiBase):
|
||||
#compsfilter.append('/usr/share/pungi/comps-cleanup.xsl')
|
||||
#compsfilter.append(ourcompspath)
|
||||
|
||||
#pypungi._doRunCommand(compsfilter, self.logger)
|
||||
#pypungi.util._doRunCommand(compsfilter, self.logger)
|
||||
|
||||
def downloadSRPMs(self):
|
||||
"""Cycle through the list of srpms and
|
||||
@ -599,7 +531,7 @@ class Pungi(pypungi.PungiBase):
|
||||
repoview.append(path)
|
||||
|
||||
# run the command
|
||||
pypungi._doRunCommand(repoview, self.logger)
|
||||
pypungi.util._doRunCommand(repoview, self.logger)
|
||||
|
||||
def doCreaterepo(self, comps=True):
|
||||
"""Run createrepo to generate repodata in the tree."""
|
||||
@ -611,7 +543,7 @@ class Pungi(pypungi.PungiBase):
|
||||
|
||||
# setup the cache dirs
|
||||
for target in ['createrepocache', 'repoviewcache']:
|
||||
pypungi._ensuredir(os.path.join(self.config.get('default', 'cachedir'),
|
||||
pypungi.util._ensuredir(os.path.join(self.config.get('default', 'cachedir'),
|
||||
target),
|
||||
self.logger,
|
||||
force=True)
|
||||
@ -652,7 +584,7 @@ class Pungi(pypungi.PungiBase):
|
||||
|
||||
# run the command
|
||||
# TMPDIR is still broken with buildinstall.
|
||||
pypungi._doRunCommand(buildinstall, self.logger) #, env={"TMPDIR": self.workdir})
|
||||
pypungi.util._doRunCommand(buildinstall, self.logger) #, env={"TMPDIR": self.workdir})
|
||||
|
||||
# write out the tree data for snake
|
||||
self.writeinfo('tree: %s' % self.mkrelative(self.topdir))
|
||||
@ -670,7 +602,7 @@ class Pungi(pypungi.PungiBase):
|
||||
pkgorder.append(self.config.get('default', 'product_path'))
|
||||
|
||||
# run the command
|
||||
pypungi._doRunCommand(pkgorder, self.logger, output=pkgorderfile)
|
||||
pypungi.util._doRunCommand(pkgorder, self.logger, output=pkgorderfile)
|
||||
pkgorderfile.close()
|
||||
|
||||
def doGetRelnotes(self):
|
||||
@ -689,7 +621,7 @@ class Pungi(pypungi.PungiBase):
|
||||
for pattern in self.config.get('default', 'relnotedirre').split():
|
||||
dirres.append(re.compile(pattern))
|
||||
|
||||
pypungi._ensuredir(docsdir, self.logger, force=self.config.getboolean('default', 'force'), clean=True)
|
||||
pypungi.util._ensuredir(docsdir, self.logger, force=self.config.getboolean('default', 'force'), clean=True)
|
||||
|
||||
# Expload the packages we list as relnote packages
|
||||
pkgs = os.listdir(os.path.join(self.topdir, self.config.get('default', 'product_path')))
|
||||
@ -720,7 +652,7 @@ class Pungi(pypungi.PungiBase):
|
||||
for regex in fileres:
|
||||
if regex.match(filename) and not os.path.exists(os.path.join(self.topdir, filename)):
|
||||
self.logger.info("Linking release note file %s" % filename)
|
||||
pypungi._link(os.path.join(dirpath, filename), os.path.join(self.topdir, filename), self.logger)
|
||||
pypungi.util._link(os.path.join(dirpath, filename), os.path.join(self.topdir, filename), self.logger)
|
||||
self.common_files.append(filename)
|
||||
|
||||
# Walk the tree for our dirs
|
||||
@ -731,7 +663,6 @@ class Pungi(pypungi.PungiBase):
|
||||
self.logger.info("Copying release note dir %s" % directory)
|
||||
shutil.copytree(os.path.join(dirpath, directory), os.path.join(self.topdir, directory))
|
||||
|
||||
|
||||
def doSplittree(self):
|
||||
"""Use anaconda-runtime's splittree to split the tree into appropriate
|
||||
sized chunks."""
|
||||
@ -784,7 +715,7 @@ class Pungi(pypungi.PungiBase):
|
||||
|
||||
# this is stolen from splittree.py in anaconda-runtime. Blame them if its ugly (:
|
||||
for i in range(timber.src_list[0], timber.src_list[-1] + 1):
|
||||
pypungi._ensuredir('%s-disc%d/SRPMS' % (timber.dist_dir, i),
|
||||
pypungi.util._ensuredir('%s-disc%d/SRPMS' % (timber.dist_dir, i),
|
||||
self.logger,
|
||||
force=self.config.getboolean('default', 'force'),
|
||||
clean=True)
|
||||
@ -806,7 +737,7 @@ class Pungi(pypungi.PungiBase):
|
||||
compsfile = os.path.join(self.workdir, '%s-%s-comps.xml' % (self.config.get('default', 'name'), self.config.get('default', 'version')))
|
||||
|
||||
if not split:
|
||||
pypungi._ensuredir('%s-disc1' % self.topdir, self.logger,
|
||||
pypungi.util._ensuredir('%s-disc1' % self.topdir, self.logger,
|
||||
clean=True) # rename this for single disc
|
||||
path = self.topdir
|
||||
basedir=None
|
||||
@ -845,7 +776,7 @@ cost=500
|
||||
anaruntime = '/usr/lib/anaconda-runtime/boot'
|
||||
discinfofile = os.path.join(self.topdir, '.discinfo') # we use this a fair amount
|
||||
|
||||
pypungi._ensuredir(self.isodir, self.logger,
|
||||
pypungi.util._ensuredir(self.isodir, self.logger,
|
||||
force=self.config.getboolean('default', 'force'),
|
||||
clean=True) # This is risky...
|
||||
|
||||
@ -944,15 +875,15 @@ cost=500
|
||||
extraargs.append(os.path.join(self.archdir, 'SRPMS'))
|
||||
|
||||
# run the command
|
||||
pypungi._doRunCommand(mkisofs + extraargs, self.logger)
|
||||
pypungi.util._doRunCommand(mkisofs + extraargs, self.logger)
|
||||
|
||||
# implant md5 for mediacheck on all but source arches
|
||||
if not self.config.get('default', 'arch') == 'source':
|
||||
pypungi._doRunCommand(['/usr/bin/implantisomd5', isofile], self.logger)
|
||||
pypungi.util._doRunCommand(['/usr/bin/implantisomd5', isofile], self.logger)
|
||||
|
||||
# shove the sha1sum into a file
|
||||
sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a')
|
||||
pypungi._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file)
|
||||
pypungi.util._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file)
|
||||
sha1file.close()
|
||||
|
||||
# return the .discinfo file
|
||||
@ -1004,15 +935,15 @@ cost=500
|
||||
extraargs.append(os.path.join('%s-disc%s' % (self.topdir, disc)))
|
||||
|
||||
# run the command
|
||||
pypungi._doRunCommand(mkisofs + extraargs, self.logger)
|
||||
pypungi.util._doRunCommand(mkisofs + extraargs, self.logger)
|
||||
|
||||
# implant md5 for mediacheck on all but source arches
|
||||
if not self.config.get('default', 'arch') == 'source':
|
||||
pypungi._doRunCommand(['/usr/bin/implantisomd5', isofile], self.logger)
|
||||
pypungi.util._doRunCommand(['/usr/bin/implantisomd5', isofile], self.logger)
|
||||
|
||||
# shove the sha1sum into a file
|
||||
sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a')
|
||||
pypungi._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file)
|
||||
pypungi.util._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file)
|
||||
sha1file.close()
|
||||
|
||||
# keep track of the CD images we've written
|
||||
@ -1029,11 +960,11 @@ cost=500
|
||||
isofile = os.path.join(self.isodir, isoname)
|
||||
|
||||
# link the boot iso to the iso dir
|
||||
pypungi._link(os.path.join(self.topdir, 'images', 'boot.iso'), isofile, self.logger)
|
||||
pypungi.util._link(os.path.join(self.topdir, 'images', 'boot.iso'), isofile, self.logger)
|
||||
|
||||
# shove the sha1sum into a file
|
||||
sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a')
|
||||
pypungi._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file)
|
||||
pypungi.util._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file)
|
||||
sha1file.close()
|
||||
|
||||
# Do some clean up
|
||||
|
Loading…
Reference in New Issue
Block a user