diff --git a/README.md b/README.md index 1bdf3ed..c6294fb 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,17 @@ The easiest way to run it is to copy and paste the following command into your t curl -L https://raw.githubusercontent.com/metabarcoding/obitools4/master/install_obitools.sh | bash ``` -By default, the script installs the *OBITools* commands and other associated files into the `/usr/local` directory. -The names of the commands in the new *OBITools4* are mostly identical to those in *OBITools2*. -Therefore, installing the new *OBITools* may hide or delete the old ones. If you want both versions to be -available on your system, the installation script offers two options: +By default, the script installs the latest version of *OBITools* commands and other associated files into the `/usr/local` directory. +### Installation Options +The installation script offers several options: + +> -l, --list List all available versions and exit. +> +> -v, --version Install a specific version (e.g., `-v 4.4.3`). +> By default, the latest version is installed. +> > -i, --install-dir Directory where obitools are installed > (as example use `/usr/local` not `/usr/local/bin`). > @@ -30,14 +35,31 @@ available on your system, the installation script offers two options: > same time on your system (as example `-p g` will produce > `gobigrep` command instead of `obigrep`). -You can use these options by following the installation command: +### Examples +List all available versions: +```{bash} +curl -L https://raw.githubusercontent.com/metabarcoding/obitools4/master/install_obitools.sh | bash -s -- --list +``` + +Install a specific version: +```{bash} +curl -L https://raw.githubusercontent.com/metabarcoding/obitools4/master/install_obitools.sh | bash -s -- --version 4.4.3 +``` + +Install in a custom directory with command prefix: ```{bash} curl -L https://raw.githubusercontent.com/metabarcoding/obitools4/master/install_obitools.sh | \ bash -s -- --install-dir test_install --obitools-prefix k ``` -In this case, the binaries will be installed in the `test_install` directory and all command names will be prefixed with the letter `k`. Thus, `obigrep` will be named `kobigrep`. +In this last example, the binaries will be installed in the `test_install` directory and all command names will be prefixed with the letter `k`. Thus, `obigrep` will be named `kobigrep`. + +### Note on Version Compatibility + +The names of the commands in the new *OBITools4* are mostly identical to those in *OBITools2*. +Therefore, installing the new *OBITools* may hide or delete the old ones. If you want both versions to be +available on your system, use the `--install-dir` and `--obitools-prefix` options as shown above. ## Continuing the analysis... diff --git a/install_obitools.sh b/install_obitools.sh index 8e28f66..07cf571 100755 --- a/install_obitools.sh +++ b/install_obitools.sh @@ -1,27 +1,56 @@ #!/bin/bash -INSTALL_DIR="/usr/local" -OBITOOLS_PREFIX="" -# default values +# Default values URL="https://go.dev/dl/" -OBIURL4="https://github.com/metabarcoding/obitools4/archive/refs/heads/master.zip" +GITHUB_REPO="https://github.com/metabarcoding/obitools4" INSTALL_DIR="/usr/local" OBITOOLS_PREFIX="" +VERSION="" +LIST_VERSIONS=false -# help message +# Help message function display_help { echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " -i, --install-dir Directory where obitools are installed " - echo " (as example use /usr/local not /usr/local/bin)." + echo " (e.g., use /usr/local not /usr/local/bin)." echo " -p, --obitools-prefix Prefix added to the obitools command names if you" echo " want to have several versions of obitools at the" - echo " same time on your system (as example -p g will produce " + echo " same time on your system (e.g., -p g will produce " echo " gobigrep command instead of obigrep)." + echo " -v, --version Install a specific version (e.g., 4.4.8)." + echo " If not specified, installs the latest version." + echo " -l, --list List all available versions and exit." echo " -h, --help Display this help message." + echo "" + echo "Examples:" + echo " $0 # Install latest version" + echo " $0 -l # List available versions" + echo " $0 -v 4.4.8 # Install specific version" + echo " $0 -i /opt/local # Install to custom directory" } +# List available versions from GitHub releases +function list_versions { + echo "Fetching available versions..." 1>&2 + echo "" + curl -s "https://api.github.com/repos/metabarcoding/obitools4/releases" \ + | grep '"tag_name":' \ + | sed -E 's/.*"tag_name": "Release_([0-9.]+)".*/\1/' \ + | sort -V -r +} + +# Get latest version from GitHub releases +function get_latest_version { + curl -s "https://api.github.com/repos/metabarcoding/obitools4/releases" \ + | grep '"tag_name":' \ + | sed -E 's/.*"tag_name": "Release_([0-9.]+)".*/\1/' \ + | sort -V -r \ + | head -1 +} + +# Parse command line arguments while [ "$#" -gt 0 ]; do case "$1" in -i|--install-dir) @@ -32,67 +61,104 @@ while [ "$#" -gt 0 ]; do OBITOOLS_PREFIX="$2" shift 2 ;; + -v|--version) + VERSION="$2" + shift 2 + ;; + -l|--list) + LIST_VERSIONS=true + shift + ;; -h|--help) - display_help 1>&2 + display_help exit 0 ;; *) - echo "Error: Unsupported option $1" 1>&2 + echo "Error: Unsupported option $1" 1>&2 + display_help 1>&2 exit 1 ;; esac done -# the directory from where the script is run +# List versions and exit if requested +if [ "$LIST_VERSIONS" = true ]; then + echo "Available OBITools4 versions:" + echo "==============================" + list_versions + exit 0 +fi + +# Determine version to install +if [ -z "$VERSION" ]; then + echo "Fetching latest version..." 1>&2 + VERSION=$(get_latest_version) + if [ -z "$VERSION" ]; then + echo "Error: Could not determine latest version" 1>&2 + exit 1 + fi + echo "Latest version: $VERSION" 1>&2 +else + echo "Installing version: $VERSION" 1>&2 +fi + +# Construct source URL for the specified version +OBIURL4="${GITHUB_REPO}/archive/refs/tags/Release_${VERSION}.zip" + +# The directory from where the script is run DIR="$(pwd)" -# the temp directory used, within $DIR -# omit the -p parameter to create a temporal directory in the default location -# WORK_DIR=$(mktemp -d -p "$DIR" "obitools4.XXXXXX" 2> /dev/null || \ -# mktemp -d -t "$DIR" "obitools4.XXXXXX") - +# Create temporary directory WORK_DIR=$(mktemp -d "obitools4.XXXXXX") -# check if tmp dir was created +# Check if tmp dir was created if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then - echo "Could not create temp dir" 1>&2 + echo "Could not create temp dir" 1>&2 exit 1 fi mkdir -p "${WORK_DIR}/cache" \ - || (echo "Cannot create ${WORK_DIR}/cache directory" 1>&2 + || (echo "Cannot create ${WORK_DIR}/cache directory" 1>&2 exit 1) - +# Create installation directory mkdir -p "${INSTALL_DIR}/bin" 2> /dev/null \ - || (echo "Please enter your password for installing obitools in ${INSTALL_DIR}" 1>&2 + || (echo "Please enter your password for installing obitools in ${INSTALL_DIR}" 1>&2 sudo mkdir -p "${INSTALL_DIR}/bin") if [[ ! -d "${INSTALL_DIR}/bin" ]]; then - echo "Could not create ${INSTALL_DIR}/bin directory for installing obitools" 1>&2 + echo "Could not create ${INSTALL_DIR}/bin directory for installing obitools" 1>&2 exit 1 fi INSTALL_DIR="$(cd ${INSTALL_DIR} && pwd)" -echo "WORK_DIR=$WORK_DIR" 1>&2 -echo "INSTALL_DIR=$INSTALL_DIR" 1>&2 -echo "OBITOOLS_PREFIX=$OBITOOLS_PREFIX" 1>&2 +echo "================================" 1>&2 +echo "OBITools4 Installation" 1>&2 +echo "================================" 1>&2 +echo "VERSION=$VERSION" 1>&2 +echo "WORK_DIR=$WORK_DIR" 1>&2 +echo "INSTALL_DIR=$INSTALL_DIR" 1>&2 +echo "OBITOOLS_PREFIX=$OBITOOLS_PREFIX" 1>&2 +echo "================================" 1>&2 -pushd "$WORK_DIR"|| exit +pushd "$WORK_DIR" > /dev/null || exit +# Detect OS and architecture OS=$(uname -a | awk '{print $1}') ARCH=$(uname -m) -if [[ "$ARCH" == "x86_64" ]] ; then - ARCH="amd64" +if [[ "$ARCH" == "x86_64" ]] ; then + ARCH="amd64" fi -if [[ "$ARCH" == "aarch64" ]] ; then - ARCH="arm64" +if [[ "$ARCH" == "aarch64" ]] ; then + ARCH="arm64" fi -GOFILE=$(curl "$URL" \ +# Download and install Go +echo "Downloading Go..." 1>&2 +GOFILE=$(curl -s "$URL" \ | grep 'class="download"' \ | grep "\.tar\.gz" \ | sed -E 's@^.*/dl/(go[1-9].+\.tar\.gz)".*$@\1@' \ @@ -100,44 +166,71 @@ GOFILE=$(curl "$URL" \ | grep -i "$ARCH" \ | head -1) -GOURL=$(curl "${URL}${GOFILE}" \ +GOURL=$(curl -s "${URL}${GOFILE}" \ | sed -E 's@^.*href="(.*\.tar\.gz)".*$@\1@') -echo "Install GO from : $GOURL" 1>&2 - -curl "$GOURL" \ - | tar zxf - +echo "Installing Go from: $GOURL" 1>&2 + +curl -s "$GOURL" | tar zxf - PATH="$(pwd)/go/bin:$PATH" export PATH GOPATH="$(pwd)/go" export GOPATH - export GOCACHE="$(pwd)/cache" -echo "GOCACHE=$GOCACHE" 1>&2@ + +echo "GOCACHE=$GOCACHE" 1>&2 mkdir -p "$GOCACHE" +# Download OBITools4 source +echo "Downloading OBITools4 v${VERSION}..." 1>&2 +echo "Source URL: $OBIURL4" 1>&2 -curl -L "$OBIURL4" > master.zip -unzip master.zip +if ! curl -sL "$OBIURL4" > obitools4.zip; then + echo "Error: Could not download OBITools4 version ${VERSION}" 1>&2 + echo "Please check that this version exists with: $0 --list" 1>&2 + exit 1 +fi -echo "Install OBITOOLS from : $OBIURL4" +unzip -q obitools4.zip -cd obitools4-master || exit -mkdir vendor +# Find the extracted directory +OBITOOLS_DIR=$(ls -d obitools4-* 2>/dev/null | head -1) +if [ -z "$OBITOOLS_DIR" ] || [ ! -d "$OBITOOLS_DIR" ]; then + echo "Error: Could not find extracted OBITools4 directory" 1>&2 + exit 1 +fi + +echo "Building OBITools4..." 1>&2 +cd "$OBITOOLS_DIR" || exit +mkdir -p vendor + +# Build with or without prefix if [[ -z "$OBITOOLS_PREFIX" ]] ; then - make GOFLAGS="-buildvcs=false" + make GOFLAGS="-buildvcs=false" else make GOFLAGS="-buildvcs=false" OBITOOLS_PREFIX="${OBITOOLS_PREFIX}" fi +# Install binaries +echo "Installing binaries to ${INSTALL_DIR}/bin..." 1>&2 (cp build/* "${INSTALL_DIR}/bin" 2> /dev/null) \ - || (echo "Please enter your password for installing obitools in ${INSTALL_DIR}" + || (echo "Please enter your password for installing obitools in ${INSTALL_DIR}" 1>&2 sudo cp build/* "${INSTALL_DIR}/bin") -popd || exit +popd > /dev/null || exit +# Cleanup +echo "Cleaning up..." 1>&2 chmod -R +w "$WORK_DIR" rm -rf "$WORK_DIR" +echo "" 1>&2 +echo "================================" 1>&2 +echo "OBITools4 v${VERSION} installed successfully!" 1>&2 +echo "Binaries location: ${INSTALL_DIR}/bin" 1>&2 +if [[ -n "$OBITOOLS_PREFIX" ]] ; then + echo "Command prefix: ${OBITOOLS_PREFIX}" 1>&2 +fi +echo "================================" 1>&2 diff --git a/pkg/obioptions/version.go b/pkg/obioptions/version.go index 36b9581..2cc2fe0 100644 --- a/pkg/obioptions/version.go +++ b/pkg/obioptions/version.go @@ -3,7 +3,7 @@ package obioptions // Version is automatically updated by the Makefile from version.txt // The patch number (third digit) is incremented on each push to the repository -var _Version = "Release 4.4.10" +var _Version = "Release 4.4.11" // Version returns the version of the obitools package. // diff --git a/version.txt b/version.txt index 97b0809..793ea8a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.4.10 +4.4.11