From 89d44945efd901606ed8a0dce70b52dfa6b83285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Doktor?= Date: Wed, 18 Mar 2026 10:26:27 +0100 Subject: [PATCH 1/3] Port from setup.py to pyproject.toml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit automated conversion with a few little adjustments. Co-Authored-By: Claude Opus 4.5 Signed-off-by: Lukáš Doktor --- .github/workflows/ci.yml | 26 ++++---- Makefile | 8 +-- docs/source/conf.py | 12 +--- pyproject.toml | 88 +++++++++++++++++++++++++++ requirements.txt | 6 -- runperf/profiles.py | 4 +- runperf/utils/__init__.py | 4 +- runperf/version.py | 54 +++-------------- selftests/utils/test_utils.py | 23 +++---- setup.py | 110 ---------------------------------- 10 files changed, 127 insertions(+), 208 deletions(-) create mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100755 setup.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 027177c..5938379 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,36 +15,32 @@ jobs: python-version: [3.12] fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: - fetch-depth: 500 - - name: Fetch tags required for run-perf version - run: git fetch --tags --depth 500 - - uses: actions/setup-python@v2 + fetch-depth: 1 + fetch-tags: true + - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install missing aexpect dependency (remove when https://github.com/avocado-framework/aexpect/pull/81 is merged) run: pip install six numpy - - run: pip install -r requirements.txt + - run: pip install -e .[dev] - run: make check code_coverage: name: CodeCoverage runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: - fetch-depth: 500 - - name: Fetch tags required for run-perf version - run: git fetch --tags --depth 500 - - uses: actions/setup-python@v2 + fetch-depth: 1 + fetch-tags: true + - uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: "3.12" - name: Install missing aexpect dependency (remove when https://github.com/avocado-framework/aexpect/pull/81 is merged) run: pip install six - - run: pip install -r requirements.txt + - run: pip install -e .[dev] - run: | pip install coverage curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter diff --git a/Makefile b/Makefile index d33162c..7ff1367 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ all: @echo @echo "Development related targets:" @echo "check: Executes selftests" - @echo "develop: Runs 'python setup.py --develop' on this tree alone" + @echo "develop: Deploy run-perf editable from this directory" @echo "clean: Get rid of scratch, byte files and removes the links to other subprojects" @echo "docs: Build html docs in docs/build/html/ dir" @echo "html_result: Refresh the docs/source/_static/html_result.html from selftests/.assets/results" @@ -25,7 +25,7 @@ coverage: clean develop ./selftests/run_coverage develop: - $(PYTHON) -m pip install -e . + $(PYTHON) -m pip install -e ".[dev]" clean: $(PYTHON) -m pip uninstall -y runperf @@ -36,8 +36,8 @@ clean: docs: develop make -C docs html -pypi: clean develop - RUNPERF_RELEASE=yes $(PYTHON) setup.py sdist bdist_wheel +pypi: clean + $(PYTHON) -m build @echo @echo @echo "Use 'python3 -m twine upload dist/*'" diff --git a/docs/source/conf.py b/docs/source/conf.py index deff09e..202c7ee 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -17,7 +17,7 @@ import sys ROOT_PATH = os.path.abspath(os.path.join(os.path.pardir, os.path.pardir)) sys.path.insert(0, ROOT_PATH) -from setup import _get_git_version # pylint: disable=C0413 +from runperf.version import __version__ # pylint: disable=C0413 # -- Project information ----------------------------------------------------- @@ -26,15 +26,7 @@ author = 'Lukáš Doktor' # The full version, including alpha/beta/rc tags -release = _get_git_version() -if release == '0.0': - # Probably in shallow-cloned git, fetch the latest tag - try: - subprocess.call([shutil.which("git"), "fetch", # nosec - "--depth=500"]) - release = _get_git_version() - except subprocess.SubprocessError: - pass +release = __version__ # -- API docs ---------------------------------------------------------------- API_SOURCE_DIR = os.path.join(ROOT_PATH, 'runperf') diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..3cee4e9 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,88 @@ +[build-system] +requires = ["setuptools>=64", "setuptools-scm>=8"] +build-backend = "setuptools.build_meta" + +[project] +name = "runperf" +description = "Helper to execute perf-beaker-tasks locally or in VM" +readme = "README.rst" +license = "GPL-2.0-or-later" +authors = [ + {name = "Lukas Doktor", email = "ldoktor@redhat.com"} +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Natural Language :: English", + "Operating System :: POSIX", + "Topic :: Software Development :: Quality Assurance", + "Topic :: Software Development :: Testing", + "Programming Language :: Python :: 3", +] +requires-python = ">=3.9" +dependencies = [ + "aexpect>=1.5.1", + "PyYAML", + "numpy", +] +dynamic = ["version"] + +[project.optional-dependencies] +dev = [ + "inspektor", + "Sphinx", + "jinja2", + "build", +] + +[project.urls] +Homepage = "https://github.com/distributed-system-analysis/run-perf" + +[project.entry-points."runperf.profiles"] +"50Localhost" = "runperf.profiles:Localhost" +"50DefaultLibvirt" = "runperf.profiles:DefaultLibvirt" +"50DefaultLibvirtMulti" = "runperf.profiles:DefaultLibvirtMulti" +"50Overcommit1_5" = "runperf.profiles:Overcommit1p5" +"50TunedLibvirt" = "runperf.profiles:TunedLibvirt" + +[project.entry-points."runperf.tests"] +"50DummyTest" = "runperf.tests:DummyTest" +"50PBenchFio" = "runperf.tests:PBenchFio" +"50Linpack" = "runperf.tests:Linpack" +"50UPerf" = "runperf.tests:UPerf" +"50PBenchNBD" = "runperf.tests:PBenchNBD" +"50PBenchLibblkio" = "runperf.tests:PBenchLibblkio" + +[project.entry-points."runperf.machine.distro_info"] +"50get_distro_info" = "runperf.machine:get_distro_info" + +[project.entry-points."runperf.utils.cloud_image_providers"] +"50Fedora" = "runperf.utils.cloud_image_providers:Fedora" + +[project.entry-points."runperf.provisioners"] +"50Beaker" = "runperf.provisioners:Beaker" + +[project.entry-points."runperf.utils.pbench"] +"50Dnf" = "runperf.utils.pbench:Dnf" + +[tool.setuptools.packages.find] +exclude = ["selftests*"] + +[tool.setuptools.package-data] +"*" = ["assets/**/*"] + +[tool.setuptools] +script-files = [ + "scripts/run-perf", + "scripts/analyze-perf", + "scripts/compare-perf", + "scripts/diff-perf", + "scripts/strip-run-perf", +] + +[tool.setuptools_scm] +# Version format: +# - Tagged release: X.Y.Z (e.g., 1.2) +# - Development: X.Y.devN+gHASH (e.g., 1.2.dev86+g62d6338) +# - Dirty: X.Y.devN+gHASH.dirty (e.g., 1.2.dev86+g62d6338.dirty) +local_scheme = "dirty-tag" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index f2edbf7..0000000 --- a/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Extra requirements for selftesting and such -# -# inspektor (static and style checks) -inspektor -Sphinx -jinja2 diff --git a/runperf/profiles.py b/runperf/profiles.py index 109d13b..3726b45 100644 --- a/runperf/profiles.py +++ b/runperf/profiles.py @@ -16,7 +16,7 @@ import os import time -from pkg_resources import iter_entry_points as pkg_entry_points +from importlib.metadata import entry_points from . import utils @@ -549,7 +549,7 @@ def _get_image(self, session, setup_script): self.log.debug("Image %s ready", self._guest["distro"]) return plugin.image providers = ", ".join(str(_) - for _ in pkg_entry_points(entry_point)) + for _ in entry_points(group=entry_point)) raise RuntimeError(f"Fail to fetch {self._guest['distro']} " f"using {providers} providers") diff --git a/runperf/utils/__init__.py b/runperf/utils/__init__.py index 698cbcb..11380fa 100644 --- a/runperf/utils/__init__.py +++ b/runperf/utils/__init__.py @@ -29,7 +29,7 @@ import threading import time import traceback -import pkg_resources +from importlib.metadata import entry_points import aexpect @@ -544,7 +544,7 @@ def sorted_entry_points(group): :param group: entry-point group """ - return sorted(pkg_resources.iter_entry_points(group), + return sorted(entry_points(group=group), key=lambda ep: ep.name) diff --git a/runperf/version.py b/runperf/version.py index bf451e4..c102918 100644 --- a/runperf/version.py +++ b/runperf/version.py @@ -13,58 +13,22 @@ # Copyright: Red Hat Inc. 2020 # Author: Lukas Doktor """ -The purpose of this implementation is to return the right version for -installed as well as 'make develop' deployments. -""" - -import os -import shutil -import subprocess # nosec - -import pkg_resources - -# Path to setup.py. It only exists when used from sources -SETUP_PATH = os.path.dirname(os.path.dirname(__file__)) - +Version handling using importlib.metadata. -def _get_git_version(): - """ - Get version from git describe +Version is computed from git tags at build/install time by setuptools_scm. +""" - :warning: This implementation must match the "../setup.py" one - """ - curdir = os.getcwd() - try: - os.chdir(SETUP_PATH) - git = shutil.which("git") - version = subprocess.check_output( # nosec - [git, "describe", "--tags", - "HEAD"]).strip().decode("utf-8") - if version.count("-") == 2: - split = version.split('-') - version = f"{split[0]}.{split[1]}+{split[2]}" - else: - version = version.replace("-", ".") - try: - subprocess.check_output([git, "diff", "--quiet"]) # nosec - except subprocess.CalledProcessError: - version += "+dirty" - except (OSError, subprocess.SubprocessError, NameError): - return '0.0' - finally: - os.chdir(curdir) - return version +from importlib.metadata import version, PackageNotFoundError def get_version(): """ - Attempt to get the version from git or fallback to pkg_resources + Get version from package metadata (set at build time by setuptools_scm). """ - if os.path.exists(os.path.join(SETUP_PATH, '.git')): - version = _get_git_version() - if version: - return version - return pkg_resources.get_distribution("runperf").version + try: + return version("runperf") + except PackageNotFoundError: + return "0.0.0+unknown" __version__ = get_version() diff --git a/selftests/utils/test_utils.py b/selftests/utils/test_utils.py index b10918d..693ca31 100644 --- a/selftests/utils/test_utils.py +++ b/selftests/utils/test_utils.py @@ -143,28 +143,23 @@ def load(self): plugin.name = self.loaded_name plugin.plugin = self.name return plugin - entries = lambda _: [EP("10"), EP("20"), EP("30")] - with mock.patch("runperf.utils.pkg_resources.iter_entry_points", - entries): + entries = lambda group: [EP("10"), EP("20"), EP("30")] + with mock.patch("runperf.utils.entry_points", entries): self.assertEqual(["10", "20", "30"], [_.name for _ in utils.sorted_entry_points('')]) - entries = lambda _: [EP("20"), EP("30"), EP("10")] - with mock.patch("runperf.utils.pkg_resources.iter_entry_points", - entries): + entries = lambda group: [EP("20"), EP("30"), EP("10")] + with mock.patch("runperf.utils.entry_points", entries): self.assertEqual(["10", "20", "30"], [_.name for _ in utils.sorted_entry_points('')]) - entries = lambda _: [EP("20", "foo"), EP("30", "foo"), EP("10", "bar")] - with mock.patch("runperf.utils.pkg_resources.iter_entry_points", - entries): + entries = lambda group: [EP("20", "foo"), EP("30", "foo"), EP("10", "bar")] + with mock.patch("runperf.utils.entry_points", entries): act = utils.named_entry_point("", "foo") self.assertEqual(("foo", "20"), (act.name, act.plugin)) - entries = lambda _: [EP("30", "foo"), EP("20", "foo"), EP("10", "bar")] - with mock.patch("runperf.utils.pkg_resources.iter_entry_points", - entries): + entries = lambda group: [EP("30", "foo"), EP("20", "foo"), EP("10", "bar")] + with mock.patch("runperf.utils.entry_points", entries): act = utils.named_entry_point("", "foo") self.assertEqual(("foo", "20"), (act.name, act.plugin)) - with mock.patch("runperf.utils.pkg_resources.iter_entry_points", - entries): + with mock.patch("runperf.utils.entry_points", entries): self.assertRaises(KeyError, utils.named_entry_point, "", "missing") def test_human_to_bool(self): diff --git a/setup.py b/setup.py deleted file mode 100755 index 905feb1..0000000 --- a/setup.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/env python3 -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -# See LICENSE for more details. -# -# Copyright: Red Hat Inc. 2018-2020 -# Author: Lukas Doktor - -import os -import shutil -import subprocess # nosec - -from setuptools import setup, find_packages - -# pylint: disable=E0611 -SETUP_PATH = os.path.abspath(os.path.dirname(__file__)) - - -def _get_git_version(): - """ - Get version from git describe - - :warning: This implementation must match the "runperf/version.py" one - """ - curdir = os.getcwd() - try: - os.chdir(SETUP_PATH) - git = shutil.which("git") - version = subprocess.check_output( # nosec - [git, "describe", "--tags", - "HEAD"]).strip().decode("utf-8") - if version.count("-") == 2: - split = version.split('-') - version = "%s.%s+%s" % tuple(split) - else: - version = version.replace("-", ".") - try: - subprocess.check_output([git, "diff", "--quiet"]) # nosec - except subprocess.CalledProcessError: - version += ".dirty" - except (OSError, subprocess.SubprocessError, NameError): - return '0.0' - finally: - os.chdir(curdir) - return version - - -def get_long_description(): - with open(os.path.join(SETUP_PATH, 'README.rst'), 'r') as req: - req_contents = req.read() - return req_contents - - -if __name__ == '__main__': - setup(name='runperf', - version=_get_git_version(), - description='Helper to execute perf-beaker-tasks locally or in VM', - long_description=get_long_description(), - long_description_content_type="text/markdown", - author='Lukas Doktor', - author_email='ldoktor@redhat.com', - url='https://github.com/distributed-system-analysis/run-perf', - license="GPLv2+", - classifiers=[ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", - "Natural Language :: English", - "Operating System :: POSIX", - "Topic :: Software Development :: Quality Assurance", - "Topic :: Software Development :: Testing", - "Programming Language :: Python :: 3", - ], - packages=find_packages(exclude=('selftests*',)), - include_package_data=True, - scripts=['scripts/run-perf', 'scripts/analyze-perf', - 'scripts/compare-perf', 'scripts/diff-perf', - 'scripts/strip-run-perf'], - entry_points={ - 'runperf.profiles': [ - '50Localhost = runperf.profiles:Localhost', - '50DefaultLibvirt = runperf.profiles:DefaultLibvirt', - '50DefaultLibvirtMulti = runperf.profiles:DefaultLibvirtMulti', - '50Overcommit1_5 = runperf.profiles:Overcommit1p5', - '50TunedLibvirt = runperf.profiles:TunedLibvirt'], - 'runperf.tests': [ - '50DummyTest = runperf.tests:DummyTest', - '50PBenchFio = runperf.tests:PBenchFio', - '50Linpack = runperf.tests:Linpack', - '50UPerf = runperf.tests:UPerf', - '50PBenchNBD = runperf.tests:PBenchNBD', - '50PBenchLibblkio = runperf.tests:PBenchLibblkio'], - 'runperf.machine.distro_info': [ - '50get_distro_info = runperf.machine:get_distro_info'], - 'runperf.utils.cloud_image_providers': [ - '50Fedora = runperf.utils.cloud_image_providers:Fedora'], - 'runperf.provisioners': [ - '50Beaker = runperf.provisioners:Beaker'], - 'runperf.utils.pbench': [ - '50Dnf = runperf.utils.pbench:Dnf']}, - test_suite='selftests', - python_requires='>=3.4', - install_requires=['aexpect>=1.5.1', 'PyYAML', 'numpy']) From c120e35da8488a4845f2e0d1ac8f464d9a416428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Doktor?= Date: Wed, 18 Mar 2026 10:58:50 +0100 Subject: [PATCH 2/3] .workflows: Remove code-coverage workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the code-climate is dead and replacement is not worth it. Let's remove this workflow and rely on manual execution. Signed-off-by: Lukáš Doktor --- .github/workflows/ci.yml | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5938379..2668337 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,27 +26,3 @@ jobs: run: pip install six numpy - run: pip install -e .[dev] - run: make check - - code_coverage: - name: CodeCoverage - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 1 - fetch-tags: true - - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - name: Install missing aexpect dependency (remove when https://github.com/avocado-framework/aexpect/pull/81 is merged) - run: pip install six - - run: pip install -e .[dev] - - run: | - pip install coverage - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - chmod +x ./cc-test-reporter - ./cc-test-reporter before-build - make develop && ./selftests/run_coverage - ./cc-test-reporter after-build - env: - CC_TEST_REPORTER_ID: 009b4c0bfafb850daeb66460df98eded574477a064df0b4a75f65752b18b1d01 From 36f8dbe91bb24bf27003abcb505d3e0f2786889a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Doktor?= Date: Wed, 18 Mar 2026 16:45:44 +0100 Subject: [PATCH 3/3] contrib: Move contrib to runperf/contrib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in order to deploy the contrib scripts along with the run-perf, let's move them there and add "ruperf-contrib-path" script to retrieve the right path. Signed-off-by: Lukáš Doktor --- pyproject.toml | 5 ++- runperf/contrib.py | 42 +++++++++++++++++++ {contrib => runperf/contrib}/bisect.sh | 0 .../contrib}/bisecter_bisect.sh | 0 .../contrib}/container/Dockerfile | 0 .../contrib}/data_analysis/extract_data.py | 0 {contrib => runperf/contrib}/rpm_links.py | 0 .../contrib}/sample_bisecter_bisect.sh | 0 .../contrib}/setup_scripts/fio-compile-nbd.sh | 0 .../contrib}/setup_scripts/fio-fedora-3.19.sh | 0 .../contrib}/setup_scripts/linpack-fedora.sh | 0 .../contrib}/setup_scripts/upstream_qemu.sh | 0 .../contrib}/upstream_qemu_bisect.sh | 0 13 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 runperf/contrib.py rename {contrib => runperf/contrib}/bisect.sh (100%) rename {contrib => runperf/contrib}/bisecter_bisect.sh (100%) rename {contrib => runperf/contrib}/container/Dockerfile (100%) rename {contrib => runperf/contrib}/data_analysis/extract_data.py (100%) rename {contrib => runperf/contrib}/rpm_links.py (100%) rename {contrib => runperf/contrib}/sample_bisecter_bisect.sh (100%) rename {contrib => runperf/contrib}/setup_scripts/fio-compile-nbd.sh (100%) rename {contrib => runperf/contrib}/setup_scripts/fio-fedora-3.19.sh (100%) rename {contrib => runperf/contrib}/setup_scripts/linpack-fedora.sh (100%) rename {contrib => runperf/contrib}/setup_scripts/upstream_qemu.sh (100%) rename {contrib => runperf/contrib}/upstream_qemu_bisect.sh (100%) diff --git a/pyproject.toml b/pyproject.toml index 3cee4e9..107d88a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,8 +68,11 @@ Homepage = "https://github.com/distributed-system-analysis/run-perf" [tool.setuptools.packages.find] exclude = ["selftests*"] +[project.scripts] +runperf-contrib-path = "runperf.contrib:main" + [tool.setuptools.package-data] -"*" = ["assets/**/*"] +"*" = ["assets/**/*", "contrib/**/*"] [tool.setuptools] script-files = [ diff --git a/runperf/contrib.py b/runperf/contrib.py new file mode 100644 index 0000000..828a6bd --- /dev/null +++ b/runperf/contrib.py @@ -0,0 +1,42 @@ +#!/bin/env python3 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# See LICENSE for more details. +# +# Copyright: Red Hat Inc. 2024 +# Author: Lukas Doktor + +"""Helper to locate contrib scripts directory""" + +import os +import sys + + +def get_contrib_path(): + """ + Return the path to the contrib scripts directory. + + Works for both editable installs and regular pip installs. + """ + return os.path.join(os.path.dirname(__file__), 'contrib') + + +def main(): + """Print the path to contrib scripts directory""" + path = get_contrib_path() + if not os.path.isdir(path): + sys.stderr.write(f"Warning: contrib directory not found at {path}\n") + return 1 + print(path) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/contrib/bisect.sh b/runperf/contrib/bisect.sh similarity index 100% rename from contrib/bisect.sh rename to runperf/contrib/bisect.sh diff --git a/contrib/bisecter_bisect.sh b/runperf/contrib/bisecter_bisect.sh similarity index 100% rename from contrib/bisecter_bisect.sh rename to runperf/contrib/bisecter_bisect.sh diff --git a/contrib/container/Dockerfile b/runperf/contrib/container/Dockerfile similarity index 100% rename from contrib/container/Dockerfile rename to runperf/contrib/container/Dockerfile diff --git a/contrib/data_analysis/extract_data.py b/runperf/contrib/data_analysis/extract_data.py similarity index 100% rename from contrib/data_analysis/extract_data.py rename to runperf/contrib/data_analysis/extract_data.py diff --git a/contrib/rpm_links.py b/runperf/contrib/rpm_links.py similarity index 100% rename from contrib/rpm_links.py rename to runperf/contrib/rpm_links.py diff --git a/contrib/sample_bisecter_bisect.sh b/runperf/contrib/sample_bisecter_bisect.sh similarity index 100% rename from contrib/sample_bisecter_bisect.sh rename to runperf/contrib/sample_bisecter_bisect.sh diff --git a/contrib/setup_scripts/fio-compile-nbd.sh b/runperf/contrib/setup_scripts/fio-compile-nbd.sh similarity index 100% rename from contrib/setup_scripts/fio-compile-nbd.sh rename to runperf/contrib/setup_scripts/fio-compile-nbd.sh diff --git a/contrib/setup_scripts/fio-fedora-3.19.sh b/runperf/contrib/setup_scripts/fio-fedora-3.19.sh similarity index 100% rename from contrib/setup_scripts/fio-fedora-3.19.sh rename to runperf/contrib/setup_scripts/fio-fedora-3.19.sh diff --git a/contrib/setup_scripts/linpack-fedora.sh b/runperf/contrib/setup_scripts/linpack-fedora.sh similarity index 100% rename from contrib/setup_scripts/linpack-fedora.sh rename to runperf/contrib/setup_scripts/linpack-fedora.sh diff --git a/contrib/setup_scripts/upstream_qemu.sh b/runperf/contrib/setup_scripts/upstream_qemu.sh similarity index 100% rename from contrib/setup_scripts/upstream_qemu.sh rename to runperf/contrib/setup_scripts/upstream_qemu.sh diff --git a/contrib/upstream_qemu_bisect.sh b/runperf/contrib/upstream_qemu_bisect.sh similarity index 100% rename from contrib/upstream_qemu_bisect.sh rename to runperf/contrib/upstream_qemu_bisect.sh