#!/bin/sh

alterator_api_version=1
po_domain="alterator-etcgit"

. etcgit-sh-functions
. alterator-sh-functions

get_public_url() {
        local pubdir="$(get_pubdir)"
        [ -n "$pubdir" ] || return 0
        local defiface=$(ip r show | sed -n -e '/^default[[:space:]]/ { s/^.*[[:space:]]dev[[:space:]]\+\([^[:space:]]\+\).*$/\1/p; q }')
        local defip=
        local dnsname=
        local addr=

        if [ -n "$defiface" ]; then
                defip=$(ip a show $defiface | sed -n -e '/^[[:space:]]*inet[[:space:]]/ { s,^[[:space:]]*inet[[:space:]]\+\([0-9.]\+\)/\([0-9]\+\).*$,\1,p; q }')
                if [ -n "$defip" ]; then
                        dnsname=$(host -v $defip | sed -n -e '/^;;[[:space:]]\+ANSWER SECTION:$/,$ { /[[:space:]]PTR[[:space:]]/ { s/^.*[[:space:]]PTR[[:space:]]\+\(.*\)\.$/\1/p; q } }')
                        if [ -n "$dnsname" ]; then
                                addr="$dnsname"
                        else
                                addr="$defip"
                        fi
                fi
        fi
        [ -n "$addr" ] || addr='127.0.0.1'

        echo "git://$addr/${pubdir##*/}"
}

enable_publication() {
        local pubdir="$(get_pubdir)"
        init_pubdir
        publish_repo
        chkconfig git on
        service xinetd reload 1>/dev/null 2>&1
        touch "$pubdir/git-daemon-export-ok"
}

disable_publication() {
        local pubdir="$(get_pubdir)"

        [ -d "$pubdir" ] && rm -f "$pubdir/git-daemon-export-ok"
        chkconfig git off
        service xinetd reload 1>/dev/null 2>&1
}

read_branch_name() {
        local br="$(get_branch_name)"

        if [ -z "$br" ]; then
                write_bool_param 'branch' 'no'
        else
                write_string_param 'branch' "$br"
        fi
}

on_message()
{
        if [ "${in_url-}" = '#f' ]; then
                in_url=
        fi
	case "$in_action" in
		read)
			case "$in__objects" in
				/)
                                        read_branch_name
                                        if [ -n "$(_list_modified)" ]; then
                                                write_bool_param 'modified' 'yes'
                                        else
                                                write_bool_param 'modified' 'no'
                                        fi
					;;
				head)
                                        (
                                                hd="$(get_branch_head)"
                                                write_string_param 'commit' "$hd"
                                                write_string_param 'msg' "$(get_head_message "$hd")"
                                        )
					;;
                                branch)
                                        write_string_param 'url' "$(get_branch_remote_url)"
                                        ;;
				diff)
					write_string_param 'diff' "$(get_diff)"
					;;
                                publication)
                                        write_string_param 'url' "$(get_public_url)"
                                        if chkconfig git; then
                                                write_bool_param 'status' 'on'
                                        else
                                                write_bool_param 'status' 'off'
                                        fi
                                        ;;
			esac
			;;
		write)
			case "$in__objects" in
				/)
					if [ -n "$in_branch" ]; then
                                                reload_branch
					fi
					;;
				head)
                                        if [ "$in_commit" = '#t' ]; then
                                                commit_tree && write_string_param 'commit' "$(get_branch_head)"
                                        elif [ -n "$in_commit" ]; then
                                                reset_branch
                                        fi
					;;
                                branch)
                                        if [ -n "${in_url:-}" ]; then
                                                fetch_remote_branch
                                        elif [ "${in_url-#t}" != "#t" ] && [ "${in_url:-#f}" = "#f" ]; then
                                                delete_branch
                                        fi
                                        ;;
                                publication)
                                        if [ -n "${in_status-}" ]; then
                                                if test_bool "$in_status" || [ "$in_status" = 'on' ]; then
                                                        enable_publication
                                                else
                                                        disable_publication
                                                fi
                                        fi
                                        ;;
			esac
			;;
		list)
			case "$in__objects" in
				branches)
#                                        if [ -n "$in_url" ]; then
                                                list_all_branches | while read br rhd lhd status pstatus; do
                                                        write_table_item 'name' "$br" \
                                                                         'label' "$br" \
                                                                         'remote_head' "$rhd" \
                                                                         'local_head' "$lhd" \
                                                                         'status' "$status" \
                                                                         'publication_status' "$pstatus"
                                                done
#                                        else
#                                                list_local_branches | while read br hd url; do
#                                                        write_table_item 'name' "$br" \
#                                                                         'label' "$br" \
#                                                                         'head' "$hd" \
#                                                                         'url' "$url"
#                                                done
#                                        fi
					;;
				commits)
					list_commits | (
                                                IFS='	'
                                                while read h t m; do
                                                        write_table_item 'head' "$h" 'timestamp' "$t" 'msg' "$m"
                                                done
                                        )
					;;
                                start)
                                        if [ -n "${in_service:-}" ]; then
                                                list_start_seq_for_srv | _filter_SK | _duplicate | write_enum
                                        else
                                                list_start_seq | _duplicate | write_enum
                                        fi
                                        ;;
                                stop)
                                        if [ -n "${in_service:-}" ]; then
                                                list_kill_seq_for_srv | _filter_SK | _duplicate | write_enum
                                        else
                                                list_kill_seq | _duplicate | write_enum
                                        fi
                                        ;;
				/)
					_list_modified | _format_status | (
                                                IFS='	'
                                                while read n s; do
                                                        write_table_item 'filename' "$n" 'status' "$s"
                                                done
                                        )
					;;
			esac
			;;
	esac
}

message_loop
