Revision: 4930 Author: wikipedian Date: 2008-01-24 15:12:22 +0000 (Thu, 24 Jan 2008)
Log Message: ----------- applied patch [ 1877680 ] redirect.py multiple redirects by AndreasJS (untested)
Modified Paths: -------------- trunk/pywikipedia/redirect.py
Modified: trunk/pywikipedia/redirect.py =================================================================== --- trunk/pywikipedia/redirect.py 2008-01-24 15:09:02 UTC (rev 4929) +++ trunk/pywikipedia/redirect.py 2008-01-24 15:12:22 UTC (rev 4930) @@ -262,74 +262,85 @@ # Show the title of the page we're working on. # Highlight the title in purple. wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % redir.title()) - try: - secondRedir = redir.getRedirectTarget() - except wikipedia.IsNotRedirectPage: - wikipedia.output(u'%s is not a redirect.' % redir.aslink()) - except wikipedia.NoPage: - wikipedia.output(u'%s doesn't exist.' % redir.aslink()) - else: - if secondRedir.site() != redir.site(): - wikipedia.output( - u'Skipping %s; redirect target (%s) is on a different site.' - % (redir.aslink(), secondRedir.aslink())) - continue + newRedir = redir + redirList = [] # bookkeeping to detect loops + while True: + redirList.append(u'%s:%s' % (newRedir .site().lang, newRedir .sectionFreeTitle())) try: - secondTargetPage = secondRedir.getRedirectTarget() + targetPage = newRedir.getRedirectTarget() + except wikipedia.IsNotRedirectPage: + if len(redirList) == 1: + wikipedia.output(u'Skipping: Page %s is not a redirect.' % redir.aslink()) + break #do nothing + elif len(redirList) == 2: + wikipedia.output( + u'Skipping: Redirect target %s is not a redirect.' % redir.aslink()) + break # do nothing + except wikipedia.NoPage: + wikipedia.output(u'Warning: %s doesn't exist.' % newRedir .aslink()) except wikipedia.SectionError: wikipedia.output( u'Warning: Redirect target section %s doesn't exist.' - % secondRedir.aslink()) - except wikipedia.IsNotRedirectPage: - wikipedia.output( - u'Redirect target %s is not a redirect.' - % secondRedir.aslink()) + % newRedir .aslink()) except wikipedia.BadTitle, e: # str(e) is in the format 'BadTitle: [[Foo]]' wikipedia.output( - u'Redirect target %s is not a valid page title.' + u'Warning: Redirect target %s is not a valid page title.' % str(e)[10:]) except wikipedia.NoPage: wikipedia.output( - u'Redirect target %s doesn't exist.' - % secondRedir.aslink()) + u'Warning: Redirect target %s doesn't exist.' + % newRedir .aslink()) else: - if secondTargetPage.site() != secondRedir.site(): + wikipedia.output( + u' Links to: %s.' + % targetPage.aslink()) + if targetPage.site() != mysite: wikipedia.output( - u"Page %s is a redirect to a different site (%s)" - % (secondRedir.aslink(), secondTargetPage.aslink())) - continue + u'Warning: redirect target (%s) is on a different site.' + % (targetPage.aslink())) + if self.always: + break # skip if automatic # watch out for redirect loops - if secondTargetPage.sectionFreeTitle() == secondRedir.sectionFreeTitle() \ - or secondTargetPage.sectionFreeTitle() == redir.sectionFreeTitle(): - continue - oldText = redir.get(get_redirect=True) - text = mysite.redirectRegex().sub( - '#%s [[%s]]' % - (mysite.redirect( True ), - secondTargetPage.title()), - oldText) - wikipedia.showDiff(oldText, text) - if self.prompt(u'Do you want to accept the changes?'): - try: - redir.put(text) - except wikipedia.LockedPage: - wikipedia.output(u'%s is locked.' % redir.title()) - except wikipedia.SpamfilterError, error: - wikipedia.output( + if redirList.count((u'%s:%s' + % (targetPage.site().lang, targetPage.sectionFreeTitle()))) > 0: + wikipedia.output( + u'Warning: Redirect target %s forms a redirect loop.' + % targetPage.aslink()) + break #TODO: deal with loop + else: + newRedir = targetPage + continue # + oldText = redir.get(get_redirect=True) + text = mysite.redirectRegex().sub( + '#%s %s' % + (mysite.redirect( True ), + targetPage.aslink()), + oldText) + if text == oldText: + break + wikipedia.showDiff(oldText, text) + if self.prompt(u'Do you want to accept the changes?'): + try: + redir.put(text) + except wikipedia.LockedPage: + wikipedia.output(u'%s is locked.' % redir.title()) + except wikipedia.SpamfilterError, error: + wikipedia.output( u"Saving page [[%s]] prevented by spam filter: %s" - % (redir.title(), error.url)) - except wikipedia.PageNotSaved, error: - wikipedia.output(u"Saving page [[%s]] failed: %s" - % (redir.title(), error)) - except wikipedia.NoUsername: - wikipedia.output( + % (redir.title(), error.url)) + except wikipedia.PageNotSaved, error: + wikipedia.output(u"Saving page [[%s]] failed: %s" + % (redir.title(), error)) + except wikipedia.NoUsername: + wikipedia.output( u"Page [[%s]] not saved; sysop privileges required." - % redir.title()) - except wikipedia.Error, error: - wikipedia.output( + % redir.title()) + except wikipedia.Error, error: + wikipedia.output( u"Unexpected error occurred trying to save [[%s]]: %s" - % (redir.title(), error)) + % (redir.title(), error)) + break
def run(self): if self.action == 'double':