Index: test/unit/assignment_test.rb
===================================================================
--- test/unit/assignment_test.rb	(revision 1208)
+++ test/unit/assignment_test.rb	(revision 1222)
@@ -285,6 +285,7 @@
      setup do
        # Let's tweak student3 so that their membership_status makes them
        # an accepted part of the group
+
        memberships(:membership3).membership_status = 'accepted'
        memberships(:membership3).save
        @source = assignments(:assignment_1)
@@ -302,6 +303,35 @@
      end
    end
 
+   context "an assignment with external commits only and previous groups" do
+     setup do
+       # Again, let's tweak student3 so that their membership_status makes them
+       # an accepted part of the group
+       memberships(:membership3).membership_status = 'accepted'
+       memberships(:membership3).save
+       @source = assignments(:assignment_1)
+       @target = assignments(:assignment_2)
+       assert @source.update_attributes(:allow_web_submits => false)
+       assert @target.update_attributes(:allow_web_submits => false)     
+       # And for this test, let's make sure all groupings cloned have admin approval
+       @source.groupings.each do |grouping|
+         grouping.admin_approved = true
+         grouping.save
+       end
+       assert @source.groupings.size > 0
+     end
+    should "ensure that all students have appropriate permissions on the cloned groupings" do
+       @target.clone_groupings_from(@source.id)
+       @target.reload
+       @target.groupings.each do |grouping|
+         grouping.accepted_students.each do |student|
+           assert_equal grouping.group.repo.get_permissions(student.user_name), Repository::Permission::READ_WRITE, "student should have read-write permissions on their group's repository"
+         end
+       end
+     end
+   end
+
+
    def test_grouped_students
      a = assignments(:assignment_1)
      assert_equal(6, a.grouped_students.size)
Index: app/models/assignment.rb
===================================================================
--- app/models/assignment.rb	(revision 1208)
+++ app/models/assignment.rb	(revision 1222)
@@ -247,6 +247,8 @@
             membership.membership_status = m.membership_status
             raise "Could not save membership" if !(grouping.memberships << membership)
           end
+          # Ensure all student members have permissions on their group repositories
+          grouping.update_repository_permissions
         end
       end
     end
Index: app/MARKUS_VERSION
===================================================================
--- app/MARKUS_VERSION	(revision 1208)
+++ app/MARKUS_VERSION	(revision 1222)
@@ -1 +1 @@
-VERSION=0.6,PATCH_LEVEL=2
+VERSION=0.6,PATCH_LEVEL=3
Index: NAMED_REVISIONS
===================================================================
--- NAMED_REVISIONS	(revision 1208)
+++ NAMED_REVISIONS	(revision 1222)
@@ -1,4 +1,5 @@
 --- MarkUs 0.6 ---
+Version 0.6.3 corresponds to Subversion revision 1222 in branches/release_0.6
 Version 0.6.2 corresponds to Subversion revision 1207 in branches/release_0.6
 Version 0.6.1 corresponds to Subversion revision 1183 in branches/release_0.6
 Version 0.6.0 corresponds to Subversion revision 1156 in branches/release_0.6
Index: Changelog
===================================================================
--- Changelog	(revision 1208)
+++ Changelog	(revision 1222)
@@ -1,3 +1,7 @@
+Changes for MarkUs 0.6.3:
+* Added rake task to automatically regenerate svn_authz in the event of corruption
+* MarkUs now ensures student read/write permissions on repositories after cloning groups
+
 Changes for MarkUs 0.6.2:
 * For now, students who work alone do not have their repositories named after them
 * "Allow Web Submits?" in Assignment Properties page defaults to REPOSITORY_EXTERNAL_SUBMITS_ONLY setting now
Index: lib/tasks/generate_svn_permissions.rake
===================================================================
--- lib/tasks/generate_svn_permissions.rake	(revision 0)
+++ lib/tasks/generate_svn_permissions.rake	(revision 1222)
@@ -0,0 +1,54 @@
+namespace :markus do
+  desc "Generates a Subversion permission file (svn_authz)"
+  task(:generate_svn_authz => [:environment]) do
+    valid_groupings_and_members = {}
+    # Start collecting data
+    #
+    # Get all assignments with no web submissions allowed
+    assignments = Assignment.find(:all, :conditions => {:allow_web_submits => false})
+    assignments.each do |assignment|
+      # Get valid/admin approved groupings
+      valid_groupings = assignment.valid_groupings
+      valid_groupings.each do |gr|
+        accepted_students = gr.accepted_students
+        accepted_students = accepted_students.map { |student| student.user_name }
+        valid_groupings_and_members[gr.group.repo_name] = accepted_students
+      end
+    end
+    # TAs and Admins should have permissions anyway
+    tas = Ta.all
+    tas = tas.map { |ta| ta.user_name }
+    admins = Admin.all
+    admins = admins.map { |admin| admin.user_name }
+    tas_and_admins = tas + admins # we only need their user_names
+    # TAs and Admins should have access to "dead" repositories
+    invalid_groups = Group.all
+    invalid_groups = invalid_groups.map { |group| group.repo_name }
+    #
+    # We have the data, print permission string
+    #
+    valid_groupings_and_members.each do |repo_name, students|
+      $stdout.print "[#{repo_name}:/]\n"
+      # add students
+      students.each do |user_name|
+        $stdout.print "#{user_name} = rw\n"
+      end
+      # add TAs and Admins
+      tas_and_admins.each do |admin_user|
+        $stdout.print "#{admin_user} = rw\n"
+      end
+      $stdout.print "\n"
+      invalid_groups.delete(repo_name)
+    end
+    # Add TAs and Admins to be allowed to access any repository
+    # created at some point
+    invalid_groups.each do |repo_name|
+      $stdout.print "[#{repo_name}:/]\n"
+      # add TAs and Admins, only
+      tas_and_admins.each do |admin_user|
+        $stdout.print "#{admin_user} = rw\n"
+      end
+      $stdout.print "\n"
+    end
+  end
+end
