From 6b7f9285c430ae198b1190a6454b503da716fa6f Mon Sep 17 00:00:00 2001 From: Einhard Leichtfuß Date: Tue, 25 Dec 2018 19:43:45 +0100 Subject: Use arrays for the program variables Also, - Fix --search-by-data with $output_program != cat. `- Required a the introduction of $tmp_dir. - Correct some bad explanation in ctct_config(5). - Correctly initialize $user_config_file in the script. --- ctct.in | 71 ++++++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 20 deletions(-) (limited to 'ctct.in') diff --git a/ctct.in b/ctct.in index e1cad6b..55f926d 100644 --- a/ctct.in +++ b/ctct.in @@ -18,15 +18,18 @@ # along with ctct. If not, see . # +typeset -a fallback_editor default_editor +typeset -a input_program output_program visual_program + ## DEFAULT SETTINGS: sysconfdir="@sysconfdir_expanded@" -user_config_file="@user_config_file@" +user_config_file="@default_user_config_file@" datadir="@default_datadir@" -fallback_editor="@default_fallback_editor@" -default_editor= # none - use $EDITOR -input_program="@default_input_program@" -output_program="@default_output_program@" -visual_program="@default_visual_program@" +fallback_editor=("@default_fallback_editor@") +default_editor=() # none - use $EDITOR +input_program=("@default_input_program@") +output_program=("@default_output_program@") +visual_program=("@default_visual_program@") confirm_deletion=@default_confirm_deletion@ confirm_default_yes=@default_confirm_default_yes@ @@ -67,6 +70,7 @@ EOF function cleanup() { test -v tmp_file && test -f "$tmp_file" && rm -f "$tmp_file" + test -v tmp_dir && test -d "$tmp_dir" && rm -rf "$tmp_dir" } trap cleanup EXIT @@ -168,11 +172,16 @@ function display_exact() check_syntax "$1" || return $RET_BADSYNTAX file="$datadir/$(get_filename "$1")" || return $RET_FAILURE - if test "$visual_program" = "cat" + if [ "$visual_program" = "cat" ] && [ ${#visual_program[@]} -eq 1 ] + then + "${output_program[@]}" < "$file" || return $RET_ERROR + elif [ "$output_program" = "cat" ] && [ ${#output_program[@]} -eq 1 ] then - $output_program < "$file" || return $RET_ERROR + "${visual_program[@]}" < "$file" || return $RET_ERROR else - $output_program < "$file" | $visual_program || return $RET_ERROR + "${output_program[@]}" < "$file" | "${visual_program[@]}" + [[ ${PIPESTATUS[0]} -eq 0 || ${PIPESTATUS[1]} -eq 0 ]] \ + || return $RET_ERROR fi return $RET_SUCCESS @@ -234,6 +243,21 @@ function search_by_data() cd "$datadir" files=( $(list_all || return $RET_ERROR) ) + if [ "$output_program" = "cat" ] && [ ${#output_program[@]} -eq 1 ] + then + unset tmp_dir + else + tmp_dir="$(mktemp -d)" + + for file in ${files[@]} + do + "${output_program[@]}" < $file > "${tmp_dir}/${file}" \ + || return $RET_ERROR + done + + cd "$tmp_dir" + fi + for regexp in "${@,,}" do files=( $(grep -Eil "$regexp" ${files[@]}) ) @@ -242,6 +266,11 @@ function search_by_data() [ $ret -gt 1 ] && return $RET_ERROR done + if test -n "$tmp_dir" + then + rm -rf "$tmp_dir" && unset tmp_dir || return $RET_ERROR + fi + print_msg "$msg" printf " %s\n" ${files[@]} return $RET_SUCCESS @@ -266,7 +295,8 @@ function list_all() # $1: contact name function edit_contact() { - local file editor new + local file new + typeset -a editor check_syntax "$1" || return $RET_BADSYNTAX @@ -282,17 +312,18 @@ function edit_contact() fi fi - if test -n "$default_editor" + if test -n "${default_editor[*]}" then - editor="$default_editor" - elif test -n "$EDITOR" && which "$EDITOR" >/dev/null 2>&1 + editor=( "${default_editor[@]}" ) + elif test -n "$EDITOR" && which "${EDITOR% *}" >/dev/null 2>&1 then - editor="$EDITOR" + editor=( $EDITOR ) else - editor="$fallback_editor" + editor=( "${fallback_editor[@]}" ) fi - if test "$input_program" = "cat" -a "$output_program" = "cat" + if [ "$input_program" = "cat" ] && [ ${#input_program[@]} -eq 1 ] \ + && [ "$output_program" = "cat" ] && [ ${#output_program[@]} -eq 1 ] then if $new then @@ -300,18 +331,18 @@ function edit_contact() touch "$file" || return $RET_ERROR fi - $editor "$file" || return $RET_ERROR + "${editor[@]}" "$file" || return $RET_ERROR else tmp_file="$(mktemp || return $RET_ERROR)" chmod 600 "$tmp_file" || return $RET_ERROR if ! $new then - $output_program < "$file" > "$tmp_file" || return $RET_ERROR + "${output_program[@]}" < "$file" > "$tmp_file" || return $RET_ERROR fi - $editor "$tmp_file" || return $RET_ERROR - $input_program < "$tmp_file" > "$file" || return $RET_ERROR + "${editor[@]}" "$tmp_file" || return $RET_ERROR + "${input_program[@]}" < "$tmp_file" > "$file" || return $RET_ERROR rm -f "$tmp_file" && unset tmp_file || return $RET_ERROR fi -- cgit v1.2.3