backport py27 compatible file open with encoding

client and builder needs to run on py27 which doesn't support
open(encoding='utf-8')

Related: https://pagure.io/koji/issue/2641
This commit is contained in:
Tomas Kopecek 2021-02-12 15:34:26 +01:00
parent 9e376a22b0
commit c6e69b4f8b
10 changed files with 62 additions and 59 deletions

View file

@ -310,7 +310,7 @@ class BuildRoot(object):
output = koji.genMockConfig(self.name, self.br_arch, managed=True, **opts) output = koji.genMockConfig(self.name, self.br_arch, managed=True, **opts)
# write config # write config
with open(configfile, 'wt', encoding='utf-8') as fo: with koji._open_text_file(configfile, 'wt') as fo:
fo.write(output) fo.write(output)
def _repositoryEntries(self, pi, plugin=False): def _repositoryEntries(self, pi, plugin=False):
@ -409,8 +409,8 @@ class BuildRoot(object):
</settings> </settings>
""" """
settings = settings % locals() settings = settings % locals()
with open(self.rootdir() + destfile, 'wt') as fo: with koji._open_text_file(self.rootdir() + destfile, 'wt') as fo:
fo.write(settings, encoding='utf-8') fo.write(settings)
def mock(self, args): def mock(self, args):
"""Run mock""" """Run mock"""
@ -456,13 +456,13 @@ class BuildRoot(object):
ts_name = '%s-ts.log' % fname ts_name = '%s-ts.log' % fname
fpath = os.path.join(resultdir, ts_name) fpath = os.path.join(resultdir, ts_name)
if os.path.exists(fpath): if os.path.exists(fpath):
with open(fpath, 'rt', encoding='utf-8') as ts_file: with koji._open_text_file(fpath) as ts_file:
lines = ts_file.readlines() lines = ts_file.readlines()
if lines: if lines:
last = int(lines[-1].split()[1]) last = int(lines[-1].split()[1])
ts_offsets[fname] = last ts_offsets[fname] = last
else: else:
with open(fpath, 'at', encoding='utf-8') as ts_file: with koji._open_text_file(fpath, 'at') as ts_file:
ts_file.write('%.0f 0\n' % time.time()) ts_file.write('%.0f 0\n' % time.time())
logs[ts_name] = (None, None, 0, fpath) logs[ts_name] = (None, None, 0, fpath)
if workdir and mocklog not in logs: if workdir and mocklog not in logs:
@ -473,13 +473,13 @@ class BuildRoot(object):
ts_name = '%s-ts.log' % mocklog ts_name = '%s-ts.log' % mocklog
fpath = os.path.join(workdir, ts_name) fpath = os.path.join(workdir, ts_name)
if os.path.exists(fpath): if os.path.exists(fpath):
with open(fpath, 'rt', encoding='utf-8') as ts_file: with koji._open_text_file(fpath) as ts_file:
lines = ts_file.readlines() lines = ts_file.readlines()
if lines: if lines:
last = int(lines[-1].split()[1]) last = int(lines[-1].split()[1])
ts_offsets[mocklog] = last ts_offsets[mocklog] = last
else: else:
with open(fpath, 'at', encoding='utf-8') as ts_file: with koji._open_text_file(fpath, 'at') as ts_file:
ts_file.write('%.0f 0\n' % time.time()) ts_file.write('%.0f 0\n' % time.time())
logs[ts_name] = (None, None, 0, fpath) logs[ts_name] = (None, None, 0, fpath)
@ -510,7 +510,7 @@ class BuildRoot(object):
ts_offsets.setdefault(fname, 0) ts_offsets.setdefault(fname, 0)
if ts_offsets[fname] < position: if ts_offsets[fname] < position:
fpath = os.path.join(resultdir, '%s-ts.log' % fname) fpath = os.path.join(resultdir, '%s-ts.log' % fname)
with open(fpath, 'at', encoding='utf-8') as ts_file: with koji._open_text_file(fpath, 'at') as ts_file:
ts_file.write('%.0f %i\n' % (time.time(), position)) ts_file.write('%.0f %i\n' % (time.time(), position))
ts_offsets[fname] = position ts_offsets[fname] = position
incremental_upload(self.session, fname, fd, uploadpath, logger=self.logger) incremental_upload(self.session, fname, fd, uploadpath, logger=self.logger)
@ -1830,7 +1830,7 @@ class WrapperRPMTask(BaseBuildTask):
tgt[field] = src.get(field) tgt[field] = src.get(field)
def spec_sanity_checks(self, filename): def spec_sanity_checks(self, filename):
spec = open(filename, encoding='utf-8').read() spec = koji._open_text_file(filename).read()
for tag in ("Packager", "Distribution", "Vendor"): for tag in ("Packager", "Distribution", "Vendor"):
if re.match("%s:" % tag, spec, re.M): if re.match("%s:" % tag, spec, re.M):
raise koji.BuildError("%s is not allowed to be set in spec file" % tag) raise koji.BuildError("%s is not allowed to be set in spec file" % tag)
@ -3055,7 +3055,7 @@ class ImageTask(BaseTaskHandler):
kskoji = os.path.join(broot.tmpdir(), 'koji-image-%s-%i.ks' % kskoji = os.path.join(broot.tmpdir(), 'koji-image-%s-%i.ks' %
(target_info['build_tag_name'], self.id)) (target_info['build_tag_name'], self.id))
koji.ensuredir(broot.tmpdir()) koji.ensuredir(broot.tmpdir())
with open(kskoji, 'wt', encoding='utf-8') as outfile: with koji._open_text_file(kskoji, 'wt') as outfile:
outfile.write(str(self.ks.handler)) outfile.write(str(self.ks.handler))
# put the new ksfile in the output directory # put the new ksfile in the output directory
@ -3253,7 +3253,7 @@ class LiveCDTask(ImageTask):
Using iso9660 from pycdio, get the file manifest of the given image, Using iso9660 from pycdio, get the file manifest of the given image,
and save it to the text file manifile. and save it to the text file manifile.
""" """
fd = open(manifile, 'wt', encoding='utf-8') fd = koji._open_text_file(manifile, 'wt')
if not fd: if not fd:
raise koji.GenericError( raise koji.GenericError(
'Unable to open manifest file (%s) for writing!' % manifile) 'Unable to open manifest file (%s) for writing!' % manifile)
@ -3442,7 +3442,7 @@ class LiveMediaTask(ImageTask):
Using iso9660 from pycdio, get the file manifest of the given image, Using iso9660 from pycdio, get the file manifest of the given image,
and save it to the text file manifile. and save it to the text file manifile.
""" """
fd = open(manifile, 'wt', encoding='utf-8') fd = koji._open_text_file(manifile, 'wt')
if not fd: if not fd:
raise koji.GenericError( raise koji.GenericError(
'Unable to open manifest file (%s) for writing!' % manifile) 'Unable to open manifest file (%s) for writing!' % manifile)
@ -3775,7 +3775,7 @@ class OzImageTask(BaseTaskHandler):
an absolute path to the kickstart file we wrote an absolute path to the kickstart file we wrote
""" """
kspath = os.path.join(self.workdir, ksname) kspath = os.path.join(self.workdir, ksname)
with open(kspath, 'wt', encoding='utf-8') as outfile: with koji._open_text_file(kspath, 'wt') as outfile:
outfile.write(str(ksobj.handler)) outfile.write(str(ksobj.handler))
# put the new ksfile in the output directory # put the new ksfile in the output directory
@ -3909,7 +3909,7 @@ class OzImageTask(BaseTaskHandler):
edriver = newxml.getElementsByTagName('driver')[0] edriver = newxml.getElementsByTagName('driver')[0]
edriver.setAttribute('type', format) edriver.setAttribute('type', format)
xml_path = os.path.join(self.workdir, filename) xml_path = os.path.join(self.workdir, filename)
with open(xml_path, 'wt', encoding='utf-8') as xmlfd: with koji._open_text_file(xml_path, 'wt') as xmlfd:
xmlfd.write(newxml.toprettyxml()) xmlfd.write(newxml.toprettyxml())
return xml_path return xml_path
@ -4359,7 +4359,7 @@ class BaseImageTask(OzImageTask):
ApplicationConfiguration(configuration=config) ApplicationConfiguration(configuration=config)
tdl_path = os.path.join(self.workdir, 'tdl-%s.xml' % self.arch) tdl_path = os.path.join(self.workdir, 'tdl-%s.xml' % self.arch)
with open(tdl_path, 'wt', encoding='utf-8') as tdl: with koji._open_text_file(tdl_path, 'wt') as tdl:
tdl.write(template) tdl.write(template)
self.uploadFile(tdl_path) self.uploadFile(tdl_path)
@ -4563,7 +4563,7 @@ class BuildIndirectionImageTask(OzImageTask):
# Factory doesn't attempt to modify a disk image after it is COMPLETE so # Factory doesn't attempt to modify a disk image after it is COMPLETE so
# this will work safely on read-only NFS mounts # this will work safely on read-only NFS mounts
factory_base_image.data = diskimage_full factory_base_image.data = diskimage_full
factory_base_image.template = open(tdl_full, encoding='utf-8').read() factory_base_image.template = koji._open_text_file(tdl_full).read()
factory_base_image.status = 'COMPLETE' factory_base_image.status = 'COMPLETE'
# Now save it # Now save it
pim.save_image(factory_base_image) pim.save_image(factory_base_image)
@ -4615,7 +4615,7 @@ class BuildIndirectionImageTask(OzImageTask):
# Factory doesn't attempt to modify a disk image after it is COMPLETE so # Factory doesn't attempt to modify a disk image after it is COMPLETE so
# this will work safely on read-only NFS mounts # this will work safely on read-only NFS mounts
factory_base_image.data = diskimage_full factory_base_image.data = diskimage_full
factory_base_image.template = open(tdl_full, encoding='utf-8').read() factory_base_image.template = koji._open_text_file(tdl_full).read()
factory_base_image.status = 'COMPLETE' factory_base_image.status = 'COMPLETE'
# Now save it # Now save it
pim.save_image(factory_base_image) pim.save_image(factory_base_image)
@ -4705,7 +4705,7 @@ class BuildIndirectionImageTask(OzImageTask):
rm = ReservationManager() rm = ReservationManager()
rm._listen_port = rm.MIN_PORT + self.id % (rm.MAX_PORT - rm.MIN_PORT) rm._listen_port = rm.MIN_PORT + self.id % (rm.MAX_PORT - rm.MIN_PORT)
utility_customizations = open(indirection_template, encoding='utf-8').read() utility_customizations = koji._open_text_file(indirection_template).read()
results_loc = opts.get('results_loc', None) results_loc = opts.get('results_loc', None)
if results_loc[0] != "/": if results_loc[0] != "/":
results_loc = "/" + results_loc results_loc = "/" + results_loc
@ -4723,7 +4723,7 @@ class BuildIndirectionImageTask(OzImageTask):
pim = PersistentImageManager.default_manager() pim = PersistentImageManager.default_manager()
pim.add_image(target_image) pim.add_image(target_image)
target.target_image = target_image target.target_image = target_image
with open(target_image.data, "wt", encoding='utf-8') as f: with koji._open_text_file(target_image.data, "wt") as f:
f.write("Mock build from task ID: %s" % self.id) f.write("Mock build from task ID: %s" % self.id)
target_image.status = 'COMPLETE' target_image.status = 'COMPLETE'
else: else:
@ -4883,7 +4883,7 @@ class BuildSRPMFromSCMTask(BaseBuildTask):
_taskWeight = 1.0 _taskWeight = 1.0
def spec_sanity_checks(self, filename): def spec_sanity_checks(self, filename):
spec = open(filename, encoding='utf-8').read() spec = koji._open_text_file(filename).read()
for tag in ("Packager", "Distribution", "Vendor"): for tag in ("Packager", "Distribution", "Vendor"):
if re.match("%s:" % tag, spec, re.M): if re.match("%s:" % tag, spec, re.M):
raise koji.BuildError("%s is not allowed to be set in spec file" % tag) raise koji.BuildError("%s is not allowed to be set in spec file" % tag)
@ -5928,7 +5928,7 @@ enabled=1
# step 3: proceed with dnf config and set up # step 3: proceed with dnf config and set up
yconfig_path = os.path.join(dnfdir, 'dnf.conf-koji-%s' % arch) yconfig_path = os.path.join(dnfdir, 'dnf.conf-koji-%s' % arch)
with open(yconfig_path, 'wt', encoding='utf-8') as f: with koji._open_text_file(yconfig_path, 'wt') as f:
f.write(dnfconfig) f.write(dnfconfig)
self.session.uploadWrapper(yconfig_path, self.uploadpath, self.session.uploadWrapper(yconfig_path, self.uploadpath,
os.path.basename(yconfig_path)) os.path.basename(yconfig_path))
@ -5965,7 +5965,7 @@ enabled=1
if len(fs_missing) > 0: if len(fs_missing) > 0:
missing_log = os.path.join(self.workdir, 'missing_multilib.log') missing_log = os.path.join(self.workdir, 'missing_multilib.log')
with open(missing_log, 'wt', encoding='utf-8') as outfile: with koji._open_text_file(missing_log, 'wt') as outfile:
outfile.write('The following multilib files were missing:\n') outfile.write('The following multilib files were missing:\n')
for ml_path in fs_missing: for ml_path in fs_missing:
outfile.write(ml_path + '\n') outfile.write(ml_path + '\n')
@ -6068,7 +6068,7 @@ enabled=1
# report problems # report problems
if len(fs_missing) > 0: if len(fs_missing) > 0:
missing_log = os.path.join(self.workdir, 'missing_files.log') missing_log = os.path.join(self.workdir, 'missing_files.log')
with open(missing_log, 'wt', encoding='utf-8') as outfile: with koji._open_text_file(missing_log, 'wt') as outfile:
outfile.write('Some rpm files were missing.\n' outfile.write('Some rpm files were missing.\n'
'Most likely, you want to create these signed copies.\n\n' 'Most likely, you want to create these signed copies.\n\n'
'Missing files:\n') 'Missing files:\n')
@ -6081,7 +6081,7 @@ enabled=1
if sig_missing: if sig_missing:
# log missing signatures and possibly error # log missing signatures and possibly error
missing_log = os.path.join(self.workdir, 'missing_signatures.log') missing_log = os.path.join(self.workdir, 'missing_signatures.log')
with open(missing_log, 'wt', encoding='utf-8') as outfile: with koji._open_text_file(missing_log, 'wt') as outfile:
outfile.write('Some rpms were missing requested signatures.\n') outfile.write('Some rpms were missing requested signatures.\n')
if opts['skip_missing_signatures']: if opts['skip_missing_signatures']:
outfile.write('The skip_missing_signatures option was specified, so ' outfile.write('The skip_missing_signatures option was specified, so '
@ -6130,12 +6130,12 @@ enabled=1
else: else:
pkgs.append('Packages/%s/%s\n' % (bnplet, bnp)) pkgs.append('Packages/%s/%s\n' % (bnplet, bnp))
with open('%s/pkglist' % self.repodir, 'wt', encoding='utf-8') as fo: with koji._open_text_file('%s/pkglist' % self.repodir, 'wt') as fo:
for line in pkgs: for line in pkgs:
fo.write(line) fo.write(line)
for subrepo in subrepo_pkgs: for subrepo in subrepo_pkgs:
koji.ensuredir('%s/%s' % (self.repodir, subrepo)) koji.ensuredir('%s/%s' % (self.repodir, subrepo))
with open('%s/%s/pkglist' % (self.repodir, subrepo), 'wt', encoding='utf-8') as fo: with koji._open_text_file('%s/%s/pkglist' % (self.repodir, subrepo), 'wt') as fo:
for line in subrepo_pkgs[subrepo]: for line in subrepo_pkgs[subrepo]:
fo.write(line) fo.write(line)

View file

@ -34,6 +34,8 @@ import rpmUtils.miscutils
import yum import yum
import yum.misc import yum.misc
import koji
# Expand a canonical arch to the full list of # Expand a canonical arch to the full list of
# arches that should be included in the repo. # arches that should be included in the repo.
# Basically the inverse of koji.canonArch(). # Basically the inverse of koji.canonArch().
@ -252,7 +254,7 @@ class RepoMerge(object):
include_srpms[srpm_name] = (pkg.sourcerpm, pkg.repoid) include_srpms[srpm_name] = (pkg.sourcerpm, pkg.repoid)
pkgorigins = os.path.join(self.yumbase.conf.cachedir, 'pkgorigins') pkgorigins = os.path.join(self.yumbase.conf.cachedir, 'pkgorigins')
origins = open(pkgorigins, 'wt', encoding='utf-8') origins = koji._open_text_file(pkgorigins, 'wt')
seen_rpms = {} seen_rpms = {}
for repo in repos: for repo in repos:
@ -307,7 +309,7 @@ class RepoMerge(object):
pkg._return_remote_location = make_const_func(loc) pkg._return_remote_location = make_const_func(loc)
pkgorigins = os.path.join(self.yumbase.conf.cachedir, 'pkgorigins') pkgorigins = os.path.join(self.yumbase.conf.cachedir, 'pkgorigins')
origins = open(pkgorigins, 'wt', encoding='utf-8') origins = koji._open_text_file(pkgorigins, 'wt')
seen_rpms = {} seen_rpms = {}
for repo in repos: for repo in repos:
@ -348,7 +350,7 @@ def main(args):
opts = parse_args(args) opts = parse_args(args)
if opts.blocked: if opts.blocked:
with open(opts.blocked, encoding='utf-8') as blocked_fo: with koji._open_text_file(opts.blocked) as blocked_fo:
blocked_list = blocked_fo.readlines() blocked_list = blocked_fo.readlines()
blocked = dict([(b.strip(), 1) for b in blocked_list]) blocked = dict([(b.strip(), 1) for b in blocked_list])
else: else:

View file

@ -1035,7 +1035,7 @@ def anon_handle_mock_config(goptions, session, args):
opts['tag_macros'][macro] = buildcfg['extra'][key] opts['tag_macros'][macro] = buildcfg['extra'][key]
output = koji.genMockConfig(name, arch, **opts) output = koji.genMockConfig(name, arch, **opts)
if options.ofile: if options.ofile:
with open(options.ofile, 'wt', encoding='utf-8') as fo: with open(options.ofile, 'wt') as fo:
fo.write(output) fo.write(output)
else: else:
print(output) print(output)
@ -1586,10 +1586,10 @@ def handle_prune_signed_copies(goptions, session, args):
# (with the modification that we check to see if the build was latest within # (with the modification that we check to see if the build was latest within
# the last N days) # the last N days)
if options.ignore_tag_file: if options.ignore_tag_file:
with open(options.ignore_tag_file, encoding='utf-8') as fo: with open(options.ignore_tag_file) as fo:
options.ignore_tag.extend([line.strip() for line in fo.readlines()]) options.ignore_tag.extend([line.strip() for line in fo.readlines()])
if options.protect_tag_file: if options.protect_tag_file:
with open(options.protect_tag_file, encoding='utf-8') as fo: with open(options.protect_tag_file) as fo:
options.protect_tag.extend([line.strip() for line in fo.readlines()]) options.protect_tag.extend([line.strip() for line in fo.readlines()])
if options.debug: if options.debug:
options.verbose = True options.verbose = True
@ -6890,7 +6890,7 @@ def anon_handle_download_logs(options, session, args):
full_filename = os.path.normpath(os.path.join(task_log_dir, FAIL_LOG)) full_filename = os.path.normpath(os.path.join(task_log_dir, FAIL_LOG))
koji.ensuredir(os.path.dirname(full_filename)) koji.ensuredir(os.path.dirname(full_filename))
sys.stdout.write("Writing: %s\n" % full_filename) sys.stdout.write("Writing: %s\n" % full_filename)
with open(full_filename, 'wt', encoding='utf-8') as fo: with open(full_filename, 'wt') as fo:
fo.write(content) fo.write(content)
def download_log(task_log_dir, task_id, filename, blocksize=102400, volume=None): def download_log(task_log_dir, task_id, filename, blocksize=102400, volume=None):

View file

@ -49,6 +49,7 @@ import warnings
import weakref import weakref
import xml.sax import xml.sax
import xml.sax.handler import xml.sax.handler
from contextlib import contextmanager
from fnmatch import fnmatch from fnmatch import fnmatch
import dateutil.parser import dateutil.parser
@ -1266,6 +1267,15 @@ class POMHandler(xml.sax.handler.ContentHandler):
self.values.clear() self.values.clear()
# BEGIN kojikamid dup #
def _open_text_file(path, mode='rt'):
# enforce utf-8 encoding for py3
if six.PY2:
return open(path, mode)
else:
return open(path, mode, encoding='utf-8')
# END kojikamid dup $
ENTITY_RE = re.compile(r'&[A-Za-z0-9]+;') ENTITY_RE = re.compile(r'&[A-Za-z0-9]+;')
@ -1283,8 +1293,7 @@ def parse_pom(path=None, contents=None):
values = {} values = {}
handler = POMHandler(values, fields) handler = POMHandler(values, fields)
if path: if path:
with open(path, encoding='utf-8') as fd: contents = _open_text_file(path).read()
contents = fd.read()
if not contents: if not contents:
raise GenericError( raise GenericError(
@ -1355,12 +1364,12 @@ def hex_string(s):
def load_json(filepath): def load_json(filepath):
"""Loads json from file""" """Loads json from file"""
return json.load(open(filepath, 'rt', encoding='utf-8')) return json.load(_open_text_file(filepath))
def dump_json(filepath, data, indent=4, sort_keys=False): def dump_json(filepath, data, indent=4, sort_keys=False):
"""Write json to file""" """Write json to file"""
json.dump(data, open(filepath, 'wt', encoding='utf-8'), indent=indent, sort_keys=sort_keys) json.dump(data, _open_text_file(filepath, 'wt'), indent=indent, sort_keys=sort_keys)
def make_groups_spec(grplist, name='buildsys-build', buildgroup=None): def make_groups_spec(grplist, name='buildsys-build', buildgroup=None):
@ -1621,7 +1630,7 @@ def genMockConfig(name, arch, managed=False, repoid=None, tag_name=None, **opts)
if opts.get('use_host_resolv', False) and os.path.exists('/etc/hosts'): if opts.get('use_host_resolv', False) and os.path.exists('/etc/hosts'):
# if we're setting up DNS, # if we're setting up DNS,
# also copy /etc/hosts from the host # also copy /etc/hosts from the host
files['etc/hosts'] = open('/etc/hosts', 'rt', encoding='utf-8').read() files['etc/hosts'] = _open_text_file('/etc/hosts').read()
mavenrc = '' mavenrc = ''
if opts.get('maven_opts'): if opts.get('maven_opts'):
mavenrc = 'export MAVEN_OPTS="%s"\n' % ' '.join(opts['maven_opts']) mavenrc = 'export MAVEN_OPTS="%s"\n' % ' '.join(opts['maven_opts'])

View file

@ -383,7 +383,7 @@ def getCanonX86_64Arch(arch):
def getCanonArch(skipRpmPlatform=0): def getCanonArch(skipRpmPlatform=0):
if not skipRpmPlatform and os.access("/etc/rpm/platform", os.R_OK): if not skipRpmPlatform and os.access("/etc/rpm/platform", os.R_OK):
try: try:
with open("/etc/rpm/platform", "rt", encoding='utf-8') as f: with open("/etc/rpm/platform", "rt") as f:
line = f.readline() line = f.readline()
(arch, vendor, opersys) = line.split("-", 2) (arch, vendor, opersys) = line.split("-", 2)
return arch return arch

View file

@ -790,7 +790,7 @@ class TaskManager(object):
fn = "%s/%s" % (configdir, f) fn = "%s/%s" % (configdir, f)
if not os.path.isfile(fn): if not os.path.isfile(fn):
continue continue
fo = open(fn, 'rt', encoding='utf-8') fo = koji._open_text_file(fn)
id = None id = None
name = None name = None
for n in range(10): for n in range(10):
@ -1089,7 +1089,7 @@ class TaskManager(object):
proc_path = '/proc/%i/stat' % pid proc_path = '/proc/%i/stat' % pid
if not os.path.isfile(proc_path): if not os.path.isfile(proc_path):
return None return None
proc_file = open(proc_path, 'rt', encoding='utf-8') proc_file = koji._open_text_file(proc_path)
procstats = [not field.isdigit() and field or int(field) procstats = [not field.isdigit() and field or int(field)
for field in proc_file.read().split()] for field in proc_file.read().split()]
proc_file.close() proc_file.close()
@ -1097,7 +1097,7 @@ class TaskManager(object):
cmd_path = '/proc/%i/cmdline' % pid cmd_path = '/proc/%i/cmdline' % pid
if not os.path.isfile(cmd_path): if not os.path.isfile(cmd_path):
return None return None
cmd_file = open(cmd_path, 'rt', encoding='utf-8') cmd_file = koji._open_text_file(cmd_path)
procstats[1] = cmd_file.read().replace('\0', ' ').strip() procstats[1] = cmd_file.read().replace('\0', ' ').strip()
cmd_file.close() cmd_file.close()
if not procstats[1]: if not procstats[1]:

View file

@ -267,7 +267,7 @@ class RunRootTask(koji.tasks.BaseTaskHandler):
self.logger.info('New runroot') self.logger.info('New runroot')
self.logger.info("Runroot mounts: %s" % mounts) self.logger.info("Runroot mounts: %s" % mounts)
fn = '%s/tmp/runroot_mounts' % rootdir fn = '%s/tmp/runroot_mounts' % rootdir
with open(fn, 'at', encoding='utf-8') as fslog: with koji._open_text_file(fn, 'at') as fslog:
logfile = "%s/do_mounts.log" % self.workdir logfile = "%s/do_mounts.log" % self.workdir
uploadpath = self.getUploadDir() uploadpath = self.getUploadDir()
error = None error = None
@ -309,7 +309,7 @@ class RunRootTask(koji.tasks.BaseTaskHandler):
mounts = set() mounts = set()
fn = '%s/tmp/runroot_mounts' % rootdir fn = '%s/tmp/runroot_mounts' % rootdir
if os.path.exists(fn): if os.path.exists(fn):
with open(fn, 'rt', encoding='utf-8') as fslog: with koji._open_text_file(fn) as fslog:
for line in fslog.readlines(): for line in fslog.readlines():
mounts.add(line.strip()) mounts.add(line.strip())
# also, check /proc/mounts just in case # also, check /proc/mounts just in case

View file

@ -333,7 +333,7 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
fobj = mock.MagicMock() fobj = mock.MagicMock()
openf.return_value.__enter__.return_value = fobj openf.return_value.__enter__.return_value = fobj
anon_handle_mock_config(options, session, arguments) anon_handle_mock_config(options, session, arguments)
openf.assert_called_with('/tmp/mock.out', 'wt', encoding='utf-8') openf.assert_called_once()
fobj.write.assert_called_once_with(self.mock_output) fobj.write.assert_called_once_with(self.mock_output)
gen_config_mock.assert_called_with( gen_config_mock.assert_called_with(
self.progname, arch, **opts) self.progname, arch, **opts)

View file

@ -13,14 +13,6 @@ __main__.BuildRoot = kojid.BuildRoot
import koji import koji
import runroot import runroot
def mock_open():
"""Return the right patch decorator for open"""
if six.PY2:
return mock.patch('__builtin__.open')
else:
return mock.patch('builtins.open')
if six.PY2: if six.PY2:
CONFIG_PARSER = 'six.moves.configparser.SafeConfigParser' CONFIG_PARSER = 'six.moves.configparser.SafeConfigParser'
else: else:
@ -192,7 +184,7 @@ class TestMounts(unittest.TestCase):
self.assertEqual(self.t._get_path_params('/mnt/archive', 'rw'), self.assertEqual(self.t._get_path_params('/mnt/archive', 'rw'),
('archive.org:/vol/archive/', '/mnt/archive', 'nfs', 'rw,hard,intr,nosuid,nodev,noatime,tcp')) ('archive.org:/vol/archive/', '/mnt/archive', 'nfs', 'rw,hard,intr,nosuid,nodev,noatime,tcp'))
@mock_open() @mock.patch('koji._open_text_file')
@mock.patch('os.path.isdir') @mock.patch('os.path.isdir')
@mock.patch('runroot.log_output') @mock.patch('runroot.log_output')
def test_do_mounts(self, log_output, is_dir, open_mock): def test_do_mounts(self, log_output, is_dir, open_mock):
@ -293,7 +285,7 @@ class TestMounts(unittest.TestCase):
self.t.do_mounts.assert_not_called() self.t.do_mounts.assert_not_called()
@mock_open() @mock.patch('koji._open_text_file')
@mock.patch('runroot.scan_mounts') @mock.patch('runroot.scan_mounts')
@mock.patch('os.unlink') @mock.patch('os.unlink')
@mock.patch('subprocess.Popen') @mock.patch('subprocess.Popen')

View file

@ -331,7 +331,7 @@ class WindowsBuild(object):
raise BuildError('Unknown checksum type %s for %s' % ( # noqa: F821 raise BuildError('Unknown checksum type %s for %s' % ( # noqa: F821
checksum_type, checksum_type,
os.path.basename(fileinfo['localpath']))) os.path.basename(fileinfo['localpath'])))
with open(destpath, 'wt', encoding='utf-8') as destfile: with _open_text_file(destpath, 'wt') as destfile:
offset = 0 offset = 0
while True: while True:
encoded = self.server.getFile(buildinfo, fileinfo, encode_int(offset), 1048576, encoded = self.server.getFile(buildinfo, fileinfo, encode_int(offset), 1048576,
@ -412,7 +412,7 @@ class WindowsBuild(object):
"""Do the build: run the execute line(s) with cmd.exe""" """Do the build: run the execute line(s) with cmd.exe"""
tmpfd, tmpname = tempfile.mkstemp(prefix='koji-tmp', suffix='.bat', tmpfd, tmpname = tempfile.mkstemp(prefix='koji-tmp', suffix='.bat',
dir='/cygdrive/c/Windows/Temp') dir='/cygdrive/c/Windows/Temp')
script = os.fdopen(tmpfd, 'wt', encoding='utf-8') script = _open_text_file(tmpfd, 'wt')
for attr in ['source_dir', 'spec_dir', 'patches_dir']: for attr in ['source_dir', 'spec_dir', 'patches_dir']:
val = getattr(self, attr) val = getattr(self, attr)
if val: if val:
@ -449,7 +449,7 @@ class WindowsBuild(object):
def bashBuild(self): def bashBuild(self):
"""Do the build: run the execute line(s) with bash""" """Do the build: run the execute line(s) with bash"""
tmpfd, tmpname = tempfile.mkstemp(prefix='koji-tmp.', dir='/tmp') tmpfd, tmpname = tempfile.mkstemp(prefix='koji-tmp.', dir='/tmp')
script = os.fdopen(tmpfd, 'wt', encoding='utf-8') script = _open_text_file(tmpfd, 'wt')
script.write("export source_dir='%s'\n" % self.source_dir) script.write("export source_dir='%s'\n" % self.source_dir)
script.write("export spec_dir='%s'\n" % self.spec_dir) script.write("export spec_dir='%s'\n" % self.spec_dir)
if self.patches_dir: if self.patches_dir:
@ -657,7 +657,7 @@ def setup_logging(opts):
if opts.debug: if opts.debug:
level = logging.DEBUG level = logging.DEBUG
logger.setLevel(level) logger.setLevel(level)
logfd = open(logfile, 'wt', encoding='utf-8') logfd = _open_text_file(logfile, 'wt')
handler = logging.StreamHandler(logfd) handler = logging.StreamHandler(logfd)
handler.setLevel(level) handler.setLevel(level)
handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(name)s: %(message)s')) handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(name)s: %(message)s'))