move move_and_symlink to koji.util

This commit is contained in:
Tomas Kopecek 2018-06-05 10:11:18 +02:00 committed by Mike McLean
parent 6a6f90be1e
commit 9963877545
4 changed files with 52 additions and 59 deletions

View file

@ -59,6 +59,7 @@ import koji.tasks
from koji.context import context
from koji.util import dslice
from koji.util import md5_constructor
from koji.util import move_and_symlink
from koji.util import multi_fnmatch
from koji.util import safer_move
from koji.util import sha1_constructor
@ -73,16 +74,6 @@ def log_error(msg):
logger.error(msg)
def move_and_symlink(src, dst, relative=False, create_dir=False):
"""Move src to dest and create symlink instead of original file"""
if create_dir:
koji.ensuredir(os.path.dirname(dst))
safer_move(src, dst)
if relative:
dst = os.path.relpath(dst, os.path.dirname(src))
os.symlink(dst, src)
class Task(object):
"""A task for the build hosts"""
@ -6046,7 +6037,7 @@ def import_build_log(fn, buildinfo, subdir=None):
raise koji.GenericError("Error importing build log. %s already exists." % final_path)
if os.path.islink(fn) or not os.path.isfile(fn):
raise koji.GenericError("Error importing build log. %s is not a regular file." % fn)
move_and_symlink(fn, final_path, relative=True)
move_and_symlink(fn, final_path)
def import_rpm_file(fn, buildinfo, rpminfo):
"""Move the rpm file into the proper place
@ -6491,7 +6482,7 @@ def _import_archive_file(filepath, destdir):
raise koji.GenericError("Error importing archive file, %s already exists" % final_path)
if os.path.islink(filepath) or not os.path.isfile(filepath):
raise koji.GenericError("Error importing archive file, %s is not a regular file" % filepath)
move_and_symlink(filepath, final_path, relative=True, create_dir=True)
move_and_symlink(filepath, final_path, create_dir=True)
def _generate_maven_metadata(mavendir):
"""
@ -8660,7 +8651,7 @@ def importImageInternal(task_id, build_id, imgdata):
raise koji.GenericError("Error importing build log. %s already exists." % final_path)
if os.path.islink(logsrc) or not os.path.isfile(logsrc):
raise koji.GenericError("Error importing build log. %s is not a regular file." % logsrc)
move_and_symlink(logsrc, final_path, relative=True, create_dir=True)
move_and_symlink(logsrc, final_path, create_dir=True)
# record all of the RPMs installed in the image(s)
# verify they were built in Koji or in an external repo
@ -11944,7 +11935,7 @@ class HostExports(object):
for relpath in [srpm] + rpms:
fn = "%s/%s" % (uploadpath, relpath)
dest = "%s/%s" % (dir, os.path.basename(fn))
move_and_symlink(fn, dest, relative=True)
move_and_symlink(fn, dest)
if logs:
for key, files in six.iteritems(logs):
if key:
@ -11955,7 +11946,7 @@ class HostExports(object):
for relpath in files:
fn = "%s/%s" % (uploadpath, relpath)
dest = "%s/%s" % (logdir, os.path.basename(fn))
move_and_symlink(fn, dest, relative=True)
move_and_symlink(fn, dest)
def moveMavenBuildToScratch(self, task_id, results, rpm_results):
"Move a completed Maven scratch build into place (not imported)"
@ -11976,14 +11967,14 @@ class HostExports(object):
relpath = filename
src = os.path.join(koji.pathinfo.task(results['task_id']), relpath)
dest = os.path.join(destdir, relpath)
move_and_symlink(src, dest, relative=True, create_dir=True)
move_and_symlink(src, dest, create_dir=True)
if rpm_results:
for relpath in [rpm_results['srpm']] + rpm_results['rpms'] + \
rpm_results['logs']:
src = os.path.join(koji.pathinfo.task(rpm_results['task_id']),
relpath)
dest = os.path.join(destdir, 'rpms', relpath)
move_and_symlink(src, dest, relative=True, create_dir=True)
move_and_symlink(src, dest, create_dir=True)
def moveWinBuildToScratch(self, task_id, results, rpm_results):
"Move a completed Windows scratch build into place (not imported)"
@ -11999,14 +11990,14 @@ class HostExports(object):
for relpath in to_list(results['output'].keys()) + results['logs']:
filename = os.path.join(koji.pathinfo.task(results['task_id']), relpath)
dest = os.path.join(destdir, relpath)
move_and_symlink(filename, dest, relative=True, create_dir=True)
move_and_symlink(filename, dest, create_dir=True)
if rpm_results:
for relpath in [rpm_results['srpm']] + rpm_results['rpms'] + \
rpm_results['logs']:
filename = os.path.join(koji.pathinfo.task(rpm_results['task_id']),
relpath)
dest = os.path.join(destdir, 'rpms', relpath)
move_and_symlink(filename, dest, relative=True, create_dir=True)
move_and_symlink(filename, dest, create_dir=True)
def moveImageBuildToScratch(self, task_id, results):
"""move a completed image scratch build into place"""
@ -12028,7 +12019,7 @@ class HostExports(object):
src = os.path.join(workdir, img)
dest = os.path.join(destdir, img)
logger.debug('renaming %s to %s' % (src, dest))
move_and_symlink(src, dest, relative=True, create_dir=True)
move_and_symlink(src, dest, create_dir=True)
if 'rpmresults' in sub_results:
rpm_results = sub_results['rpmresults']
for relpath in [rpm_results['srpm']] + rpm_results['rpms'] + \
@ -12036,7 +12027,7 @@ class HostExports(object):
src = os.path.join(koji.pathinfo.task(
rpm_results['task_id']), relpath)
dest = os.path.join(destdir, 'rpms', relpath)
move_and_symlink(src, dest, relative=True, create_dir=True)
move_and_symlink(src, dest, create_dir=True)
def initBuild(self, data):
"""Create a stub (rpm) build entry.

View file

@ -450,6 +450,16 @@ def safer_move(src, dst):
shutil.move(src, dst)
def move_and_symlink(src, dst, relative=True, create_dir=False):
"""Move src to dest and create symlink instead of original file"""
if create_dir:
koji.ensuredir(os.path.dirname(dst))
safer_move(src, dst)
if relative:
dst = os.path.relpath(dst, os.path.dirname(src))
os.symlink(dst, src)
def relpath(*args, **kwargs):
deprecated("koji.util.relpath() is deprecated and will be removed in a "
"future version. See: https://pagure.io/koji/issue/834")

View file

@ -1,38 +0,0 @@
import mock
try:
import unittest2 as unittest
except ImportError:
import unittest
import kojihub
class TestMoveAndSymlink(unittest.TestCase):
@mock.patch('koji.ensuredir')
@mock.patch('kojihub.safer_move')
@mock.patch('os.symlink')
def test_valid(self, symlink, safer_move, ensuredir):
kojihub.move_and_symlink('/dir_a/src', '/dir_b/dst', relative=False, create_dir=False)
ensuredir.assert_not_called()
safer_move.assert_called_once_with('/dir_a/src', '/dir_b/dst')
symlink.assert_called_once_with('/dir_b/dst', '/dir_a/src')
@mock.patch('koji.ensuredir')
@mock.patch('kojihub.safer_move')
@mock.patch('os.symlink')
def test_valid_relative(self, symlink, safer_move, ensuredir):
kojihub.move_and_symlink('/a/src', '/b/dst', relative=True, create_dir=False)
safer_move.assert_called_once_with('/a/src', '/b/dst')
symlink.assert_called_once_with('../b/dst', '/a/src')
ensuredir.assert_not_called()
@mock.patch('koji.ensuredir')
@mock.patch('kojihub.safer_move')
@mock.patch('os.symlink')
def test_valid_create_dir(self, symlink, safer_move, ensuredir):
kojihub.move_and_symlink('a/src', 'b/dst', relative=True, create_dir=True)
safer_move.assert_called_once_with('a/src', 'b/dst')
symlink.assert_called_once_with('../b/dst', 'a/src')
ensuredir.assert_called_once_with('b')

View file

@ -1170,6 +1170,36 @@ class TestRmtree(unittest.TestCase):
isdir.assert_has_calls([call('mode'), call('mode')])
lstat.assert_has_calls([call('a'), call('b')])
class TestMoveAndSymlink(unittest.TestCase):
@mock.patch('koji.ensuredir')
@mock.patch('koji.util.safer_move')
@mock.patch('os.symlink')
def test_valid(self, symlink, safer_move, ensuredir):
koji.util.move_and_symlink('/dir_a/src', '/dir_b/dst', relative=False, create_dir=False)
ensuredir.assert_not_called()
safer_move.assert_called_once_with('/dir_a/src', '/dir_b/dst')
symlink.assert_called_once_with('/dir_b/dst', '/dir_a/src')
@mock.patch('koji.ensuredir')
@mock.patch('koji.util.safer_move')
@mock.patch('os.symlink')
def test_valid_relative(self, symlink, safer_move, ensuredir):
koji.util.move_and_symlink('/a/src', '/b/dst', relative=True, create_dir=False)
safer_move.assert_called_once_with('/a/src', '/b/dst')
symlink.assert_called_once_with('../b/dst', '/a/src')
ensuredir.assert_not_called()
@mock.patch('koji.ensuredir')
@mock.patch('koji.util.safer_move')
@mock.patch('os.symlink')
def test_valid_create_dir(self, symlink, safer_move, ensuredir):
koji.util.move_and_symlink('a/src', 'b/dst', relative=True, create_dir=True)
safer_move.assert_called_once_with('a/src', 'b/dst')
symlink.assert_called_once_with('../b/dst', 'a/src')
ensuredir.assert_called_once_with('b')
if __name__ == '__main__':
unittest.main()