http://www.mediawiki.org/wiki/Special:Code/pywikipedia/11162
Revision: 11162 Author: xqt Date: 2013-03-02 14:47:05 +0000 (Sat, 02 Mar 2013) Log Message: ----------- some PEP8 changes, update from trunk r11161
Modified Paths: -------------- branches/rewrite/scripts/interwiki.py
Modified: branches/rewrite/scripts/interwiki.py =================================================================== --- branches/rewrite/scripts/interwiki.py 2013-03-02 14:46:09 UTC (rev 11161) +++ branches/rewrite/scripts/interwiki.py 2013-03-02 14:47:05 UTC (rev 11162) @@ -333,7 +333,7 @@ # (C) Rob W.W. Hooft, 2003 # (C) Daniel Herding, 2004 # (C) Yuri Astrakhan, 2005-2006 -# (C) xqt, 2009-2012 +# (C) xqt, 2009-2013 # (C) Pywikipedia bot team, 2007-2013 # # Distributed under the terms of the MIT license. @@ -341,7 +341,10 @@ __version__ = '$Id$' #
-import sys, copy, re, os +import sys +import copy +import re +import os import time import codecs import pickle @@ -359,101 +362,96 @@ '&pagegenerators_help;': pagegenerators.parameterHelp }
+ class SaveError(pywikibot.Error): """ An attempt to save a page with changed interwiki has failed. """
+ class LinkMustBeRemoved(SaveError): """ An interwiki link has to be removed, but this can't be done because of user preferences or because the user chose not to change the page. """
+ class GiveUpOnPage(pywikibot.Error): """ The user chose not to work on this page and its linked pages any more. """
+ # Subpage templates. Must be in lower case, # whereas subpage itself must be case sensitive moved_links = { - 'ar' : ([u'documentation', - u'template documentation', - u'شرح', - u'توثيق'], u'/doc'), - 'bn' : (u'documentation', u'/doc'), - 'ca' : (u'ús de la plantilla', u'/ús'), - 'cs' : (u'dokumentace', u'/doc'), - 'da' : (u'dokumentation', u'/doc'), - 'de' : (u'dokumentation', u'/Meta'), + 'ar': ([u'documentation', u'template documentation', u'شرح', u'توثيق'], + u'/doc'), + 'bn': (u'documentation', u'/doc'), + 'ca': (u'ús de la plantilla', u'/ús'), + 'cs': (u'dokumentace', u'/doc'), + 'da': (u'dokumentation', u'/doc'), + 'de': (u'dokumentation', u'/Meta'), 'dsb': ([u'dokumentacija', u'doc'], u'/Dokumentacija'), - 'en' : ([u'documentation', - u'template documentation', - u'template doc', - u'doc', - u'documentation, template'], u'/doc'), - 'es' : ([u'documentación', u'documentación de plantilla'], u'/doc'), - 'eu' : (u'txantiloi dokumentazioa', u'/dok'), - 'fa' : ([u'documentation', - u'template documentation', - u'template doc', - u'doc', - u'توضیحات', - u'زیرصفحه توضیحات'], u'/doc'), + 'en': ([u'documentation', u'template documentation', u'template doc', + u'doc', u'documentation, template'], u'/doc'), + 'es': ([u'documentación', u'documentación de plantilla'], u'/doc'), + 'eu': (u'txantiloi dokumentazioa', u'/dok'), + 'fa': ([u'documentation', u'template documentation', u'template doc', + u'doc', u'توضیحات', u'زیرصفحه توضیحات'], u'/doc'), # fi: no idea how to handle this type of subpage at :Metasivu: - 'fi' : (u'mallineohje', None), - 'fr' : ([u'/documentation', u'documentation', u'doc_modèle', - u'documentation modèle', u'documentation modèle compliqué', - u'documentation modèle en sous-page', - u'documentation modèle compliqué en sous-page', - u'documentation modèle utilisant les parserfunctions en sous-page', + 'fi': (u'mallineohje', None), + 'fr': ([u'/documentation', u'documentation', u'doc_modèle', + u'documentation modèle', u'documentation modèle compliqué', + u'documentation modèle en sous-page', + u'documentation modèle compliqué en sous-page', + u'documentation modèle utilisant les parserfunctions en sous-page', ], - u'/Documentation'), + u'/Documentation'), 'hsb': ([u'dokumentacija', u'doc'], u'/Dokumentacija'), - 'hu' : (u'sablondokumentáció', u'/doc'), - 'id' : (u'template doc', u'/doc'), + 'hu': (u'sablondokumentáció', u'/doc'), + 'id': (u'template doc', u'/doc'), 'ilo': (u'documentation', u'/doc'), - 'ja' : (u'documentation', u'/doc'), - 'ka' : (u'თარგის ინფო', u'/ინფო'), - 'ko' : (u'documentation', u'/설명문서'), - 'ms' : (u'documentation', u'/doc'), - 'no' : (u'dokumentasjon', u'/dok'), - 'nn' : (u'dokumentasjon', u'/dok'), - 'pl' : (u'dokumentacja', u'/opis'), - 'pt' : ([u'documentação', u'/doc'], u'/doc'), - 'ro' : (u'documentaţie', u'/doc'), - 'ru' : (u'doc', u'/doc'), + 'ja': (u'documentation', u'/doc'), + 'ka': (u'თარგის ინფო', u'/ინფო'), + 'ko': (u'documentation', u'/설명문서'), + 'ms': (u'documentation', u'/doc'), + 'no': (u'dokumentasjon', u'/dok'), + 'nn': (u'dokumentasjon', u'/dok'), + 'pl': (u'dokumentacja', u'/opis'), + 'pt': ([u'documentação', u'/doc'], u'/doc'), + 'ro': (u'documentaţie', u'/doc'), + 'ru': (u'doc', u'/doc'), 'simple': ([u'documentation', u'template documentation', u'template doc', u'doc', u'documentation, template'], u'/doc'), - 'sv' : (u'dokumentation', u'/dok'), - 'uk' : ([u'документація', - u'doc', - u'documentation'], u'/Документація'), - 'vi' : (u'documentation', u'/doc'), - 'zh' : ([u'documentation', u'doc'], u'/doc'), + 'sk': (u'dokumentácia', u'/Dokumentácia'), + 'sv': (u'dokumentation', u'/dok'), + 'uk': ([u'документація', u'doc', u'documentation'], u'/Документація'), + 'vi': (u'documentation', u'/doc'), + 'zh': ([u'documentation', u'doc'], u'/doc'), }
# A list of template names in different languages. # Pages which contain these shouldn't be changed. ignoreTemplates = { '_default': [u'delete'], - 'ar' : [u'قيد الاستخدام'], - 'cs' : [u'Pracuje_se'], - 'de' : [u'inuse', 'in use', u'in bearbeitung', u'inbearbeitung', - u'löschen', u'sla', - u'löschantrag', u'löschantragstext', - u'falschschreibung', - u'obsolete schreibung', 'veraltete schreibweise'], - 'en' : [u'inuse', u'softredirect'], - 'fa' : [u'در دست ویرایش ۲', u'حذف سریع'], + 'ar': [u'قيد الاستخدام'], + 'cs': [u'Pracuje_se'], + 'de': [u'inuse', 'in use', u'in bearbeitung', u'inbearbeitung', + u'löschen', u'sla', + u'löschantrag', u'löschantragstext', + u'falschschreibung', + u'obsolete schreibung', 'veraltete schreibweise'], + 'en': [u'inuse', u'softredirect'], + 'fa': [u'در دست ویرایش ۲', u'حذف سریع'], 'pdc': [u'lösche'], - 'zh' : [u'inuse'], + 'zh': [u'inuse'], }
+ class Global(object): """ Container class for global settings. @@ -495,9 +493,9 @@ contentsondisk = config.interwiki_contents_on_disk lacklanguage = None minlinks = 0 - quiet = False + quiet = False restoreAll = False - async = False + async = False summary = u''
def readOptions(self, arg): @@ -509,9 +507,12 @@ elif arg.startswith('-hintfile'): hintfilename = arg[10:] if (hintfilename is None) or (hintfilename == ''): - hintfilename = pywikibot.input(u'Please enter the hint filename:') + hintfilename = pywikibot.input( + u'Please enter the hint filename:') f = codecs.open(hintfilename, 'r', config.textfile_encoding) - R = re.compile(ur'[[(.+?)(?:]]||)') # hint or title ends either before | or before ]] + + # hint or title ends either before | or before ]] + R = re.compile(ur'[[(.+?)(?:]]||)') for pageTitle in R.findall(f.read()): self.hints.append(pageTitle) f.close() @@ -569,7 +570,7 @@ elif arg.startswith('-neverlink:'): self.neverlink += arg[11:].split(",") elif arg.startswith('-ignore:'): - self.ignore += [pywikibot.Page(None,p) for p in arg[8:].split(",")] + self.ignore += [pywikibot.Page(None, p) for p in arg[8:].split(",")] elif arg.startswith('-ignorefile:'): ignorefile = arg[12:] ignorePageGen = pagegenerators.TextfilePageGenerator(ignorefile) @@ -599,7 +600,8 @@ self.async = True elif arg.startswith('-summary'): if len(arg) == 8: - self.summary = pywikibot.input(u'What summary do you want to use?') + self.summary = pywikibot.input( + u'What summary do you want to use?') else: self.summary = arg[9:] elif arg.startswith('-lack:'): @@ -613,6 +615,7 @@ return False return True
+ class StoredPage(pywikibot.Page): """ Store the Page contents on disk to avoid sucking too much @@ -629,20 +632,20 @@ SPstore = None
# attributes created by pywikibot.Page.__init__ - SPcopy = [ '_editrestriction', - '_site', - '_namespace', - '_section', - '_title', - 'editRestriction', - 'moveRestriction', - '_permalink', - '_userName', - '_ipedit', - '_editTime', - '_startTime', - '_revisionId', - '_deletedRevs' ] + SPcopy = ['_editrestriction', + '_site', + '_namespace', + '_section', + '_title', + 'editRestriction', + 'moveRestriction', + '_permalink', + '_userName', + '_ipedit', + '_editTime', + '_startTime', + '_revisionId', + '_deletedRevs']
def SPdeleteStore(): if StoredPage.SPpath: @@ -680,6 +683,7 @@
_contents = property(SPgetContents, SPsetContents, SPdelContents)
+ class PageTree(object): """ Structure to manipulate a set of pages. @@ -758,6 +762,7 @@ for page in plist: yield page
+ class Subject(object): """ Class to follow the progress of a single 'subject' (i.e. a page with @@ -808,9 +813,8 @@ done <- NL(pending) U done return done
- - Subject objects only operate on pages that should have been preloaded before. - In fact, at any time: + Subject objects only operate on pages that should have been preloaded + before. In fact, at any time: * todo contains new Pages that have not been loaded yet * done contains Pages that have been loaded, and that have been treated. * If batch preloadings are successful, Page._get() is never called from @@ -841,7 +845,7 @@ # As we haven't yet found a page that links to the origin page, we # start with an empty list for it. if originPage: - self.foundIn = {self.originPage:[]} + self.foundIn = {self.originPage: []} else: self.foundIn = {} # This is a list of all pages that are currently scheduled for @@ -869,7 +873,6 @@ for page in tree.filter(site): if page.exists() and page.isDisambig(): return page - return None
def getFoundNonDisambig(self, site): """ @@ -880,10 +883,9 @@ """ for tree in [self.done, self.pending]: for page in tree.filter(site): - if page.exists() and not page.isDisambig() \ - and not page.isRedirectPage() and not page.isCategoryRedirect(): + if page.exists() and not page.isDisambig() and \ + not page.isRedirectPage() and not page.isCategoryRedirect(): return page - return None
def getFoundInCorrectNamespace(self, site): """ @@ -894,25 +896,36 @@ """ for tree in [self.done, self.pending, self.todo]: for page in tree.filter(site): - # -hintsonly: before we have an origin page, any namespace will do. - if self.originPage and page.namespace() == self.originPage.namespace(): - if page.exists() and not page.isRedirectPage() and not page.isCategoryRedirect(): + # -hintsonly: before we have an origin page, any namespace will + # do. + if self.originPage and \ + page.namespace() == self.originPage.namespace(): + if page.exists() and not \ + page.isRedirectPage() and not page.isCategoryRedirect(): return page - return None
- def translate(self, hints = None, keephintedsites = False): + def translate(self, hints=None, keephintedsites=False): """Add the given translation hints to the todo list""" if globalvar.same and self.originPage: if hints: - pages = titletranslate.translate(self.originPage, hints = hints + ['all:'], - auto = globalvar.auto, removebrackets = globalvar.hintnobracket) + pages = titletranslate.translate( + self.originPage, + hints=hints + ['all:'], + auto=globalvar.auto, + removebrackets=globalvar.hintnobracket) else: - pages = titletranslate.translate(self.originPage, hints = ['all:'], - auto = globalvar.auto, removebrackets = globalvar.hintnobracket) + pages = titletranslate.translate( + self.originPage, + hints=['all:'], + auto=globalvar.auto, + removebrackets=globalvar.hintnobracket) else: - pages = titletranslate.translate(self.originPage, hints=hints, - auto=globalvar.auto, removebrackets=globalvar.hintnobracket, - site=pywikibot.getSite()) + pages = titletranslate.translate( + self.originPage, + hints=hints, + auto=globalvar.auto, + removebrackets=globalvar.hintnobracket, + site=pywikibot.getSite()) for page in pages: if globalvar.contentsondisk: page = StoredPage(page) @@ -939,7 +952,8 @@ # Bug-check: Isn't there any work still in progress? We can't work on # different sites at a time! if len(self.pending) > 0: - raise 'BUG: Can't start to work on %s; still working on %s' % (site, self.pending) + raise "BUG: Can't start to work on %s; still working on %s" \ + % (site, self.pending) # Prepare a list of suitable pages result = [] for page in self.todo.filter(site): @@ -951,7 +965,7 @@ # If there are any, return them. Otherwise, nothing is in progress. return result
- def makeForcedStop(self,counter): + def makeForcedStop(self, counter): """ Ends work on the page before the normal end. """ @@ -1011,26 +1025,33 @@ if linkedPage in self.foundIn: # We have seen this page before, don't ask again. return False - elif self.originPage and self.originPage.namespace() != linkedPage.namespace(): + elif self.originPage and \ + self.originPage.namespace() != linkedPage.namespace(): # Allow for a mapping between different namespaces - crossFrom = self.originPage.site.family.crossnamespace.get(self.originPage.namespace(), {}) - crossTo = crossFrom.get(self.originPage.site.language(), crossFrom.get('_default', {})) - nsmatch = crossTo.get(linkedPage.site.language(), crossTo.get('_default', [])) + crossFrom = self.originPage.site.family.crossnamespace.get( + self.originPage.namespace(), {}) + crossTo = crossFrom.get(self.originPage.site.language(), + crossFrom.get('_default', {})) + nsmatch = crossTo.get(linkedPage.site.language(), + crossTo.get('_default', [])) if linkedPage.namespace() in nsmatch: return False if globalvar.autonomous: - pywikibot.output(u"NOTE: Ignoring link from page %s in namespace %i to page %s in namespace %i." - % (linkingPage, linkingPage.namespace(), - linkedPage, linkedPage.namespace())) + pywikibot.output( +u"NOTE: Ignoring link from page %s in namespace %i to page %s in namespace %i." + % (linkingPage, linkingPage.namespace(), linkedPage, + linkedPage.namespace())) # Fill up foundIn, so that we will not write this notice self.foundIn[linkedPage] = [linkingPage] return True else: preferredPage = self.getFoundInCorrectNamespace(linkedPage.site) if preferredPage: - pywikibot.output(u"NOTE: Ignoring link from page %s in namespace %i to page %s in namespace %i because page %s in the correct namespace has already been found." - % (linkingPage, linkingPage.namespace(), linkedPage, - linkedPage.namespace(), preferredPage)) + pywikibot.output( +u"NOTE: Ignoring link from page %s in namespace %i to page %s in namespace %i " +u"because page %s in the correct namespace has already been found." + % (linkingPage, linkingPage.namespace(), linkedPage, + linkedPage.namespace(), preferredPage)) return True else: choice = pywikibot.inputChoice( @@ -1045,13 +1066,17 @@ if choice == 'g': self.makeForcedStop(counter) elif choice == 'a': - newHint = pywikibot.input(u'Give the alternative for language %s, not using a language code:' - % linkedPage.site.language()) + newHint = pywikibot.input( + u'Give the alternative for language %s, not ' + u'using a language code:' + % linkedPage.site.language()) if newHint: - alternativePage = pywikibot.Page(linkedPage.site, newHint) + alternativePage = pywikibot.Page( + linkedPage.site, newHint) if alternativePage: # add the page that was entered by the user - self.addIfNew(alternativePage, counter, None) + self.addIfNew(alternativePage, counter, + None) else: pywikibot.output( u"NOTE: ignoring %s and its interwiki links" @@ -1063,14 +1088,18 @@ return False
def wiktionaryMismatch(self, page): - if self.originPage and globalvar.same=='wiktionary': + if self.originPage and globalvar.same == 'wiktionary': if page.title().lower() != self.originPage.title().lower(): - pywikibot.output(u"NOTE: Ignoring %s for %s in wiktionary mode" % (page, self.originPage)) - return True - elif page.title() != self.originPage.title() and self.originPage.site.nocapitalize and page.site.nocapitalize: - pywikibot.output(u"NOTE: Ignoring %s for %s in wiktionary mode because both languages are uncapitalized." + pywikibot.output(u"NOTE: Ignoring %s for %s in wiktionary mode" % (page, self.originPage)) return True + elif page.title() != self.originPage.title() and \ + self.originPage.site.nocapitalize and page.site.nocapitalize: + pywikibot.output( + u"NOTE: Ignoring %s for %s in wiktionary mode because both " + u"languages are uncapitalized." + % (page, self.originPage)) + return True return False
def disambigMismatch(self, page, counter): @@ -1088,15 +1117,17 @@ chosen to use instead of the given page. """ if not self.originPage: - return (False, None) # any page matches until we have an origin page + return (False, None) # any page matches til we have an origin page if globalvar.autonomous: if self.originPage.isDisambig() and not page.isDisambig(): - pywikibot.output(u"NOTE: Ignoring link from disambiguation page %s to non-disambiguation %s" - % (self.originPage, page)) + pywikibot.output( + u"NOTE: Ignoring link from disambiguation page %s to " + u"non-disambiguation %s" % (self.originPage, page)) return (True, None) elif not self.originPage.isDisambig() and page.isDisambig(): - pywikibot.output(u"NOTE: Ignoring link from non-disambiguation page %s to disambiguation %s" - % (self.originPage, page)) + pywikibot.output( + u"NOTE: Ignoring link from non-disambiguation page %s to " + u"disambiguation %s" % (self.originPage, page)) return (True, None) else: choice = 'y' @@ -1104,32 +1135,39 @@ disambig = self.getFoundDisambig(page.site) if disambig: pywikibot.output( - u"NOTE: Ignoring non-disambiguation page %s for %s because disambiguation page %s has already been found." + u"NOTE: Ignoring non-disambiguation page %s for %s " + u"because disambiguation page %s has already been " + u"found." % (page, self.originPage, disambig)) return (True, None) else: choice = pywikibot.inputChoice( - u'WARNING: %s is a disambiguation page, but %s doesn't seem to be one. Follow it anyway?' + u"WARNING: %s is a disambiguation page, but %s doesn't " + u"seem to be one. Follow it anyway?" % (self.originPage, page), ['Yes', 'No', 'Add an alternative', 'Give up'], ['y', 'n', 'a', 'g']) elif not self.originPage.isDisambig() and page.isDisambig(): nondisambig = self.getFoundNonDisambig(page.site) if nondisambig: - pywikibot.output(u"NOTE: Ignoring disambiguation page %s for %s because non-disambiguation page %s has already been found." - % (page, self.originPage, nondisambig)) + pywikibot.output( + u"NOTE: Ignoring disambiguation page %s for %s because " + u"non-disambiguation page %s has already been found." + % (page, self.originPage, nondisambig)) return (True, None) else: choice = pywikibot.inputChoice( - u'WARNING: %s doesn't seem to be a disambiguation page, but %s is one. Follow it anyway?' + u'WARNING: %s doesn't seem to be a disambiguation ' + u'page, but %s is one. Follow it anyway?' % (self.originPage, page), ['Yes', 'No', 'Add an alternative', 'Give up'], ['y', 'n', 'a', 'g']) if choice == 'n': return (True, None) elif choice == 'a': - newHint = pywikibot.input(u'Give the alternative for language %s, not using a language code:' - % page.site.language()) + newHint = pywikibot.input( + u'Give the alternative for language %s, not using a ' + u'language code:' % page.site.language()) alternativePage = pywikibot.Page(page.site, newHint) return (True, alternativePage) elif choice == 'g': @@ -1164,7 +1202,8 @@ return if (self.untranslated or globalvar.askhints) and not self.hintsAsked \ and self.originPage and self.originPage.exists() \ - and not self.originPage.isRedirectPage() and not self.originPage.isCategoryRedirect(): + and not self.originPage.isRedirectPage() and \ + not self.originPage.isCategoryRedirect(): # Only once! self.hintsAsked = True if globalvar.untranslated: @@ -1174,17 +1213,24 @@ pywikibot.output(self.originPage.get()[:t]) # loop while True: - newhint = pywikibot.input(u'Give a hint (? to see pagetext):') + newhint = pywikibot.input( + u'Give a hint (? to see pagetext):') if newhint == '?': t += globalvar.showtextlinkadd pywikibot.output(self.originPage.get()[:t]) elif newhint and not ':' in newhint: - pywikibot.output(u'Please enter a hint in the format language:pagename or type nothing if you do not have a hint.') + pywikibot.output( + u'Please enter a hint in the format ' + u'language:pagename or type nothing if you do not ' + u'have a hint.') elif not newhint: break else: - pages = titletranslate.translate(self.originPage, hints=[newhint], - auto = globalvar.auto, removebrackets=globalvar.hintnobracket) + pages = titletranslate.translate( + self.originPage, + hints=[newhint], + auto=globalvar.auto, + removebrackets=globalvar.hintnobracket) for page in pages: self.addIfNew(page, counter, None) if globalvar.hintsareright: @@ -1197,9 +1243,9 @@ In other words, all the pages in self.pending have already been preloaded.
- The only argument is an instance - of a counter class, that has methods minus() and plus() to keep - counts of the total work todo. + The only argument is an instance of a counter class, that has methods + minus() and plus() to keep counts of the total work todo. + """ # Loop over all the pages that should have been taken care of for page in self.pending: @@ -1211,9 +1257,11 @@ dictName, year = page.autoFormat() if dictName is not None: if self.originPage: - pywikibot.output(u'WARNING: %s:%s relates to %s:%s, which is an auto entry %s(%s)' - % (self.originPage.site.language(), self.originPage, - page.site.language(), page, dictName, year)) + pywikibot.output( + u'WARNING: %s:%s relates to %s:%s, which is an ' + u'auto entry %s(%s)' + % (self.originPage.site.language(), self.originPage, + page.site.language(), page, dictName, year))
# Abort processing if the bot is running in autonomous mode. if globalvar.autonomous: @@ -1231,12 +1279,13 @@ pywikibot.output(u"NOTE: %s does not exist. Skipping." % page) if page == self.originPage: - # The page we are working on is the page that does not exist. - # No use in doing any work on it in that case. + # The page we are working on is the page that does not + # exist. No use in doing any work on it in that case. for site, count in self.todo.siteCounts(): counter.minus(site, count) self.todo = PageTree() - # In some rare cases it might be we already did check some 'automatic' links + # In some rare cases it might be we already did check some + # 'automatic' links self.done = PageTree() continue
@@ -1253,7 +1302,8 @@ pywikibot.output(u"NOTE: %s is %sredirect to %s" % (page, redir, redirectTargetPage)) if self.originPage is None or page == self.originPage: - # the 1st existig page becomes the origin page, if none was supplied + # the 1st existig page becomes the origin page, if none was + # supplied if globalvar.initialredirect: if globalvar.contentsondisk: redirectTargetPage = StoredPage(redirectTargetPage) @@ -1264,8 +1314,8 @@ self.todo.add(redirectTargetPage) counter.plus(redirectTargetPage.site) else: - # This is a redirect page to the origin. We don't need to - # follow the redirection. + # This is a redirect page to the origin. We don't need + # to follow the redirection. # In this case we can also stop all hints! for site, count in self.todo.siteCounts(): counter.minus(site, count) @@ -1309,7 +1359,8 @@
# Page exists, isnt a redirect, and is a plain link (no section) if self.originPage is None: - # the 1st existig page becomes the origin page, if none was supplied + # the 1st existig page becomes the origin page, if none was + # supplied self.originPage = page try: iw = page.langlinks() @@ -1331,7 +1382,8 @@
duplicate = None for p in self.done.filter(page.site): - if p != page and p.exists() and not p.isRedirectPage() and not p.isCategoryRedirect(): + if p != page and p.exists() and \ + not p.isRedirectPage() and not p.isCategoryRedirect(): duplicate = p break
@@ -1341,7 +1393,8 @@ # Ignore the interwiki links. iw = () if globalvar.lacklanguage: - if globalvar.lacklanguage in [link.site.language() for link in iw]: + if globalvar.lacklanguage in [link.site.language() + for link in iw]: iw = () self.workonme = False if len(iw) < globalvar.minlinks: @@ -1349,8 +1402,9 @@ self.workonme = False
elif globalvar.autonomous and duplicate and not skip: - pywikibot.output(u"Stopping work on %s because duplicate pages"\ - " %s and %s are found" % (self.originPage, duplicate, page)) + pywikibot.output(u"Stopping work on %s because duplicate pages" + " %s and %s are found" + % (self.originPage, duplicate, page)) self.makeForcedStop(counter) try: f = codecs.open( @@ -1652,10 +1706,10 @@ break else: for (site, page) in new.iteritems(): - # edit restriction for some templates on zh-wiki where interlanguage keys are included - # by /doc subpage - smallWikiAllowed = not (page.site.sitename() == 'wikipedia:zh' and - page.namespace() == 10 and + # edit restriction for some templates on zh-wiki where + # interlanguage keys are included by /doc subpage + smallWikiAllowed = not (page.site.sitename() == 'wikipedia:zh' + and page.namespace() == 10 and u'Country data' in page.title(withNamespace=False)) # edit restriction on is-wiki # http://is.wikipedia.org/wiki/Wikipediaspjall:V%C3%A9lmenni @@ -1769,7 +1823,7 @@
# clone original newPages dictionary, so that we can modify it to the # local page's needs - new = dict(newPages) + new = newPages.copy() interwikis = [pywikibot.Page(l) for l in page.iterlanglinks()]
# remove interwiki links to ignore @@ -2007,10 +2061,11 @@ % (page.site.family.name, page, expectedPage, linkedPage)) except KeyError: - pywikibot.output( - u"WARNING: %s: %s does not link to %s" - % (page.site.family.name, - page, expectedPage)) + if not expectedPage.site.is_data_repository(): + pywikibot.output( + u"WARNING: %s: %s does not link to %s" + % (page.site.family.name, + page, expectedPage)) # Check for superfluous links for linkedPage in linkedPages: if linkedPage not in expectedPages: @@ -2429,9 +2484,9 @@ elif globalvar.summary: globalvar.summary += u'; '
- # ensure that we don't try to change main page site = pywikibot.getSite() site.login() + # ensure that we don't try to change main page try: mainpagename = site.mediawiki_message('mainpage') globalvar.skip.add(pywikibot.Page(site, mainpagename))
pywikipedia-svn@lists.wikimedia.org