bin-utils/auto_sync.sh

107 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
die()
{
echo "$*" >&2
exit 1
}
git_rdiff()
{
git fetch -q
GITREMOTEDIFF=$( git diff --name-status remotes/origin/master )
if [ -n "$GITREMOTEDIFF" ];then
echo "$( pwd ) not synchronised with remote" 1>&2
echo "$GITREMOTEDIFF" 1>&2
fi
}
git_st()
{
GITSTATUS=$( git status --porcelain )
if [ -n "$GITSTATUS" ]; then
echo "Untracked files in $( pwd )" 1>&2
echo "$GITSTATUS" 1>&2
fi
}
annex_copy() {
# copy auto from/to every remote
for remote in $(git remote)
do
git ls-remote $remote 2>&1 > /dev/null && git-annex get --auto --fast --quiet --from $remote
git ls-remote $remote 2>&1 > /dev/null && git-annex copy --auto --fast --quiet --to $remote
done
}
annex_control() {
UNUSED=$( git-annex unused --fast | grep -v checking | grep -v 'fast mode enabled' )
if [ -n "$UNUSED" ]; then
echo "Unused data in $( pwd )" 1>&2
echo "++$UNUSED++" 1>&2
fi
# affiche les fichiers qui n'ont pas suffisamment de copies
git-annex fsck --fast > /dev/null
}
CONF=${1:-$HOME/.sync.cfg}
# echo Configuration: $CONF
[ -r $CONF ] || die "Missing configuration: $CONF"
ORIG_DIR=$PWD
#echo "ORIG_DIR $ORIG_DIR"
PIDFILE=${CONF}.pid
#echo "PIDFILE: $PIDFILE"
[ -f $PIDFILE ] && die "Pidfile exists: $PIDFILE"
touch $PIDFILE
declare -a LINE
exec < $CONF
dir_ok=1
while read -a LINE; do
# echo "${LINE[@]}"
if [[ "${LINE[@]}" =~ ^\[.*\]$ ]]; then
dir_head=${LINE[@]}
# bash > 4.2 dir=${dir_head:1: -1}
dir=${dir_head:1:${#dir_head}-2}
# echo "DIR $dir"
cd $ORIG_DIR
cd $dir
dir_ok=$?
pwd
elif [[ "${LINE[@]}" =~ ^# ]]; then
:
# echo COMMENT
elif [ $dir_ok -eq 0 ]; then
action="${LINE[0]}"
action_args="${LINE[@]:1}"
#echo ACTION $action
#echo ARGS $action_args
case "$action" in
annex.watch )
git-annex watch --quiet ;;
annex.sync )
git-annex sync --fast --quiet 2> /dev/null ;;
annex.copy)
annex_copy ;;
annex.to )
git-annex copy --auto --fast --quiet --to $action_args ;;
annex.from )
git-annex copy --auto --fast --quiet --from $action_args ;;
annex.control )
annex_control ;;
git.pull )
git pull -q ;;
git.diff )
git_rdiff ;;
git.status )
git_st ;;
git.push )
git commit -a --allow-empty-message -m "" && git push --porcelain ;;
esac
fi
done
cd $ORIG_DIR
#echo "PIDFILE: $PIDFILE"
rm -f $PIDFILE
[ -f $PIDFILE ] && die "Pidfile still exists $PIDFILE"