mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-28 00:16:15 +01:00
fa32ee6481
None of these files starts with a #! line, and they are not native binary executables, so if a user attempts to execute them as a program, Unix shells will run them as /bin/sh scripts. This is not going to end well, since none of them are shell scripts (the gio bash completion is for bash, which is not a lowest-common-denominator POSIX shell, and in any case is designed to be sourced rather than executed). Fixes: #1539 Signed-off-by: Simon McVittie <smcv@collabora.com>
121 lines
3.7 KiB
Plaintext
121 lines
3.7 KiB
Plaintext
#
|
|
# Copyright (C) 2018 Red Hat, Inc.
|
|
#
|
|
# This library is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU Lesser General Public License as
|
|
# published by the Free Software Foundation; either version 2.1 of the
|
|
# licence, or (at your option) any later version.
|
|
#
|
|
# This is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
# License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public License
|
|
# along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
# Check for bash
|
|
[ -z "$BASH_VERSION" ] && return
|
|
|
|
####################################################################################################
|
|
|
|
# Check whether the suggestions have common prefix (i.e. suggestions won't be
|
|
# shown and prefix will be completed first)
|
|
__has_common_prefix() {
|
|
for (( i = 1; i < ${#COMPREPLY[@]}; i++ )); do
|
|
if [[ "${COMPREPLY[i-1]:${#cur}:1}" != "${COMPREPLY[i]:${#cur}:1}" ]]; then
|
|
return 1 # False
|
|
fi
|
|
done
|
|
|
|
return 0 # True
|
|
}
|
|
|
|
# Complete file location
|
|
__gio_location() {
|
|
# Prevent breaking on colons, we have to work with uris
|
|
local cur
|
|
_get_comp_words_by_ref -n : cur
|
|
|
|
# Resolve dirname for dir listing
|
|
local dir=""
|
|
if [[ $cur =~ "/"$ ]]; then
|
|
dir="$cur"
|
|
elif [[ $cur =~ "/" ]]; then
|
|
dir="$(dirname "$cur")/"
|
|
fi
|
|
|
|
# List daemon mounts, just if dir is not specified, or looks like scheme
|
|
local mounts=()
|
|
if [[ $dir == "" ]] || [[ $dir =~ ":"$ && ! $dir =~ "/" ]]; then
|
|
while IFS=$'\n' read mount; do
|
|
# Do not care about local mounts
|
|
[[ "$mount" =~ ^"file:" ]] && continue
|
|
|
|
# Use only matching mounts
|
|
[[ "$mount" =~ ^"$cur" && "$mount" != "$cur" ]] && mounts+=("$mount")
|
|
done < <(gio mount -l | sed -n -r 's/^ *Mount\([0-9]+\): .* -> (.*)$/\1/p')
|
|
fi
|
|
|
|
# Workaround to unescape dir name (e.g. "\ " -> " ")
|
|
declare -a tmp="( ${dir} )"
|
|
unescaped_dir="${tmp[0]}"
|
|
|
|
# List files
|
|
local files=()
|
|
local names=()
|
|
while IFS=$'\t' read name size type; do
|
|
# Escape name properly
|
|
local escaped_name="$(printf "%q" "$name")"
|
|
|
|
# Append slash for directories and space for files
|
|
if [[ "$type" == "(directory)" ]]; then
|
|
escaped_name="$escaped_name/"
|
|
else
|
|
escaped_name="$escaped_name "
|
|
fi
|
|
|
|
path="$dir$escaped_name"
|
|
|
|
# Use only matching paths
|
|
if [[ "$path" =~ ^"$cur" ]]; then
|
|
files+=("$path")
|
|
names+=("$escaped_name")
|
|
fi
|
|
done < <(gio list -hl "$unescaped_dir" 2> /dev/null)
|
|
|
|
COMPREPLY=("${files[@]}" "${mounts[@]}")
|
|
|
|
# Workaround to show suggestions as basenames only
|
|
if ! __has_common_prefix; then
|
|
COMPREPLY=("${mounts[@]} ${names[@]}")
|
|
|
|
# Workaround to prevent overwritting suggestions, it adds empty
|
|
# suggestion, otherwise names with colons will be corrupted
|
|
COMPREPLY+=(" ")
|
|
|
|
return 0
|
|
fi
|
|
|
|
# Workaround to complete names with colons, it removes colon prefix from
|
|
# COMPREPLY
|
|
__ltrim_colon_completions "$cur"
|
|
}
|
|
|
|
__gio() {
|
|
# Complete subcommands
|
|
if (( ${COMP_CWORD} == 1 )); then
|
|
COMPREPLY=($(compgen -W "help version cat copy info list mime mkdir monitor mount move open rename save set trash tree" -- "${COMP_WORDS[1]}"))
|
|
compopt +o nospace
|
|
return 0
|
|
fi
|
|
|
|
# Complete file locations
|
|
__gio_location
|
|
}
|
|
|
|
####################################################################################################
|
|
|
|
complete -o nospace -F __gio gio
|