jenkins-bot submitted this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[IMPR] handle some generic exceptions in get_redirect_target static method

- Use get_redirect_target static method to get the redirect target.
Handle some generic exceptions but let other be handled by its caller
method
- decrease nested flow statements in delete_1_broken_redirect

Change-Id: I114a7895d105c17e1dacddb8bd68e11f87b96941
---
M scripts/redirect.py
1 file changed, 74 insertions(+), 66 deletions(-)

diff --git a/scripts/redirect.py b/scripts/redirect.py
index 21e1f1a..d3ea415 100755
--- a/scripts/redirect.py
+++ b/scripts/redirect.py
@@ -479,74 +479,83 @@
ignore_save_related_errors=True,
ignore_server_errors=True)

+ @staticmethod
+ def get_redirect_target(page):
+ """Get redirect target page and handle some exceptions."""
+ try:
+ return page.getRedirectTarget()
+ except (CircularRedirectError, RuntimeError):
+ pywikibot.exception()
+ pywikibot.output('Skipping {}.'.format(page))
+ except InterwikiRedirectPageError:
+ pywikibot.output('{} is on another site, skipping.'.format(page))
+ return None
+
def delete_1_broken_redirect(self) -> None:
"""Treat one broken redirect."""
redir_page = self.current_page
done = not self.opt.delete
try:
targetPage = redir_page.getRedirectTarget()
- except (CircularRedirectError,
- InvalidTitleError,
- RuntimeError):
+ except InvalidTitleError:
pywikibot.exception()
- except InterwikiRedirectPageError:
- pywikibot.output('{} is on another site.'
- .format(redir_page.title()))
- else:
- try:
- targetPage.get()
- except InvalidTitleError:
- pywikibot.exception()
- except NoPageError:
- movedTarget = None
- with suppress(NoMoveTargetError):
- movedTarget = targetPage.moved_target()
- if movedTarget:
- if not movedTarget.exists():
- # FIXME: Test to another move
- pywikibot.output('Target page {} does not exist'
- .format(movedTarget))
- elif redir_page == movedTarget:
- pywikibot.output(
- 'Redirect to target page forms a redirect loop')
- else:
- pywikibot.output('{} has been moved to {}'
- .format(redir_page, movedTarget))
- reason = i18n.twtranslate(
- redir_page.site, 'redirect-fix-broken-moved',
- {'to': movedTarget.title(as_link=True,
- allow_interwiki=False)})
- content = redir_page.get(get_redirect=True)
- redir_page.set_redirect_target(
- movedTarget, keep_section=True, save=False)
- pywikibot.output('Summary - ' + reason)
- done = self.userPut(redir_page, content,
- redir_page.text, summary=reason,
- ignore_save_related_errors=True,
- ignore_server_errors=True)
- if not done and self.user_confirm(
- 'Redirect target {} does not exist.\n'
- 'Do you want to delete {}?'
- .format(targetPage.title(as_link=True),
- redir_page.title(as_link=True))):
- self.delete_redirect(redir_page, 'redirect-remove-broken')
- elif not (self.opt.delete or movedTarget):
+ targetPage = None
+
+ if not targetPage:
+ return
+
+ try:
+ targetPage.get()
+ except InvalidTitleError:
+ pywikibot.exception()
+ except NoPageError:
+ movedTarget = None
+ with suppress(NoMoveTargetError):
+ movedTarget = targetPage.moved_target()
+ if movedTarget:
+ if not movedTarget.exists():
+ # FIXME: Test to another move
+ pywikibot.output('Target page {} does not exist'
+ .format(movedTarget))
+ elif redir_page == movedTarget:
pywikibot.output(
- 'Cannot fix or delete the broken redirect')
- except IsRedirectPageError:
- pywikibot.output(
- 'Redirect target {} is also a redirect! {}'.format(
- targetPage.title(as_link=True),
- "Won't delete anything."
- if self.opt.delete else 'Skipping.'))
- else:
- # we successfully get the target page, meaning that
- # it exists and is not a redirect: no reason to touch it.
- pywikibot.output(
- 'Redirect target {} does exist! {}'.format(
- targetPage.title(as_link=True),
- "Won't delete anything."
- if self.opt.delete else 'Skipping.'))
+ 'Redirect to target page forms a redirect loop')
+ else:
+ pywikibot.output('{} has been moved to {}'
+ .format(redir_page, movedTarget))
+ reason = i18n.twtranslate(
+ redir_page.site, 'redirect-fix-broken-moved',
+ {'to': movedTarget.title(as_link=True,
+ allow_interwiki=False)})
+ content = redir_page.get(get_redirect=True)
+ redir_page.set_redirect_target(
+ movedTarget, keep_section=True, save=False)
+ pywikibot.output('Summary - ' + reason)
+ done = self.userPut(redir_page, content,
+ redir_page.text, summary=reason,
+ ignore_save_related_errors=True,
+ ignore_server_errors=True)
+ if not done and self.user_confirm(
+ 'Redirect target {} does not exist.\n'
+ 'Do you want to delete {}?'
+ .format(targetPage.title(as_link=True),
+ redir_page.title(as_link=True))):
+ self.delete_redirect(redir_page, 'redirect-remove-broken')
+ elif not (self.opt.delete or movedTarget):
+ pywikibot.output('Cannot fix or delete the broken redirect')
+ except IsRedirectPageError:
+ pywikibot.output(
+ 'Redirect target {} is also a redirect! {}'.format(
+ targetPage.title(as_link=True),
+ "Won't delete anything."
+ if self.opt.delete else 'Skipping.'))
+ else:
+ # we successfully get the target page, meaning that
+ # it exists and is not a redirect: no reason to touch it.
+ pywikibot.output('Redirect target {} does exist! {}'
+ .format(targetPage.title(as_link=True),
+ "Won't delete anything."
+ if self.opt.delete else 'Skipping.'))

def fix_1_double_redirect(self) -> None:
"""Treat one double redirect."""
@@ -568,10 +577,7 @@
pywikibot.warning(
"Redirect target section {} doesn't exist."
.format(newRedir.title(as_link=True)))
- except (CircularRedirectError,
- InterwikiRedirectPageError,
- UnsupportedPageError,
- RuntimeError):
+ except UnsupportedPageError:
pywikibot.exception()
pywikibot.output('Skipping {}.'.format(newRedir))
break
@@ -583,13 +589,15 @@
.format(title))
break # skip if automatic
pywikibot.warning(
- "Redirect target {} doesn't exist."
- .format(title))
+ "Redirect target {} doesn't exist.".format(title))
except ServerError:
pywikibot.output('Skipping due to server error: '
'No textarea found')
break
else:
+ if not targetPage:
+ break
+
pywikibot.output(
' Links to: {}.'
.format(targetPage.title(as_link=True)))

To view, visit change 761909. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I114a7895d105c17e1dacddb8bd68e11f87b96941
Gerrit-Change-Number: 761909
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: D3r1ck01 <xsavitar.wiki@aol.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged