From 17ce6fbb5270b6ccca7485ba23c718c439b8a113 Mon Sep 17 00:00:00 2001 From: Tin Lai Date: Fri, 29 May 2020 18:46:48 +1000 Subject: [PATCH 01/15] Allows custom folder name --- libexec/basher-_clone | 14 +++++++++----- libexec/basher-install | 27 ++++++++++++++++++--------- libexec/basher-list | 15 +++++++++++++-- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/libexec/basher-_clone b/libexec/basher-_clone index 6d02688..1c637ef 100755 --- a/libexec/basher-_clone +++ b/libexec/basher-_clone @@ -2,11 +2,11 @@ # # Summary: Clones a package from a site, but doesn't install it # -# Usage: basher _clone [] +# Usage: basher _clone [] [folder] set -e -if [ "$#" -ne 3 ] && [ "$#" -ne 4 ]; then +if [ "$#" -lt 3 -a "$#" -gt 5 ]; then basher-help _clone exit 1 fi @@ -15,6 +15,7 @@ use_ssh="$1" site="$2" package="$3" ref="$4" +folder="$5" if [ -z "$use_ssh" ]; then basher-help _clone @@ -49,7 +50,11 @@ if [ -z "$name" ]; then exit 1 fi -if [ -e "$BASHER_PACKAGES_PATH/$package" ]; then +if [ -z "$folder" ]; then + folder="$package" +fi + +if [ -e "$BASHER_PACKAGES_PATH/$folder" ]; then echo "Package '$package' is already present" exit 0 fi @@ -66,5 +71,4 @@ else URI="https://${site}/$package.git" fi -# shellcheck disable=SC2086 -git clone ${DEPTH_OPTION} ${BRANCH_OPTION} --recursive "$URI" "${BASHER_PACKAGES_PATH}/$package" +git clone ${DEPTH_OPTION} ${BRANCH_OPTION} --recursive "$URI" "${BASHER_PACKAGES_PATH}/$folder" diff --git a/libexec/basher-install b/libexec/basher-install index bc0acdc..471420f 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -2,7 +2,7 @@ # # Summary: Installs a package from github (or a custom site) # -# Usage: basher install [--ssh] [site]/[@ref] +# Usage: basher install [--ssh] [site]/[@ref] [folder] set -e @@ -15,7 +15,7 @@ case $1 in ;; esac -if [ "$#" -ne 1 ]; then +if [ "$#" -lt 1 -o "$#" -gt 2 ]; then basher-help install exit 1 fi @@ -28,6 +28,17 @@ else site="github.com" fi +# defaults to package's name, but allows custom folder name +folder="$package" +if [ -n "$2" ]; then + if [[ "$2" = */* ]]; then + basher-help install + echo "Optional argunment [folder] cannot be nested." + exit 1 + fi + folder="${user}/$2" +fi + if [ -z "$package" ]; then basher-help install exit 1 @@ -51,10 +62,8 @@ else ref="" fi -if [ -z "$ref" ]; then - basher-_clone "$use_ssh" "$site" "$package" -else - basher-_clone "$use_ssh" "$site" "$package" "$ref" -fi -basher-_deps "$package" -basher-_link "$package" +basher-_clone "$use_ssh" "$site" "$package" "$ref" "$folder" +basher-_deps "$folder" +basher-_link-bins "$folder" +basher-_link-man "$folder" +basher-_link-completions "$folder" diff --git a/libexec/basher-list b/libexec/basher-list index d00f213..776c9cf 100755 --- a/libexec/basher-list +++ b/libexec/basher-list @@ -1,10 +1,17 @@ #!/usr/bin/env bash # # Summary: List installed packages -# Usage: basher list +# Usage: basher list [-v] set -e +case $1 in + -v) + verbose="true" + shift + ;; +esac + if [ "$#" -gt 0 ]; then basher-help list exit 1 @@ -17,5 +24,9 @@ do username="$(dirname "$package_path")" username="${username##*/}" package="${package_path##*/}" - echo "$username/$package" + if [ -z "$verbose" ]; then + echo "$username/$package" + else + printf "%-30s %-30s\n" "$username/$package" "($(git --git-dir=${BASHER_PACKAGES_PATH}/$username/$package/.git config --get remote.origin.url))" + fi done From fdb50bb1632b0d03b8d87bbf2d622aa24ebfd43e Mon Sep 17 00:00:00 2001 From: Tin Lai Date: Sun, 31 May 2020 17:21:45 +1000 Subject: [PATCH 02/15] fix logic --- libexec/basher-install | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libexec/basher-install b/libexec/basher-install index 471420f..c1f1c35 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -24,7 +24,8 @@ if [[ "$1" = */*/* ]]; then IFS=/ read -r site user name <<< "$1" package="${user}/${name}" else - package="$1" + IFS=/ read -r user name <<< "$1" + package="${user}/${name}" site="github.com" fi From 58118fcc7c0a112930fbd328cbb2144705c3ed8c Mon Sep 17 00:00:00 2001 From: Tin Lai Date: Mon, 1 Jun 2020 18:44:52 +1000 Subject: [PATCH 03/15] optional folder must include namespace --- libexec/basher-install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libexec/basher-install b/libexec/basher-install index c1f1c35..e41e4da 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -32,12 +32,12 @@ fi # defaults to package's name, but allows custom folder name folder="$package" if [ -n "$2" ]; then - if [[ "$2" = */* ]]; then + if [[ "$2" != *([^/])/*([^/]) ]]; then basher-help install - echo "Optional argunment [folder] cannot be nested." + echo "Optional argunment [folder] must be in the format <...>/<...>" exit 1 fi - folder="${user}/$2" + folder="$2" fi if [ -z "$package" ]; then From 756c18f9f9f3b4306998a4d25c66776df4d9deb1 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 11:50:05 +0100 Subject: [PATCH 04/15] Fix basher clone tests --- libexec/basher-_clone | 2 +- tests/basher-_clone.bats | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libexec/basher-_clone b/libexec/basher-_clone index 1c637ef..15c0b37 100755 --- a/libexec/basher-_clone +++ b/libexec/basher-_clone @@ -6,7 +6,7 @@ set -e -if [ "$#" -lt 3 -a "$#" -gt 5 ]; then +if [ "$#" -lt 3 -o "$#" -gt 5 ]; then basher-help _clone exit 1 fi diff --git a/tests/basher-_clone.bats b/tests/basher-_clone.bats index 8eb6941..d14f434 100644 --- a/tests/basher-_clone.bats +++ b/tests/basher-_clone.bats @@ -5,19 +5,19 @@ load test_helper @test "without arguments prints usage" { run basher-_clone assert_failure - assert_line "Usage: basher _clone []" + assert_line "Usage: basher _clone [] [folder]" } @test "invalid package prints usage" { run basher-_clone false github.com invalid_package assert_failure - assert_line "Usage: basher _clone []" + assert_line "Usage: basher _clone [] [folder]" } @test "too many arguments prints usage" { - run basher-_clone false site a/b ref fourth_arg + run basher-_clone false site a/b ref folder fifth_arg assert_failure - assert_line "Usage: basher _clone []" + assert_line "Usage: basher _clone [] [folder]" } @test "install a specific version" { From 1f0eb02a3ae571447e22311c8f1dea6a79cea2d9 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 11:55:27 +0100 Subject: [PATCH 05/15] Fix too many arguments test in bats install --- tests/basher-install.bats | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/basher-install.bats b/tests/basher-install.bats index 3d92d2e..27db484 100644 --- a/tests/basher-install.bats +++ b/tests/basher-install.bats @@ -5,19 +5,19 @@ load test_helper @test "without arguments prints usage" { run basher-install assert_failure - assert_line "Usage: basher install [--ssh] [site]/[@ref]" + assert_line "Usage: basher install [--ssh] [site]/[@ref] [folder]" } @test "incorrect argument prints usage" { run basher-install first_arg assert_failure - assert_line "Usage: basher install [--ssh] [site]/[@ref]" + assert_line "Usage: basher install [--ssh] [site]/[@ref] [folder]" } @test "too many arguments prints usage" { - run basher-install a/b wrong + run basher-install a/b folder wrong assert_failure - assert_line "Usage: basher install [--ssh] [site]/[@ref]" + assert_line "Usage: basher install [--ssh] [site]/[@ref] [folder]" } @test "executes install steps in right order" { From f693026ac74078cba8701bdbec59e1019fdde99b Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:01:05 +0100 Subject: [PATCH 06/15] Make extra parameters provided to basher clone optional --- libexec/basher-install | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libexec/basher-install b/libexec/basher-install index e41e4da..526f5aa 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -63,7 +63,16 @@ else ref="" fi -basher-_clone "$use_ssh" "$site" "$package" "$ref" "$folder" +# Call basher-_clone with appropriate number of parameters +if [ -z "$ref" ] && [ "$folder" = "$package" ]; then + basher-_clone "$use_ssh" "$site" "$package" +elif [ -n "$ref" ] && [ "$folder" = "$package" ]; then + basher-_clone "$use_ssh" "$site" "$package" "$ref" +else + basher-_clone "$use_ssh" "$site" "$package" "$ref" "$folder" +fi + +# Use folder for subsequent operations basher-_deps "$folder" basher-_link-bins "$folder" basher-_link-man "$folder" From e4fea83da3cec5f201d6c8f07374908ad7813009 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:07:26 +0100 Subject: [PATCH 07/15] basher install tests running fine --- libexec/basher-install | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libexec/basher-install b/libexec/basher-install index 526f5aa..2ac082e 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -31,6 +31,7 @@ fi # defaults to package's name, but allows custom folder name folder="$package" +custom_folder=false if [ -n "$2" ]; then if [[ "$2" != *([^/])/*([^/]) ]]; then basher-help install @@ -38,6 +39,7 @@ if [ -n "$2" ]; then exit 1 fi folder="$2" + custom_folder=true fi if [ -z "$package" ]; then @@ -64,11 +66,15 @@ else fi # Call basher-_clone with appropriate number of parameters -if [ -z "$ref" ] && [ "$folder" = "$package" ]; then - basher-_clone "$use_ssh" "$site" "$package" -elif [ -n "$ref" ] && [ "$folder" = "$package" ]; then - basher-_clone "$use_ssh" "$site" "$package" "$ref" +if [ "$custom_folder" = "false" ]; then + # No custom folder - use original behavior + if [ -z "$ref" ]; then + basher-_clone "$use_ssh" "$site" "$package" + else + basher-_clone "$use_ssh" "$site" "$package" "$ref" + fi else + # Custom folder specified - pass all parameters basher-_clone "$use_ssh" "$site" "$package" "$ref" "$folder" fi From db1957368cbf7587cd934faab80fdc40c23d9665 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:11:31 +0100 Subject: [PATCH 08/15] Usage update for basher-list tests --- tests/basher-list.bats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basher-list.bats b/tests/basher-list.bats index 49817a6..4ec769b 100644 --- a/tests/basher-list.bats +++ b/tests/basher-list.bats @@ -5,7 +5,7 @@ load test_helper @test "with arguments shows usage" { run basher-list a_arg assert_failure - assert_line "Usage: basher list" + assert_line "Usage: basher list [-v]" } @test "list installed packages" { From 607070ed9a3170121aaf29e51751a1329b65f3ec Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:26:05 +0100 Subject: [PATCH 09/15] Add list tests for verbose option --- tests/basher-list.bats | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/basher-list.bats b/tests/basher-list.bats index 4ec769b..aa13a2d 100644 --- a/tests/basher-list.bats +++ b/tests/basher-list.bats @@ -22,3 +22,36 @@ load test_helper assert_line "username2/p2" refute_line "username2/p3" } + +@test "list installed packages with verbose flag shows remote URLs" { + mock_clone + create_package username/p1 + create_package username2/p2 + basher-install username/p1 + basher-install username2/p2 + + run basher-list -v + assert_success + # Check that output contains package names in the verbose format + # The format is: package-name (remote-url) + assert_output --regexp "username/p1 +\(/tmp/basher/origin/username/p1\)" + assert_output --regexp "username2/p2 +\(/tmp/basher/origin/username2/p2\)" +} + +@test "verbose flag with arguments shows usage" { + run basher-list -v extra_arg + assert_failure + assert_line "Usage: basher list [-v]" +} + +@test "displays nothing if there are no packages" { + run basher-list + assert_success + assert_output "" +} + +@test "displays nothing if there are no packages with verbose flag" { + run basher-list -v + assert_success + assert_output "" +} From 8ca113ac370a3b319b9362276a25c2988f7aead0 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:40:32 +0100 Subject: [PATCH 10/15] Add basher install tests --- tests/basher-install.bats | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/basher-install.bats b/tests/basher-install.bats index 27db484..3841dbe 100644 --- a/tests/basher-install.bats +++ b/tests/basher-install.bats @@ -102,3 +102,42 @@ basher-_link-completions username/package" run basher-install username/package assert_success } + +@test "installs package with custom folder name" { + mock_command basher-_clone + mock_command basher-_deps + mock_command basher-_link-bins + mock_command basher-_link-man + mock_command basher-_link-completions + + run basher-install username/package my/folder + + assert_line "basher-_clone false github.com username/package my/folder" + assert_line "basher-_deps my/folder" + assert_line "basher-_link-bins my/folder" + assert_line "basher-_link-man my/folder" + assert_line "basher-_link-completions my/folder" +} + +@test "installs package with custom folder name and version" { + mock_command basher-_clone + mock_command basher-_deps + mock_command basher-_link-bins + mock_command basher-_link-man + mock_command basher-_link-completions + + run basher-install username/package@v1.2.3 my/folder + + assert_line "basher-_clone false github.com username/package v1.2.3 my/folder" + assert_line "basher-_deps my/folder" + assert_line "basher-_link-bins my/folder" + assert_line "basher-_link-man my/folder" + assert_line "basher-_link-completions my/folder" +} + + +@test "rejects invalid custom folder name format" { + run basher-install username/package invalid-folder + assert_failure + assert_line "Optional argunment [folder] must be in the format <...>/<...>" +} From 7a66d03db9705b1eadc19e8257364b802581aaae Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:52:45 +0100 Subject: [PATCH 11/15] Add tests for basher-clone --- libexec/basher-_clone | 2 +- tests/basher-_clone.bats | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libexec/basher-_clone b/libexec/basher-_clone index 15c0b37..1070ff8 100755 --- a/libexec/basher-_clone +++ b/libexec/basher-_clone @@ -55,7 +55,7 @@ if [ -z "$folder" ]; then fi if [ -e "$BASHER_PACKAGES_PATH/$folder" ]; then - echo "Package '$package' is already present" + echo "Folder '$folder' already exists" exit 0 fi diff --git a/tests/basher-_clone.bats b/tests/basher-_clone.bats index d14f434..b90ec55 100644 --- a/tests/basher-_clone.bats +++ b/tests/basher-_clone.bats @@ -34,7 +34,7 @@ load test_helper run basher-_clone false github.com username/package assert_success - assert_output "Package 'username/package' is already present" + assert_output "Folder 'username/package' already exists" } @test "using a different site" { @@ -79,3 +79,36 @@ load test_helper assert_success assert_output "git clone --depth=1 --recursive git@site:username/package.git ${BASHER_PACKAGES_PATH}/username/package" } + +@test "clones to custom folder" { + mock_command git + + run basher-_clone false github.com username/package "" custom/folder + assert_success + assert_output "git clone --depth=1 --recursive https://github.com/username/package.git ${BASHER_PACKAGES_PATH}/custom/folder" +} + +@test "clones to custom folder with version" { + mock_command git + + run basher-_clone false github.com username/package v1.2.3 custom/folder + assert_success + assert_output "git clone --depth=1 -b v1.2.3 --recursive https://github.com/username/package.git ${BASHER_PACKAGES_PATH}/custom/folder" +} + +@test "custom folder defaults to package name when not specified" { + mock_command git + + run basher-_clone false github.com username/package "" "" + assert_success + assert_output "git clone --depth=1 --recursive https://github.com/username/package.git ${BASHER_PACKAGES_PATH}/username/package" +} + +@test "does nothing if custom folder already exists" { + mkdir -p "$BASHER_PACKAGES_PATH/custom/folder" + + run basher-_clone false github.com username/package "" custom/folder + + assert_success + assert_output "Folder 'custom/folder' already exists" +} From b8fa82f53ec5f91f659f2ef879202394da9dbb71 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Wed, 9 Jul 2025 12:57:37 +0100 Subject: [PATCH 12/15] Update README.md --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9536bca..1bb6f62 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,16 @@ access to the site, use `--ssh` to override the protocol: $ basher install --ssh juanibiapina/gg ~~~ +### Installing with a custom folder name + +You can install a package with a custom folder name by providing a second argument: + +~~~ sh +$ basher install sstephenson/bats bats-core/bats +~~~ + +This will install the package into `~/.basher/packages/bats-core/bats` instead of the default location. And it will appear in `basher list` as `bats-core/bats`. + ### Installing a local package If you develop a package locally and want to try it through basher, @@ -119,8 +129,9 @@ This will source a file `lib/file.sh` under the package `username/repo`. - `basher commands` - List commands - `basher help ` - Display help for a command +- `basher install [--ssh] [site]/[@ref] [folder]` - Install a package - `basher uninstall ` - Uninstall a package -- `basher list` - List installed packages +- `basher list [-v]` - List installed packages - `basher outdated` - List packages which are not in the latest version - `basher upgrade ` - Upgrade a package to the latest version From fcfb12de227ffdccaca435f1a63cae7a4ad1ff72 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Thu, 10 Jul 2025 09:05:20 +0100 Subject: [PATCH 13/15] Fix regex so it works on older bash versions --- libexec/basher-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/basher-install b/libexec/basher-install index 2ac082e..c1cd136 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -33,7 +33,7 @@ fi folder="$package" custom_folder=false if [ -n "$2" ]; then - if [[ "$2" != *([^/])/*([^/]) ]]; then + if ! [[ "$2" =~ ^[^/]+/[^/]+$ ]]; then basher-help install echo "Optional argunment [folder] must be in the format <...>/<...>" exit 1 From eaf1ce0872e7817f95fad94456fcb5b9037d3a94 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Thu, 10 Jul 2025 09:05:20 +0100 Subject: [PATCH 14/15] Fix regex so it works on older bash versions --- libexec/basher-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/basher-install b/libexec/basher-install index 2ac082e..c1cd136 100755 --- a/libexec/basher-install +++ b/libexec/basher-install @@ -33,7 +33,7 @@ fi folder="$package" custom_folder=false if [ -n "$2" ]; then - if [[ "$2" != *([^/])/*([^/]) ]]; then + if ! [[ "$2" =~ ^[^/]+/[^/]+$ ]]; then basher-help install echo "Optional argunment [folder] must be in the format <...>/<...>" exit 1 From d72db88e5ea396a7423f903ebe531b39651057a5 Mon Sep 17 00:00:00 2001 From: ChadThackray Date: Thu, 10 Jul 2025 09:19:33 +0100 Subject: [PATCH 15/15] Change test to use env var for install location folder rather than hardcode --- tests/basher-list.bats | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/basher-list.bats b/tests/basher-list.bats index aa13a2d..88ababe 100644 --- a/tests/basher-list.bats +++ b/tests/basher-list.bats @@ -34,8 +34,8 @@ load test_helper assert_success # Check that output contains package names in the verbose format # The format is: package-name (remote-url) - assert_output --regexp "username/p1 +\(/tmp/basher/origin/username/p1\)" - assert_output --regexp "username2/p2 +\(/tmp/basher/origin/username2/p2\)" + assert_output --regexp "username/p1 +\(${BASHER_ORIGIN_DIR}/username/p1\)" + assert_output --regexp "username2/p2 +\(${BASHER_ORIGIN_DIR}/username2/p2\)" } @test "verbose flag with arguments shows usage" {