bug
author lbatlle@npdl268.bpo.hp.com
Tue, 24 Oct 2006 18:00:31 +0200
changeset 3 5108af44ed6e
parent 2 d086ec1aec5d
child 4 b3a6e3ad6dc5
permissions -rwxr-xr-x
Fixed a bug on 'edit' deletion.

#!/bin/bash

PNAME=`basename "$0"`
CMD="$1"

if [ "x$EDITOR" == "x" ]; then
	EDITOR=vim
fi

function usage
{
	echo "usage: $PNAME <add | list | view | edit | delete | create | project>"
}

function create
{
	if [ ! -f "$BUG_PROJECT" ]; then
		echo 0 > "$BUG_PROJECT"
		return 0
	else
		echo "The project exists. Please remove the file before create." 2>&1
		return 1
	fi
}

function getnext
{
	head -n 1 "$BUG_PROJECT"
}

function updatenext
{
	NEXT=$1
	ed $BUG_PROJECT >&/dev/null << END
1
c
$NEXT
.
w
q
END

}

function trim
{
	sed 's/^ *//g; s/ *$//g'
}
function trimlastdbNL
{
	sed 's/\\n$//g'
}

function noNL
{
	tr -d "\\n"
}

function string2db
{
	noNL | trim | sed 's/\t/\\t/g'
}

function text2db
{
	sed 's/\t/\\t/g ; s/$/\\/g' | tr "\\n" n
}

function db2text
{
	sed 's/\\t/\t/g ; s/\\n/\n/g'
}

function addfile
{	
	ID=`grep "^Id:" $1 | head -n 1 | cut -d : -f 2 | string2db`
	SUBJECT=`grep "^Subject:" $1 | head -n 1 | cut -d : -f 2 | string2db`
	STATE=`grep "^State:" $1 | head -n 1 | cut -d : -f 2 | string2db`
	PRIORITY=`grep "^Priority:" $1 | head -n 1 | cut -d : -f 2 | string2db`

	if ( [ "x$SUBJECT" == "" ] || [ "x$PRIORITY" == "" ] ); then
		echo "Error in ticket: subject or priority." 2>&1
		return 1
	fi

	LINES=`cat $1 | wc -l`

	# Substract Id, Subject, State and Priority
	TOTAIL=$(( LINES - 5 ))
	DESCRIPTION=`tail -n $TOTAIL $1 | text2db | trimlastdbNL`

	echo "$ID	$PRIORITY	$STATE	$SUBJECT	$DESCRIPTION" >> $BUG_PROJECT
	updatenext $((ID + 1))
	return 0
}

function list
{
	echo "Id	Prior.	State	Subject"
	catlist | cut -f 1,2,3,4 | sort -n -r -k 2
}

function view
{
	ID=$1

	LINE=`catlist | grep "^$ID	"`

	if [ "x$LINE" != "x" ]; then
		PRIORITY=`echo "$LINE" | cut -f 2`
		STATE=`echo "$LINE" | cut -f 3`
		SUBJECT=`echo "$LINE" | cut -f 4`
		DESCRIPTION=`echo "$LINE" | cut -f 5`

		echo "Id: $ID" | db2text
		echo "Priority: $PRIORITY" | db2text
		echo "State: $STATE" | db2text
		echo "Subject: $SUBJECT" | db2text
		echo "-- Description below --"
		echo "$DESCRIPTION" | db2text
		return 0
	else
		echo "Id not found." 2>&1
		return 1
	fi
}

function catlist
{
	LINES=`cat $BUG_PROJECT | wc -l`
	TOTAIL=$(( LINES - 1 ))
	tail -n $TOTAIL $BUG_PROJECT | grep -v "^#"
}

function searchline
{	
	ID=$1

	LINE=`cat $BUG_PROJECT | grep -n "^$ID	" | cut -d : -f 1`
	if [ "x$LINE" != "x" ]; then
		echo $LINE
		return 0
	else
		return 1
	fi
}

function delete
{
	ID=$1
	LINE=`searchline $ID`
	if [ $? -eq 0 ]; then
		ed $BUG_PROJECT >&/dev/null << END
$LINE
d
w
q
END
	else
		echo "Id not found." 2>&1
	fi
}

function edit
{
	ID=$1

	# Get a random file
	FILE="/tmp/$RANDOM.txt"
	while [ -f "$FILE" ]; do
		FILE="/tmp/$RANDOM.txt"
	done

	view $ID > $FILE

	if [ $? -eq 0 ]; then
		MD5=`md5sum "$FILE"`

		"$EDITOR" "$FILE"

		MD5_bis=`md5sum "$FILE"`

		if [ "$MD5" != "$MD5_bis" ]; then
			delete $ID
			addfile "$FILE" && rm "$FILE"
		else
			echo "File not changed. Not changing the ticket."
			rm "$FILE"
		fi
	else
		echo "Id not found."
		rm "$FILE"
	fi

}

function add
{	
	# Get a random file
	FILE="/tmp/$RANDOM.txt"
	while [ -f "$FILE" ]; do
		FILE="/tmp/$RANDOM.txt"
	done
	
	ID=`getnext`

	cat > "$FILE" << TEMPLATE
Id: $ID
Priority: 
State: 
Subject: 
-- Description below --
TEMPLATE
	MD5=`md5sum "$FILE"`

	"$EDITOR" "$FILE"

	MD5_bis=`md5sum "$FILE"`
	
	if [ "$MD5" != "$MD5_bis" ]; then
		addfile "$FILE" && rm "$FILE"
	else
		echo "File not changed. Not adding a ticket."
		rm "$FILE"
	fi

}

if [ "x$BUG_PROJECT" == "x" ]; then
	echo "\$BUG_PROJECT is not set"
	exit 1
fi

if [ "x$CMD" == "x" ]; then
	usage
	exit 1
fi

case "$CMD" in
	add)
		add || exit 1
		;;
	list)
		list || exit 1
		;;
	view)
		view $2 || exit 1
		;;
	project)
		echo Project: $BUG_PROJECT
		;;
	delete)
		delete $2 || exit 1
		;;
	create)
		create || exit 1
		;;
	edit)
		edit $2 || exit 1
		;;
	*)
		usage
		exit 1
		;;
esac
exit 0

# vim:ts=8:sw=8:noet