From b0ff3053b9a8f451c25a821b85b4c341fe475ce3 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 3 Jul 2012 19:06:07 -0400 Subject: [PATCH] Add development code for pushing CMS changes to github --- cms/djangoapps/contentstore/views.py | 11 ++++++++- cms/djangoapps/github_sync/__init__.py | 19 +++++++++++++-- cms/envs/common.py | 1 + cms/envs/dev.py | 33 ++++++++++++++++++++++++-- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index c4825a4ddf..ca06942ae4 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -4,6 +4,8 @@ from django.http import HttpResponse from django_future.csrf import ensure_csrf_cookie from fs.osfs import OSFS from django.core.urlresolvers import reverse +from xmodule.modulestore import Location +from github_sync import repo_path_from_location, export_to_github from mitxmako.shortcuts import render_to_response from xmodule.modulestore.django import modulestore @@ -12,7 +14,6 @@ from xmodule.modulestore.django import modulestore @ensure_csrf_cookie def index(request): courses = modulestore().get_items(['i4x', None, None, 'course', None]) - print courses return render_to_response('index.html', { 'courses': [(course.metadata['display_name'], reverse('course_index', args=[ @@ -46,6 +47,14 @@ def save_item(request): item_id = request.POST['id'] data = json.loads(request.POST['data']) modulestore().update_item(item_id, data) + + # Export the course back to github + course_location = Location(item_id)._replace(category='course', name=None) + courses = modulestore().get_items(course_location) + for course in courses: + repo_path = repo_path_from_location(course.location) + export_to_github(course, repo_path, "CMS Edit") + return HttpResponse(json.dumps({})) diff --git a/cms/djangoapps/github_sync/__init__.py b/cms/djangoapps/github_sync/__init__.py index c6bbca222f..178291f7db 100644 --- a/cms/djangoapps/github_sync/__init__.py +++ b/cms/djangoapps/github_sync/__init__.py @@ -1,6 +1,9 @@ from git import Repo from contentstore import import_from_xml from fs.osfs import OSFS +import os +from xmodule.modulestore import Location +from django.conf import settings def import_from_github(repo_settings): @@ -13,17 +16,28 @@ def import_from_github(repo_settings): org: name of the """ repo_path = repo_settings['path'] + + if not os.path.isdir(repo_path): + Repo.clone_from(repo_settings['origin'], repo_path) + git_repo = Repo(repo_path) origin = git_repo.remotes.origin origin.fetch() # Do a hard reset to the remote branch so that we have a clean import - git_repo.heads[repo_settings['branch']].checkout() + git_repo.git.checkout(repo_settings['branch']) git_repo.head.reset('origin/%s' % repo_settings['branch'], index=True, working_tree=True) return git_repo.head.commit.hexsha, import_from_xml(repo_settings['org'], repo_settings['course'], repo_path) +def repo_path_from_location(location): + location = Location(location) + for name, repo in settings.REPOS.items(): + if repo['org'] == location.org and repo['course'] == location.course: + return repo['path'] + + def export_to_github(course, repo_path, commit_message): fs = OSFS(repo_path) xml = course.export_to_xml(fs) @@ -37,4 +51,5 @@ def export_to_github(course, repo_path, commit_message): git_repo.git.commit(m=commit_message) origin = git_repo.remotes.origin - origin.push() + if settings.MITX_FEATURES['GITHUB_PUSH']: + origin.push() diff --git a/cms/envs/common.py b/cms/envs/common.py index 6edd6aa2b9..400a5138b9 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -30,6 +30,7 @@ from path import path MITX_FEATURES = { 'USE_DJANGO_PIPELINE': True, + 'GITHUB_PUSH': False, } ############################# SET PATH INFORMATION ############################# diff --git a/cms/envs/dev.py b/cms/envs/dev.py index 8ff2a35c52..13dd2e847b 100644 --- a/cms/envs/dev.py +++ b/cms/envs/dev.py @@ -36,8 +36,37 @@ REPOS = { 'path': REPO_ROOT / "edx4edx", 'org': 'edx', 'course': 'edx4edx', - 'branch': 'for_cms' - } + 'branch': 'for_cms', + 'origin': 'git@github.com:MITx/edx4edx.git', + }, + '6002x-fall-2012': { + 'path': REPO_ROOT / '6002x-fall-2012', + 'org': 'mit.edu', + 'course': '6.002x', + 'branch': 'master', + 'origin': 'git@github.com:MITx/6002x-fall-2012.git', + }, + '6.00x': { + 'path': REPO_ROOT / '6.00x', + 'org': 'mit.edu', + 'course': '6.00x', + 'branch': 'master', + 'origin': 'git@github.com:MITx/6.00x.git', + }, + '7.00x': { + 'path': REPO_ROOT / '7.00x', + 'org': 'mit.edu', + 'course': '7.00x', + 'branch': 'master', + 'origin': 'git@github.com:MITx/7.00x.git', + }, + '3.091x': { + 'path': REPO_ROOT / '3.091x', + 'org': 'mit.edu', + 'course': '3.091x', + 'branch': 'master', + 'origin': 'git@github.com:MITx/3.091x.git', + }, } CACHES = {