From: Ian Kelling Date: Mon, 28 Jul 2014 15:19:02 +0000 (-0700) Subject: fix bug when using -T for a link to a dirctory X-Git-Url: https://iankelling.org/git/?p=lnf;a=commitdiff_plain;h=056e6160cd38fa3bf1622ed4f4c0179f84b53c2f fix bug when using -T for a link to a dirctory --- diff --git a/lnf b/lnf index 104c901..29f137d 100755 --- a/lnf +++ b/lnf @@ -3,45 +3,59 @@ # This program is under GPL v. 3 or later, see lnf() { - local help="lnf [--help] [-T] LN_ARGUMENT... -Create symlinks conveniently and forcefully. + local help="lnf - Create symlinks conveniently and forcefully. +Usage: + lnf -T TARGET LINK_NAME (1st form) + lnf TARGET (2nd form) + lnf TARGET... DIRECTORY (3rd form) -Remove existing file/links using trash-put or rm -rf if it is not available. -Create directory if needed. Small change to ln argument semantics: for 2 arguments, -the second argument is a directory unless -T is passed. This removes ambiguity of -replacing a file but not a directory. No ln option arguments are supported." +Remove existing file in the using trash-put or rm -rf if it is not available. +Create directory if needed. Slightly more restrictive arguments than ln. + +In the 1st form, create a link to TARGET with the name LINK_NAME. In the 2nd +form, create a link to TARGET in the current directory. In the 3rd form, create +links to each TARGET in DIRECTORY." if [[ $1 == --help || $# -eq 0 ]]; then echo "$help" return 0 fi - local nodir=false + local nodir if [[ $1 == -T ]]; then - nodir=true + nodir=-T shift + if (( $# != 2 )); then + echo "lnf error: expected 2 arguments with -T flag. Got $#" + return 1 + fi fi + local reset_extglob=false + ! shopt extglob >/dev/null && reset_extglob=true + shopt -s extglob + local remove x - if type -P dircolors >/dev/null; then + if type -P trash-put >/dev/null; then remove=trash-put else remove="rm -rf" fi - if $nodir && [[ $# -eq 2 ]]; then + if [[ $nodir ]]; then if [[ -e "$2" || -L "$2" ]]; then $remove "$2" - elif [[ ! -d "$2/.." ]]; then - mkdir -p "$2/.." + elif ! mkdir -p "$(dirname "$2")"; then + echo "lnf error: failed to make directory $(dirname "$2")" + return 1 fi - elif [[ $# -ge 2 ]]; then + elif (( $# >= 2 )); then if [[ -d ${!#} ]]; then local oldcwd=$PWD - cd ${!#} # last arg - for x in "${@:1:$(($#-1))}"; do # all but last arg - # remove any trailing slashes + cd "${!#}" # last arg + for x in "${@:1:$(( $# - 1 ))}"; do # all but last arg + # remove any trailing slashes, uses extglob x="${x%%+(/)}" # remove any leading directory components x="${x##*/}" @@ -49,11 +63,16 @@ replacing a file but not a directory. No ln option arguments are supported." done cd "$oldcwd" else - mkdir -p "${!#}" + if ! mkdir -p "${!#}"; then + echo "lnf error: failed to make directory ${!#}" + return 1 + fi fi elif [[ $# -eq 1 ]]; then [[ -e "${1##*/}" || -L "${1##*/}" ]] && $remove "${1##*/}" fi - ln -s -- "$@" + + $reset_extglob && shopt -u extglob + ln -s $nodir -- "$@" } lnf "$@" diff --git a/lnf-function b/lnf-function index daae096..9dbcef5 100644 --- a/lnf-function +++ b/lnf-function @@ -3,23 +3,32 @@ # This program is under GPL v. 3 or later, see lnf() { - local help="lnf [--help] [-T] LN_ARGUMENT... -Create symlinks conveniently and forcefully. + local help="lnf - Create symlinks conveniently and forcefully. +Usage: + lnf -T TARGET LINK_NAME (1st form) + lnf TARGET (2nd form) + lnf TARGET... DIRECTORY (3rd form) -Remove existing file/links using trash-put or rm -rf if it is not available. -Create directory if needed. Small change to ln argument semantics: for 2 arguments, -the second argument is a directory unless -T is passed. This removes ambiguity of -replacing a file but not a directory. No ln option arguments are supported." +Remove existing file in the using trash-put or rm -rf if it is not available. +Create directory if needed. Slightly more restrictive arguments than ln. + +In the 1st form, create a link to TARGET with the name LINK_NAME. In the 2nd +form, create a link to TARGET in the current directory. In the 3rd form, create +links to each TARGET in DIRECTORY." if [[ $1 == --help || $# -eq 0 ]]; then echo "$help" return 0 fi - local nodir=false + local nodir if [[ $1 == -T ]]; then - nodir=true + nodir=-T shift + if (( $# != 2 )); then + echo "lnf error: expected 2 arguments with -T flag. Got $#" + return 1 + fi fi local reset_extglob=false @@ -34,13 +43,14 @@ replacing a file but not a directory. No ln option arguments are supported." remove="rm -rf" fi - if $nodir && [[ $# -eq 2 ]]; then + if [[ $nodir ]]; then if [[ -e "$2" || -L "$2" ]]; then $remove "$2" - elif [[ ! -d "$2/.." ]]; then - mkdir -p "$2/.." + elif ! mkdir -p "$(dirname "$2")"; then + echo "lnf error: failed to make directory $(dirname "$2")" + return 1 fi - elif [[ $# -ge 2 ]]; then + elif (( $# >= 2 )); then if [[ -d ${!#} ]]; then local oldcwd=$PWD cd "${!#}" # last arg @@ -53,12 +63,15 @@ replacing a file but not a directory. No ln option arguments are supported." done cd "$oldcwd" else - mkdir -p "${!#}" + if ! mkdir -p "${!#}"; then + echo "lnf error: failed to make directory ${!#}" + return 1 + fi fi elif [[ $# -eq 1 ]]; then [[ -e "${1##*/}" || -L "${1##*/}" ]] && $remove "${1##*/}" fi $reset_extglob && shopt -u extglob - ln -s -- "$@" + ln -s $nodir -- "$@" }