#!/bin/sh

. /lib/partman/definitions.sh

dev=$2
id=$3
part=$dev/$id

cd $dev

[ -f $part/method -a -f $part/acting_filesystem ] || exit 0
filesystem=$(cat $part/acting_filesystem)

do_fatmountpoint () {
    local noninteractive tpl
    noninteractive=true
    while true; do
	if [ -f "$part/mountpoint" ]; then
	    old_mountpoint=$(cat $part/mountpoint)
	else
	    old_mountpoint=/
	fi
	case "$filesystem" in
	    fat16|fat32|ntfs)
		tpl=partman-basicfilesystems/fat_mountpoint
		;;
	    *)
		tpl=partman-basicfilesystems/mountpoint
		;;
	esac
	db_set $tpl "$old_mountpoint"
	db_input critical $tpl || $noninteractive
	db_go || return 1
	db_get $tpl

	case "$RET" in
	    Do?not?mount?it)
                rm -f $part/mountpoint
		break
		;;
	    Enter?manually)
		if do_mountpoint_manual; then break; fi
		noninteractive="return 1"
		;;
	    *)
		echo $RET >$part/mountpoint
		break
	esac
    done
}

do_mountpoint_manual () {
    local noninteractive
    noninteractive=true
    while true; do
	new_mountpoint=''
	while [ ! "$new_mountpoint" ]; do
	    if [ -f "$part/mountpoint" ]; then
		old_mountpoint=$(cat $part/mountpoint)
	    else
		old_mountpoint=/
	    fi
	    db_set partman-basicfilesystems/mountpoint_manual "$old_mountpoint"
	    db_input critical partman-basicfilesystems/mountpoint_manual \
		|| $noninteractive
	    db_go || return 1
	    db_get partman-basicfilesystems/mountpoint_manual
	    
	    if expr "$RET" : '/[^ ]*$' >/dev/null; then
		new_mountpoint=$RET
	    else
		db_input high partman-basicfilesystems/bad_mountpoint || true
		db_go || true
	    fi
	done
	echo $RET >$part/mountpoint
	break
    done
}

case $1 in
    mountpoint)
	code=0
	if [ "$filesystem" = fat16 -o "$filesystem" = fat32 -o "$filesystem" = ntfs ]; then
	    do_fatmountpoint || code=$?
	else
	    select_mountpoint $dev $id || code=$?
	fi
	if [ "$code" -eq 0 ]; then
	    update_partition $dev $id
	fi
	;;
    options)
	if [ "$filesystem" = fat16 -o "$filesystem" = fat32 ]; then
	    select_mountoptions $dev $id partman-basicfilesystems/fatoptions
	else
	    select_mountoptions $dev $id partman-basicfilesystems/options
	fi
	;;
    format_swap)
	>$part/format
	update_partition $dev $id
	;;
    dont_format_swap)
	if [ -f $part/format ]; then
	    rm $part/format
	    update_partition $dev $id
	fi
	;;
    label)
	if [ -f $part/label ]; then
	    label=$(cat $part/label)
	else
	    label=''
	fi
	db_set partman-basicfilesystems/choose_label "$label"
	db_input critical partman-basicfilesystems/choose_label || true
	db_go || exit 1
	db_get partman-basicfilesystems/choose_label
	if [ "$RET" ]; then
	    echo "$RET" >$part/label
	else
	    rm -f $part/label
	fi
	db_reset partman-basicfilesystems/choose_label
	;;
    reserved_for_root)
	if [ -f $part/reserved_for_root ]; then
	    reserved=$(cat $part/reserved_for_root)
	else
	    reserved=5
	fi
	db_set partman-basicfilesystems/specify_reserved "$reserved%"
	db_input critical partman-basicfilesystems/specify_reserved || true
	db_go || exit 1
	db_get partman-basicfilesystems/specify_reserved
	RET=`expr "$RET" : '\([0-9][0-9]\?\)\([,. %].*\)\?$'`
	if [ "$RET" ]; then
	    echo "$RET" >$part/reserved_for_root
	else
	    rm -f $part/reserved_for_root
	fi
	db_reset partman-basicfilesystems/specify_reserved
	;;
    usage)
	db_metaget partman-basicfilesystems/text/typical_usage description
	typical_usage="$RET"
	if [ -f $part/usage ]; then
	    usage=$(cat $part/usage)
	else
	    usage="$typical_usage"
	fi
	db_subst partman-basicfilesystems/specify_usage CHOICES "$typical_usage, news, largefile, largefile4"
	db_set partman-basicfilesystems/specify_usage "$usage"
	db_input critical partman-basicfilesystems/specify_usage || true
	db_go || exit 1
	db_get partman-basicfilesystems/specify_usage
	if [ "$RET" != "$typical_usage" ]; then
	    echo "$RET" >$part/usage
	else
	    rm -f $part/usage
	fi
	;;
esac

exit 0
