@@ -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 | ||||