tagfs_nofs() { echo "No tagfs filesystem found in `pwd`" } tagfs_exists() { [ -d .tagfs ] && return 1 || return 0 } tagfs_clear_filter() { rm .tagfs/filters/$$ 2> /dev/null return 0 } tagfs_list_filter() { cat .tagfs/filters/$$ 2> /dev/null return 0 } tagfs_list_tags() { /bin/ls -1 .tagfs/tags/ } tagfs_is_tag() { [ -n "$(echo $1 | egrep '^[-+]')" ] && return 1 || return 0 } filter() { tagfs_exists [ $? -eq 0 ] && tagfs_nofs && return [ $# -eq 1 ] && [ "$1" = "-" ] && tagfs_clear_filter && return filter_file=".tagfs/filters/$$" tmp_file=".tagfs/filters/tmp_$$" for t in "$@"; do case "$(echo $t | cut -b1)" in +) [ -z "$(fgrep $t $filter_file 2> /dev/null)" ] && echo "${t#+}" >> $filter_file ;; -) sed -e "/${t#-}/d" $filter_file > $tmp_file && mv $tmp_file $filter_file echo nigga;; esac done tagfs_list_filter } tags() { tagfs_exists [ $? -eq 0 ] && tagfs_nofs && return [ $# -eq 0 ] && tagfs_list_tags && return tagfs_is_tag "$1" if [ $? -eq 1 ]; then for tag in "$@"; do [ "$tag" = "-" ] && continue case "$(echo $tag | cut -b1)" in +) mkdir .tagfs/tags/${tag#+} ;; -) rm -r .tagfs/tags/${tag#-} ;; esac done else for tag in "$@"; do [ "$tag" = "$1" ] && continue [ "$tag" = "-" ] && rm $(find -name "$1") && continue case "$(echo $tag | cut -b1)" in +) ln -s ../../../"$1" .tagfs/tags/"${tag#+}"/"$1" ;; -) rm .tagfs/tags/"${tag#-}"/"$1" ;; esac done fi } # Bash completion # _filter_completion() # { # filter_file=".tagfs/filters/$$" # list="" # # for t in $(cat $filter_file 2> /dev/null); do # list+="-$t " # done # # for t in $(ls .tagfs/tags/); do # [ -n "$(fgrep $t $filter_file 2> /dev/null)" ] && continue # list+="+$(basename $t) " # done # # COMPREPLY=($(compgen -W "$list" -- "${COMP_WORDS[$COMP_CWORD]}")) # } # # complete -F _filter_completion filter #