Skip to content

Commit 505b3ea

Browse files
authored
Fix removing symlink to a directory when processing data-dirs option (#575)
1 parent 6eb746e commit 505b3ea

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

src/builder/guard.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::path::Path;
2-
use std::fs::{remove_dir_all, remove_file};
2+
use std::fs::{remove_dir_all, remove_file, symlink_metadata};
33
use std::collections::HashMap;
44

55
use crate::build_step::BuildStep;
@@ -198,7 +198,11 @@ fn remove_all_except(root: &Path, keep_rel_paths: &HashMap<&Path, bool>)
198198
remove_all_except(path, keep_rel_paths)?;
199199
},
200200
None => {
201-
if path.is_dir() {
201+
let file_type = try_msg!(
202+
symlink_metadata(path),
203+
"Error querying file metadata: {path:?}: {err}", path=path
204+
).file_type();
205+
if file_type.is_dir() {
202206
try_msg!(clean_dir(path, true),
203207
"Error cleaning dir {path:?}: {err}",
204208
path=path);

tests/generic.bats

+34-15
Original file line numberDiff line numberDiff line change
@@ -81,21 +81,40 @@ setup() {
8181
assert_equal "$(ls -1 .vagga/remove/opt/ | wc -l)" "0"
8282
}
8383

84-
@test "generic: The data-dirs option works" {
85-
run vagga _build data-container
86-
link=$(readlink .vagga/data-container)
87-
assert_equal "$link" ".roots/data-container.e6da9e30/root"
88-
assert [ -d ".vagga/data-container/etc" ]
89-
assert [ -f ".vagga/data-container/etc/passwd" ]
90-
assert [ -d ".vagga/data-container/var" ]
91-
assert [ -d ".vagga/data-container/var/lib" ]
92-
assert [ -d ".vagga/data-container/var/local" ]
93-
assert [ -f ".vagga/data-container/var/local/hello.txt" ]
94-
assert [ ! -f ".vagga/data-container/var/local/bye.txt" ]
95-
assert_equal "$(ls -1 ".vagga/data-container/" | wc -l)" "2"
96-
assert_equal "$(ls -1 ".vagga/data-container/var" | wc -l)" "2"
97-
assert_equal "$(ls -1 ".vagga/data-container/var/lib" | wc -l)" "3"
98-
assert_equal "$(ls -1 ".vagga/data-container/var/local" | wc -l)" "1"
84+
@test "generic: data-dirs alpine" {
85+
run vagga _build data-container-alpine
86+
container_path=.vagga/data-container-alpine
87+
link=$(readlink $container_path)
88+
assert_equal "$link" ".roots/data-container-alpine.e6da9e30/root"
89+
assert [ -d "$container_path/etc" ]
90+
assert [ -f "$container_path/etc/passwd" ]
91+
assert [ -d "$container_path/var" ]
92+
assert [ -d "$container_path/var/lib" ]
93+
assert [ -d "$container_path/var/local" ]
94+
assert [ -f "$container_path/var/local/hello.txt" ]
95+
assert [ ! -f "$container_path/var/local/bye.txt" ]
96+
assert_equal "$(ls -1 "$container_path/" | wc -l)" "2"
97+
assert_equal "$(ls -1 "$container_path/var" | wc -l)" "2"
98+
assert_equal "$(ls -1 "$container_path/var/lib" | wc -l)" "3"
99+
assert_equal "$(ls -1 "$container_path/var/local" | wc -l)" "1"
100+
}
101+
102+
@test "generic: data-dirs ubuntu" {
103+
run vagga _build data-container-ubuntu
104+
container_path=.vagga/data-container-ubuntu
105+
link=$(readlink $container_path)
106+
assert_equal "$link" ".roots/data-container-ubuntu.ee7a0504/root"
107+
assert [ -d "$container_path/etc" ]
108+
assert [ -f "$container_path/etc/passwd" ]
109+
assert [ -d "$container_path/var" ]
110+
assert [ -d "$container_path/var/lib" ]
111+
assert [ -d "$container_path/var/local" ]
112+
assert [ -f "$container_path/var/local/hello.txt" ]
113+
assert [ ! -f "$container_path/var/local/bye.txt" ]
114+
assert_equal "$(ls -1 "$container_path/" | wc -l)" "2"
115+
assert_equal "$(ls -1 "$container_path/var" | wc -l)" "2"
116+
assert_equal "$(ls -1 "$container_path/var/lib" | wc -l)" "5"
117+
assert_equal "$(ls -1 "$container_path/var/local" | wc -l)" "1"
99118
}
100119

101120
@test "generic: The supervise command works" {

tests/generic/vagga.yaml

+9-1
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,22 @@ containers:
7878
- !Remove /opt/test_dir
7979
- !Remove /opt/test_symlink
8080

81-
data-container:
81+
data-container-alpine:
8282
setup:
8383
- !Alpine v3.4
8484
- !Text
8585
/var/local/hello.txt: Hello world!
8686
- !Sh ln -s /var/local/hello.txt /var/local/bye.txt
8787
data-dirs: [/etc, /var/lib, /var/lib/apk, /var/local/hello.txt]
8888

89+
data-container-ubuntu:
90+
setup:
91+
- !Ubuntu focal
92+
- !Text
93+
/var/local/hello.txt: Hello world!
94+
- !Sh ln -s /var/local/hello.txt /var/local/bye.txt
95+
data-dirs: [/etc, /var/lib, /var/lib/apt, /var/local/hello.txt]
96+
8997
busybox:
9098
setup:
9199
- !Alpine v3.4

0 commit comments

Comments
 (0)