diff --git a/docs/builds.rst b/docs/builds.rst index e63a84ba7..cb1151ca0 100644 --- a/docs/builds.rst +++ b/docs/builds.rst @@ -16,6 +16,11 @@ When RTD builds your project, it sets the ``READTHEDOCS`` environment variable t else: html_theme = 'nature' +Deleting a stale or broken build environment +-------------------------------------------- + +RTD doesn't expose this in the UI, but it is possible to remove the build directory of your project. If you want to remove a build environment for your project, hit http://readthedocs.org/wipe/// with a POST. You must be logged in to do this. + Packages installed in the build environment ------------------------------------------- diff --git a/readthedocs/core/views.py b/readthedocs/core/views.py index 96db738fc..f77d92708 100644 --- a/readthedocs/core/views.py +++ b/readthedocs/core/views.py @@ -16,7 +16,8 @@ from django.views.decorators.csrf import csrf_view_exempt from django.views.static import serve from projects.models import Project, ImportedFile, ProjectRelationship -from projects.tasks import update_docs +from projects.tasks import update_docs, remove_dir +from builds.models import Version import json import mimetypes @@ -42,6 +43,27 @@ def random_page(request, project=None): return HttpResponseRedirect(ImportedFile.objects.filter(project__slug=project).order_by('?')[0].get_absolute_url()) return HttpResponseRedirect(ImportedFile.objects.order_by('?')[0].get_absolute_url()) +@csrf_view_exempt +def wipe_version(request, project_slug, version_slug): + version = get_object_or_404(Version, project__slug=project_slug, slug=version_slug) + if request.user not in version.project.users.all(): + raise Http404("You must own this project to wipe it.") + del_dir = version.project.checkout_path(version.slug) + if request.method == 'POST' and del_dir: + remove_dir.delay(del_dir) + return render_to_response('wipe_version.html', { + 'del_dir': del_dir, + 'deleted': True, + }, + context_instance=RequestContext(request)) + return render_to_response('wipe_version.html', { + 'del_dir': del_dir, + }, + context_instance=RequestContext(request)) + + + + @csrf_view_exempt def github_build(request): """ diff --git a/readthedocs/templates/wipe_version.html b/readthedocs/templates/wipe_version.html index 91606d86a..a140c45b4 100644 --- a/readthedocs/templates/wipe_version.html +++ b/readthedocs/templates/wipe_version.html @@ -8,6 +8,10 @@ {{ del_dir }} is now deleting.

{% else %} This is a page to delete a directory. Only POST to it if you wish to refresh a project on RTD's build servers. + +
+ +
{% endif %} {% endblock %} diff --git a/readthedocs/urls.py b/readthedocs/urls.py index 62d26d39a..51852a5d9 100644 --- a/readthedocs/urls.py +++ b/readthedocs/urls.py @@ -63,6 +63,10 @@ urlpatterns = patterns('', url(r'^build/(?P\d+)', 'core.views.generic_build', name='generic_build'), url(r'^random/(?P[\w-]+)', 'core.views.random_page', name='random_page'), url(r'^random/$', 'core.views.random_page', name='random_page'), + url(r'^wipe/(?P[-\w]+)/(?P[-\w]+)/$', + 'core.views.wipe_version', + name='wipe_version' + ), url(r'^profiles/create/', 'profiles.views.create_profile', {'form_class': UserProfileForm}, name='profiles_profile_create'),