def instructor_team_pull_repos(ctx, course, assignment_id, directory, only_ready_for_grading, reset, only): assignment = course.get_assignment(assignment_id) if assignment is None: print "Assignment %s does not exist" % assignment_id ctx.exit(CHISUBMIT_FAIL) conn = create_connection(course, ctx.obj['config']) if conn is None: print "Could not connect to git server." ctx.exit(CHISUBMIT_FAIL) teams = get_teams(course, assignment, only = only) directory = os.path.expanduser(directory) if not os.path.exists(directory): os.makedirs(directory) max_len = max([len(t.id) for t in teams]) for team in sorted([t for t in teams if t.active], key=operator.attrgetter("id")): team_dir = "%s/%s" % (directory, team.id) team_git_url = conn.get_repository_git_url(course, team) ta = team.get_assignment(assignment.id) if not team.has_assignment_ready_for_grading(assignment) and only_ready_for_grading: print "%-*s SKIPPING (not ready for grading)" % (max_len, team.id) continue try: msg = "" if not os.path.exists(team_dir): r = LocalGitRepo.create_repo(team_dir, clone_from_url=team_git_url) msg = "Cloned repo" else: r = LocalGitRepo(team_dir) if reset: r.fetch("origin") r.reset_branch("origin", "master") msg = "Reset to match origin/master" else: if r.repo.is_dirty(): print "%-*s ERROR: Cannot pull. Local repository has unstaged changes." % (max_len, team.id) continue r.checkout_branch("master") r.pull("origin", "master") msg = "Pulled latest changes" if only_ready_for_grading: r.checkout_commit(ta.commit_sha) msg += " and checked out commit %s" % (ta.commit_sha) print "%-*s %s" % (max_len, team.id, msg) except ChisubmitException, ce: print "%-*s ERROR: Could not checkout or pull master branch (%s)" % (max_len, team.id, ce.message) except GitCommandError, gce: print "%-*s ERROR: Could not checkout or pull master branch" % (max_len, team.id) print gce
def instructor_team_pull_repos(ctx, course, assignment_id, directory, only_ready_for_grading, reset, only): assignment = get_assignment_or_exit(ctx, course, assignment_id) conn = create_connection(course, ctx.obj['config']) teams_registrations = get_teams_registrations(course, assignment, only = only) directory = os.path.expanduser(directory) if not os.path.exists(directory): os.makedirs(directory) teams = sorted([t for t in teams_registrations.keys() if t.active], key = operator.attrgetter("team_id")) max_len = max([len(t.team_id) for t in teams]) for team in teams: registration = teams_registrations[team] team_dir = "%s/%s" % (directory, team.team_id) team_git_url = conn.get_repository_git_url(course, team) if not registration.is_ready_for_grading() and only_ready_for_grading: print "%-*s SKIPPING (not ready for grading)" % (max_len, team.team_id) continue try: msg = "" if not os.path.exists(team_dir): r = LocalGitRepo.create_repo(team_dir, clone_from_url=team_git_url) msg = "Cloned repo" else: r = LocalGitRepo(team_dir) if reset: r.fetch("origin") r.reset_branch("origin", "master") msg = "Reset to match origin/master" else: if r.repo.is_dirty(): print "%-*s ERROR: Cannot pull. Local repository has unstaged changes." % (max_len, team.team_id) continue r.checkout_branch("master") r.pull("origin", "master") msg = "Pulled latest changes" if only_ready_for_grading: r.checkout_commit(registration.final_submission.commit_sha) msg += " and checked out commit %s" % (registration.final_submission.commit_sha) print "%-*s %s" % (max_len, team.team_id, msg) except ChisubmitException, ce: print "%-*s ERROR: Could not checkout or pull master branch (%s)" % (max_len, team.team_id, ce.message) except GitCommandError, gce: print "%-*s ERROR: Could not checkout or pull master branch" % (max_len, team.team_id) print gce
def instructor_team_pull_repos(ctx, course, directory, assignment, only_ready_for_grading, reset, only): if only_ready_for_grading and assignment is None: print( "--only-ready-for-grading can only be used with --assignment option" ) ctx.exit(CHISUBMIT_FAIL) if assignment is not None: assignment = get_assignment_or_exit(ctx, course, assignment) conn = create_connection(course, ctx.obj['config']) directory = os.path.expanduser(directory) if not os.path.exists(directory): os.makedirs(directory) if assignment is None: teams = sorted(course.get_teams(), key=operator.attrgetter("team_id")) else: teams_registrations = get_teams_registrations(course, assignment, only=only) teams = sorted( [t for t in list(teams_registrations.keys()) if t.active], key=operator.attrgetter("team_id")) max_len = max([len(t.team_id) for t in teams]) for team in teams: team_dir = "%s/%s" % (directory, team.team_id) team_git_url = conn.get_repository_git_url(course, team) if only_ready_for_grading: registration = teams_registrations[team] if not registration.is_ready_for_grading( ) and only_ready_for_grading: print("%-*s SKIPPING (not ready for grading)" % (max_len, team.team_id)) continue try: msg = "" if not os.path.exists(team_dir): r = LocalGitRepo.create_repo(team_dir, clone_from_url=team_git_url) msg = "Cloned repo" else: r = LocalGitRepo(team_dir) if reset: r.fetch("origin") r.reset_branch("origin", "master") msg = "Reset to match origin/master" else: if r.repo.is_dirty(): print( "%-*s ERROR: Cannot pull. Local repository has unstaged changes." % (max_len, team.team_id)) continue r.checkout_branch("master") r.pull("origin", "master") msg = "Pulled latest changes" if only_ready_for_grading: r.checkout_commit(registration.final_submission.commit_sha) msg += " and checked out commit %s" % ( registration.final_submission.commit_sha) print("%-*s %s" % (max_len, team.team_id, msg)) except ChisubmitException as ce: print( "%-*s ERROR: Could not checkout or pull master branch (%s)" % (max_len, team.team_id, ce)) except GitCommandError as gce: print("%-*s ERROR: Could not checkout or pull master branch" % (max_len, team.team_id)) print(gce) except InvalidGitRepositoryError as igre: print( "%-*s ERROR: Directory %s exists but does not contain a valid git repository" % (max_len, team.team_id, team_dir)) except Exception as e: print( "%-*s ERROR: Unexpected exception when trying to checkout/pull" % (max_len, team.team_id)) raise return CHISUBMIT_SUCCESS
def instructor_team_pull_repos(ctx, course, directory, assignment, only_ready_for_grading, reset, only): if only_ready_for_grading and assignment is None: print("--only-ready-for-grading can only be used with --assignment option") ctx.exit(CHISUBMIT_FAIL) if assignment is not None: assignment = get_assignment_or_exit(ctx, course, assignment) conn = create_connection(course, ctx.obj['config']) directory = os.path.expanduser(directory) if not os.path.exists(directory): os.makedirs(directory) if assignment is None: teams = sorted(course.get_teams(), key = operator.attrgetter("team_id")) else: teams_registrations = get_teams_registrations(course, assignment, only = only) teams = sorted([t for t in list(teams_registrations.keys()) if t.active], key = operator.attrgetter("team_id")) max_len = max([len(t.team_id) for t in teams]) for team in teams: team_dir = "%s/%s" % (directory, team.team_id) team_git_url = conn.get_repository_git_url(course, team) if only_ready_for_grading: registration = teams_registrations[team] if not registration.is_ready_for_grading() and only_ready_for_grading: print("%-*s SKIPPING (not ready for grading)" % (max_len, team.team_id)) continue try: msg = "" if not os.path.exists(team_dir): r = LocalGitRepo.create_repo(team_dir, clone_from_url=team_git_url) msg = "Cloned repo" else: r = LocalGitRepo(team_dir) if reset: r.fetch("origin") r.reset_branch("origin", "master") msg = "Reset to match origin/master" else: if r.repo.is_dirty(): print("%-*s ERROR: Cannot pull. Local repository has unstaged changes." % (max_len, team.team_id)) continue r.checkout_branch("master") r.pull("origin", "master") msg = "Pulled latest changes" if only_ready_for_grading: r.checkout_commit(registration.final_submission.commit_sha) msg += " and checked out commit %s" % (registration.final_submission.commit_sha) print("%-*s %s" % (max_len, team.team_id, msg)) except ChisubmitException as ce: print("%-*s ERROR: Could not checkout or pull master branch (%s)" % (max_len, team.team_id, ce)) except GitCommandError as gce: print("%-*s ERROR: Could not checkout or pull master branch" % (max_len, team.team_id)) print(gce) except InvalidGitRepositoryError as igre: print("%-*s ERROR: Directory %s exists but does not contain a valid git repository" % (max_len, team.team_id, team_dir)) except Exception as e: print("%-*s ERROR: Unexpected exception when trying to checkout/pull" % (max_len, team.team_id)) raise return CHISUBMIT_SUCCESS