# `projvar` - **Proj**ect **Var**iables [![License: AGPL-3.0-or-later]( https://img.shields.io/badge/License-AGPL--3.0--or--later-blue.svg)]( LICENSE.txt) [![REUSE status]( https://api.reuse.software/badge/github.com/hoijui/projvar)]( https://api.reuse.software/info/github.com/hoijui/projvar) [![Repo]( https://img.shields.io/badge/Repo-GitHub-555555&logo=github.svg)]( https://github.com/hoijui/projvar) [![Package Releases]( https://img.shields.io/crates/v/projvar.svg)]( https://crates.io/crates/projvar) [![Documentation Releases]( https://docs.rs/projvar/badge.svg)]( https://docs.rs/projvar) [![Dependency Status]( https://deps.rs/repo/github/hoijui/projvar/status.svg)]( https://deps.rs/repo/github/hoijui/projvar) [![Build Status]( https://github.com/hoijui/projvar/workflows/build/badge.svg)]( https://github.com/hoijui/projvar/actions) [![In cooperation with FabCity Hamburg]( https://raw.githubusercontent.com/osegermany/tiny-files/master/res/media/img/badge-fchh.svg)]( https://fabcity.hamburg) [![In cooperation with Open Source Ecology Germany]( https://raw.githubusercontent.com/osegermany/tiny-files/master/res/media/img/badge-oseg.svg)]( https://opensourceecology.de) A CLI ([Command-line Interface]( https://en.wikipedia.org/wiki/Command-line_interface)) tool that extracts a base set of meta data properties from a given, digital project, using various sources. ## Example scenarios `projvar` is designed to work best for git repositories, both locally or on a CI ([**C**ontinous **I**ntegration]( https://en.wikipedia.org/wiki/Continuous_integration)) system, though it will also work (partly) for other projects. ### Local project The project needs to be present as a folder on the local file-system, from which one runs `projvar`, which in turn writes the meta-data for that project into a file ```sh $ # Here we show output for running projvar on its self, $ # but in your case this will be something else: # MY_PROJECT_PATH="$HOME/Projects/projvar" $ cd "$MY_PROJECT_PATH" $ projvar [INFO] Using the default out file: .projvars.env.txt $ cat .projvars.env.txt PROJECT_BUILD_ARCH="x86_64" PROJECT_BUILD_BRANCH="master" PROJECT_BUILD_DATE="2021-12-25 12:50:50" PROJECT_BUILD_HOSTING_URL="https://hoijui.github.io/projvar" PROJECT_BUILD_OS="linux" PROJECT_BUILD_OS_FAMILY="unix" PROJECT_BUILD_TAG="0.8.0" PROJECT_CI="false" PROJECT_LICENSE="AGPL-3.0-only" PROJECT_LICENSES="CC0-1.0, AGPL-3.0-or-later, Unlicense" PROJECT_NAME="projvar" PROJECT_NAME_MACHINE_READABLE="projvar" PROJECT_REPO_CLONE_URL="https://github.com/hoijui/projvar.git" PROJECT_REPO_CLONE_URL_SSH="ssh://git@github.com:hoijui/projvar.git" PROJECT_REPO_COMMIT_PREFIX_URL="https://github.com/hoijui/projvar/commit" PROJECT_REPO_ISSUES_URL="https://github.com/hoijui/projvar/issues" PROJECT_REPO_RAW_VERSIONED_PREFIX_URL="https://raw.githubusercontent.com/hoijui/projvar" PROJECT_REPO_VERSIONED_DIR_PREFIX_URL="https://github.com/hoijui/projvar/tree" PROJECT_REPO_VERSIONED_FILE_PREFIX_URL="https://github.com/hoijui/projvar/blob" PROJECT_REPO_WEB_URL="https://github.com/hoijui/projvar" PROJECT_VERSION="0.8.0-dirty" PROJECT_VERSION_DATE="2021-12-13 09:18:25" ``` ## In CI (build-bot) 1. Check out your repo 2. Run this tool (`projvar`) * it ensures a a few properties are known, for example: * `PROJECT_NAME="My Project"` * `PROJECT_VERSION="my-proj-1.2.3-44-ge73gf28"` * `PROJECT_REPO_WEB_URL="https://github.com/user/my-proj"` * it stores them somehow, typically into a file, using [BASH `source`]( https://opensource.com/article/20/6/bash-source-command) compatible syntax 3. Run some other tool that uses these environment variables. For example, you may include it in a QRCode, which you then print onto your project. ## How to compile You need to install Rust(lang) and Cargo. Then get the whole repo plus git sub-modules with: ```bash git clone --recurse-submodules https://github.com/hoijui/projvar.git cd projvar ``` Then you can run: ```bash scripts/build ``` If all goes well, the executable can be found at `target/release/projvar`. ## Get the tool As for now, you have two choices: 1. [Compile it](#how-to-compile) yourself 1. Download a Linux x86\_64 statically linked binary from [the releases page](https://github.com/hoijui/projvar/releases) ## Usage ```bash $ projvar --version projvar 0.17.0 $ projvar --help A tiny CLI tool that tries to gather project specific meta-data in different ways, to store them into environment variables in a file for later use by other tools. See --list for the keys set by this tool. Usage: projvar [OPTIONS] Options: -V, --version Print version information and exit. May be combined with -q,--quiet, to really only output the version string. -C, --project-root The root directory of the project, mainly used for SCM (e.g. git) information gathering. [default: .] --raw-panic Do not wrap rusts native panic handling functionality in a more end-user-friendly way. This is particularly useful when running on CI. -D, --variable A key-value pair (aka a variable) to be used as input, as it it was specified as an environment variable. Values provided with this take precedense over environment variables - they overwrite them. See -I,--variables-file for supplying a lot of such pairs at once. -I, --variables-file An input file containing KEY=VALUE pairs, one per line (BASH style). Empty lines, and those starting with "#" or "//" are ignored. See -D,--variable for specifying one pair at a time. -x, --no-env-in Disable the use of environment variables as input -e, --env-out Write resulting values directy into the environment -O, --file-out Write evaluated values into a file. Two file formats are supported: * ENV: one KEY=VALUE pair per line (BASH syntax) * JSON: a dictionary of KEY: "value" You can choose which format is used by the file-extension. Note that "-" has no special meaning here; it does not mean stdout, but rather the file "./-". [default: .projvars.env.txt] -t, --hosting-type As usually most kinds of repo URL property values are derived from the clone URL, it is essential to know how to construct them. Different hosting softwares construct them differently. By default, we try to derive it from the clone URL domain, but if this is not possible, this switch allows to set the hosting software manually. Possible values: - git-hub: - proprietary - git-lab: - OSS - bit-bucket: - proprietary - source-hut: - OSS - LowTech (no JS) hacker tool, (almost) suckless style - gitea: - OSS - girocco: - OSS - rocket-git: - OSS - allura: - OSS - unknown: NOTE: The rust masters said, this is better then Option! -v, --verbose... More verbose log output; useful for debugging. See -F,--log-level for more fine-grained control. -F, --log-level Set the log-level [possible values: none, errors, warnings, info, debug, trace] -q, --quiet Minimize or suppress output to stdout, and only shows log output on stderr. See -F,--log-level to also disable the later. This does not affect the log level for the log-file. -f, --fail Fail if no value is available for any of the required properties. See --all, --none, --require, --require-not. -a, --all Marks all properties as required. See --none, --fail, --require, --require-not. -n, --none Marks all properties as *not* required. See --all, --fail, --require, --require-not. -R, --require Mark a propery as required. \ You may use the property name (e.g. "Name") \ or the variable key (e.g. "PROJECT_NAME"); \ See --list for all possible keys. \ If at least one such option is present, \ the default required values list is cleared. \ See --fail, --all, --none, --require-not. -N, --require-not A key of a variable whose value is *not* required. For example PROJECT_NAME (see --list for all possible keys). Can be used either on the base of the default requried list or all. See --fail, --all, --none, --require. --only-required Only output the required values. See --all, --none, --require, --require-not. --key-prefix The key prefix to be used when writing out values in the sinks. For example "PROJECT_" -> "PROJECT_VERSION", "PROJECT_NAME", ... [default: PROJECT_] -d, --dry Set Whether to skip the actual setting of environment variables. -o, --overwrite Whether to overwrite already set values in the output. [possible values: all, none, main, alternative] -l, --list Prints a list of all the environment variables that are potentially set by this tool onto stdout and exits. -T, --date-format Date format string for generated (vs supplied) dates. For details, see https://docs.rs/chrono/latest/chrono/format/strftime/index.html [default: "%Y-%m-%d %H:%M:%S"] -A, --show-all-retrieved [] Shows a table (in Markdown syntax) of all properties and the values retrieved for each from each individual source. Writes to log(Info), if no target file is given as argument. -P, --show-primary-retrieved [] Shows a list (in Markdown syntax) of all properties and the primary values retrieved for each, accumulated over the sources. Writes to log(Info), if no target file is given as argument. -h, --help Print help (see a summary with '-h') ``` The list of all supported keys/properties (as shown by `--list`): | Default Required | Key | Description | | - | --- | ------------ | | [ ] | `PROJECT_BUILD_ARCH` | The computer hardware architecture we are building on. (common values: 'x86', 'x86_64') | | [ ] | `PROJECT_BUILD_BRANCH` | The development branch name, for example: "master", "develop" | | [ ] | `PROJECT_BUILD_DATE` | Date of this build, for example: "2021-12-31 23:59:59" (see --date-format) | | [ ] | `PROJECT_BUILD_HOSTING_URL` | Web URL under which the generated output will be available, for example: https://osegermany.gitlab.io/OHS-3105 | | [ ] | `PROJECT_BUILD_NUMBER` | The build number (1, 2, 3) starts at 1 for each repo and branch. | | [ ] | `PROJECT_BUILD_OS` | The operating system we are building on. (common values: 'linux', 'macos', 'windows') | | [ ] | `PROJECT_BUILD_OS_FAMILY` | The operating system family we are building on. (should be either 'unix' or 'windows') | | [ ] | `PROJECT_BUILD_TAG` | The tag of a commit that kicked off the build. This value is only available on tags. Not available for builds against branches. | | [ ] | `PROJECT_CI` | 'true' if running on a CI/build-bot; unset otherwise. | | [x] | `PROJECT_LICENSE` | The main License identifier of the sources, preferably from the SPDX specs, for example: "AGPL-3.0-or-later", "CC-BY-SA-4.0" | | [x] | `PROJECT_LICENSES` | The identifiers of all the licenses of this project, preferably from the SPDX specs, comma separated, for example: "AGPL-3.0-or-later, CC0-1.0, Unlicense" | | [x] | `PROJECT_NAME` | The human focused name of the project. | | [x] | `PROJECT_NAME_MACHINE_READABLE` | The machine readable name of the project. | | [x] | `PROJECT_REPO_CLONE_URL` | The original repo clone URL; may use any valid git URL scheme. May not conform to the URL specification. It is commonly used for anonymous fetch-only access. | | [ ] | `PROJECT_REPO_CLONE_URL_HTTP` | The repo clone URL, HTTP(S) version. It always conforms to the URL specification. It is commonly used for anonymous fetch-only access. | | [ ] | `PROJECT_REPO_CLONE_URL_SSH` | The repo clone URL, SSH version. It always conforms to the URL specification. It is commonly used for authenticated, fetch and push access. | | [x] | `PROJECT_REPO_COMMIT_PREFIX_URL` | The repo commit prefix URL. Add commit SHA. The part in []: [https://github.com/hoijui/nim-ci/commit]/23f84b91] | | [x] | `PROJECT_REPO_ISSUES_URL` | The repo issues URL, for example: https://gitlab.com/openflexure/openflexure-microscope/issues | | [x] | `PROJECT_REPO_RAW_VERSIONED_PREFIX_URL` | The repo raw prefix URL. Add version (tag, branch, SHA) and file path. The part in []: [https://raw.githubusercontent.com/hoijui/nim-ci]/master/.github/workflows/docker.yml] | | [x] | `PROJECT_REPO_VERSIONED_DIR_PREFIX_URL` | The repo directory prefix URL. Add version (tag, branch, SHA) and directory path. The part in []: [https://github.com/hoijui/nim-ci]/master/.github/workflows/docker.yml] | | [x] | `PROJECT_REPO_VERSIONED_FILE_PREFIX_URL` | The repo file prefix URL. Add version (tag, branch, SHA) and file path. The part in []: [https://github.com/hoijui/nim-ci]/master/.github/workflows/docker.yml] | | [x] | `PROJECT_REPO_WEB_URL` | The repo web UI URL, for example: https://gitlab.com/OSEGermany/OHS-3105 | | [x] | `PROJECT_VERSION` | The project version, for example: "1.10.3", "0.2.0-1-ga5387ac-dirty" | | [x] | `PROJECT_VERSION_DATE` | Date this version was committed to source control, for example: "2021-12-31 23:59:59" (see --date-format) | ## Funding This project was funded by the European Regional Development Fund (ERDF) in the context of the [INTERFACER Project](https://www.interfacerproject.eu/), from August 2021 (project start) until March 2023. ![Logo of the EU ERDF program]( https://cloud.fabcity.hamburg/s/TopenKEHkWJ8j5P/download/logo-eu-erdf.png)