summaryrefslogtreecommitdiff
path: root/.local/bin/fpm
blob: 8da3d353a48f76c47e6fed99dd9ac8382138e71c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/sh

help() { echo "fzf-pm - fzf package manager

USAGE:
	fzf-pkgs [OPTION]... [QUERY]

OPTIONS:
	-g  list global [all] packages
	-l  list local [instllaed] packages (default)
	-i  select and install packages (implies -g)
	-u  select and uninstall packages (implies -l)
	-v  show verbose output
	-h  show this help message

	(for Arch linux only)
	-a AUR_HELPER  specify command for AUR helper

	(special options)
	-s PACKAGE     print package info
	-p             print package manager

	Note: passing global (-g) or local (-l) pkg list will cancel
	any install (-i) or uninstall (-u) operations started previously.

ENVIRONMENT VARIABLES:
	AUR_HELPER    set an AUR helper command for Arch linux

Following package managers are supported:
	apt, pkg, pacman and any pacman compatible AUR helper

QUERY is mandatory when using an AUR Helper" ;}

while getopts 's:gliuha:p' o; do case "$o" in
  s) sflag=0; pkg="$OPTARG" ;;
  g) operation=""; opmsg=""; list_all=0 ;;
  l) operation=""; opmsg=""; list_all=1 ;;
  i) operation="install_pkgs"; opmsg="to Install"; list_all=0 ;;
  u) operation="uninstall_pkgs"; opmsg="to Uninstall"; list_all=1 ;;
  h) help; exit ;;
  a) export AUR_HELPER="$OPTARG" ;;
	p) pflag=0 ;;
  *) printf "fzf-pkgs: invalid option -- '%s'"  "$OPTARG"; exit 1 ;;
esac done
shift $((OPTIND - 1))

if command -v apt-get >> /dev/null; then
	alias pkg_sort='sed -e "s/ - / => /"'

  if [ "$list_all" = 0 ]; then
    export pkg_info='apt-cache show'
    alias list_pkgs='apt-cache search .'
    alias search_pkg='apt-cache search'
  else
    export DPKG_COLOR='always'
    export pkg_info='dpkg-query --status'
    format='${Package} - ${Description}\n'
    alias list_pkgs='dpkg-query --show --showformat "$format"'
    alias search_pkg='dpkg-query --show --showformat "$format" | grep'
  fi

	if command -v pkg >> /dev/null; then
		export PKGMAN="pkg"
		alias install_pkgs='pkg install'
		alias uninstall_pkgs='pkg uninstall'
	else
		export PKGMAN="apt"
		alias install_pkgs='sudo apt-get install'
		alias uninstall_pkgs='sudo apt-get remove'
	fi

elif command -v pacman >> /dev/null; then
	alias pkg_sort='sed -e "N;s/\n\s*/ => /"'

  if [ -n "$AUR_HELPER" ]; then
    export PKGMAN="$AUR_HELPER"
    if command -v "$PKGMAN" >/dev/null; then
      alias install_pkgs='$PKGMAN -S'
      alias uninstall_pkgs='$PKGMAN -Rns'
    else
      echo "fzf-pkgs: AUR Helper '$PKGMAN' command not found" >&2 &&
      exit 1
    fi
  else
    export PKGMAN='pacman'
    alias install_pkgs='sudo $PKGMAN -S'
    alias uninstall_pkgs='sudo $PKGMAN -Rns'
  fi

  if [ "$list_all" = 0 ]; then
    export pkg_info="$PKGMAN --color=always -Si"
    alias list_pkgs='$PKGMAN --color=always -Ss'
    alias search_pkg='$PKGMAN --color=always -Ss'
  else
    export pkg_info="$PKGMAN --color=always -Qi"
    alias list_pkgs='$PKGMAN --color=always -Qs'
    alias search_pkg='$PKGMAN --color=always -Qs'
  fi

else
	echo "fzf-pkgs: package manager not found" >&2
	exit 1
fi

if [ "$pflag" = 0 ]; then
	printf "%s\n" "$PKGMAN"
	exit
elif [ "$sflag" = 0 ]; then
	printf "$ %s '%s'\n" "$pkg_info" "$pkg"
	$pkg_info $pkg
	exit
fi

query="$1"
if [ -n "$AUR_HELPER" ] && [ -z "$query" ] && [ "$list_all" = 0 ]; then
	echo "fzf-pkgs: providing QUERY is mandatory when using an AUR Helper"
	exit 1
	# printf "query: "; read -r query
	# [ -z "$query" ] && exit 1
fi

if [ -n "$query" ]; then
	prompt="searching '$query' "
	get_pkgs() { search_pkg "$query"; }
else
	get_pkgs() { list_pkgs; }
fi

[ -z "$FZF_HIST_DIR" ] && export FZF_HIST_DIR="$HOME/.local/share/fzf"
fzff() {
	preview='
		echo "selected packages:";
		printf "\t%s\n" {+1} | tr " " "\n"
		echo
		eval "$pkg_info 2>/dev/null" {1}
		'
	fzf --ansi --multi \
		--history="${FZF_HIST_DIR:-$HOME/.local/share}/package_history" \
		--header="Select packages $opmsg" --header-first --prompt="$prompt> " \
		--preview="$preview" --preview-window="hidden" --tiebreak='begin' \
		--bind 'ctrl-v:toggle-preview,ctrl-space:toggle-preview'
}

pkgs="$(get_pkgs | pkg_sort | fzff | cut -d' ' -f1 | tr '\n' ' ')"
[ -n "$pkgs" ] || exit 2
echo "$pkgs"
[ -n "$operation" ] && eval $operation $pkgs