#!/usr/bin/env bash # GRADER for p1 CSCI 311 Spring 2006 # assumes: (1) that tests/ is one level higher # (2) the script is placed into the same directory # as the student directories # (3) students do not put their files into sub directories # to do: no protection against programs that hang assignment=p1 exec_name=avl start_dir=`pwd` test_dir=../../tests COMPILE_POINTS=50; POINTS_FOR_BASIC_TESTS=5; POINTS_FOR_INSERT_TESTS=3; POINTS_FOR_DELETE_TESTS=3; # if a single student directory is given from the command line # else grade all students if [ $# != 0 ] then student_directories=$@ else # count ONLY directories student_directories=`ls -F | grep \/` fi # don't overwrite the grade file if it exists # should preserve grade files.. rm grade.csv.* mv grade.csv grade.csv."`date | awk '{print $4}'`" cat << END /////////////////////////////////////////////////////////// // `date` grader_p1 // /////////////////////////////////////////////////////////// END echo $student_directories echo "user,name,secret_id,compile,t01,t02,t03,t04,t05,t06,t07,\ t11,t12,t13,t14,t15,t16,t17,t18,t30,t31,t32,t33,t34,t35,\ t36,t37,t38,t39,total,files,lines,COMMENT" >> grade.csv for student in $student_directories do echo -n "$student: " student=`echo $student | sed -e 's/.$//' 2> /dev/null` grade=`grep ^$student students.lst` echo `grep ^$student students.lst` points=0; # pwd will be inside the students directory if cd $student then # count the number of files num_of_files=0; for cur_file in `ls *.h *.cpp *akefile 2> /dev/null` do (( num_of_files++ )) done # count the number of lines num_of_lines=`wc -l *.h *.cpp *akefile 2> /dev/null | awk '/total/ {print $1}' 2> /dev/null` # remove old output files if any rm -f *.temp_out # compile and then run the tests if make >& /dev/null && file $exec_name >& /dev/null then grade=${grade},15 points=`expr 15 + $points` if [ "$student" = "wowen" ]; then redir= else redir='<' fi # for those who need file io instead of redirection: # yes that's you WOWEN if [ $student = "wowen/" ]; then echo "detected wowen" fi for test_file in $test_dir/t0[0-9]; do student_file=`basename $test_file` echo -n "$student_file " eval ./$exec_name $redir $test_file > $student_file.temp_out 2> /dev/null if diff $student_file.temp_out ${test_file}.out >& /dev/null; then echo "passed" grade=${grade},$POINTS_FOR_BASIC_TESTS points=`expr $POINTS_FOR_BASIC_TESTS + $points` else echo "failed" grade=${grade},0 fi done for test_file in $test_dir/t1[0-9]; do student_file=`basename $test_file` echo -n "$student_file " eval ./$exec_name $redir $test_file > $student_file.temp_out 2> /dev/null if diff $student_file.temp_out ${test_file}.out >& /dev/null; then echo "passed" grade=${grade},$POINTS_FOR_INSERT_TESTS points=`expr $POINTS_FOR_INSERT_TESTS + $points` else echo "failed" grade=${grade},0 fi done for test_file in $test_dir/t3[0-9]; do student_file=`basename $test_file` echo -n "$student_file " eval ./$exec_name $redir $test_file > $student_file.temp_out 2> /dev/null if diff $student_file.temp_out ${test_file}.out >& /dev/null; then echo "passed" grade=${grade},$POINTS_FOR_DELETE_TESTS points=`expr $POINTS_FOR_DELETE_TESTS + $points` else echo "failed" grade=${grade},0 fi done # clean up rm -f *.o avl >& /dev/null else # no executable echo "$student has no executable built" # 0 points for compilation grade=${grade},0 # assign zero for each test for test_file in ~admiral/Desktop/csci311/sandbox/tests/t[0-9][0-9] do grade=${grade},0 done fi #add on the points grade=${grade},$points #add on the number of files grade=${grade},$num_of_files #add on the number of lines grade=${grade},$num_of_lines else echo "wtf: can't cd to student directory: $student" fi # add the comment file if [ -f COMMENT ]; then grade=${grade},`cat COMMENT` else grade="${grade},NO SUBMISSION" fi cd $start_dir # write to the file echo $grade >> grade.csv done