[pacman-dev] [PATCH] meson: make our symlinking script more portable
We do not need the --relative case as it is dead code (we only ever link a filename without directory components). For the rest, GNU-specific ln -T does two things: - if the link name is an existing directory, ln fails instead of creating a surprising link inside the directory - if the link name is a symlink to a directory, ln treats it as a file, and due to -f, unlinks it The second case can be portably solved by ln -n, and the first case is not actually currently functional, but we can portably replace the error message with rmdir, so, why not? Signed-off-by: Eli Schwartz <eschwartz@archlinux.org> --- build-aux/meson-make-symlink.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/build-aux/meson-make-symlink.sh b/build-aux/meson-make-symlink.sh index 501cd43d4..27d068efe 100644 --- a/build-aux/meson-make-symlink.sh +++ b/build-aux/meson-make-symlink.sh @@ -5,8 +5,11 @@ set -eu # and we need to create the target directory... mkdir -vp "$(dirname "${DESTDIR:-}$2")" -if [ "$(dirname $1)" = . ]; then - ln -vfs -T "$1" "${DESTDIR:-}$2" -else - ln -vfs -T --relative "${DESTDIR:-}$1" "${DESTDIR:-}$2" + +# ln -T is neither portable, nor useful if we would like to actually succeed +# ln -F is nice, but BSD only +if [ ! -L "${DESTDIR:-}$2" ] && [ -d "${DESTDIR:-}$2" ]; then + rmdir "${DESTDIR:-}$2" fi + +ln -vnfs "$1" "${DESTDIR:-}$2" -- 2.31.1
On 18/4/21 12:42 pm, Eli Schwartz wrote:
We do not need the --relative case as it is dead code (we only ever link a filename without directory components).
For the rest, GNU-specific ln -T does two things:
- if the link name is an existing directory, ln fails instead of creating a surprising link inside the directory - if the link name is a symlink to a directory, ln treats it as a file, and due to -f, unlinks it
The second case can be portably solved by ln -n, and the first case is not actually currently functional, but we can portably replace the error message with rmdir, so, why not?
Can we? That assumes the directory is non-empty and rmdir fails. I don't think removing an empty directory and replacing it with a symlink is expected behaviour. Can we just abort with an error if the target is a directory? Allan
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org> --- build-aux/meson-make-symlink.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/build-aux/meson-make-symlink.sh b/build-aux/meson-make-symlink.sh index 501cd43d4..27d068efe 100644 --- a/build-aux/meson-make-symlink.sh +++ b/build-aux/meson-make-symlink.sh @@ -5,8 +5,11 @@ set -eu # and we need to create the target directory...
mkdir -vp "$(dirname "${DESTDIR:-}$2")" -if [ "$(dirname $1)" = . ]; then - ln -vfs -T "$1" "${DESTDIR:-}$2" -else - ln -vfs -T --relative "${DESTDIR:-}$1" "${DESTDIR:-}$2" + +# ln -T is neither portable, nor useful if we would like to actually succeed +# ln -F is nice, but BSD only +if [ ! -L "${DESTDIR:-}$2" ] && [ -d "${DESTDIR:-}$2" ]; then + rmdir "${DESTDIR:-}$2" fi + +ln -vnfs "$1" "${DESTDIR:-}$2"
On 4/19/21 3:42 AM, Allan McRae wrote:
On 18/4/21 12:42 pm, Eli Schwartz wrote:
We do not need the --relative case as it is dead code (we only ever link a filename without directory components).
For the rest, GNU-specific ln -T does two things:
- if the link name is an existing directory, ln fails instead of creating a surprising link inside the directory - if the link name is a symlink to a directory, ln treats it as a file, and due to -f, unlinks it
The second case can be portably solved by ln -n, and the first case is not actually currently functional, but we can portably replace the error message with rmdir, so, why not?
Can we? That assumes the directory is non-empty and rmdir fails. I don't think removing an empty directory and replacing it with a symlink is expected behaviour.
Can we just abort with an error if the target is a directory?
I guess, but what's the difference between this and replacing a symlink to a directory? -- Eli Schwartz Bug Wrangler and Trusted User
On 19/4/21 9:18 pm, Eli Schwartz wrote:
On 4/19/21 3:42 AM, Allan McRae wrote:
On 18/4/21 12:42 pm, Eli Schwartz wrote:
We do not need the --relative case as it is dead code (we only ever link a filename without directory components).
For the rest, GNU-specific ln -T does two things:
- if the link name is an existing directory, ln fails instead of creating a surprising link inside the directory - if the link name is a symlink to a directory, ln treats it as a file, and due to -f, unlinks it
The second case can be portably solved by ln -n, and the first case is not actually currently functional, but we can portably replace the error message with rmdir, so, why not?
Can we? That assumes the directory is non-empty and rmdir fails. I don't think removing an empty directory and replacing it with a symlink is expected behaviour.
Can we just abort with an error if the target is a directory?
I guess, but what's the difference between this and replacing a symlink to a directory?
"ln -Tfs" overwrites one but not the other. So it is staying consistent with the old behaviour. If we want to be consistent, don't replace a symlink to a directory either. Allan
participants (2)
-
Allan McRae
-
Eli Schwartz