{"id":27958036,"url":"https://github.com/ericsson/ove","last_synced_at":"2025-05-07T18:15:58.388Z","repository":{"id":42191348,"uuid":"184041040","full_name":"Ericsson/ove","owner":"Ericsson","description":"OVE gathers git repositories and the knowledge how to build and test them","archived":false,"fork":false,"pushed_at":"2025-04-17T07:02:42.000Z","size":3401,"stargazers_count":18,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-05-07T18:15:52.942Z","etag":null,"topics":["bash","build","cli","fzf","git","incus","lxd","owel","repository-management","shell","strace","xfce4","xpra"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ericsson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-04-29T09:28:34.000Z","updated_at":"2025-04-17T07:02:46.000Z","dependencies_parsed_at":"2023-12-20T13:43:58.205Z","dependency_job_id":"9d5665ad-c3ad-431d-ab21-08c69c2cd501","html_url":"https://github.com/Ericsson/ove","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ericsson%2Fove","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ericsson%2Fove/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ericsson%2Fove/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ericsson%2Fove/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ericsson","download_url":"https://codeload.github.com/Ericsson/ove/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252931507,"owners_count":21827112,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","build","cli","fzf","git","incus","lxd","owel","repository-management","shell","strace","xfce4","xpra"],"created_at":"2025-05-07T18:15:57.728Z","updated_at":"2025-05-07T18:15:58.349Z","avatar_url":"https://github.com/Ericsson.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"![OVE](ove.png)\n\n\u003chttps://user-images.githubusercontent.com/25057211/120758396-1528a300-c512-11eb-82c8-ec479a800102.mp4\u003e\n\n# What is OVE\n\nOVE is gathering git repositories and the knowledge how to build and test them.\nWell sort of, it is up to you to feed this information to OVE. However, OVE\nprovides a well-defined structure for using and sharing this information with\nothers. OVE also provides a number of commands for common tasks, flexible ways\nof including all sorts of projects as well as the ability to expand OVE on the\ngo! OVE is not a one-entry-point tool, but rather a shell enhancer: All parts\nof the OVE workflow can be done manually from prompt. We like to view OVE as a\nway of removing not-updated-lately wikis, and instead share ready-to-use\nfunctionality.\n\n## Justification\n\n*To have a localized, yet versioned, top project source view to enable fast\nmodify-build-test loops in parallel development. For developers, for anyone\nthat prefers a see-the-big-picture approach and for those who just want to take\na quick peek.*\n\nOVE is built with the developer in focus. We embrace the fact that while\ncomputers (e.g. CI/CD hosts) generally do not get easily frustrated, developers\ndo.\n\n## Tutorial\n\nEager to get going? We have a tutorial\n[here](https://github.com/Ericsson/ove-tutorial). Try OVE out with a pre-made\ntutorial project and get up to speed on OVE in just a few minutes.\n\n## Overview\n\nOVE provides a top project, and on this top level OVE therefore needs to handle\nfour major functionality areas:\n\n* **Versioning**\n\n* **Build chain**\n\n* **System tests**\n\n* **Project specific tasks**\n\nTo do this, OVE uses a top git repository (OWEL) containing information related\nto these tasks. Before we dig into details, let us just elaborate on a few\nsubjects:\n\nVersioning is handled entirely through git. The top repo and whatever sub repos\nare added are all git repos.\n\nFor OVE, a project is something that produces output (e.g. an executable, a\nlibrary or anything else machine-made). Even though projects are normally\ncontained within a corresponding git repo, OVE treats projects and repos\nindependently. Multiple projects can be configured using code and build systems\nfrom the same repo, and one project can use code and build systems from\nmultiple repos.\n\nIn order for OVE to build at the top level, independently of any toolchain used\nby sub-projects, a contract must be set up between OVE and any included\nproject. This is a one-sided contract. Nothing needs to (nor should) go into a\nsub-project on OVE's account. To set up this contract, some typical build steps\n(bootstrap, configure, build, install) are specified for added sub projects.\n\nSystem tests tend to be quite tricky to generalize, so we simply do not. What\nis provided is a way of keeping track of entry points and groups of entry\npoints to system tests. This creates a template for keeping track of tests and\na way to pass information that OVE holds down to test suites.\n\nRegardless of how much features go into tools or frameworks for software\nprojects, they are never complete. There are always per-project specific needs.\nOVE is made with a less-is-more approach. Rather than trying to implement as\nmany feature requests as possible, we wanted to provide a solid functional base\ntogether with a simple, intuitive way of adding project-specific features. It\nis therefore possible to expose customized OVE commands from an OWEL, a\nworkspace or from any git that OVE knows about. These commands are called\nplugins. They are basically just a bunch of executables (most often small bash\nscripts) that can leverage on the project information held by OVE.\n\nEnough said, let us dig into details! We start with versioning:\n\n### The 'revtab' file\n\nTo make it transparent and intuitive for the developer to quickly grasp what\nrevision state a certain workspace or project is in, OVE tries to be as short\nand clear as possible about it. Therefore, the baseline for a project is\ndefined by a plain, line-by-line, text file in the OWEL. It is called 'revtab'\nand only contains four fields:\n\n* name: Unique identifier of the git repository.\n* fetch URL: The fetch URL.\n* push URL: The push URL.\n* revision: The git revision. This is passed on to 'git checkout'.\n\nExample:\n\n    $ cat revtab\n    # name        fetch URL          push URL           revision\n    repoX         ssh://xyz/repoX    ssh://xyz/repoX    main\n    deps/repoY    https://xyz/repoY  https://xyz/repoY  stable\n\nThat's it! This is how OVE keeps track of git revisions. There is no\nintermediate representation for revisioning in OVE. What you put in the\n'revision' column travels untouched to git, which means you can safely put\nanything there that git understands. Now, let's move on to top-view builds:\n\n### The 'projs' file\n\nHow does OVE keep track of dependencies? Well, to start with there are (at\nleast) two types of dependencies: First, there are prerequisites for most\nprojects to build, usually installed using a package manager. Secondly, within\na top project handled by OVE the sub-projects almost always have dependencies\nto each other. To specify these two types, you use a YAML file in the OWEL,\n'projs', that contains a list of projects with the following syntax:\n\n    name:\n      deps:\n        ...\n      needs:\n        ...\n      path:\n        ...\n      tags:\n        ...\n      version:\n        ...\n\n#### name\n\nProject name. Characters allowed: a-z, A-Z, 0-9 and underscore. 'common' is\na reserved word.\n\n#### deps\n\nA list of OVE projects that need to be built before this project can be built.\n\n#### needs\n\nA list of OS packages that need to be installed before this project can be\nbuilt. Shell command substitution is allowed.\n\nCan be extended with specific distro requirements, syntax:\n\n    needs[_ID][_VER]]\n\nID is a string and is matched vs. one string within: \"${OVE_OS_ID//-/_}\n${OVE_OS_ID_LIKE//-/_}\". Examples: \"ubuntu\", \"debian\", \"centos\", \"rhel\",\n\"fedora\", \"opensuse_tumbleweed\", \"suse\". VER is a string and is matched vs.\n\"${OVE_OS_VER//[.-]/_}\". Examples: \"18_04\", \"3_12_0\", \"20200923\".\n\n#### path\n\nThe path to project work directory. Relative to OVE_BASE_DIR or an absolute\npath. Variables are allowed.\n\n#### tags\n\nMark a project with one or many tags. Tags will allow you to refererence groups\nof projects (e.g. for builds).\n\n#### version\n\nOptional. Passed on as a bash variable to all steps for this project.\n\n    $ cat projs\n    ---\n    projA:\n      deps:\n        projB\n      needs:\n        autoconf\n        automake\n        g++\n      path:\n        repoX\n      tags:\n        small\n        ui\n\n    projB:\n      deps:\n        projC\n      needs:\n        build-essential\n        linux-headers-$(uname -r)\n      path:\n        repoY\n      tags:\n        backend\n        medium\n\n    projC:\n      needs:\n        build-essential\n      needs_ubuntu:\n        pkgA\n      needs_ubuntu_20_04:\n        pkgB\n      needs_debian:\n        pkgC\n      needs_rhel:\n        pkgE\n      path:\n        /tmp/projC\n      tags:\n        large\n        ui\n      version:\n        2.0.0\n\nThat's how OVE resolves external and internal dependencies for builds. As you\njust read above, the 'version:' keyword creates an environment variable that is\npassed to all build steps. What are those steps exactly? We cover that in the\nnext section:\n\n### The 'projects' directory\n\nOVE is agnostic when it comes to build systems. Well, not entirely true. You\nneed to be in a UNIX-like environment. That said, there are still a multitude\nof ways to build and install software that need to be taken care of. OVE\nhandles this by providing a way of defining, for each sub project, how that\nparticular project is built. In the OWEL, there is a directory called\n'projects'. Within this projects directory, sub directories need to be present\nfor each sub project containing executables (normally tiny shell scripts) for\neach build step. The projects structure typically look like this (output from\ntree):\n\n    ├── projects/\n    │   ├── projA/\n    │   │   ├── bootstrap\n    │   │   ├── build\n    │   │   ├── configure\n    │   │   └── install\n    │   ├── projB/\n    │   │   ├── bootstrap\n    │   │   ├── build\n    │   │   ├── configure\n    │   │   └── install\n    │   ├── projC/\n    │   │   ├── bootstrap\n    │   │   ├── build\n    │   │   ├── common\n    │   │   ├── configure\n    │   │   └── install\n    │   └── common/\n    │   │   ├── bootstrap\n    │   │   ├── bootstrap.post\n    │   │   ├── bootstrap.pre\n    │   │   └── build.pre\n\nWhen OVE builds the top project the following happens: First, OVE sorts out the\nbuild order as explained in the previous section. Secondly, each projects'\nbuild steps are executed (bootstrap, build, configure, install). When done, you\nshould be able to find the final output of the build in the staging area. In\nmost cases, these are then picked up by an OVE plugin that creates deliverable\npackages of some kind (.rpm, .deb or similar).\n\nParticularly interesting here are the \"configure\" and \"install\" steps. In order\nfor OVE to get intermediate build results into the staging area, this kind of\nconstruct is typically used from within the 'configure' script:\n\n    ./configure --prefix=${OVE_STAGE_DIR}${OVE_PREFIX}\n\nThis way, the install step will install any built items into\n'${OVE_STAGE_DIR}${OVE_PREFIX}'. Of course the way to do this depends on what\nbuild system is used, but the same goes for any project you put into an OVE\nproject: You need to be able to get the build results into the staging area.\n\nThe 'common' directory is special. In the example above, before each individual\nproject's 'projX/bootstrap' file is executed, the 'common/bootstrap' file is\nsourced. This will allow you to put common environment flags, checks etc. into\nthat 'common/{bootstrap,configure,build,install,...}' shell script. The\npre/post files are sourced before/after the first/last bootstrap command.\n\nExample:\n\n    $ ove bootstrap projA projB\n    projects/common/bootstrap.pre\n    A: projects/common/bootstrap\n    A: projects/projA/bootstrap\n    B: projects/common/bootstrap\n    B: projects/projB/bootstrap\n    projects/common/bootstrap.post\n\nEach OVE project may also have a 'common' file within the project directory.\nThis 'common' file is sourced before the project command file is executed.\n\nExample:\n\n    $ ove build projC\n    projects/common/build.pre\n    C: projects/projC/common\n    C: projects/projC/build\n\nFor convenience, each project command has access to a few OVE_ACTIVE_PROJECT_\nvariables:\n\n| Environment variable       | Description                                  |\n|----------------------------|----------------------------------------------|\n| OVE_ACTIVE_PROJECT_COMMAND | Project command. E.g. 'build'                |\n| OVE_ACTIVE_PROJECT_NAME    | Project name. E.g. 'projA'                   |\n| OVE_ACTIVE_PROJECT_VERSION | Project version (if available). E.g. '1.4.1' |\n\nYou now know how to build sub projects together, but what about testing from a\nsystem perspective? We cover that in the next section:\n\n### The 'systests' and 'systests-groups' files\n\nWe have already covered how OVE keeps track of repos, how sub-project build\nmethods can be included and how they can all form a larger, top view project.\nWe also showed how these parts are built together using OVE's staging area. On\nthe same note, it also makes sense to provide a way to execute system tests,\ntests that need more than one sub-project or repo to execute. As stipulated\nearlier, OVE takes a rather defensive approach here. Quite often, test systems\nalready exist for most functionality you want to develop, at least partly. And\nyou want to re-use them. OVE is able to launch any tests as long as they can\nexecute from prompt. Two files, 'systests' and 'systests-groups' give OVE\ninformation about what tests are available and how to execute them:\n\n'systests' is a text file that contains a list of tests. One row is one test:\n\n* name: unique identifier for the test\n* timeout: time in seconds when the test should finish. 0 = no timeout.\n* type:\n   * 0 = 00b = run in fg\n   * 1 = 01b = run in fg and abort test suite on errors\n   * 2 = 10b = run in bg\n   * 3 = 11b = run in bg and abort test suite on errors\n* path: where to execute the test (either relative to OVE_BASE_DIR or an absolute path)\n* command: command(s) to execute\n\nExample:\n\n    $ cat systests\n    # name       timeout (s)   type   path   command\n    # ----------------------------------------------\n    t1              5          0      repoX  sleep 4\n    t2              1          0      .      sleep 2\n    t3           3600          0      repoY  ./long-duration-test\n    t4              3          0      $HOME  echo hellu $LOGNAME; ls -l; whoami\n    t5              3          0      /tmp   pwd\n\n'systests-groups' is a YAML file that contains groups/sets of tests. Example:\n\n    $ cat systests-groups\n    all:\n      - t1\n      - t2\n      - t3\n    sanity:\n      - t1\n\nUsing the above structure, you would be able to execute either one test (t1, t2\nor t3), a series of them (t1 t2) or a test group (\"all\" or \"sanity\"). Asking\nove what test are available in this case would look like this:\n\n    $ ove list-systests\n    all\n    sanity\n    t1\n    t2\n    t3\n\nThat's it for system tests! Now lets go ahead and look at plugins:\n\n## Plugins\n\nAs discussed in the Overview, in most larger projects there is a strong need\nfor flexibility when it comes to what a developer or CI/CD machinery wants to\nbe able to do with it. To accommodate these needs, OVE provides a way of\nextending the OVE command list with customized commands. We call them plugins,\nand they can be exposed to your OVE project in three ways: From your workspace,\nfrom your OWEL (top repo) or from any repo included in the revtab. What are\nthey really then? They are executables, optionally accompanied with a help text\nand/or a tab completion script. OVE looks for plugins at the following\nlocations:\n\n    $OVE_OWEL_DIR/scripts/\n    \u003call repositories\u003e/.ove/scripts/\n\nAny executable found in any of these locations will become an OVE command. And\nprovided that tab completion scripts and help texts exist at the same location,\nthey will also be part of the OVE help and support tab completion for their\narguments.\n\nIf you are using a plugin that reads from stdin AND you need this plugin within\na pipe, please use this construct:\n\n    echo foo | ove-bar\n\nWe now covered the four main functionality areas of OVE. Next we will go\nthrough how to make life easy for developers or CI/CD machines when it comes to\nsetting up an OVE project:\n\n## Setup: an existing OVE project\n\nAn existing OVE project is typically setup (or downloaded if you will) by the\ndeveloper or CI/CD machine using the following oneliner:\n\n    curl -sSL https://raw.githubusercontent.com/Ericsson/ove/master/setup | bash -s \u003cname\u003e \u003cOWEL\u003e\n\n* name: Path to the OVE workspace.\n* OWEL: URL of the top git repository\n\nThe setup script will do two things:\n\n* create the 'name' directory at your current location\n* clone the OVE (ove itself) and OWEL (top repo) git repos\n\nThe 'setup' script will then urge the developer to enter the OVE workspace\ndirectory and run\n\n    source ove\n\nDoing this, OVE will check that you have the required programs installed on\nyour machine and prompt for installation otherwise. This is the current list:\n\n* bash (\u003e=4.3)\n* bzip2\n* column\n* file\n* flock\n* git (\u003e=1.8.5)\n* gzip\n* ld\n* less\n* pgrep\n* script\n* tar\n* tsort\n\nOVE is also dependent on 'sed/grep/tail/awk/...' but they are not checked for\nsince it is quite uncommon to lack these. To unlock all OVE features you also\nneed:\n\n* ag\n* convert\n* dig\n* dot\n* ffmpeg\n* fzf\n* graph-easy\n* inotifywait\n* jp2a\n* incus\n* locate\n* lxc\n* make\n* md5deep\n* rg\n* shellcheck\n* sshpass\n* strace\n* task\n* tmux\n* tsp\n* whois\n* yamllint\n* xdotool\n* xpra\n\nRun 'ove list-externals' or check [this page](doc/ove-externals-list.md) for a\ncomplete list of commands that OVE is dependent on.\n\nAfter successfully sourcing OVE, further instructions are given to enter the\nOVE workspace and fetch the rest of the repos. When the fetch is completed,\neverything is ready in order for man or machine to start working with the\nproject! For the sake of clarity, lets look at an example:\n\n    $ curl -sSL https://raw.githubusercontent.com/Ericsson/ove/master/setup | bash -s abc ssh://github.com/Ericsson/xyz\n    Cloning into '.ove'...\n    Cloning into 'xyz'...\n    ...\n    $ cd abc\n    $ source ove\n    OVE [SHA-1: ... @ Ubuntu 19.10]\n    $ ove fetch\n    Cloning into 'repoX'...\n    Cloning into 'repoY'...\n    ...\n    repoX ## main..origin/main\n    repoY ## main..origin/stable\n    .ove  ## master..origin/master\n\nDone! As simple as that. Lets give a final example of what an OVE project file\nstructure can look like when ready:\n\n    $ tree\n    ├── ove -\u003e .ove/ove\n    ├── .ove/\n    │   ├── .git/\n    │   ├── LICENSE\n    │   ├── ove\n    │   ├── ove.png\n    │   ├── README.md\n    │   ├── scripts/\n    │   ├── setup\n    │   ├── tests/\n    │   └── yex\n    ├── .owel -\u003e xyz/\n    ├── repoX/\n    │   ├── .git/\n    │   └── README\n    ├── repoY/\n    │   ├── .git/\n    │   └── README\n    └── xyz/\n        ├── .git/\n        ├── projects/\n        │   ├── projA/\n        │   │   ├── bootstrap\n        │   │   ├── build\n        │   │   ├── configure\n        │   │   └── install\n        │   ├── projB/\n        │   │   ├── bootstrap\n        │   │   ├── build\n        │   │   ├── configure\n        │   │   └── install\n        │   ├── projC/\n        │   │   ├── bootstrap\n        │   │   ├── build\n        │   │   ├── configure\n        │   │   └── install\n        │   └── common/\n        │       └── build\n        ├── projs\n        ├── revtab\n        ├── systests\n        └── systests-groups\n\n## Setup: track a few repos\n\nOneliner:\n\n    git clone https://github.com/Ericsson/ove.git .ove \u0026\u0026 source .ove/ove\n\nIn this example you will end up with a complete OVE workspace.\n\nExample:\n\n    # '$HOME/src' has four git repositories\n    $ cd $HOME/src\n    $ git clone https://github.com/Ericsson/ove.git .ove \u0026\u0026 source .ove/ove\n    ...\n    Directory to scan for git repositories? Leave blank to search in '$HOME/src': [ENTER]\n    OWEL name? Leave blank to name it 'top': [ENTER]\n    Scanning '$HOME/src'. #repos: 5\n    Initialized empty Git repository in $HOME/src/top/.git/\n    Create example/skeleton files? (y/N) [ENTER]\n    ...\n    # you now have a OVE workspace in '$HOME/src' that contains six repos: four repos + OVE + OWEL\n    # try 'ove status'\n    $ ove status\n    ...\n\n## Setup: create an OWEL within a git repository\n\nOneliner:\n\n    source \u003c(curl -sSL https://raw.githubusercontent.com/Ericsson/ove/master/ove)\n\nIn this example you will create an OWEL within a git repository.\n\nExample:\n\n    $ cd a-git-repo\n    $ source \u003c(curl -sSL https://raw.githubusercontent.com/Ericsson/ove/master/ove)\n    # the commands below will:\n    #   - create a git commit of the OWEL specific files\n    #   - publish the OWEL commit upstream\n    #   - print OVE oneliner\n    #   - try the oneliner _after_ the push\n    #   - remember to run the oneliner outside of the 'foo' repo\n    # create a git commit\n    git add projects projs revtab scripts SETUP systests systests-groups \u0026\u0026 git commit -m \"initial commit\"\n    # publish the commit\n    git push\n    # OVE oneliner\n    curl -sSL https://raw.githubusercontent.com/Ericsson/ove/master/setup | bash -s foo https://...\n\n## Setup: create an OWEL within a git repository using 'ove init'\n\nOneliner:\n\n    ove init\n\nSame as above except that OVE is already available on the host.\n\n    # an existing OVE workspace\n    $ source ove\n    # move to a git repository\n    $ cd a-git-repo\n    $ ove init\n    ...\n    # create a git commit\n    git add projects projs revtab scripts SETUP systests systests-groups \u0026\u0026 git commit -m \"initial commit\"\n    # publish the commit\n    git push\n    # OVE oneliner\n    curl -sSL https://raw.githubusercontent.com/Ericsson/ove/master/setup | bash -s bar https://...\n\nUp until now we covered everything you need to know to get to the point where\ndevelopers (or machines) can start working with your OVE project. Going through\nthese steps, You might have noticed us mention OVE commands several times. It\nis time to have a closer look at how they work:\n\n## Commands\n\nOVE will enhance your bash shell with commands to manage your OVE based\nproject. We divide them into the following categories:\n\n| Category | Description                   | Example             |\n|----------|-------------------------------|---------------------|\n| BUILD    | Build commands                | buildme, mrproper   |\n| CORE     | High level git commands       | status, diff, fetch |\n| DEBUG    | Debug commands                | loglevel            |\n| INTERNAL | Internal commands             | unittest            |\n| LOG      | Show and manipulate logs      | l, lastlog          |\n| PLUGIN   | Plugins/scripts               |                     |\n| SEARCH   | Search repos                  | grep, ag, rg        |\n| TEST     | Test commands                 | systest             |\n| UTIL     | Utility commands              | vi\n\n### CORE\n\nOVE implements a subset of the standard git commands as \"high level\" git\ncommands. These commands executes the corresponding git command on all (or\nselective) **revtab** repositories.\n\n* add\n* apply\n* blame\n* branch\n* checkout\n* commit\n* describe\n* diff\n* fetch\n* grep\n* pull\n* show\n* status\n* stash\n* worktree\n\n### BUILD\n\nThis is a list of build related commands:\n\n* buildme / buildme-parallel\n* make\n* mrproper\n\nThe above list will be dynamically populated with project commands found under\nthe \"projects/proj/\" directories. So, for a \"normal\" OVE project, these\ncommands are usually also present:\n\n* bootstrap\n* configure\n* build\n* install\n\nNote: For each project command there is a \"command-parallel\" version of that\ncommand.\n\n### UTIL\n\nHere's a list (not complete) of a few utility commands:\n\n| Command                  | Description                                                |\n|--------------------------|------------------------------------------------------------|\n| forall/forall-parallel   | run an arbitrary command for all git repositories          |\n| forowel/forowel-parallel | run an arbitrary command in all OVE workspaces on the host |\n| locate                   | list OVE workspaces on this host                           |\n| news                     | view upstream news for each git repository                 |\n| cd                       | switch to another OVE workspace                            |\n| vi                       | open all modified files in 'vi'                            |\n\n### Command reference\n\nPlease find the full command reference [here](doc/ove-cmd-list.md)\n\n### Invocation\n\nEach OVE command can be invoked using four different methods: normal, quick, queue or\nremote. The table below tries to explain the differencies on a few aspects.\n\n| method    | performance impact | hooks | log | debug | example                      |\n|-----------|--------------------|-------|-----|-------|------------------------------|\n| normal    | yes                | yes   | yes | yes   | ove ls-files                 |\n| quick     | no                 | no    | no  | no    | ove-ls-files                 |\n| queue     | yes                | yes   | yes | no    | OVE_BATCH_IT=1 ove ls-files  |\n| remote    | maybe              | maybe | yes | maybe | OVE_REMOTE_IT=1 ove ls-files |\n\nExample:\n\n    # method: normal\n    #\n    # ls-files command can take a while\n    $ time ove ls-files\n    ...\n    real 0m2,011s\n    # the output (and input) of the ls-files command is saved and you can use LOG commands to view or replay the output\n    $ ove list-commands LOG\n    ...\n    # run strace in background and filter on all execve calls\n    # ove loglevel 3\n    $ ove ls-files\n    ...\n\n    # method: quick\n    #\n    # ls-files using the quick invocation method\n    $ time ove-ls-files\n    ...\n    real 0m0,949s\n\n    # method: queue\n    #\n    # queue the ls-files command, the command will silently be run in background\n    $ time OVE_BATCH_IT=1 ove ls-files\n    0\n    real 0m0,193 s\n    # check task spooler status\n    $ ove ts\n    ...\n\n    # method: remote\n    #\n    # run the ls-files command on a few remote hosts (tmux)\n    $ time OVE_REMOTE_IT=1 ove ls-files\n    real 0m0,949s\n    # run the ls-files command on a few remote hosts (no tmux)\n    $ time OVE_REMOTE_IT=1 ove ls-files\n    real 0m10,858s\n    # run the ls-files command on localhost and a few remote hosts (no tmux)\n    $ time OVE_REMOTE_IT=2 ove ls-files\n    real 0m11,237s\n\n## Configuration\n\nConfigurable OVE commands can be found [here](doc/ove-config-list.md)\n\n## Environment variables\n\nA list of OVE environment variables that will remain stable across OVE versions\ncan be found [here](doc/ove-variables-list.md).\n\n## Supported Linux distributions\n\nOVE has been tested for the following Linux distributions:\n\n| Distribution        | Release(s)                  |\n|---------------------|-----------------------------|\n| AlmaLinux           | 9.1                         |\n| Alpine Linux        | 3.15..3.21                  |\n| Arch Linux          | N/A                         |\n| Debian              | Buster, Bullseye, Bookworm  |\n| Devuan              | Beowulf, Chimaera, Daedalus |\n| Fedora              | 36..41                      |\n| Kali                | N/A                         |\n| Linux Mint          | Uma..Wilma                  |\n| openSUSE Tumbleweed | N/A                         |\n| Ubuntu              | 16.04..24.04                |\n| Void Linux          | N/A                         |\n\nWant to know more about OVE? Please check out the OVE\n[tutorial](https://github.com/Ericsson/ove-tutorial) or ask OVE:\n\n    ove help\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericsson%2Fove","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericsson%2Fove","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericsson%2Fove/lists"}