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 shutil
|
||||||
import sys
|
import sys
|
||||||
import gzip
|
import gzip
|
||||||
import pypungi
|
import pypungi.util
|
||||||
import logging
|
import logging
|
||||||
import urlgrabber.progress
|
import urlgrabber.progress
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -46,7 +46,7 @@ class PungiBase(object):
|
|||||||
|
|
||||||
logdir = os.path.join(self.config.get('default', 'destdir'), 'logs')
|
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'):
|
if self.config.get('default', 'flavor'):
|
||||||
logfile = os.path.join(logdir, '%s.%s.log' % (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)
|
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):
|
class CallBack(urlgrabber.progress.TextMeter):
|
||||||
"""A call back function used with yum."""
|
"""A call back function used with yum."""
|
||||||
|
|
||||||
def progressbar(self, current, total, name=None):
|
def progressbar(self, current, total, name=None):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
class PungiYum(yum.YumBase):
|
class PungiYum(yum.YumBase):
|
||||||
"""Subclass of Yum"""
|
"""Subclass of Yum"""
|
||||||
|
|
||||||
@ -163,6 +94,7 @@ class PungiYum(yum.YumBase):
|
|||||||
# the logging.
|
# the logging.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Pungi(pypungi.PungiBase):
|
class Pungi(pypungi.PungiBase):
|
||||||
def __init__(self, config, ksparser):
|
def __init__(self, config, ksparser):
|
||||||
pypungi.PungiBase.__init__(self, config)
|
pypungi.PungiBase.__init__(self, config)
|
||||||
@ -186,7 +118,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
self.topdir = os.path.join(self.archdir, 'os')
|
self.topdir = os.path.join(self.archdir, 'os')
|
||||||
self.isodir = os.path.join(self.archdir, self.config.get('default','isodir'))
|
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.common_files = []
|
||||||
self.infofile = os.path.join(self.config.get('default', 'destdir'),
|
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
|
# Ensure the pkgdir exists, force if requested, and make sure we clean it out
|
||||||
if relpkgdir.endswith('SRPMS'):
|
if relpkgdir.endswith('SRPMS'):
|
||||||
# Since we share source dirs with other arches don't clean, but do allow us to use it
|
# 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:
|
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)
|
probs = self.ayum.downloadPkgs(polist)
|
||||||
|
|
||||||
@ -483,7 +415,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
|
|
||||||
# Link downloaded package in (or link package from file repo)
|
# Link downloaded package in (or link package from file repo)
|
||||||
try:
|
try:
|
||||||
pypungi._link(local, target, self.logger, force=True)
|
pypungi.util._link(local, target, self.logger, force=True)
|
||||||
continue
|
continue
|
||||||
except:
|
except:
|
||||||
self.logger.error("Unable to link %s from the yum cache." % po.name)
|
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('/usr/share/pungi/comps-cleanup.xsl')
|
||||||
#compsfilter.append(ourcompspath)
|
#compsfilter.append(ourcompspath)
|
||||||
|
|
||||||
#pypungi._doRunCommand(compsfilter, self.logger)
|
#pypungi.util._doRunCommand(compsfilter, self.logger)
|
||||||
|
|
||||||
def downloadSRPMs(self):
|
def downloadSRPMs(self):
|
||||||
"""Cycle through the list of srpms and
|
"""Cycle through the list of srpms and
|
||||||
@ -599,7 +531,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
repoview.append(path)
|
repoview.append(path)
|
||||||
|
|
||||||
# run the command
|
# run the command
|
||||||
pypungi._doRunCommand(repoview, self.logger)
|
pypungi.util._doRunCommand(repoview, self.logger)
|
||||||
|
|
||||||
def doCreaterepo(self, comps=True):
|
def doCreaterepo(self, comps=True):
|
||||||
"""Run createrepo to generate repodata in the tree."""
|
"""Run createrepo to generate repodata in the tree."""
|
||||||
@ -611,7 +543,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
|
|
||||||
# setup the cache dirs
|
# setup the cache dirs
|
||||||
for target in ['createrepocache', 'repoviewcache']:
|
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),
|
target),
|
||||||
self.logger,
|
self.logger,
|
||||||
force=True)
|
force=True)
|
||||||
@ -652,7 +584,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
|
|
||||||
# run the command
|
# run the command
|
||||||
# TMPDIR is still broken with buildinstall.
|
# 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
|
# write out the tree data for snake
|
||||||
self.writeinfo('tree: %s' % self.mkrelative(self.topdir))
|
self.writeinfo('tree: %s' % self.mkrelative(self.topdir))
|
||||||
@ -670,7 +602,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
pkgorder.append(self.config.get('default', 'product_path'))
|
pkgorder.append(self.config.get('default', 'product_path'))
|
||||||
|
|
||||||
# run the command
|
# run the command
|
||||||
pypungi._doRunCommand(pkgorder, self.logger, output=pkgorderfile)
|
pypungi.util._doRunCommand(pkgorder, self.logger, output=pkgorderfile)
|
||||||
pkgorderfile.close()
|
pkgorderfile.close()
|
||||||
|
|
||||||
def doGetRelnotes(self):
|
def doGetRelnotes(self):
|
||||||
@ -689,7 +621,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
for pattern in self.config.get('default', 'relnotedirre').split():
|
for pattern in self.config.get('default', 'relnotedirre').split():
|
||||||
dirres.append(re.compile(pattern))
|
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
|
# Expload the packages we list as relnote packages
|
||||||
pkgs = os.listdir(os.path.join(self.topdir, self.config.get('default', 'product_path')))
|
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:
|
for regex in fileres:
|
||||||
if regex.match(filename) and not os.path.exists(os.path.join(self.topdir, filename)):
|
if regex.match(filename) and not os.path.exists(os.path.join(self.topdir, filename)):
|
||||||
self.logger.info("Linking release note file %s" % 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)
|
self.common_files.append(filename)
|
||||||
|
|
||||||
# Walk the tree for our dirs
|
# Walk the tree for our dirs
|
||||||
@ -731,7 +663,6 @@ class Pungi(pypungi.PungiBase):
|
|||||||
self.logger.info("Copying release note dir %s" % directory)
|
self.logger.info("Copying release note dir %s" % directory)
|
||||||
shutil.copytree(os.path.join(dirpath, directory), os.path.join(self.topdir, directory))
|
shutil.copytree(os.path.join(dirpath, directory), os.path.join(self.topdir, directory))
|
||||||
|
|
||||||
|
|
||||||
def doSplittree(self):
|
def doSplittree(self):
|
||||||
"""Use anaconda-runtime's splittree to split the tree into appropriate
|
"""Use anaconda-runtime's splittree to split the tree into appropriate
|
||||||
sized chunks."""
|
sized chunks."""
|
||||||
@ -784,7 +715,7 @@ class Pungi(pypungi.PungiBase):
|
|||||||
|
|
||||||
# this is stolen from splittree.py in anaconda-runtime. Blame them if its ugly (:
|
# 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):
|
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,
|
self.logger,
|
||||||
force=self.config.getboolean('default', 'force'),
|
force=self.config.getboolean('default', 'force'),
|
||||||
clean=True)
|
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')))
|
compsfile = os.path.join(self.workdir, '%s-%s-comps.xml' % (self.config.get('default', 'name'), self.config.get('default', 'version')))
|
||||||
|
|
||||||
if not split:
|
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
|
clean=True) # rename this for single disc
|
||||||
path = self.topdir
|
path = self.topdir
|
||||||
basedir=None
|
basedir=None
|
||||||
@ -845,7 +776,7 @@ cost=500
|
|||||||
anaruntime = '/usr/lib/anaconda-runtime/boot'
|
anaruntime = '/usr/lib/anaconda-runtime/boot'
|
||||||
discinfofile = os.path.join(self.topdir, '.discinfo') # we use this a fair amount
|
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'),
|
force=self.config.getboolean('default', 'force'),
|
||||||
clean=True) # This is risky...
|
clean=True) # This is risky...
|
||||||
|
|
||||||
@ -944,15 +875,15 @@ cost=500
|
|||||||
extraargs.append(os.path.join(self.archdir, 'SRPMS'))
|
extraargs.append(os.path.join(self.archdir, 'SRPMS'))
|
||||||
|
|
||||||
# run the command
|
# 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
|
# implant md5 for mediacheck on all but source arches
|
||||||
if not self.config.get('default', 'arch') == 'source':
|
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
|
# shove the sha1sum into a file
|
||||||
sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a')
|
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()
|
sha1file.close()
|
||||||
|
|
||||||
# return the .discinfo file
|
# return the .discinfo file
|
||||||
@ -1004,15 +935,15 @@ cost=500
|
|||||||
extraargs.append(os.path.join('%s-disc%s' % (self.topdir, disc)))
|
extraargs.append(os.path.join('%s-disc%s' % (self.topdir, disc)))
|
||||||
|
|
||||||
# run the command
|
# 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
|
# implant md5 for mediacheck on all but source arches
|
||||||
if not self.config.get('default', 'arch') == 'source':
|
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
|
# shove the sha1sum into a file
|
||||||
sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a')
|
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()
|
sha1file.close()
|
||||||
|
|
||||||
# keep track of the CD images we've written
|
# keep track of the CD images we've written
|
||||||
@ -1029,11 +960,11 @@ cost=500
|
|||||||
isofile = os.path.join(self.isodir, isoname)
|
isofile = os.path.join(self.isodir, isoname)
|
||||||
|
|
||||||
# link the boot iso to the iso dir
|
# 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
|
# shove the sha1sum into a file
|
||||||
sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a')
|
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()
|
sha1file.close()
|
||||||
|
|
||||||
# Do some clean up
|
# Do some clean up
|
||||||
|
Loading…
Reference in New Issue
Block a user