#!/bin/sh
# a script to traverse a directory tree and convert 
# file and directory names to target (current by default)
# charset, auto-guessing source charset given the language
# (c) 2006, Michael Shigorin <mike@altlinux.org>
# use freely

usage()
{
	echo "A script to traverse a directory tree and convert" >&2
	echo "file and directory names to target charset using" >&2
	echo "source charset autoguesser (defaulting to locale's" >&2
	echo "language and charset if none specified)"
	echo >&2
	echo "Usage: $0 [-L language] [-x charset] [-r] [-q] [<directory|file>]" >&2
	echo "       -L and -x take parameters just as enca(1)" >&2
	echo "       -r turns on recursion" >&2
	echo "       -q means quiet" >&2
	exit 1
}

fatal()
{
	echo $0: $* >&2
	exit 1
}

process()
{
	new="$(echo $1 | enca -L "$language" -x "$charmap" || failed="$1")"
	[ -z "$new" ] && fatal "$1 results in EMPTY converted name!"
	[ "$1" != "$new" ] && {
		[ -e "$new" ] && {
			echo "$0: $1 already exists with recoded name: $new, leaving as is" >&2
		} || $wrapper mv "$verbose" "$1" "$new" 
	}
}

traverse() 
{
	[ -d "$1" ] && { obj=.; dir="$1"; } || { obj="$1"; dir=.; }
	pushd "$dir" >/dev/null || return
	ls "$obj" | while read i; do
		[ ! -L "$i" -a -d "$i" -a -n "$recurse" ] && traverse "$i"
		process "$i"
	done
	popd >/dev/null
}

### main()

TEMP=`getopt -l language:,charset:,recurse,notest,quiet,help -- +L:x:r:N:q:h "$@"` || usage
eval set -- "$TEMP"
eval `locale -k charmap`	# $charmap is current charset
# alas, language code isn't that easy
[ -z "$LC_CTYPE" ] && eval `locale 2>/dev/null | grep ^LC_CTYPE`
language="`echo $LC_CTYPE | cut -c1-2`"
verbose="-v"
recurse=
wrapper="echo"
failed=

while :; do
	case "$1" in 
		--) shift; break
			;;
		-L|--language) shift; language="$1"
			;;
		-x|--charset) shift; charmap="$1"
			;;
		-r|--recurse) recurse=1
			;;
		-N|--notest) wrapper=
			;;
		-q|--quiet) verbose=
			;;
		-h|--help) usage
			;;
		*) [ -e "$1" ] && break || fatal "Unrecognized option: $1"
			;;
	esac
	shift
done

[ -z "$language" ] && fatal "need -L language, unable to guess from locale"
[ -z "$charmap" ]  && fatal "need -x charset, unable to guess from locale"

[ -n "$1" ] && {
	[ -e "$1" ] && traverse "$1" || fatal "$1 not found"
} || usage

[ -n "$wrapper" -a -z "$failed" ] && echo "seems good, now run me with --notest to actually rename"
[ -n "$failed" ] && fatal "$failed name failed to convert, please check"
