mirror of
https://gitee.com/amber-ce/amber-pm
synced 2026-03-26 15:39:50 +08:00
256 lines
7.6 KiB
Bash
Executable File
256 lines
7.6 KiB
Bash
Executable File
# Debian apt(8) completion -*- shell-script -*-
|
||
|
||
_apm()
|
||
{
|
||
local sourcesdir="/etc/apt/sources.list.d"
|
||
local cur prev words cword
|
||
_init_completion || return
|
||
|
||
local GENERIC_APT_GET_OPTIONS='
|
||
-d --download-only
|
||
-y --assume-yes
|
||
--assume-no
|
||
-u --show-upgraded
|
||
-m --ignore-missing
|
||
-t --target-release
|
||
--download
|
||
--fix-missing
|
||
--ignore-hold
|
||
--upgrade
|
||
--only-upgrade
|
||
--allow-change-held-packages
|
||
--allow-remove-essential
|
||
--allow-downgrades
|
||
--print-uris
|
||
--trivial-only
|
||
--remove
|
||
--arch-only
|
||
--allow-unauthenticated
|
||
--allow-insecure-repositories
|
||
--install-recommends
|
||
--install-suggests
|
||
--no-install-recommends
|
||
--no-install-suggests
|
||
--fix-policy
|
||
'
|
||
|
||
# see if the user selected a command already
|
||
local COMMANDS=(
|
||
"ssaudit"
|
||
"list"
|
||
"search"
|
||
"show" "showsrc"
|
||
"install" "remove" "purge" "autoremove" "autopurge"
|
||
"update"
|
||
"upgrade" "full-upgrade" "dist-upgrade"
|
||
"run"
|
||
"help"
|
||
"source" "build-dep"
|
||
"clean" "autoclean"
|
||
"download" "changelog"
|
||
"amber"
|
||
"debug"
|
||
"depends" "rdepends"
|
||
"policy")
|
||
|
||
local command i
|
||
for (( i=0; i < ${#words[@]}-1; i++ )); do
|
||
if [[ ${COMMANDS[@]} =~ ${words[i]} ]]; then
|
||
command=${words[i]}
|
||
break
|
||
fi
|
||
done
|
||
|
||
|
||
|
||
# supported options per command
|
||
if [[ "$cur" == -* ]]; then
|
||
case $command in
|
||
install|remove|purge|upgrade|dist-upgrade|full-upgrade|autoremove)
|
||
COMPREPLY=( $( compgen -W '--show-progress
|
||
--fix-broken --purge --verbose-versions --auto-remove
|
||
-s --simulate --dry-run
|
||
--download
|
||
--fix-missing
|
||
--fix-policy
|
||
--ignore-hold
|
||
--force-yes
|
||
--trivial-only
|
||
--reinstall --solver
|
||
-t --target-release'"$GENERIC_APT_GET_OPTIONS" -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
update)
|
||
COMPREPLY=( $( compgen -W '--list-cleanup
|
||
--print-uris
|
||
--allow-insecure-repositories
|
||
' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
list)
|
||
COMPREPLY=( $( compgen -W '--installed --upgradable
|
||
--manual-installed
|
||
-v --verbose
|
||
-a --all-versions
|
||
-t --target-release
|
||
' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
show)
|
||
COMPREPLY=( $( compgen -W '-a --all-versions
|
||
' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
depends|rdepends)
|
||
COMPREPLY=( $( compgen -W '-i
|
||
--important
|
||
--installed
|
||
--pre-depends
|
||
--depends
|
||
--recommends
|
||
--suggests
|
||
--replaces
|
||
--breaks
|
||
--conflicts
|
||
--enhances
|
||
--recurse
|
||
--implicit' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
search)
|
||
COMPREPLY=( $( compgen -W '
|
||
-n --names-only
|
||
-f --full' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
showsrc)
|
||
COMPREPLY=( $( compgen -W '
|
||
--only-source' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
source)
|
||
COMPREPLY=( $( compgen -W '
|
||
-s --simulate --dry-run
|
||
-b --compile --build
|
||
-P --build-profiles
|
||
--diff-only --debian-only
|
||
--tar-only
|
||
--dsc-only
|
||
-t --target-release
|
||
'"$GENERIC_APT_GET_OPTIONS" -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
build-dep)
|
||
COMPREPLY=( $( compgen -W '
|
||
-a --host-architecture
|
||
-s --simulate --dry-run
|
||
-P --build-profiles
|
||
-t --target-release
|
||
--purge --solver
|
||
'"$GENERIC_APT_GET_OPTIONS" -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
moo)
|
||
COMPREPLY=( $( compgen -W '
|
||
--color
|
||
' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
clean|autoclean)
|
||
COMPREPLY=( $( compgen -W '
|
||
-s --simulate --dry-run
|
||
' -- "$cur" ) )
|
||
return 0
|
||
;;
|
||
esac
|
||
fi
|
||
# 定义目录路径
|
||
primary_dir="/var/lib/apm/apm/files/ace-env/var/lib/apm/"
|
||
fallback_dir="/var/lib/apm/"
|
||
|
||
# 查找不包含特定子目录的目录
|
||
find_directories_without_ace_env() {
|
||
local base_dir="$1"
|
||
local result=()
|
||
|
||
# 检查基础目录是否存在
|
||
if [[ ! -d "$base_dir" ]]; then
|
||
return 1
|
||
fi
|
||
|
||
# 查找所有直接子目录,排除包含ace-env子目录的目录
|
||
while IFS= read -r -d '' dir; do
|
||
if [[ -d "$dir" ]] && [[ ! -d "$dir/files/ace-env" ]]; then
|
||
result+=("$(basename $dir)")
|
||
fi
|
||
done < <(find "$base_dir" -maxdepth 1 -type d ! -path "$base_dir" -print0 2>/dev/null)
|
||
|
||
# 输出结果
|
||
if [[ ${#result[@]} -gt 0 ]]; then
|
||
printf '%s\n' "${result[@]}"
|
||
return 0
|
||
fi
|
||
return 1
|
||
}
|
||
function apm_run_compgen(){
|
||
result=$(find_directories_without_ace_env "$primary_dir")
|
||
|
||
if [[ -n "$result" ]]; then
|
||
echo "$result"
|
||
else
|
||
result=$(find_directories_without_ace_env "$fallback_dir")
|
||
if [[ -n "$result" ]]; then
|
||
echo "$result"
|
||
else
|
||
echo ""
|
||
fi
|
||
fi
|
||
}
|
||
# specific command arguments
|
||
if [[ -n $command ]]; then
|
||
case $command in
|
||
remove|purge|autoremove)
|
||
# Debian system
|
||
|
||
|
||
COMPREPLY=( $( compgen -W "$(ls /var/lib/apm/apm/files/ace-env/var/lib/apm/ )" $cur ) )
|
||
|
||
return 0
|
||
;;
|
||
show|list|download|changelog|depends|rdepends)
|
||
COMPREPLY=( $( amber-pm-debug apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
|
||
2> /dev/null ) )
|
||
return 0
|
||
;;
|
||
install)
|
||
COMPREPLY=( $( amber-pm-debug apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
|
||
2> /dev/null ) )
|
||
if [[ "$cur" == ./* || "$cur" == /* ]]; then
|
||
_filedir "deb"
|
||
fi
|
||
return 0
|
||
;;
|
||
source|build-dep|showsrc|policy)
|
||
COMPREPLY=( $( amber-pm-debug apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
|
||
2> /dev/null ) $( apt-cache dumpavail -o Dir::Cache="/var/lib/aptss/" | \
|
||
command grep "^Source: $cur" | sort -u | cut -f2 -d" " ) )
|
||
return 0
|
||
;;
|
||
run)
|
||
COMPREPLY=( $( compgen -W "$(apm_run_compgen)" "$cur" ) )
|
||
return 0
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
# no command yet, show what commands we have
|
||
if [ "$command" = "" ]; then
|
||
COMPREPLY=( $( compgen -W '${COMMANDS[@]}' -- "$cur" ) )
|
||
fi
|
||
|
||
return 0
|
||
} &&
|
||
complete -F _apm apm
|
||
|
||
# ex: ts=4 sw=4 et filetype=sh
|