tagfs/shell/tagfs.sh

102 lines
1.8 KiB
Bash

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
#