| @@ -26,6 +26,18 @@ module KGrader::Backend | |||||
| run *args, repo | run *args, repo | ||||
| end | end | ||||
| def log(repo) | |||||
| xml = Nokogiri::XML run('log', '--xml', repo).first | |||||
| xml.css('logentry').map do |elem| | |||||
| { :rev => elem.attr('revision').to_i, | |||||
| :date => Time.parse(elem.css('date').text) } | |||||
| end | |||||
| end | |||||
| def commit(repo, message, paths = nil) | |||||
| # TODO | |||||
| end | |||||
| private | private | ||||
| def run(*cmd) | def run(*cmd) | ||||
| Open3.capture2e('svn', *cmd) | Open3.capture2e('svn', *cmd) | ||||
| @@ -14,9 +14,15 @@ module KGrader | |||||
| class CourseError < KGraderError | class CourseError < KGraderError | ||||
| end | end | ||||
| class RosterError < KGraderError | |||||
| end | |||||
| class AssignmentError < KGraderError | class AssignmentError < KGraderError | ||||
| end | end | ||||
| class RosterError < KGraderError | |||||
| class TaskError < KGraderError | |||||
| end | |||||
| class SubmissionError < KGraderError | |||||
| end | end | ||||
| end | end | ||||
| @@ -41,8 +41,8 @@ module KGrader | |||||
| oldrev = revision if status == :graded | oldrev = revision if status == :graded | ||||
| self.status = :fetching | self.status = :fetching | ||||
| @course.backend.update repo | @course.backend.update repo | ||||
| rewind due | |||||
| self.status = revision == oldrev ? :graded : :ungraded | |||||
| newrev = rewind due | |||||
| self.status = newrev == oldrev ? :graded : :ungraded | |||||
| end | end | ||||
| nil | nil | ||||
| end | end | ||||
| @@ -63,7 +63,8 @@ module KGrader | |||||
| def commit | def commit | ||||
| # TODO: | # TODO: | ||||
| # if status == :graded && File.exists? pendingfile | # if status == :graded && File.exists? pendingfile | ||||
| # [copy gradefile to repo and commit] | |||||
| # [copy gradefile to repo] | |||||
| # @course.backend.commit repo, <message>, <gradefile path> | |||||
| # FileUtils.rm pendingfile | # FileUtils.rm pendingfile | ||||
| # end | # end | ||||
| @@ -93,7 +94,15 @@ module KGrader | |||||
| end | end | ||||
| def rewind(date) | def rewind(date) | ||||
| # TODO | |||||
| log = @course.backend.log repo | |||||
| target = log.find { |commit| commit[:date] <= date } | |||||
| if target.nil? | |||||
| raise SubmissionError, "no commits before due date: #{student}" | |||||
| end | |||||
| rev = target[:rev] | |||||
| @course.backend.update repo, rev | |||||
| rev | |||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| @@ -16,6 +16,10 @@ module KGrader | |||||
| fetch = options.fetch(:fetch, true) | fetch = options.fetch(:fetch, true) | ||||
| regrade = options.fetch(:regrade, false) | regrade = options.fetch(:regrade, false) | ||||
| if options.include?(:due) && !fetch | |||||
| raise TaskError, "can't set a new due date without fetching" | |||||
| end | |||||
| subtask 'setup' do |sub| | subtask 'setup' do |sub| | ||||
| sub.create unless sub.exists? | sub.create unless sub.exists? | ||||
| end | end | ||||