Skip to content

Commit d49b666

Browse files
committed
fix: Upgrades remove symlinks when removes from underlying repository. Closes #17
1 parent 432186c commit d49b666

12 files changed

+190
-44
lines changed

pkg/lib/commands/do-install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ do-install() {
2222

2323
log.info "Installing '$repoSpec'"
2424
do-plumbing-clone "$uri" "$package" $ref
25-
do-plumbing-deps "$package"
25+
do-plumbing-add-deps "$package"
2626
do-plumbing-link-bins "$package"
2727
do-plumbing-link-completions "$package"
2828
do-plumbing-link-man "$package"

pkg/lib/commands/do-link.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ do-link() {
3131

3232
log.info "Linking '$directory'"
3333
if [ "$install_deps" = 'yes' ]; then
34-
do-plumbing-deps "$package"
34+
do-plumbing-add-deps "$package"
3535
fi
3636
do-plumbing-link-bins "$package"
3737
do-plumbing-link-completions "$package"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# shellcheck shell=bash
2+
3+
# @summary: Globally installs package runtime dependencies.
4+
# It installs the package dependencies, specified with the
5+
# DEPS= variable on package.sh.
6+
# Usage: bpm _deps <package>
7+
# Example: DEPS=username/repo1:otheruser/repo2
8+
9+
do-plumbing-add-deps() {
10+
local package="$1"
11+
ensure.non_zero 'package' "$package"
12+
ensure.package_exists "$package"
13+
14+
local -a deps=()
15+
16+
local bpm_toml_file="$BPM_PACKAGES_PATH/$package/bpm.toml"
17+
local package_sh_file="$BPM_PACKAGES_PATH/$package/package.sh"
18+
19+
if [ -f "$bpm_toml_file" ]; then
20+
if util.get_toml_array "$bpm_toml_file" 'dependencies'; then
21+
deps=("${REPLIES[@]}")
22+
fi
23+
elif [ -f "$package_sh_file" ]; then
24+
if util.extract_shell_variable "$package_sh_file" 'DEPS'; then
25+
IFS=':' read -ra deps <<< "$REPLY"
26+
fi
27+
fi
28+
29+
log.info "Installing dependencies for '$package'"
30+
for dep in "${deps[@]}"; do
31+
do-install "$dep"
32+
done
33+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# shellcheck shell=bash
2+
3+
do-plumbing-remove-deps() {
4+
local package="$1"
5+
ensure.non_zero 'package' "$package"
6+
ensure.package_exists "$package"
7+
8+
local -a deps=()
9+
10+
local bpm_toml_file="$BPM_PACKAGES_PATH/$package/bpm.toml"
11+
local package_sh_file="$BPM_PACKAGES_PATH/$package/package.sh"
12+
13+
if [ -f "$bpm_toml_file" ]; then
14+
if util.get_toml_array "$bpm_toml_file" 'dependencies'; then
15+
deps=("${REPLIES[@]}")
16+
fi
17+
elif [ -f "$package_sh_file" ]; then
18+
if util.extract_shell_variable "$package_sh_file" 'DEPS'; then
19+
IFS=':' read -ra deps <<< "$REPLY"
20+
fi
21+
fi
22+
23+
# TODO: bug: this removes dependencies specified with incorrect URLs
24+
log.info "Removing dependencies for '$package'"
25+
for dep in "${deps[@]}"; do
26+
util.construct_clone_url "$repoSpec" "$with_ssh"
27+
local uri="$REPLY1"
28+
local package="$REPLY2"
29+
30+
rm -rf "${BPM_PACKAGES_PATH:?}/$package"
31+
done
32+
}

pkg/lib/commands/do-uninstall.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ do-uninstall() {
66
fi
77

88
for repoSpec; do
9+
# If is local directory
910
if [ -d "$repoSpec" ]; then
1011
local fullPath=
1112
fullPath="$(util.readlink "$repoSpec")"
1213
fullPath="${fullPath%/}"
1314

1415
local user="${fullPath%/*}"; user="${user##*/}"
1516
local repository="${fullPath##*/}"
16-
if [ "$fullPath" == "$BPM_PACKAGES_PATH/$user/$repository" ]; then
17+
if [ "$fullPath" = "$BPM_PACKAGES_PATH/$user/$repository" ]; then
1718
do_actual_uninstall "$user/$repository"
1819
fi
1920
else

pkg/lib/commands/do-upgrade.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,17 @@ do-upgrade() {
99
local site= user= repository= ref=
1010
util.parse_package_full "$repoSpec"
1111
IFS=':' read -r site user repository ref <<< "$REPLY"
12+
local package="$user/$repository"
1213

1314
log.info "Upgrading '$repoSpec'"
15+
do-plumbing-remove-deps "$package"
16+
do-plumbing-unlink-bins "$package"
17+
do-plumbing-unlink-completions "$package"
18+
do-plumbing-unlink-man "$package"
1419
git -C "$BPM_PACKAGES_PATH/$user/$repository" pull
20+
do-plumbing-add-deps "$package"
21+
do-plumbing-link-bins "$package"
22+
do-plumbing-link-completions "$package"
23+
do-plumbing-link-man "$package"
1524
done
1625
}

tests/do-install.bats

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ load 'util/init.sh'
44

55
@test "fails when no packages are specified" {
66
test_util.mock_command do-plumbing-clone
7-
test_util.mock_command do-plumbing-deps
7+
test_util.mock_command do-plumbing-add-deps
88
test_util.mock_command do-plumbing-link-bins
99
test_util.mock_command do-plumbing-link-completions
1010
test_util.mock_command do-plumbing-link-man
@@ -17,7 +17,7 @@ load 'util/init.sh'
1717

1818
@test "executes install steps in right order" {
1919
test_util.mock_command do-plumbing-clone
20-
test_util.mock_command do-plumbing-deps
20+
test_util.mock_command do-plumbing-add-deps
2121
test_util.mock_command do-plumbing-link-bins
2222
test_util.mock_command do-plumbing-link-completions
2323
test_util.mock_command do-plumbing-link-man
@@ -27,15 +27,15 @@ load 'util/init.sh'
2727
assert_success
2828
assert_line -n 0 -p "Installing 'username/package'"
2929
assert_line -n 1 'do-plumbing-clone https://github.com/username/package.git username/package'
30-
assert_line -n 2 'do-plumbing-deps username/package'
30+
assert_line -n 2 'do-plumbing-add-deps username/package'
3131
assert_line -n 3 'do-plumbing-link-bins username/package'
3232
assert_line -n 4 'do-plumbing-link-completions username/package'
3333
assert_line -n 5 'do-plumbing-link-man username/package'
3434
}
3535

3636
@test "executes install steps in right order for multiple packages" {
3737
test_util.mock_command do-plumbing-clone
38-
test_util.mock_command do-plumbing-deps
38+
test_util.mock_command do-plumbing-add-deps
3939
test_util.mock_command do-plumbing-link-bins
4040
test_util.mock_command do-plumbing-link-completions
4141
test_util.mock_command do-plumbing-link-man
@@ -45,13 +45,13 @@ load 'util/init.sh'
4545
assert_success
4646
assert_line -n 0 -p "Installing 'username/package'"
4747
assert_line -n 1 'do-plumbing-clone https://github.com/username/package.git username/package'
48-
assert_line -n 2 'do-plumbing-deps username/package'
48+
assert_line -n 2 'do-plumbing-add-deps username/package'
4949
assert_line -n 3 'do-plumbing-link-bins username/package'
5050
assert_line -n 4 'do-plumbing-link-completions username/package'
5151
assert_line -n 5 'do-plumbing-link-man username/package'
5252
assert_line -n 6 -p "Installing 'username2/package2'"
5353
assert_line -n 7 'do-plumbing-clone https://github.com/username2/package2.git username2/package2'
54-
assert_line -n 8 'do-plumbing-deps username2/package2'
54+
assert_line -n 8 'do-plumbing-add-deps username2/package2'
5555
assert_line -n 9 'do-plumbing-link-bins username2/package2'
5656
assert_line -n 10 'do-plumbing-link-completions username2/package2'
5757
assert_line -n 11 'do-plumbing-link-man username2/package2'
@@ -60,7 +60,7 @@ load 'util/init.sh'
6060

6161
@test "uses longhand (https) site to clone from, if specified" {
6262
test_util.mock_command do-plumbing-clone
63-
test_util.mock_command do-plumbing-deps
63+
test_util.mock_command do-plumbing-add-deps
6464
test_util.mock_command do-plumbing-link-bins
6565
test_util.mock_command do-plumbing-link-completions
6666
test_util.mock_command do-plumbing-link-man
@@ -73,7 +73,7 @@ load 'util/init.sh'
7373

7474
@test "uses longhand (http) site to clone from, if specified" {
7575
test_util.mock_command do-plumbing-clone
76-
test_util.mock_command do-plumbing-deps
76+
test_util.mock_command do-plumbing-add-deps
7777
test_util.mock_command do-plumbing-link-bins
7878
test_util.mock_command do-plumbing-link-completions
7979
test_util.mock_command do-plumbing-link-man
@@ -86,7 +86,7 @@ load 'util/init.sh'
8686

8787
@test "uses shorthand site to clone from, if specified" {
8888
test_util.mock_command do-plumbing-clone
89-
test_util.mock_command do-plumbing-deps
89+
test_util.mock_command do-plumbing-add-deps
9090
test_util.mock_command do-plumbing-link-bins
9191
test_util.mock_command do-plumbing-link-completions
9292
test_util.mock_command do-plumbing-link-man
@@ -99,7 +99,7 @@ load 'util/init.sh'
9999

100100
@test "uses GitHub as default site, if not specified" {
101101
test_util.mock_command do-plumbing-clone
102-
test_util.mock_command do-plumbing-deps
102+
test_util.mock_command do-plumbing-add-deps
103103
test_util.mock_command do-plumbing-link-bins
104104
test_util.mock_command do-plumbing-link-completions
105105
test_util.mock_command do-plumbing-link-man
@@ -112,7 +112,7 @@ load 'util/init.sh'
112112

113113
@test "uses ssh protocol, when specified" {
114114
test_util.mock_command do-plumbing-clone
115-
test_util.mock_command do-plumbing-deps
115+
test_util.mock_command do-plumbing-add-deps
116116
test_util.mock_command do-plumbing-link-bins
117117
test_util.mock_command do-plumbing-link-completions
118118
test_util.mock_command do-plumbing-link-man
@@ -125,7 +125,7 @@ load 'util/init.sh'
125125

126126
@test "uses ssh protocol raw, when specified" {
127127
test_util.mock_command do-plumbing-clone
128-
test_util.mock_command do-plumbing-deps
128+
test_util.mock_command do-plumbing-add-deps
129129
test_util.mock_command do-plumbing-link-bins
130130
test_util.mock_command do-plumbing-link-completions
131131
test_util.mock_command do-plumbing-link-man
@@ -138,7 +138,7 @@ load 'util/init.sh'
138138

139139
@test "uses custom version, when specified" {
140140
test_util.mock_command do-plumbing-clone
141-
test_util.mock_command do-plumbing-deps
141+
test_util.mock_command do-plumbing-add-deps
142142
test_util.mock_command do-plumbing-link-bins
143143
test_util.mock_command do-plumbing-link-completions
144144
test_util.mock_command do-plumbing-link-man
@@ -151,7 +151,7 @@ load 'util/init.sh'
151151

152152
@test "does not use custom version, when not specified" {
153153
test_util.mock_command do-plumbing-clone
154-
test_util.mock_command do-plumbing-deps
154+
test_util.mock_command do-plumbing-add-deps
155155
test_util.mock_command do-plumbing-link-bins
156156
test_util.mock_command do-plumbing-link-completions
157157
test_util.mock_command do-plumbing-link-man

tests/do-link.bats

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ load 'util/init.sh'
1919
}
2020

2121
@test "fails if package already present" {
22-
test_util.mock_command do-plumbing-deps
22+
test_util.mock_command do-plumbing-add-deps
2323
test_util.mock_command do-plumbing-link-bins
2424
test_util.mock_command do-plumbing-link-completions
2525
test_util.mock_command do-plumbing-link-man
@@ -35,7 +35,7 @@ load 'util/init.sh'
3535
}
3636

3737
@test "fails if package already present (as erroneous file)" {
38-
test_util.mock_command do-plumbing-deps
38+
test_util.mock_command do-plumbing-add-deps
3939
test_util.mock_command do-plumbing-link-bins
4040
test_util.mock_command do-plumbing-link-completions
4141
test_util.mock_command do-plumbing-link-man
@@ -51,7 +51,7 @@ load 'util/init.sh'
5151
}
5252

5353
@test "links the package to packages under the correct namespace" {
54-
test_util.mock_command do-plumbing-deps
54+
test_util.mock_command do-plumbing-add-deps
5555
test_util.mock_command do-plumbing-link-bins
5656
test_util.mock_command do-plumbing-link-completions
5757
test_util.mock_command do-plumbing-link-man
@@ -65,7 +65,7 @@ load 'util/init.sh'
6565
}
6666

6767
@test "calls link-bins, link-completions, link-man and deps in order" {
68-
test_util.mock_command do-plumbing-deps
68+
test_util.mock_command do-plumbing-add-deps
6969
test_util.mock_command do-plumbing-link-bins
7070
test_util.mock_command do-plumbing-link-completions
7171
test_util.mock_command do-plumbing-link-man
@@ -76,15 +76,15 @@ load 'util/init.sh'
7676

7777
assert_success
7878
assert_line -n 0 -e "Linking '/(.*)/bpm/cwd/package2'"
79-
assert_line -n 1 "do-plumbing-deps bpm-local/package2"
79+
assert_line -n 1 "do-plumbing-add-deps bpm-local/package2"
8080
assert_line -n 2 "do-plumbing-link-bins bpm-local/package2"
8181
assert_line -n 3 "do-plumbing-link-completions bpm-local/package2"
8282
assert_line -n 4 "do-plumbing-link-man bpm-local/package2"
8383

8484
}
8585

8686
@test "respects --no-deps option, in order, with --nodeps" {
87-
test_util.mock_command do-plumbing-deps
87+
test_util.mock_command do-plumbing-add-deps
8888
test_util.mock_command do-plumbing-link-bins
8989
test_util.mock_command do-plumbing-link-completions
9090
test_util.mock_command do-plumbing-link-man
@@ -102,7 +102,7 @@ load 'util/init.sh'
102102

103103

104104
@test "respects --no-deps option" {
105-
test_util.mock_command do-plumbing-deps
105+
test_util.mock_command do-plumbing-add-deps
106106
test_util.mock_command do-plumbing-link-bins
107107
test_util.mock_command do-plumbing-link-completions
108108
test_util.mock_command do-plumbing-link-man
@@ -112,11 +112,11 @@ load 'util/init.sh'
112112
run do-link --no-deps package2
113113

114114
assert_success
115-
refute_line "do-plumbing-deps bpm-local/package2"
115+
refute_line "do-plumbing-add-deps bpm-local/package2"
116116
}
117117

118118
@test "resolves current directory (dot) path" {
119-
test_util.mock_command do-plumbing-deps
119+
test_util.mock_command do-plumbing-add-deps
120120
test_util.mock_command do-plumbing-link-bins
121121
test_util.mock_command do-plumbing-link-completions
122122
test_util.mock_command do-plumbing-link-man
@@ -131,7 +131,7 @@ load 'util/init.sh'
131131
}
132132

133133
@test "resolves parent directory (dotdot) path" {
134-
test_util.mock_command do-plumbing-deps
134+
test_util.mock_command do-plumbing-add-deps
135135
test_util.mock_command do-plumbing-link-bins
136136
test_util.mock_command do-plumbing-link-completions
137137
test_util.mock_command do-plumbing-link-man
@@ -146,7 +146,7 @@ load 'util/init.sh'
146146
}
147147

148148
@test "resolves arbitrary complex relative path" {
149-
test_util.mock_command do-plumbing-deps
149+
test_util.mock_command do-plumbing-add-deps
150150
test_util.mock_command do-plumbing-link-bins
151151
test_util.mock_command do-plumbing-link-completions
152152
test_util.mock_command do-plumbing-link-man

tests/do-plumbing-deps.bats

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ load 'util/init.sh'
99
test_util.fake_clone "$package"
1010

1111
test_util.mock_command do-install
12-
run do-plumbing-deps "$package"
12+
run do-plumbing-add-deps "$package"
1313

1414
assert_success ""
1515
}
@@ -26,7 +26,7 @@ load 'util/init.sh'
2626
test_util.fake_clone "$package"
2727

2828
test_util.mock_command do-install
29-
run do-plumbing-deps "$package"
29+
run do-plumbing-add-deps "$package"
3030

3131
assert_success
3232
assert_line "do-install user/dep1"
@@ -45,7 +45,7 @@ load 'util/init.sh'
4545
test_util.fake_clone "$package"
4646

4747
test_util.mock_command do-install
48-
run do-plumbing-deps "$package"
48+
run do-plumbing-add-deps "$package"
4949

5050
assert_success
5151
assert_line "do-install user/dep1"
@@ -65,7 +65,7 @@ load 'util/init.sh'
6565
test_util.fake_clone "$package"
6666

6767
test_util.mock_command do-install
68-
run do-plumbing-deps "$package"
68+
run do-plumbing-add-deps "$package"
6969

7070
assert_success
7171
assert_line "do-install user/good_dep"

0 commit comments

Comments
 (0)