Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ jobs:
- starship.rs
- swc.rs
- tailscale.com
- tmux
- webinstall.dev
- zellij.dev
- zyedidia-eget
Expand Down Expand Up @@ -96,6 +97,7 @@ jobs:
- starship.rs
- swc.rs
- tailscale.com
- tmux
- webinstall.dev
- zellij.dev
- zyedidia-eget
Expand Down
17 changes: 17 additions & 0 deletions src/tmux/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "tmux",
"id": "tmux",
"version": "1.0.0",
"description": "Install \"tmux\" terminal multiplexer",
"documentationURL": "https://github.com/devcontainer-community/devcontainer-features/tree/main/src/tmux",
"options": {
"version": {
"type": "string",
"default": "latest",
"proposals": [
"latest"
],
"description": "Version of \"tmux\" to install (e.g. \"latest\", \"3.5a\", \"3.4\")."
}
}
}
131 changes: 131 additions & 0 deletions src/tmux/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
#!/bin/bash
set -o errexit
set -o pipefail
set -o noclobber
set -o nounset
set -o allexport
readonly githubRepository='tmux/tmux'
readonly binaryName='tmux'
readonly versionArgument='-V'
readonly binaryTargetFolder='/usr/local/bin'
readonly name="${githubRepository##*/}"
apt_get_update() {
if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then
echo "Running apt-get update..."
apt-get update -y
fi
}
apt_get_checkinstall() {
if ! dpkg -s "$@" >/dev/null 2>&1; then
apt_get_update
DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends --no-install-suggests --option 'Debug::pkgProblemResolver=true' --option 'Debug::pkgAcquire::Worker=1' "$@"
fi
}
apt_get_cleanup() {
apt-get clean
rm -rf /var/lib/apt/lists/*
}
check_curl_tar_installed() {
declare -a requiredAptPackagesMissing=()
if ! [ -r '/etc/ssl/certs/ca-certificates.crt' ]; then
requiredAptPackagesMissing+=('ca-certificates')
fi
if ! command -v curl >/dev/null 2>&1; then
requiredAptPackagesMissing+=('curl')
fi
if ! command -v tar >/dev/null 2>&1; then
requiredAptPackagesMissing+=('tar')
fi
declare -i requiredAptPackagesMissingCount=${#requiredAptPackagesMissing[@]}
if [ $requiredAptPackagesMissingCount -gt 0 ]; then
apt_get_checkinstall "${requiredAptPackagesMissing[@]}"
apt_get_cleanup
fi
}
curl_check_url() {
local url=$1
local status_code
status_code=$(curl -s -o /dev/null -w '%{http_code}' "$url")
if [ "$status_code" -ne 200 ] && [ "$status_code" -ne 302 ]; then
echo "Failed to download '$url'. Status code: $status_code."
return 1
fi
}
curl_download_stdout() {
local url=$1
curl \
--silent \
--location \
--output '-' \
--connect-timeout 5 \
"$url"
}
echo_banner() {
local text="$1"
echo -e "\e[1m\e[97m\e[41m$text\e[0m"
}
github_list_releases() {
if [ -z "$1" ]; then
echo "Usage: list_github_releases <owner/repo>"
return 1
fi
local repo="$1"
local url="https://api.github.com/repos/$repo/releases"
curl -s "$url" | grep -Po '"tag_name": "\K.*?(?=")' | grep -E '^[0-9]+\.[0-9]+[a-z]?$'
}
github_get_latest_release() {
if [ -z "$1" ]; then
echo "Usage: get_latest_github_release <owner/repo>"
return 1
fi
github_list_releases "$1" | head -n 1
}
github_get_tag_for_version() {
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: github_get_tag_for_version <owner/repo> <version>"
return 1
fi
local repo="$1"
local version="$2"
local url="https://api.github.com/repos/$repo/releases"
local escaped_version
escaped_version="$(printf '%s' "$version" | sed 's/\./\\./g')"
curl -s "$url" | grep -Po '"tag_name": "\K.*?(?=")' | grep -E "^${escaped_version}$" | head -n 1
}
utils_check_version() {
local version=$1
if ! [[ "${version:-}" =~ ^(latest|[0-9]+\.[0-9]+[a-z]?)$ ]]; then
printf >&2 '=== [ERROR] Option "version" (value: "%s") is not "latest" or valid tmux version format "X.Y[a]" !\n' \
"$version"
exit 1
fi
}
install() {
utils_check_version "$VERSION"
check_curl_tar_installed
apt_get_checkinstall build-essential pkg-config libevent-dev libncurses-dev bison
if [ "$VERSION" == 'latest' ] || [ -z "$VERSION" ]; then
VERSION=$(github_get_latest_release "$githubRepository")
fi
readonly version="${VERSION:?}"
readonly releaseTag="$(github_get_tag_for_version "$githubRepository" "$version")"
if [ -z "$releaseTag" ]; then
printf >&2 '=== [ERROR] Could not find release tag for version "%s" in "%s"!\n' "$version" "$githubRepository"
exit 1
fi
readonly downloadUrl="https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-${version}.tar.gz"
curl_check_url "$downloadUrl"
local tmpDir
tmpDir=$(mktemp -d)
curl_download_stdout "$downloadUrl" | tar -xz -f '-' -C "$tmpDir" --strip-components=1
cd "$tmpDir"
./configure --prefix=/usr/local
make install
cd /
rm -rf "$tmpDir"
apt_get_cleanup
}
echo_banner "devcontainer.community"
echo "Installing $name..."
install "$@"
echo "(*) Done!"
18 changes: 18 additions & 0 deletions test/tmux/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash


set -e

# Optional: Import test library bundled with the devcontainer CLI
# See https://github.com/devcontainers/cli/blob/HEAD/docs/features/test.md#dev-container-features-test-lib
# Provides the 'check' and 'reportResults' commands.
source dev-container-features-test-lib

# Feature-specific tests
# The 'check' command comes from the dev-container-features-test-lib. Syntax is...
# check <LABEL> <cmd> [args...]
check "execute command" bash -c "tmux -V | grep 'tmux'"

# Report results
# If any of the checks above exited with a non-zero exit code, the test will fail.
reportResults
Loading