TMT(1)
β¨ NAME β¨
tmt β the Test Management Tool π (yes bestie, that's the whole name, it's giving main character energy already)
π DESCRIPTION π
okay so, tmt is literally your bestie for working with tests π it gives you a user-friendly way to handle all of it: you can comfortably create new tests, safely and easily run tests across different environments, review test results, debug test code, and enable tests in the CI using a consistent and concise config. no chaos, no vibes-off energy β¨
the python module and command-line tool implement the Metadata Specification, which lets you store all the needed test execution data directly inside a git repository π¦ and because you can also reference remote repositories, it's super easy to share test coverage across projects and distros, no cap.
the Flexible Metadata Format fmf is what stores the data, in a way that's both human and machine readable, right next to the source code π thanks to inheritance and elasticity, the metadata gets organized into the structure efficiently, preventing unnecessary duplication. it's giving organized, it's giving slay.
π SPECIFICATION π
there are several metadata levels defined by the specification, and honestly? love that for us:
- L0 metadata β the special one β¨ defines core attributes such as
summaryordescriptionwhich are common across all levels. - L1 metadata, aka Tests β defines attributes which are closely related to individual test cases, such as
test script,framework,directory pathwhere the test should be executed,maximum test duration, orpackagesrequired to run the test πΈ - L2 metadata, aka Plans β used to group relevant tests and enable them in the CI π they describe how to discover tests for execution, how to provision the environment, how to prepare it for testing, how to execute tests, and how to report test results.
- L3 metadata, aka Stories β can be used to track implementation, test and documentation coverage for individual features or requirements π¦ thanks to this you can track everything in one place, including the project implementation progress. iconic.
π¦ SYNOPSIS π¦
command line usage is straightforward, no biggie:
tmt command [options]
π EXAMPLES π
let's see which tests, plans and stories are available π
tmt
initialize the metadata tree in the current directory, optionally with example content based on templates:
tmt init
tmt init --template base
run all or selected steps for each plan:
tmt run
tmt run discover
tmt run prepare execute
see any failures from a previous run π:
tmt run --last report -vvv
show test output while running:
tmt run -vvv
list tests, show details, check against the specification:
tmt tests ls
tmt tests show
tmt tests lint
create a new test, import test metadata from other formats:
tmt test create
tmt test import
list plans, show details, check against the specification:
tmt plans ls
tmt plans show
tmt plans lint
list stories, check details, show coverage status:
tmt stories ls
tmt stories show
tmt stories coverage
many commands support regular expression filtering and other specific options π :
tmt stories ls cli
tmt stories show create
tmt stories coverage --implemented
check the help message of individual commands for the full list of available options π
π OPTIONS π
here's the list of the most frequently used commands and options, bestie π
πβοΈ Run
the run command is used to execute test steps. by default all test steps are run. see the L2 Metadata specification for a detailed description of individual steps. here's the brief overview:
discoverβ gather information about test cases to be executed πprovisionβ provision an environment for testing, or use localhost πprepareβ prepare the environment for testing π§Όexecuteβ run tests using the specified executor π₯reportβ provide test results overview and send reports πfinishβ perform the finishing tasks and clean up provisioned guests π§Ή
π§ͺ Tests
manage tests (that's L1 metadata π). check available tests, inspect their metadata, gather old metadata from various sources and store them in the new fmf format.
lsβ list available tests.showβ show test details.lintβ check tests against the L1 metadata specification.createβ create a new test based on a given template.importβ convert old test metadata into the newfmfformat.
πΊοΈ Plans
manage test plans (L2 metadata β¨). search for available plans. explore detailed test step configuration.
lsβ list available plans.showβ show plan details.lintβ check plans against the L2 metadata specification.
π Stories
manage user stories. check available user stories. explore coverage (test, implementation, documentation).
lsβ list available stories.showβ show story details.coverageβ show code, test and docs coverage for given stories.exportβ export selected stories into the desired format.
π οΈ Utils
various utility options, the little helpers π«Ά
--root PATHβ path to the metadata tree, the current directory is used by default.--verboseβ print additional information.--debugβ turn on debugging output.--log-topic NAMEβ enable logging for a specific topic, useful for debugging particular areas. for example, to see logs related to policy processing, you can use:
tmt --log-topic policy test export --policy ../policies/test/environment.yaml
check the help message of individual commands for the full list of available options π
π¦ INSTALL π¦
the main tmt package provides the core features with a minimal set of dependencies:
sudo dnf install tmt
in order to enable additional functionality, such as particular provision or report plugins, install the respective subpackage:
sudo dnf install tmt+test-convert
sudo dnf install tmt+provision-container
sudo dnf install tmt+provision-virtual
if you don't care about disk space and want to have all available features right at hand, install everything:
sudo dnf install tmt+all
for CentOS and RHEL, first make sure that you have available the EPEL repository: https://docs.fedoraproject.org/en-US/epel/ β you might also have to enable additional repositories:
sudo dnf config-manager --set-enabled crb # CentOS 10
sudo dnf config-manager --set-enabled rhel-CRB # RHEL 10
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
sudo dnf install tmt
for plugins which cannot work outside of VPN and so live within its walls, you need to enable the internal copr repository first π§± then you can install either everything or only those you need:
sudo dnf install tmt-redhat-all
sudo dnf install tmt-redhat-*
do you like to check the released bits as soon as they are out? π enable the stable copr repository and install from there:
sudo dnf copr enable @teemtee/stable
impatient to try the fresh features as soon as they are merged into the main branch? π enable the latest copr repository:
sudo dnf copr enable @teemtee/latest
not sure, just want to try out how it works? experiment safely and easily inside a container π«§:
podman run -it --rm quay.io/teemtee/tmt bash
podman run -it --rm quay.io/teemtee/tmt-all bash
the official tmt container images include tini as an init process to properly handle signals and reap zombie processes π if you are using a custom container image without a built-in init, use the --init flag to prevent zombie processes:
podman run --init -it --rm your-custom-image bash
when installing using pip you might need to install additional packages on your system:
sudo dnf install gcc redhat-rpm-config
sudo dnf install {python3,libvirt,krb5,libpq}-devel
pip install --user tmt
on other distributions than Fedora or RHEL the package names might be different. for example on Ubuntu, to install all packages to have provision plugins working:
sudo apt install libkrb5-dev pkg-config libvirt-dev genisoimage qemu-kvm libvirt-daemon-system
pip install --user "tmt[provision]"
Note: you can omit the --user flag if in a virtual environment π
π SHELL COMPLETION π
the rpm package includes a system wide script which enables the command line completion for bash, so no additional config should be needed β¨ if you use a different installation method or prefer another shell, see the instructions below.
for Bash, add this to ~/.bashrc:
eval "$(_TMT_COMPLETE=source_bash tmt)"
for Zsh, add this to ~/.zshrc:
eval "$(_TMT_COMPLETE=source_zsh tmt)"
for Fish, add this to ~/.config/fish/completions/tmt.fish:
eval (env _TMT_COMPLETE=source_fish tmt)
open a new shell to enable completion π£ or run the eval command directly in your current shell to enable it temporarily.
this is however run every time you start a shell, which can cause some delay π΄ to speed it up, write the generated script to a file and then source it from your shell's configuration file. all of this can be achieved using the tmt setup completion command. by default, it outputs the completion script to the terminal, but it can also add it to your ~/.bashrc or ~/.zshrc using the --install option:
tmt setup completion {bash, zsh, fish} --install
πͺ EXIT CODES πͺ
the following exit codes are returned from tmt run π note that you can use the --quiet option to completely disable output and only check for the exit code.
0β at least one test passed, there was no fail, warn or error. (we love to see it π)1β there was a fail or warn identified, but no error.2β errors occurred during test execution π3β no test results found.4β tests were executed, and all reported theskipresult.
π§ VARIABLES π§
the list of available environment variables which can be used to adjust the execution πΈ
ποΈ Command Variables
the following environment variables can be used to modify behaviour of the tmt command.
TMT_DEBUGβ make the developer-focused debugging output more verbose. using this environment variable has the same effect as an equal number of-doptions. the value goes from0to3for increasingly detailed logging:-d/TMT_DEBUG=1: high-level info. framework choice, policy application or reboot actions.-dd/TMT_DEBUG=2: detailed operations. actions such as step load, wake up, guest pull/push or playbook paths.-ddd/TMT_DEBUG=3: internal plumbing. the low-level implementation details such as workdir handling, process termination, key normalization and similar.
TMT_PLUGINSβ path to a directory with additional plugins. multiple paths separated with the:character can be provided as well π¦TMT_FEELING_SAFEβ set this and you unlock the "potentially unsafe" side of tmt, like straight-up executing tests directly on the test runner with thelocalprovision method. π The full docs live intmt --help, and yes there's a whole thing going on between--feeling-safeand--allow-unsafe-behavior(which gives you more granular control), plus its matchingTMT_ALLOW_UNSAFE_BEHAVIORenvironment variable.
Use with caution, only when you can fully trust the tmt metadata or if you know what you are doing.
TMT_ALLOW_UNSAFE_BEHAVIORβ same energy, same powers π set it to enable potentially unsafe behavior such as executing tests directly on the test runner using thelocalprovision method. Full docs intmt --help, and there's the interaction between--allow-unsafe-behaviorand--feeling-safeplus the matchingTMT_FEELING_SAFEenvironment variable.
Use with caution, only when you can fully trust the tmt metadata or if you know what you are doing.
TMT_EXPOSABLE_RUNNER_DEVICESβ guests sometimes need to touch devices that belong to the runner, and only devices whose path matches the regular expression you pass to this variable get made accessible. Default behavior? No runner device can be exposed to guests. periodt. πTMT_CONFIG_DIRβ path to an alternative directory full of config files. By default~/.config/tmtis used. β¨TMT_WORKDIR_ROOTβ path to the root directory containing run workdirs. Defaults to/var/tmp/tmt.NO_COLOR,TMT_NO_COLORβ kills colors in the output, both the actual output and the logging messages. Output only plain, non-colored text. π Two variables are accepted β one with the usualTMT_prefix β but tmt also acceptsNO_COLORto support the NO_COLOR effort, see https://no-color.org/ for more information.TMT_FORCE_COLORβ forces colors in the output, both the actual output and logging messages. Super handy when tmt's output streams are not terminal-like, yet its output is gonna be displayed by tools with ANSI color support. This is often the case of various CI systems. π
Note that TMT_FORCE_COLOR takes priority over NO_COLOR and TMT_NO_COLOR. If user tries both to disable and enable colorization, output would be colorized. (Color wins, bestie. That's just the rule.)
TMT_SHOW_TRACEBACKβ by default, when tmt reports an error, the corresponding traceback is not printed out. By setting this variable, the traceback and details would be shown: πTMT_SHOW_TRACEBACK=0(or unset) β Render only exception and its causes.TMT_SHOW_TRACEBACK=1β Render also call stack for exception and each of its causes.TMT_SHOW_TRACEBACK=2β Render also call stack for exception and each of its causes, plus all local variables in each frame, trimmed to first 1024 characters of their values.TMT_SHOW_TRACEBACK=fullβ Render everything that can be show: all causes, their call stacks, all frames and all locals in their completeness.
TMT_OUTPUT_WIDTHβ by default, the output width of commands liketmt * showis constrained to 79 characters. Set this variable to an integer to change the limit. πTMT_GIT_CREDENTIALS_URL_<suffix>,TMT_GIT_CREDENTIALS_VALUE_<suffix>β variable pairs used to provide credentials to clone git repositories. This is needed when working with private repositories. The suffix identifies the pair and determines the order in which URL regexp is tried.
The TMT_GIT_CREDENTIALS_URL_<suffix> contains regexp to search against url to clone. For first successful search the content of the TMT_GIT_CREDENTIALS_VALUE_<suffix> variable is used as the credential value. When it is set to an empty string, unmodified url is used.
For GitLab private repositories, you have three options for specifying the credentials:
- Personal Access Tokens β https://docs.gitlab.com/user/profile/personal_access_tokens/ β good for user-specific permissions or service accounts. For read-only access, use the
read_repositoryscope:
TMT_GIT_CREDENTIALS_URL_lab='gitlab.com/mysecretproject'
TMT_GIT_CREDENTIALS_VALUE_lab='your_gitlab_username:your_pat'
- Deploy Tokens β https://docs.gitlab.com/user/project/deploy_tokens/ β best for automated read-only access. Project-specific, not tied to a user, and provides strict read-only repository access:
TMT_GIT_CREDENTIALS_URL_lab='gitlab.com/mysecretproject'
TMT_GIT_CREDENTIALS_VALUE_lab='gitlab+deploy-token-123:abcxyz123'
- OAuth2 Tokens β https://docs.gitlab.com/api/oauth2/ β secure short-lived tokens with the
read_repositoryscope:
TMT_GIT_CREDENTIALS_URL_lab='gitlab.com/mysecretproject'
TMT_GIT_CREDENTIALS_VALUE_lab='oauth2:your_oauth2_token'
For GitHub private repositories, you have only a single method for specifying the cloning credentials:
- OAuth Tokens β https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys#https-cloning-with-oauth-tokens β you need to create a personal access token (https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) and specify it without your username. Both classic and fine-grained personal access tokens can be used:
TMT_GIT_CREDENTIALS_URL_hub='github.com/teemtee'
TMT_GIT_CREDENTIALS_VALUE_hub='personaltoken'
TMT_GIT_CLONE_ATTEMPTSβ the maximum number of retries to clone a git repository if it fails. By default, 3 attempts are done. πTMT_GIT_CLONE_INTERVALβ the interval (in seconds) to retry cloning a git repository again, 10 seconds by default.TMT_GIT_CLONE_TIMEOUTβ overall maximum time in seconds to clone a git repository. By default, the limit is not set. (Free spirit, no curfew. π¦)TMT_BOOT_TIMEOUTβ how many seconds to wait for a guest to boot. Applies to provision plugins that control the guest creation, e.g.virtual. By default, it is 2 minutes. β°TMT_CONNECT_TIMEOUTβ how many seconds to wait for a connection to succeed after guest boots for the first time. By default, it is 2 minutes.TMT_REBOOT_TIMEOUTβ how many seconds to wait for a connection to succeed after guest reboot. By default, it is 10 minutes.TMT_DOWNLOAD_ATTEMPTSβ number of attempts to download a file from a URL to guest. By default, 3 attempts are made.TMT_DOWNLOAD_INTERVALβ number of seconds to wait before retrying after an unsuccessful attempt to download a file from a URL to guest. By default, 5 seconds.TMT_RETRY_SESSION_RETRIESβ the number of retries for HTTP/HTTPS requests when encountering retriable errors (such as503 Service Unavailable). By default, 8 retries are attempted.TMT_RETRY_SESSION_BACKOFF_FACTORβ the exponential backoff factor for retrying HTTP/HTTPS requests. The wait time between retries is calculated as{backoff_factor} * (2 ** (retry_number - 1))seconds, up toTMT_RETRY_SESSION_BACKOFF_MAX. For example, with a backoff factor of 2.0, 8 retries and a maximum backoff of 120s, the delays are: 2s, 4s, 8s, 16s, 32s, 64s, 120s, 120s. By default, the backoff factor is 2.0. πTMT_RETRY_SESSION_BACKOFF_MAXβ the maximum retry wait time between retrying HTTP/HTTPS requests. By default, the maximum is 120s.TMT_SCRIPTS_DIRβ destination directory for storing tmt scripts on the guest. By default/usr/local/binis used, except for guests usingrpm-ostree, where/var/lib/tmt/scriptsis used. See the tmt internal test executor (https://tmt.readthedocs.io/en/stable/plugins/execute.html#tmt) documentation for more details on the scripts installed on the guest. π§TMT_SSH_MASTER_START_TIMEOUTβ how many seconds will tmt wait for a ssh master process to start.TMT_SSH_*β every environment variable in this format would be treated as an SSH option, and passed to the-ooption ofsshcommand. Seeman 5 ssh_configfor the list of all options.
The environment variable name would be converted into an SSH option, e.g. export TMT_SSH_CONNECTION_ATTEMPTS=5 would become -oConnectionAttempts=5. export TMT_SSH_ConnectionAttempts=5 would also be accepted.
SSH options provided via environment variables will be overruled by guest-specific ssh-options key.
TMT_REPORT_ARTIFACTS_URLβ link to test artifacts provided for report plugins. πTMT_POLICY_FILEβ location of a file with policy rules for modification of test metadata keys. Both absolute and relative paths are accepted; a relative path is interpreted either against the current working directory, or against the policy root directory if it was specified.
See tmt policy specification (https://tmt.readthedocs.io/en/stable/spec/policy.html) for more details on policies.
TMT_POLICY_NAMEβ name of the file with policy rules for modification of test metadata keys. The name would be extended with.yamlsuffix, and tmt will try to locate it under the policy root directory.
See tmt policy specification (https://tmt.readthedocs.io/en/stable/spec/policy.html) for more details on policies.
TMT_POLICY_ROOTβ if set, policy files must be located under this directory. Policy specified by its name is searched under this directory only, and policy specified by its filepath will be allowed only if the filepath is under this directory.
See tmt policy specification (https://tmt.readthedocs.io/en/stable/spec/policy.html) for more details on policies.
TMT_STATE_FORMATβ which format should tmt use for its on-disk storage of various state information like run or step data, or the collection of discovered tests. πΎ
NOTE: bestie, this does not affect user-provided files β like test, plan and story metadata in fmf files, plus all the various exports and conversions. It merely affects files tmt uses for its own needs. π
Step Variables
okay so these env vars are handed to the environment during prepare, execute and finish steps β periodt:
TMT_TREEβ the full path of the working directory where the metadata tree is copied. This usually contains the whole git repository where tmt plans are located in. Notice that it might not contain tmt tests if tmt plans and tests are in different git repositories. πTMT_PLAN_DATAβ path to the common directory used for storing logs and other artifacts related to the whole plan execution. It is pulled back from the guest and available for inspection after the plan is completed. β¨TMT_PLAN_ENVIRONMENT_FILEβ path to the file containing environment variables that should be sourced afterprepareandexecutesteps. These variables will be accessible for all subsequent steps and will have higher priority than other environment variables except those provided via command-line. π- Variables inside the file have to be in the format of
NAME=VALUEand each variable should be on a separate line. Other content form is not allowed β useTMT_PLAN_SOURCE_SCRIPTinstead to include other bash commands. - Note that this is not shared between guests of the given plan, each guest has its own dedicated file.
- Example of the file content:
- Variables inside the file have to be in the format of
COUNT=1
VARIABLE=VALUE
ANOTHER_VARIABLE=ANOTHER_VALUE
TMT_PLAN_SOURCE_SCRIPTβ path to the file that will be sourced in all tests, andprepare/shellphases. UnlikeTMT_PLAN_ENVIRONMENT_FILE, this file can be an arbitrary contents that can be parsed by bash. In order to use it, populate its content in apreparestep. π¦TMT_VERSIONβ the version of tmt. iykyk.TMT_PREPARE_SHELL_URL_REPOSITORYβ the value of the repository path inprepareshellstep whenurloption is used.TMT_FINISH_SHELL_URL_REPOSITORYβ the value of the repository path infinishshellstep whenurloption is used.
Test Variables
These env vars are provided to the test during the execution β main character energy only:
TMT_TEST_NAMEβ the test name, as a resolved FMF object name starting with/from the root of the hierarchy.TMT_TEST_DATAβ path to the directory where test can store logs and other artifacts generated during its execution. These will be pulled back from the guest and available for inspection after the test execution is finished. πTMT_TEST_SERIAL_NUMBERβ the serial number of running test in the whole plan. Each test is assigned its own serial number.TMT_TEST_ITERATION_IDβ the iteration ID is a combination of a unique run ID and the test serial number. The value is different for each new test execution. β¨TMT_TEST_METADATAβ path to a YAML-formatted file with test metadata collected during thediscoverstep.TMT_SOURCE_DIRβ path to directory with downloaded and extracted sources if thedist-git-sourceoption was used in thediscoverstep.TMT_REBOOT_COUNTβ during the test execution thetmt-rebootcommand can be used to request reboot of the guest. This variable contains number of reboots which already happened during the test. Value is set to0if no reboot occurred.- In order to keep backward-compatibility with older tests,
rhts-rebootandrstrnt-rebootcommands are supported for requesting the reboot, variablesREBOOTCOUNTandRSTRNT_REBOOTCOUNTcontain number of reboots as well. π«Ά
- In order to keep backward-compatibility with older tests,
TMT_TEST_RESTART_COUNTβ this variable contains number of times the test was restarted. Such restarts may be consequence of guest reboot, in which caseTMT_REBOOT_COUNTgets incremented as well, or test crashed and has been restarted. Value is set to0when the test starts for the first time.TMT_TOPOLOGY_BASH,TMT_TOPOLOGY_YAMLβ paths of files describing existing guests, their roles and the guest on which the test is running. Format of these files is described in the Guest Topology Format section of the plan specification.TMT_TEST_PIDFILE,TMT_TEST_PIDFILE_LOCKβ path to a file storing the test process pid and path to its reboot-request file, separated by a space. TheLOCKvariable then holds path to a locking file which must be acquired before making any changes to the pid file.TMT_TEST_PIDFILE_ROOTβ by default, the test pidfile file is stored in/var/tmpdirectory. If specified, the directory in this variable would be used instead. The directory permissions should follow the pattern of temporary directory permissions, e.g.chmod 1777, to allow access to users with all privilege levels. π
Plugin Variables
Each plugin option can be also specified via environment variable. Variables follow a naming scheme utilizing plugin name, step it belongs to, and the option name:
TMT_PLUGIN_${STEP}_${PLUGIN}_${OPTION}
All names are upper-cased, with dashes (-) replaced by underscores (_).
For example, an execute plugin "tmt" would run with verbosity equal to -vvv:
TMT_PLUGIN_EXECUTE_TMT_VERBOSE=3 tmt run ... execute -h tmt ...
Command-line takes precedence over environment variables, therefore -v would undo the effect of environment variable, and reduce verbosity to one level only:
TMT_PLUGIN_EXECUTE_TMT_VERBOSE=3 tmt run ... execute -h tmt -v ...
Environment variables β just like command-line options β take precedence over values stored in files. For example, consider the following discover step:
discover:
how: fmf
url: https://example.org/
The following commands would override the URL:
tmt run ... discover -h fmf --url https://actual.org/ ...
TMT_PLUGIN_DISCOVER_FMF_URL=https://actual.org/ tmt run ...
For setting flag-like option, 0 and 1 are the expected values. For example, an interactive mode would be enabled in this run:
TMT_PLUGIN_EXECUTE_TMT_INTERACTIVE=1 tmt run ... execute -h tmt ...
β¨ REGULAR EXPRESSIONS β¨
Many specification keys and command line options accept regular expressions, e.g. to filter a set of tests, tmt run ... test --name '^/foo'. Whenever tmt works with regular expressions, the following rules apply. π¦
Python implementation
Since tmt is implemented in Python, Python's re package (https://docs.python.org/3.9/library/re.html) is used for handling regular expressions. It comes with Python standard library, and it is widely used and well documented. For the deep dive into supported syntax, see Regular Expression Syntax (https://docs.python.org/3.9/library/re.html#regular-expression-syntax) section, for a gentler introduction there is a Regular Expression HOWTO (https://docs.python.org/3.9/howto/regex.html#regex-howto).
Search versus match
There are two ways how to check whether a regular expression matches a string: "match" or "search":
- in the "match" mode, the pattern must match from the very beginning of the string. For example,
foo.arwould matchfoobarbut not/foobar. It works in a "starts with" fashion. - on the other hand, the "search" mode is more similar to "contains" approach, and allows pattern to match anywhere in the string. In this mode,
foo.arwould match bothfoobarand/foobar.
In both modes, any characters may follow the matching pattern, e.g. regular expression foo.bar is the same as foo.bar.*.
tmt sticks to the "search" mode by default. But, to improve user experience, some keys and command line options do use the "match" mode. Such keys and options will note this in their documentation or help texts.
β¨ LINKS β¨
- Git: <https://github.com/teemtee/tmt> π
- Docs: <https://tmt.readthedocs.io/> β¨
- Ask DeepWiki: <https://deepwiki.com/teemtee/tmt> π§
- Stories: <https://tmt.readthedocs.io/en/stable/stories.html> π
- Issues: <https://github.com/teemtee/tmt/issues> π
- Releases: <https://tmt.readthedocs.io/en/stable/releases> π
- Copr: <https://copr.fedorainfracloud.org/coprs/g/teemtee/stable/> ποΈ
- PIP: <https://pypi.org/project/tmt/> π¦
- Quay: <https://quay.io/organization/teemtee> π³
- Metadata Specification: <https://tmt.readthedocs.io/en/stable/spec.html> π
- Flexible Metadata Format: <https://fmf.readthedocs.io/> π§¬
- Testing Farm: <https://docs.testing-farm.io/> πΎ
- Packit: <https://packit.dev/testing-farm/> π¦
π AUTHORS π
okay so you did NOT think this was a one-person situation, right?? bestie, tmt was built by a whole iconic squad and we are legally, morally and emotionally obligated to name every single one of them. no cap, every name stays, because erasing anybody from the credits is giving ick. so let's go, roll call, everyone gets their flowers ππ
Petr Ε plΓchal, Miro HronΔok, Alexander Sosedkin, LukΓ‘Ε‘ Zachar, Petr MenΕ‘Γk, LeoΕ‘ Pol, Miroslav Vadkerti, Pavel Valena, Jakub Heger, Honza HorΓ‘k, Rachel Sibley, FrantiΕ‘ek NeΔas, Michal Ruprich, Martin Kyral, MiloΕ‘ PrchlΓk, TomΓ‘Ε‘ NavrΓ‘til, FrantiΕ‘ek Lachman, Patrik Kis, Ondrej MosnΓ‘Δek, Andrea FickovΓ‘, Denis Karpelevich, Michal Srb, Jan Ε Δotka, Artem Zhukov, Vinzenz Feenstra, Inessa Vasilevskaya, Ε tΔpΓ‘n NΔmec, Robin Hack, Yulia Kopkova, Ondrej MoriΕ‘, Martin ZelenΓ½, Karel Ε rot, FrantiΕ‘ek Zatloukal, Simon Walter, Petr MatyΓ‘Ε‘, Yariv Rachmani, Pavel Cahyna, Martin Litwora, Brian Grech, VojtΔch Eichler, Philip Daly, Vector Li, Evgeny Fedin, Guy Inger, AdriΓ‘n TomaΕ‘ov, Jan HavlΓn, LukΓ‘Ε‘ Kotek, Daniel DiblΓk, Laura Barcziova, MariΓ‘n KonΔek, Marcin Sobczyk, JiΕΓ JabΕ―rek, Huijing Hei, Tibor DudlΓ‘k, Jan MackΕ―, Filip VΓ‘gner, Martin Hoyer, Iveta ΔesalovΓ‘, Yi Zhang, Zhaojuan Guo, NatΓ‘lia BubΓ‘kovΓ‘, Michal Josef Ε paΔek, JiΕΓ Popelka, Matej Focko, Yulia Kopkova, TomΓ‘Ε‘ Bajer, Carlos Rodriguez-Fernandez, James Molet, Cristian Le, Lili Nie, Martin ΔermΓ‘k, Michael Vogt, Qinghua Cheng, Michael Engel, Anatoli Babenia, Colin Walters, Link Dupont, Mario Casquero, Martin KlusoΕ, Pavel Holica, Otto Ε abart, Ismail Ibrahim Quwarah, Sergei Petrosian, Tom Koscielniak, Han Han, Luigi Pellecchia, Siteshwar Vashisht, Chris Kyrouac, Xiaofeng Wang, Coiby Xu, Michal PospΓΕ‘il, Wayne Sun, Evgeni Vakhonin, Mike Stowell, Therese Cornell, Mingyu Shi, Conor Tull, Athrey Vinay, David Pascual, Vaibhav D. Aren, Qin Yuan, ThiΓ©baud Weksteen, Nisha Saini, Yaakov Selkowitz, Petr Khartskhaev, Bruno Goncalves, Israel Santana, Jakub Skunda, Md Habibur Rahman, Owen Taylor, Rajesh Kumar Srivastava and Daniel Simko.
yes bestie, Yulia Kopkova is in there twice and honestly?? she earned it π the list is the list, we don't edit the list.
π COPYRIGHT π
Copyright Red Hat
This program is free software; you can redistribute it and/or modify it under the terms of the MIT License. β¨ that's it, that's the whole license situation β go forth, remix, redistribute, be free π¦
and that's a WRAP on TMT(1) π this page is from tmt, dated September 2019, and it lives in section 1 of your manual because it's a user command, obviously, main character energy only π thanks for reading all four parts bestie, you ate that fr fr, mwah πβ¨
π¦ where this page comes from
- fedora 43: tmt 1.80.0-1.fc43 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms