aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-10-04 21:09:45 +0500
committerEgor Tensin <egor@tensin.name>2026-10-04 21:09:45 +0500
commit0fd9d140ca5e2122fc2607b7b4552b49cd3e056d (patch)
treecee0796f6dedd2f6a5f5d0418ee39a63a96f22fd
parentdebian: ditch Vagrant, switch to Docker (diff)
parentworkflows/ci: move AUR setup steps to aur:Makefile (diff)
downloadconfig-links-0fd9d140ca5e2122fc2607b7b4552b49cd3e056d.tar.gz
config-links-0fd9d140ca5e2122fc2607b7b4552b49cd3e056d.zip
Merge tag 'v2.1.10' into debian
v2.1.10
-rw-r--r--.github/workflows/ci.yml44
-rw-r--r--Makefile12
-rw-r--r--prelude.mk6
-rw-r--r--test/data/src/%DEST%/bar/baz/5.txt1
-rw-r--r--test/lib/log.sh13
-rw-r--r--test/lib/test.sh34
-rwxr-xr-xtest/main.sh2
-rw-r--r--test/tst-chmod.sh5
-rw-r--r--test/tst-dir-symlink-delete.sh30
-rw-r--r--test/tst-dir-symlink-remove-shared-file.sh34
-rw-r--r--test/tst-remove-dir-symlink.sh8
-rw-r--r--test/tst-update-chmod.sh1
-rw-r--r--test/tst-update-dir-symlink.sh10
-rw-r--r--test/tst-update-symlink.sh1
-rw-r--r--test/tst-update.sh4
15 files changed, 130 insertions, 75 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f70fc60..20d8729 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,14 +30,19 @@ jobs:
test_docker:
strategy:
matrix:
- # Keep in sync with those in Makefile:
- distro: [xenial, focal]
+ # Keep in sync with those in Makefile & Launchpad:
+ distro:
+ - xenial
+ - bionic
+ - focal
+ - jammy
+ - noble
+ - resolute
runs-on: ubuntu-latest
name: 'Test / Docker / ${{ matrix.distro }}'
steps:
- name: Checkout
uses: actions/checkout@v7
-
- name: Test
run: make 'test/docker/${{ matrix.distro }}'
@@ -52,6 +57,9 @@ jobs:
&& !startsWith(github.ref, 'refs/tags/debian/')
container:
image: archlinux:base-devel
+ env:
+ SSH_KEY: |
+ ${{ secrets.SSH_KEY }}
steps:
# This step must be done before actions/checkout. From the latter's
# output:
@@ -61,39 +69,11 @@ jobs:
- name: Install dependencies
run: |
pacman -Syu --noconfirm git openssh
-
- name: Checkout
uses: actions/checkout@v7
with:
ref: aur
token: '${{ secrets.GH_TOKEN }}'
-
- # makepkg for no reason hard-forbids running as root. Kill me now.
- - name: Add builder user
- run: |
- useradd -m -s /bin/bash builder
- passwd -d builder
- echo 'builder ALL=(ALL) ALL' >> /etc/sudoers
- chown -R builder:builder -- "$GITHUB_WORKSPACE"
-
- - name: Configure SSH
- run: |
- mkdir -p /home/builder/.ssh/
- cat > /home/builder/.ssh/config <<'EOF'
- StrictHostKeyChecking no
- EOF
- cat > /home/builder/.ssh/id_ed25519 <<'EOF'
- ${{ secrets.SSH_KEY }}
- EOF
- chown -R builder:builder /home/builder/.ssh
- chmod 0600 /home/builder/.ssh/id_ed25519
-
- - name: Configure git
- run: |
- # See https://github.com/actions/checkout#push-a-commit-using-the-built-in-token
- runuser -u builder -- git -C "$GITHUB_WORKSPACE" config user.name "github-actions[bot]"
- runuser -u builder -- git -C "$GITHUB_WORKSPACE" config user.email "41898282+github-actions[bot]@users.noreply.github.com"
-
- name: Run maintenance
run: |
- runuser -u builder -- make -C "$GITHUB_WORKSPACE" maintenance
+ make -C "$GITHUB_WORKSPACE" ci
diff --git a/Makefile b/Makefile
index f0bcf58..5434611 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,5 @@
include prelude.mk
-.PHONY: DO
-DO:
-
PKG_NAME ?= config-links
DESTDIR ?=
@@ -25,9 +22,14 @@ test/docker/%: DO
# Xenial has bash 4.3, which doesn't support inherit_errexit, which is a good
# thing to test against.
#
-# Keep the list repositories synced with the GitHub actions workflow.
+# Keep the list distros synced with the GitHub actions workflow & Launchpad.
.PHONY: test/docker
-test/docker: test/docker/xenial test/docker/focal
+test/docker: test/docker/xenial
+test/docker: test/docker/bionic
+test/docker: test/docker/focal
+test/docker: test/docker/jammy
+test/docker: test/docker/noble
+test/docker: test/docker/resolute
.PHONY: install
install:
diff --git a/prelude.mk b/prelude.mk
index da836d7..e0862a5 100644
--- a/prelude.mk
+++ b/prelude.mk
@@ -21,3 +21,9 @@ ifeq ($$(origin $(1)),command line)
override $(1) := $$(value $(1))
endif
endef
+
+# A helper target to force execution of pattern rules (works like .PHONY for
+# them): https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html
+#
+.PHONY: DO
+DO:
diff --git a/test/data/src/%DEST%/bar/baz/5.txt b/test/data/src/%DEST%/bar/baz/5.txt
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/test/data/src/%DEST%/bar/baz/5.txt
@@ -0,0 +1 @@
+5
diff --git a/test/lib/log.sh b/test/lib/log.sh
index b26e16a..242ab31 100644
--- a/test/lib/log.sh
+++ b/test/lib/log.sh
@@ -1,5 +1,5 @@
# Copyright (c) 2026 Egor Tensin <egor@tensin.name>
-# This file is part of the "config-links" project.
+# This file is part of the "Config file sharing" project.
# For details, see https://github.com/egor-tensin/config-links
# Distributed under the MIT License.
@@ -10,6 +10,17 @@ log() {
done
}
+log_run() {
+ if [ "$#" -lt 1 ]; then
+ log "usage: ${FUNCNAME[0]} ARGV0 [ARG...]"
+ return 1
+ fi
+
+ local msg='Running:'
+ msg="$msg$( printf -- ' %q' "$@" )"
+ log "$msg"
+}
+
fail() {
local msg
for msg; do
diff --git a/test/lib/test.sh b/test/lib/test.sh
index 1406a78..400f39a 100644
--- a/test/lib/test.sh
+++ b/test/lib/test.sh
@@ -1,15 +1,11 @@
# Copyright (c) 2026 Egor Tensin <egor@tensin.name>
-# This file is part of the "config-links" project.
+# This file is part of the "Config file sharing" project.
# For details, see https://github.com/egor-tensin/config-links
# Distributed under the MIT License.
test_should_fail=
-
-src_dir_name='src'
-dest_dir_name='dest'
-alt_dest_dir_name='alt_dest'
-
test_root_dir=
+
test_src_dir=
test_dest_dir=
test_alt_dest_dir=
@@ -19,18 +15,18 @@ test_setup() {
# mktemp returns /var/..., which is actually in /private/var/... on macOS.
test_root_dir="$( readlink -e -- "$test_root_dir" )"
- test_src_dir="$test_root_dir/$src_dir_name"
- test_dest_dir="$test_root_dir/$dest_dir_name"
- test_alt_dest_dir="$test_root_dir/$alt_dest_dir_name"
+ test_src_dir="$test_root_dir/src"
+ test_dest_dir="$test_root_dir/dest"
+ test_alt_dest_dir="$test_root_dir/alt_test"
log "Root directory: $test_root_dir"
log "Shared directory: $test_src_dir"
log "%DEST% directory: $test_dest_dir"
log "%ALT_DEST% directory: $test_alt_dest_dir"
- cp -r -- "$script_dir/data/$src_dir_name" "$test_src_dir"
- cp -r -- "$script_dir/data/$dest_dir_name" "$test_dest_dir"
- cp -r -- "$script_dir/data/$dest_dir_name" "$test_alt_dest_dir"
+ cp -r -- "$script_dir/data/src" "$test_src_dir"
+ cp -r -- "$script_dir/data/dest" "$test_dest_dir"
+ cp -r -- "$script_dir/data/dest" "$test_alt_dest_dir"
}
test_setup_symlink() {
@@ -56,13 +52,15 @@ test_cleanup_default() {
}
test_run_script() {
- local msg='Executing script:'
- msg="$msg$( printf -- ' %q' "$@" --shared-dir "$test_src_dir" --database "$test_root_dir/links.bin" )"
- log "$msg"
-
- DEST="$test_dest_dir" ALT_DEST="$test_alt_dest_dir" "$@" \
- --shared-dir "$test_src_dir" \
+ local cmd=(
+ "$@"
+ --shared-dir "$test_src_dir"
--database "$test_root_dir/links.bin"
+ )
+
+ log_run "${cmd[@]}"
+
+ DEST="$test_dest_dir" ALT_DEST="$test_alt_dest_dir" "${cmd[@]}"
}
test_run_update() {
diff --git a/test/main.sh b/test/main.sh
index 52b19ad..76428f5 100755
--- a/test/main.sh
+++ b/test/main.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Copyright (c) 2026 Egor Tensin <egor@tensin.name>
-# This file is part of the "config-links" project.
+# This file is part of the "Config file sharing" project.
# For details, see https://github.com/egor-tensin/config-links
# Distributed under the MIT License.
diff --git a/test/tst-chmod.sh b/test/tst-chmod.sh
index b118e5e..5e26063 100644
--- a/test/tst-chmod.sh
+++ b/test/tst-chmod.sh
@@ -4,14 +4,17 @@ test_run() {
test_setup
test_run_update
- local expected_output="$test_dest_dir->
+ local expected_output
+ expected_output="$test_dest_dir->
$test_dest_dir/1.txt->$test_src_dir/%DEST%/1.txt
$test_dest_dir/bar->
$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
+
test_verify_output "$test_dest_dir" "$expected_output"
log "Verifying 1.txt's (the shared file) permissions..."
diff --git a/test/tst-dir-symlink-delete.sh b/test/tst-dir-symlink-delete.sh
index f53d87c..82de5ab 100644
--- a/test/tst-dir-symlink-delete.sh
+++ b/test/tst-dir-symlink-delete.sh
@@ -5,21 +5,37 @@ test_run() {
test_setup_dir_symlink
test_run_update
- # Remove the directory symlink:
- rm -- "$test_src_dir/%ALT_DEST%"
- test_run_update
-
- local expected_output="$test_dest_dir->
+ local expected_output
+ expected_output="$test_dest_dir->
$test_dest_dir/1.txt->$test_src_dir/%DEST%/1.txt
$test_dest_dir/bar->
$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
test_verify_output "$test_dest_dir" "$expected_output"
- expected_output="$test_alt_dest_dir->"
- test_verify_output "$test_alt_dest_dir" "$expected_output"
+ local expected_alt_output
+ expected_alt_output="$test_alt_dest_dir->
+$test_alt_dest_dir/1.txt->$test_src_dir/%ALT_DEST%/1.txt
+$test_alt_dest_dir/bar->
+$test_alt_dest_dir/bar/3.txt->$test_src_dir/%ALT_DEST%/bar/3.txt
+$test_alt_dest_dir/bar/baz->
+$test_alt_dest_dir/bar/baz/4.txt->$test_src_dir/%ALT_DEST%/bar/baz/4.txt
+$test_alt_dest_dir/bar/baz/5.txt->$test_src_dir/%ALT_DEST%/bar/baz/5.txt
+$test_alt_dest_dir/foo->
+$test_alt_dest_dir/foo/2.txt->$test_src_dir/%ALT_DEST%/foo/2.txt"
+
+ test_verify_output "$test_alt_dest_dir" "$expected_alt_output"
+
+ # Remove the directory symlink:
+ rm -- "$test_src_dir/%ALT_DEST%"
+ test_run_update
+
+ test_verify_output "$test_dest_dir" "$expected_output"
+ expected_alt_output="$test_alt_dest_dir->"
+ test_verify_output "$test_alt_dest_dir" "$expected_alt_output"
}
diff --git a/test/tst-dir-symlink-remove-shared-file.sh b/test/tst-dir-symlink-remove-shared-file.sh
index 3e20ab0..614ca8c 100644
--- a/test/tst-dir-symlink-remove-shared-file.sh
+++ b/test/tst-dir-symlink-remove-shared-file.sh
@@ -4,27 +4,55 @@ test_run() {
test_setup_dir_symlink
test_run_update
+ local expected_output
+ expected_output="$test_dest_dir->
+$test_dest_dir/1.txt->$test_src_dir/%DEST%/1.txt
+$test_dest_dir/bar->
+$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
+$test_dest_dir/bar/baz->
+$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
+$test_dest_dir/foo->
+$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
+
+ test_verify_output "$test_dest_dir" "$expected_output"
+
+ local expected_alt_output
+ expected_alt_output="$test_alt_dest_dir->
+$test_alt_dest_dir/1.txt->$test_src_dir/%ALT_DEST%/1.txt
+$test_alt_dest_dir/bar->
+$test_alt_dest_dir/bar/3.txt->$test_src_dir/%ALT_DEST%/bar/3.txt
+$test_alt_dest_dir/bar/baz->
+$test_alt_dest_dir/bar/baz/4.txt->$test_src_dir/%ALT_DEST%/bar/baz/4.txt
+$test_alt_dest_dir/bar/baz/5.txt->$test_src_dir/%ALT_DEST%/bar/baz/5.txt
+$test_alt_dest_dir/foo->
+$test_alt_dest_dir/foo/2.txt->$test_src_dir/%ALT_DEST%/foo/2.txt"
+
+ test_verify_output "$test_alt_dest_dir" "$expected_alt_output"
+
# Remove a random shared file:
rm -- "$test_src_dir/%DEST%/bar/3.txt"
test_run_update
- local expected_output="$test_dest_dir->
+ expected_output="$test_dest_dir->
$test_dest_dir/1.txt->$test_src_dir/%DEST%/1.txt
$test_dest_dir/bar->
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
test_verify_output "$test_dest_dir" "$expected_output"
- expected_output="$test_alt_dest_dir->
+ expected_alt_output="$test_alt_dest_dir->
$test_alt_dest_dir/1.txt->$test_src_dir/%ALT_DEST%/1.txt
$test_alt_dest_dir/bar->
$test_alt_dest_dir/bar/baz->
$test_alt_dest_dir/bar/baz/4.txt->$test_src_dir/%ALT_DEST%/bar/baz/4.txt
+$test_alt_dest_dir/bar/baz/5.txt->$test_src_dir/%ALT_DEST%/bar/baz/5.txt
$test_alt_dest_dir/foo->
$test_alt_dest_dir/foo/2.txt->$test_src_dir/%ALT_DEST%/foo/2.txt"
- test_verify_output "$test_alt_dest_dir" "$expected_output"
+ test_verify_output "$test_alt_dest_dir" "$expected_alt_output"
}
diff --git a/test/tst-remove-dir-symlink.sh b/test/tst-remove-dir-symlink.sh
index c524ee6..e9bcc67 100644
--- a/test/tst-remove-dir-symlink.sh
+++ b/test/tst-remove-dir-symlink.sh
@@ -5,9 +5,11 @@ test_run() {
test_run_update
test_run_remove
- local expected_output="$test_dest_dir->"
+ local expected_output
+ expected_output="$test_dest_dir->"
test_verify_output "$test_dest_dir" "$expected_output"
- expected_output="$test_alt_dest_dir->"
- test_verify_output "$test_alt_dest_dir" "$expected_output"
+ local expected_alt_output
+ expected_alt_output="$test_alt_dest_dir->"
+ test_verify_output "$test_alt_dest_dir" "$expected_alt_output"
}
diff --git a/test/tst-update-chmod.sh b/test/tst-update-chmod.sh
index a78ee15..60774a1 100644
--- a/test/tst-update-chmod.sh
+++ b/test/tst-update-chmod.sh
@@ -11,6 +11,7 @@ $test_dest_dir/bar->
$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
diff --git a/test/tst-update-dir-symlink.sh b/test/tst-update-dir-symlink.sh
index 27418ab..3bc4296 100644
--- a/test/tst-update-dir-symlink.sh
+++ b/test/tst-update-dir-symlink.sh
@@ -5,25 +5,29 @@ test_run() {
test_setup_dir_symlink
test_run_update
- local expected_output="$test_dest_dir->
+ local expected_output
+ expected_output="$test_dest_dir->
$test_dest_dir/1.txt->$test_src_dir/%DEST%/1.txt
$test_dest_dir/bar->
$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
test_verify_output "$test_dest_dir" "$expected_output"
- expected_output="$test_alt_dest_dir->
+ local expected_alt_output
+ expected_alt_output="$test_alt_dest_dir->
$test_alt_dest_dir/1.txt->$test_src_dir/%ALT_DEST%/1.txt
$test_alt_dest_dir/bar->
$test_alt_dest_dir/bar/3.txt->$test_src_dir/%ALT_DEST%/bar/3.txt
$test_alt_dest_dir/bar/baz->
$test_alt_dest_dir/bar/baz/4.txt->$test_src_dir/%ALT_DEST%/bar/baz/4.txt
+$test_alt_dest_dir/bar/baz/5.txt->$test_src_dir/%ALT_DEST%/bar/baz/5.txt
$test_alt_dest_dir/foo->
$test_alt_dest_dir/foo/2.txt->$test_src_dir/%ALT_DEST%/foo/2.txt"
- test_verify_output "$test_alt_dest_dir" "$expected_output"
+ test_verify_output "$test_alt_dest_dir" "$expected_alt_output"
}
diff --git a/test/tst-update-symlink.sh b/test/tst-update-symlink.sh
index 6a90491..598e12a 100644
--- a/test/tst-update-symlink.sh
+++ b/test/tst-update-symlink.sh
@@ -11,6 +11,7 @@ $test_dest_dir/bar->
$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"
diff --git a/test/tst-update.sh b/test/tst-update.sh
index f33b929..bcb3ad7 100644
--- a/test/tst-update.sh
+++ b/test/tst-update.sh
@@ -5,12 +5,14 @@ test_run() {
test_setup
test_run_update
- local expected_output="$test_dest_dir->
+ local expected_output
+ expected_output="$test_dest_dir->
$test_dest_dir/1.txt->$test_src_dir/%DEST%/1.txt
$test_dest_dir/bar->
$test_dest_dir/bar/3.txt->$test_src_dir/%DEST%/bar/3.txt
$test_dest_dir/bar/baz->
$test_dest_dir/bar/baz/4.txt->$test_src_dir/%DEST%/bar/baz/4.txt
+$test_dest_dir/bar/baz/5.txt->$test_src_dir/%DEST%/bar/baz/5.txt
$test_dest_dir/foo->
$test_dest_dir/foo/2.txt->$test_src_dir/%DEST%/foo/2.txt"