--- a/pylib/mozreview/mozreview/autoland/models.py
+++ b/pylib/mozreview/mozreview/autoland/models.py
@@ -75,41 +75,8 @@ class AutolandEventLogEntry(models.Model
event_time = models.DateTimeField(auto_now_add=True)
status = models.CharField(_('status'), max_length=1, choices=STATUSES,
db_index=True)
details = models.TextField(_('details'), blank=True)
error_msg = models.TextField(_('error_msg'), blank=True)
class Meta:
app_label = 'mozreview'
-
-
-class ImportPullRequestRequest(models.Model):
- autoland_id = models.IntegerField(
- primary_key=True,
- help_text=_('The job ID that Autoland returns to us.'))
- github_user = models.CharField(
- max_length=255,
- help_text=_('The github user/org for which Autoland was asked to '
- 'land the pullrequest (e.g. mozilla).'),
- db_index=True)
- github_repo = models.CharField(
- max_length=255,
- help_text=_('The github repo name for which Autoland was asked to '
- 'land the pullrequest (e.g. gecko-dev).'),
- db_index=True)
- github_pullrequest = models.IntegerField(
- help_text=_('The pullrequest number for which Autoland was asked to '
- 'land the pullrequest (e.g. 42).'),
- db_index=True)
- bugid = models.IntegerField(
- help_text=_('The bugzilla bug id for the pullrequest.'),
- null=True)
- # Unfortunately, Review Board extensions can't take advantage of the
- # ForeignKey ORM magic that Django provides. This is because the extension
- # loading mechanism doesn't do enough (yet) to flush out the foreign key
- # caches in Django.
- review_request_id = models.IntegerField(
- help_text=_('The ID of the review request that was created from the '
- 'pullrequest'), null=True)
-
- class Meta:
- app_label = 'mozreview'
--- a/pylib/mozreview/mozreview/autoland/resources.py
+++ b/pylib/mozreview/mozreview/autoland/resources.py
@@ -12,23 +12,21 @@ from djblets.webapi.decorators import (w
from djblets.webapi.errors import (DOES_NOT_EXIST,
INVALID_FORM_DATA,
NOT_LOGGED_IN,
PERMISSION_DENIED)
import requests
from reviewboard.changedescs.models import ChangeDescription
from reviewboard.extensions.base import get_extension_manager
from reviewboard.reviews.models import ReviewRequest
-from reviewboard.scmtools.models import Repository
from reviewboard.site.urlresolvers import local_site_reverse
from reviewboard.webapi.resources import WebAPIResource
from mozreview.autoland.models import (AutolandEventLogEntry,
- AutolandRequest,
- ImportPullRequestRequest)
+ AutolandRequest)
from mozreview.decorators import webapi_scm_groups_required
from mozreview.errors import (AUTOLAND_CONFIGURATION_ERROR,
AUTOLAND_ERROR,
AUTOLAND_REQUEST_IN_PROGRESS,
AUTOLAND_TIMEOUT,
NOT_PUSHED_PARENT_REVIEW_REQUEST)
from mozreview.extra_data import (
COMMITS_KEY,
@@ -519,289 +517,8 @@ class AutolandRequestUpdateResource(WebA
autoland_request.repository_url,
autoland_request.push_revision)
release_lock(lock_id)
return 200, {}
autoland_request_update_resource = AutolandRequestUpdateResource()
-
-
-class ImportPullRequestTriggerResource(WebAPIResource):
- """Resource to import pullrequests."""
-
- name = 'import_pullrequest_trigger'
- allowed_methods = ('POST',)
- model = ImportPullRequestRequest
-
- fields = {
- 'autoland_id': {
- 'type': int,
- 'description': 'The request ID that Autoland gave back.'
- },
- 'push_revision': {
- 'type': six.text_type,
- 'description': 'The revision of what got pushed for Autoland to '
- 'land.',
- },
- 'repository_url': {
- 'type': six.text_type,
- 'description': 'The repository that Autoland was asked to land '
- 'on.',
- },
- 'repository_revision': {
- 'type': six.text_type,
- 'description': 'The revision of what Autoland landed on the '
- 'repository.',
- },
- 'review_request_id': {
- 'type': int,
- 'description': 'The review request associated with this Autoland '
- 'request.',
- },
- 'user_id': {
- 'type': int,
- 'description': 'The user that initiated the Autoland request.',
- },
- 'last_known_status': {
- 'type': six.text_type,
- 'description': 'The last known status for this request.',
- },
- }
-
- def has_access_permissions(self, request, *args, **kwargs):
- return False
-
- def has_list_access_permissions(self, request, *args, **kwargs):
- return True
-
- @webapi_login_required
- @webapi_response_errors(DOES_NOT_EXIST, INVALID_FORM_DATA,
- NOT_LOGGED_IN)
- @webapi_request_fields(
- required={
- 'github_user': {
- 'type': six.text_type,
- 'description': 'The github user for the pullrequest',
- },
- 'github_repo': {
- 'type': six.text_type,
- 'description': 'The github repo for the pullrequest',
- },
- 'pullrequest': {
- 'type': int,
- 'description': 'The pullrequest number',
- },
- },
- )
- @transaction.atomic
- def create(self, request, github_user, github_repo, pullrequest, *args,
- **kwargs):
-
- ext = get_extension_manager().get_enabled_extension(
- 'mozreview.extension.MozReviewExtension')
-
- testing = ext.get_settings('autoland_testing', False)
-
- autoland_url = ext.get_settings('autoland_url')
- if not autoland_url:
- return AUTOLAND_CONFIGURATION_ERROR
-
- autoland_user = ext.get_settings('autoland_user')
- autoland_password = ext.get_settings('autoland_password')
-
- if not autoland_user or not autoland_password:
- return AUTOLAND_CONFIGURATION_ERROR
-
-
- # if we've seen an import for this pullrequest before, see if we have
- # an existing bugid we can reuse. Otherwise, Autoland will attempt to
- # extract one from the pullrequest title and if that fails, file a new
- # bug.
- bugid = None
- prs = ImportPullRequestRequest.objects.filter(github_user=github_user,
- github_repo=github_repo,
- github_pullrequest=pullrequest)
- prs = prs.order_by('-pk')[0:1]
- if prs:
- bugid = prs[0].bugid
-
- pingback_url = import_pullrequest_update_resource.get_uri(request)
-
- logger.info('Submitting a request to Autoland for pull request'
- '%s/%s/%s for bug %s with pingback_url %s'
- % (github_user, github_repo, pullrequest, bugid,
- pingback_url))
-
- destination = IMPORT_PULLREQUEST_DESTINATION
- if testing:
- # This is just slightly better than hard coding the repo name
- destination = Repository.objects.all()[0].name
-
- try:
- response = requests.post(autoland_url + '/pullrequest/mozreview',
- data=json.dumps({
- 'user': github_user,
- 'repo': github_repo,
- 'pullrequest': pullrequest,
- 'destination': destination,
- 'bzuserid': request.session['Bugzilla_login'],
- 'bzcookie': request.session['Bugzilla_logincookie'],
- 'bugid': bugid,
- 'pingback_url': pingback_url
- }), headers={
- 'content-type': 'application/json',
- },
- timeout=AUTOLAND_REQUEST_TIMEOUT,
- auth=(autoland_user, autoland_password))
- except requests.exceptions.RequestException:
- logger.error('We hit a RequestException when submitting a '
- 'request to Autoland')
- return AUTOLAND_ERROR
- except requests.exceptions.Timeout:
- logger.error('We timed out when submitting a request to '
- 'Autoland')
- return AUTOLAND_TIMEOUT
-
- if response.status_code != 200:
- return AUTOLAND_ERROR, {
- 'status_code': response.status_code,
- 'message': response.json().get('error'),
- }
-
- # We succeeded in scheduling the job.
- try:
- request_id = int(response.json()['request_id'])
- except KeyError, ValueError:
- return AUTOLAND_ERROR, {
- 'status_code': response.status_code,
- 'request_id': autoland_request_id,
- }
-
- import_pullrequest_request = ImportPullRequestRequest.objects.create(
- autoland_id=request_id,
- github_user=github_user,
- github_repo=github_repo,
- github_pullrequest=pullrequest,
- )
-
- AutolandEventLogEntry.objects.create(
- status=AutolandEventLogEntry.REQUESTED,
- autoland_request_id=request_id)
-
- url = autoland_url + '/pullrequest/mozreview/status/' + str(request_id)
- return 200, {'status-url': url}
-
- def get_uri(self, request):
- named_url = self._build_named_url(self.name_plural)
-
- return request.build_absolute_uri(
- local_site_reverse(named_url, request=request, kwargs={}))
-
- def serialize_last_known_status_field(self, obj, **kwargs):
- return obj.last_known_status
-
-
-import_pullrequest_trigger_resource = ImportPullRequestTriggerResource()
-
-
-class ImportPullRequestUpdateResource(WebAPIResource):
- """Resource for notifications of pullrequest import status update."""
-
- name = 'import_pullrequest_update'
- allowed_methods = ('POST',)
- fields = {
- 'request_id': {
- 'type': int,
- 'description': 'ID of the Autoland request this event refers to',
- },
- 'bugid': {
- 'type': int,
- 'description': 'The bugid for the pullrequest',
- },
- 'landed': {
- 'type': bool,
- 'description': 'Whether the import succeeded or not',
- },
- 'result': {
- 'type': six.text_type,
- 'description': 'In case of success, this is the review request '
- 'associated with the pullrequest',
- },
- 'error_msg': {
- 'type': six.text_type,
- 'description': 'An error message in case something went wrong',
- },
- }
-
- def has_access_permissions(self, request, *args, **kwargs):
- return False
-
- def has_list_access_permissions(self, request, *args, **kwargs):
- return True
-
- def get_uri(self, request):
- named_url = self._build_named_url(self.name_plural)
-
- return request.build_absolute_uri(
- local_site_reverse(named_url, request=request, kwargs={}))
-
- @webapi_response_errors(DOES_NOT_EXIST, INVALID_FORM_DATA,
- NOT_LOGGED_IN, PERMISSION_DENIED)
- @webapi_login_required
- @transaction.atomic
- def create(self, request, *args, **kwargs):
- ext = get_extension_manager().get_enabled_extension(
- 'mozreview.extension.MozReviewExtension')
-
- testing = ext.get_settings('autoland_testing', False)
-
- if not testing and not request.user.has_perm(
- 'mozreview.add_autolandeventlogentry'):
- return PERMISSION_DENIED
-
- try:
- fields = json.loads(request.body)
- landed = fields['landed']
- for field_name in fields:
- assert type(fields[field_name]) == self.fields[field_name]['type']
- except (ValueError, IndexError, AssertionError) as e:
- return INVALID_FORM_DATA, {
- 'error': e,
- }
-
- try:
- ImportPullRequestRequest.objects.get(pk=fields['request_id'])
- except ImportPullRequestRequest.DoesNotExist:
- return DOES_NOT_EXIST
-
- if landed:
- # Autoland gives us a review request url, we need to extract the id
- try:
- review_request_id = int(fields['result'].split('/')[-1])
- except ValueError as e:
- return INVALID_FORM_DATA, {'error': e}
-
- ImportPullRequestRequest.objects.filter(
- pk=fields['request_id']).update(
- review_request_id=review_request_id, bugid=fields['bugid'])
-
- AutolandEventLogEntry.objects.create(
- autoland_request_id=fields['request_id'],
- status=AutolandEventLogEntry.SERVED,
- details=fields['result'])
- else:
- # We need to store the bugid even if the import failed so we can
- # use that same bug for later imports of this pullrequest.
- ImportPullRequestRequest.objects.filter(
- pk=fields['request_id']).update(bugid=fields['bugid'])
-
- AutolandEventLogEntry.objects.create(
- autoland_request_id=fields['request_id'],
- status=AutolandEventLogEntry.PROBLEM,
- error_msg=fields['error_msg']
- )
-
- return 200, {}
-
-
-import_pullrequest_update_resource = ImportPullRequestUpdateResource()
deleted file mode 100644
--- a/pylib/mozreview/mozreview/autoland/views.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from django.http import HttpResponse, HttpResponseForbidden
-from django.contrib.auth.decorators import login_required
-from django.template.loader import Context, get_template
-from mozreview.autoland.resources import import_pullrequest_trigger_resource
-from reviewboard.extensions.base import get_extension_manager
-
-@login_required
-def import_pullrequest(request, user, repo, pullrequest):
- ext = get_extension_manager().get_enabled_extension(
- 'mozreview.extension.MozReviewExtension')
- enabled = ext.get_settings('autoland_import_pullrequest_ui_enabled', False)
-
- if not enabled:
- return HttpResponseForbidden('Importing pullrequests is disabled')
-
- trigger_url = import_pullrequest_trigger_resource.get_uri(request)
-
- template = get_template('mozreview/import-pullrequest.html')
- return HttpResponse(template.render(Context({
- 'request': request,
- 'user': user,
- 'repo': repo,
- 'pullrequest': pullrequest,
- 'trigger_url': trigger_url,
- })))
-
--- a/pylib/mozreview/mozreview/extension.py
+++ b/pylib/mozreview/mozreview/extension.py
@@ -20,23 +20,18 @@ from reviewboard.reviews.builtin_fields
from reviewboard.reviews.fields import (get_review_request_field,
get_review_request_fieldset)
from reviewboard.urls import (diffviewer_url_names,
review_request_url_names)
from mozreview.autoland.resources import (
autoland_request_update_resource,
autoland_trigger_resource,
- import_pullrequest_trigger_resource,
- import_pullrequest_update_resource,
try_autoland_trigger_resource,
)
-from mozreview.autoland.views import (
- import_pullrequest,
-)
from mozreview.batchreview.resources import (
batch_review_resource,
)
from mozreview.extra_data import (
is_parent,
)
from mozreview.fields import (
BaseCommitField,
@@ -130,20 +125,16 @@ class MozReviewExtension(Extension):
'source_filenames': ['mozreview/js/default.js'],
},
'filediffreviewer': {
'source_filenames': ['mozreview/js/models/filediffreviewermodel.js',
'mozreview/js/collections/filediffreviewercollection.js',
'mozreview/js/init_filediffreviewer.js'],
'apply_to': diffviewer_url_names,
},
- 'import-pullrequest': {
- 'source_filenames': ['mozreview/js/import-pullrequest.js',],
- 'apply_to': ['import_pullrequest',],
- },
'reviews': {
# TODO: Everything will break if init_rr.js is not first in this
# list.
'source_filenames': ['mozreview/js/init_rr.js',
'mozreview/js/commits.js',
'mozreview/js/review.js',
'mozreview/js/autoland.js',
'mozreview/js/ui.mozreviewautocomplete.js',]
@@ -158,18 +149,16 @@ class MozReviewExtension(Extension):
autoland_request_update_resource,
autoland_trigger_resource,
batch_review_request_resource,
batch_review_resource,
bugzilla_api_key_login_resource,
commit_data_resource,
commit_rewrite_resource,
file_diff_reviewer_resource,
- import_pullrequest_trigger_resource,
- import_pullrequest_update_resource,
ldap_association_resource,
review_request_summary_resource,
try_autoland_trigger_resource,
]
middleware = [
MozReviewCacheDisableMiddleware,
MozReviewUserProfileMiddleware,
@@ -287,20 +276,16 @@ class MozReviewExtension(Extension):
# Use a custom method to calculate a review approval state.
MozReviewApprovalHook(self)
# Instantiate the various signal handlers
initialize_signal_handlers(self)
HostingServiceHook(self, HMORepository)
- URLHook(self, patterns('',
- url(r'^import-pullrequest/(?P<user>.+)/(?P<repo>.+)/(?P<pullrequest>\d+)/$',
- import_pullrequest, name='import_pullrequest')))
-
def shutdown(self):
# We have to put the TestingDone field back before we shut down
# in order to get the instance back to its original state.
main_fieldset = get_review_request_fieldset('main')
if not get_review_request_field('testing_done'):
main_fieldset.add_field(TestingDoneField)
info_fieldset = get_review_request_fieldset('info')
deleted file mode 100644
--- a/pylib/mozreview/mozreview/static/mozreview/js/import-pullrequest.js
+++ /dev/null
@@ -1,78 +0,0 @@
-$(document).ready(function() {
- function pollAutolandRequest(statusUrl, activityIndicator) {
- $.ajax({
- type: "GET",
- url: statusUrl
- })
- .done(function(requestStatus){
- var landed = requestStatus["landed"];
-
- if (landed !== null) {
- if (landed === true) {
- activityIndicator.hide();
- window.location.href = requestStatus["result"];
- } else {
- activityIndicator.addClass("error")
- .text(gettext("Importing the pull request failed: " + requestStatus["error_msg"]))
- .append(
- $("<a/>")
- .text(gettext("Dismiss"))
- .attr("href", "#")
- .click(function() {
- activityIndicator.fadeOut("fast");
- return false;
- })
- );
- }
- } else {
- setTimeout(pollAutolandRequest, 500, statusUrl, activityIndicator);
- }
- })
- .fail(function(xhr, textStatus, errorThrown){
- activityIndicator.addClass("error")
- .text(gettext("Error communicating with Autoland server"))
- .append(
- $("<a/>")
- .text(gettext("Dismiss"))
- .attr("href", "#")
- .click(function() {
- activityIndicator.fadeOut("fast");
- return false;
- })
- );
- });
- }
-
- $("#mozreview-import-pullrequest-trigger").click(function() {
- var activityIndicator = $("#activity-indicator")
- .removeClass("error")
- .text(gettext("Importing pull request..."))
- .show();
-
- $.ajax({
- type: "POST",
- url: PULLREQUEST_TRIGGER,
- data: {
- github_user: GITHUB_USER,
- github_repo: GITHUB_REPO,
- pullrequest: GITHUB_PULLREQUEST
- }
- })
- .done(function(data){
- pollAutolandRequest(data["status-url"], activityIndicator);
- })
- .fail(function(xhr, textStatus, errorThrown){
- activityIndicator.addClass("error")
- .text(gettext("Error submitting pull request"))
- .append(
- $("<a/>")
- .text(gettext("Dismiss"))
- .attr("href", "#")
- .click(function() {
- activityIndicator.fadeOut("fast");
- return false;
- })
- );
- });
- });
-});
deleted file mode 100644
--- a/pylib/mozreview/mozreview/templates/mozreview/import-pullrequest.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% extends "base.html" %}
-{% load i18n %}
-
-{% block title %}{% trans "Import Pull Request" %}{% endblock %}
-
-{% block extrahead %}
-<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
-{% endblock %}
-
-{% block page_class %}new-review-request-page full-page-content has-sidebar mobile-show-page-sidebar{% endblock %}
-
-{% block content %}
-<h1>Import a Pull Request</h1>
-<div id="mozreview-import-pullrequest">
- <div>
- <label>Github Pull Request: </label>
- <a href="https://github.com/{{user}}/{{repo}}/pull/{{pullrequest}}">https://github.com/{{user}}/{{repo}}/pull/{{pullrequest}}</a>
- </div>
- <div>
- <input id="mozreview-import-pullrequest-trigger" type="button" value="{% trans "Import Pull Request" %}" />
- </div>
-</div>
-{% endblock %}
-
-{% block scripts-post %}
-<script charset="utf-8" type="text/javascript">
- var GITHUB_USER = "{{user}}";
- var GITHUB_REPO = "{{repo}}";
- var GITHUB_PULLREQUEST= {{pullrequest}};
- var PULLREQUEST_TRIGGER = "{{trigger_url}}";
-</script>
-{{block.super}}
-{% endblock %}
deleted file mode 100644
--- a/pylib/mozreview/mozreview/tests/test-import-pullrequest.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import absolute_import, unicode_literals
-
-import unittest
-
-import selenium.webdriver.support.expected_conditions as EC
-from selenium.common.exceptions import StaleElementReferenceException
-from selenium.webdriver.common.by import By
-from selenium.webdriver.support.wait import WebDriverWait
-
-from vcttesting.unittest import MozReviewWebDriverTest
-
-@unittest.skip('importing pull requests not supported')
-class ImportPullrequestTest(MozReviewWebDriverTest):
- @classmethod
- def setUpClass(cls):
- MozReviewWebDriverTest.setUpClass()
-
- try:
- self = cls('run')
- self.create_users([
- ('mjane@example.com', 'password2', 'Mary Jane [:mary]'),
- ])
-
- self.create_ldap(b'mjane@example.com', b'mjane', 2001, b'Mary Jane')
-
- lr = self.create_basic_repo('mjane@example.com', 'mjane')
- except Exception:
- MozReviewWebDriverTest.tearDownClass()
- raise
-
- def test_import_pullrequest(self):
- self.reviewboard_login('mjane@example.com', 'password2')
-
- self.load_rburl('import-pullrequest/dminor/gecko-dev/1')
-
- btn = self.browser.find_element_by_id('mozreview-import-pullrequest-trigger');
- btn.click()
-
- # Clicking the button should display the activity indicator
- element = WebDriverWait(self.browser, 3).until(
- EC.visibility_of_element_located((By.ID, "activity-indicator"))
- )
- try:
- self.assertTrue('Error' not in element.text)
- except StaleElementReferenceException:
- # The activity indicator may already have disappeared by the time
- # we check the text, but we want to be able to catch the error
- # if it shows up.
- pass
-
- # If this succeeds, we should be redirected to a review for the pull
- # request.
- WebDriverWait(self.browser, 10).until(
- lambda x: 'bz://1/' in self.browser.title)
-
- # Autoland should create the bug for us.
- bug = self.bugzilla().client.get(1)
- self.assertTrue('A pullrequest' in bug.summary)
-
- # It is possible to import a pull request again.
- self.load_rburl('import-pullrequest/dminor/gecko-dev/1')
-
- btn = self.browser.find_element_by_id('mozreview-import-pullrequest-trigger');
- btn.click()
-
- WebDriverWait(self.browser, 10).until(
- lambda x: 'bz://1/' in self.browser.title)
-
- # Autoland should reuse the existing bug for this pull request.
- with self.assertRaises(KeyError):
- self.bugzilla().client.get(2)