move move_and_symlink to koji.util
This commit is contained in:
parent
6a6f90be1e
commit
9963877545
4 changed files with 52 additions and 59 deletions
|
|
@ -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.
|
||||
|
|
|
|||
10
koji/util.py
10
koji/util.py
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue