From 47fb17c8530c7c16847fa3ed3969bc53fdbc19fe Mon Sep 17 00:00:00 2001 From: Iryna Shcherbina Date: Mar 13 2018 19:44:02 +0000 Subject: Add options to merge PRs: via api or selenium --- diff --git a/fixrequires/pagure_fork.py b/fixrequires/pagure_fork.py index 4bcdab1..a637757 100644 --- a/fixrequires/pagure_fork.py +++ b/fixrequires/pagure_fork.py @@ -87,3 +87,11 @@ class PagureFork(object): request = self.upstream_pr_with(**kwargs) if request: return f'{self.pagure.instance}/rpms/{self.package_name}/pull-request/{request["id"]}' + + def merge_upstream_pr(self, pr_id): + try: + self.pagure.merge_request(pr_id) + self.logger.debug(f"PR merged") + except Exception as err: + raise PagureForkException( + f"Failed to merge a PR {pr_id}. Error: {err}") diff --git a/fixrequires/pagure_pr.py b/fixrequires/pagure_pr.py index e3fa805..d72bb2a 100644 --- a/fixrequires/pagure_pr.py +++ b/fixrequires/pagure_pr.py @@ -54,8 +54,66 @@ def create_pull_request(url, title, description, create_button = driver.find_element_by_xpath( "//input[@type='submit'][@value='Create']") - import ipdb; ipdb.set_trace() + # import ipdb; ipdb.set_trace() create_button.click() # TODO: check the page if it was a success. driver.close() + + +def merge_pull_request(url, fas_user, fas_password): + driver = webdriver.Firefox() + driver.get(url) + + WebDriverWait(driver, 30).until( + EC.presence_of_element_located((By.CLASS_NAME, 'bodycontent')) + ) + # Sometimes when the user is "kinited", the login page does not open, + # and you go directly to the PR page. + login = driver.find_elements_by_xpath("//a[contains(text(), 'Log In')]") + if login: + login_url = login[0].get_attribute('href') + driver.get(login_url) + + WebDriverWait(driver, 30).until( + EC.presence_of_element_located((By.CLASS_NAME, 'bodycontent')) + ) + + if driver.title == 'Login': + if not fas_user or not fas_password: + raise Exception('Please provide both FAS username and password') + + login_elem = driver.find_element_by_name('login_name') + login_elem.clear() + login_elem.send_keys(fas_user) + + password_elem = driver.find_element_by_name('login_password') + password_elem.clear() + password_elem.send_keys(fas_password) + + login_button = driver.find_element_by_id('loginbutton') + login_button.click() + + WebDriverWait(driver, 30).until( + EC.element_to_be_clickable((By.ID, 'merge_btn')) + ) + + pr_message = driver.find_element_by_id('merge-alert-message') + if pr_message.text != 'The pull-request can be merged and fast-forwarded': + raise Exception( + 'Failed to merge: conflicts maybe') + + merge_button = driver.find_element_by_id("merge_btn") + # import ipdb; ipdb.set_trace() + merge_button.click() + + WebDriverWait(driver, 30).until(EC.alert_is_present(), 'Waiting for alert timed out') + + alert = driver.switch_to_alert() + alert.accept() + WebDriverWait(driver, 30).until( + EC.presence_of_element_located((By.CLASS_NAME, 'bodycontent')) + ) + + # TODO: check the page if it was a success. + driver.close()