--- /dev/null
+_snapper()
+{
+ local configdir="/etc/snapper/configs"
+ local cur prev words cword
+ _init_completion || return
+
+ local GLOGAL_SNAPPER_OPTIONS='
+ -q --quiet
+ -v --verbose
+ --utc
+ --iso
+ -t --table-style
+ -c --config
+ -r --root
+ --no-dbus
+ --version
+ --help
+ '
+
+ # see if the user selected a command already
+ local COMMANDS=(
+ "list-configs" "create-config" "delete-config" "set-config"
+ "list" "ls"
+ "create" "modify" "delete" "remove" "rm"
+ "mount" "umount"
+ "status" "diff" "xadiff"
+ "undochange" "rollback"
+ "setup-quota"
+ "cleanup")
+
+ local command i
+ for (( i=0; i < ${#words[@]}-1; i++ )); do
+ if [[ ${COMMANDS[@]} =~ ${words[i]} ]]; then
+ command=${words[i]}
+ break
+ fi
+ done
+
+ case $prev in
+ --version|--help)
+ return 0
+ ;;
+ esac
+
+ # supported options per command
+ if [[ "$cur" == -* ]]; then
+ case $command in
+ create-config)
+ COMPREPLY=( $( compgen -W '--fstype -f
+ --templete -t' -- "$cur" ) )
+ return 0
+ ;;
+ list|ls)
+ COMPREPLY=( $( compgen -W '--type -t
+ --all-configs -a' -- "$cur" ) )
+ return 0
+ ;;
+ create)
+ COMPREPLY=( $( compgen -W '--type -t
+ --pre-number
+ --print-number -p
+ --description -d
+ --cleanup-algorithm -c
+ --userdata -u
+ --command' -- "$cur" ) )
+ return 0
+ ;;
+ modify)
+ COMPREPLY=( $( compgen -W '--description -d
+ --cleanup-algorithm -c
+ --userdata -u' -- "$cur" ) )
+ return 0
+ ;;
+ delete|remove|rm)
+ COMPREPLY=( $( compgen -W '--sync -s
+ ' -- "$cur" ) )
+ return 0
+ ;;
+ status)
+ COMPREPLY=( $( compgen -W '--output -o
+ ' -- "$cur" ) )
+ return 0
+ ;;
+ diff)
+ COMPREPLY=( $( compgen -W '--input -i
+ --diff-cmd
+ --extensions -x' -- "$cur" ) )
+ return 0
+ ;;
+ undochange)
+ COMPREPLY=( $( compgen -W '--input -i
+ ' -- "$cur" ) )
+ return 0
+ ;;
+ rollback)
+ COMPREPLY=( $( compgen -W '--print-number -p
+ --description -d
+ --cleanup-algorithm -c
+ --userdata -u' -- "$cur" ) )
+ return 0
+ ;;
+ *)
+ COMPREPLY=( $( compgen -W "$GLOGAL_SNAPPER_OPTIONS" -- "$cur" ) )
+ return 0
+ ;;
+ esac
+ fi
+
+ # specific command arguments
+ if [[ -n $command ]]; then
+ case $command in
+ create-config)
+ case "$prev" in
+ --fstype|-f)
+ COMPREPLY=( $( compgen -W 'btrfs ext4 lvm(xfs) lvm(ext4)
+ ' -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ list)
+ case "$prev" in
+ --type|-t)
+ COMPREPLY=( $( compgen -W 'all single pre-post
+ ' -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ create)
+ case "$prev" in
+ --type|-t)
+ COMPREPLY=( $( compgen -W 'single pre post
+ ' -- "$cur" ) )
+ ;;
+ --pre-number)
+ COMPREPLY=( $( compgen -W '
+ ' -- "$cur" ) )
+ ;;
+ --cleanup-algorithm|-c)
+ COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
+ ' -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ modify)
+ case "$prev" in
+ --cleanup-algorithm|-c)
+ COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
+ ' -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ status)
+ case "$prev" in
+ --output|-o)
+ COMPREPLY=( $( compgen -f -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ cleanup)
+ case "$prev" in
+ empty-pre-post|timeline|number)
+ ;;
+ *)
+ COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
+ ' -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ diff)
+ return 0
+ ;;
+ undochange)
+ return 0
+ ;;
+ rollback)
+ case "$prev" in
+ --cleanup-algorithm|-c)
+ COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
+ ' -- "$cur" ) )
+ ;;
+ esac
+ return 0
+ ;;
+ esac
+ fi
+
+ # no command yet, show what commands we have
+ if [ "$command" = "" ]; then
+ COMPREPLY=( $( compgen -W '${COMMANDS[@]} ${GLOGAL_SNAPPER_OPTIONS[@]}' -- "$cur" ) )
+ fi
+
+ return 0
+} &&
+complete -F _snapper snapper
--- /dev/null
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit systemd bash-completion-r1
+
+DESCRIPTION="Command-line program for btrfs and lvm snapshot management"
+HOMEPAGE="http://snapper.io/"
+SRC_URI="ftp://ftp.suse.com/pub/projects/snapper/${P}.tar.bz2"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="lvm pam xattr"
+
+RDEPEND="dev-libs/boost:=[threads]
+ dev-libs/libxml2
+ dev-libs/icu:=
+ sys-apps/acl
+ sys-apps/dbus
+ sys-apps/util-linux
+ >=sys-fs/btrfs-progs-3.17.1
+ sys-libs/zlib
+ virtual/libintl
+ lvm? ( sys-fs/lvm2 )
+ pam? ( sys-libs/pam )
+ xattr? ( sys-apps/attr )"
+
+DEPEND="${RDEPEND}
+ sys-devel/gettext
+ virtual/pkgconfig"
+
+PATCHES=(
+ "${FILESDIR}"/cron-confd.patch
+)
+
+src_prepare() {
+ default
+
+ sed -e "s,/usr/lib/systemd/system,$(systemd_get_systemunitdir),g" \
+ -i data/Makefile.* \
+ || die "Failed to fix systemd services and timers installation path"
+}
+
+src_configure() {
+ # ext4 code does not work anymore
+ # snapper does not build without btrfs
+ local myeconfargs=(
+ --with-conf="/etc/conf.d"
+ --docdir="/usr/share/doc/${PF}"
+ --disable-zypp
+ --enable-rollback
+ --disable-ext4
+ --enable-btrfs
+ $(use_enable lvm)
+ $(use_enable pam)
+ $(use_enable xattr xattrs)
+ )
+
+ econf "${myeconfargs[@]}"
+}
+
+src_install() {
+ default
+ # Existing configuration file required to function
+ newconfd data/sysconfig.snapper snapper
+ find "${D}" -name '*.la' -delete || die
+ newbashcomp "${FILESDIR}"/${PN}.bash ${PN}
+}
+
+pkg_postinst() {
+ elog "In order to use Snapper, you need to set up"
+ elog "at least one config first. To do this, run:"
+ elog "snapper create-config <subvolume>"
+ elog "For more information, see man (8) snapper or"
+ elog "http://snapper.io/documentation.html"
+}