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