Revision: 7926
Author: siebrand
Date: 2010-02-12 10:39:37 +0000 (Fri, 12 Feb 2010)
Log Message:
-----------
Abort processing when an auto entry is found in autonomous mode with skipauto
This happens often if no collection of well known formats have been defined for a language, but they are present in the interwiki network. This can save an enormous amount of (processing) time in given case.
Modified Paths:
--------------
trunk/pywikipedia/interwiki.py
Modified: trunk/pywikipedia/interwiki.py
===================================================================
--- trunk/pywikipedia/interwiki.py 2010-02-12 06:53:37 UTC (rev 7925)
+++ trunk/pywikipedia/interwiki.py 2010-02-12 10:39:37 UTC (rev 7926)
@@ -1230,6 +1230,10 @@
if dictName is not None:
pywikibot.output(u'WARNING: %s:%s relates to %s:%s, which is an auto entry %s(%s)' % (self.originPage.site().language(), self.originPage.title(), page.site().language(),page.title(),dictName,year))
+ # Abort processing if the bot is running in autonomous mode.
+ if globalvar.autonomous:
+ self.makeForcedStop(counter)
+
# Register this fact at the todo-counter.
counter.minus(page.site())
Revision: 7924
Author: xqt
Date: 2010-02-12 06:40:57 +0000 (Fri, 12 Feb 2010)
Log Message:
-----------
global debug option for development purposes
Modified Paths:
--------------
trunk/pywikipedia/blockpageschecker.py
trunk/pywikipedia/djvutext.py
trunk/pywikipedia/featured.py
trunk/pywikipedia/pagefromfile.py
trunk/pywikipedia/piper.py
trunk/pywikipedia/table2wiki.py
trunk/pywikipedia/wikipedia.py
Modified: trunk/pywikipedia/blockpageschecker.py
===================================================================
--- trunk/pywikipedia/blockpageschecker.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/blockpageschecker.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -32,8 +32,8 @@
-always Doesn't ask every time if the bot should make the change or not,
do it always.
--debug When the bot can't delete the template from the page (wrong
- regex or something like that) it will ask you if it should open
+-show When the bot can't delete the template from the page (wrong
+ regex or something like that) it will ask you if it should show
the page on your browser.
(attention: pages included may give false positives!)
@@ -53,13 +53,14 @@
python blockpageschecker.py -cat:Geography -always
-python blockpageschecker.py -debug -protectedpages:4
+python blockpageschecker.py -show -protectedpages:4
"""
#
# (C) Monobi a.k.a. Wikihermit, 2007
-# (C) Filnik, 2007-2008-2009
-# (C) NicDumZ, 2008
+# (C) Filnik, 2007-2009
+# (C) NicDumZ, 2008-2009
+# (C) Pywikipedia bot team, 2007-2010
#
# Distributed under the terms of the MIT license.
#
@@ -188,7 +189,7 @@
return ('autoconfirmed-move', catchRegex)
return ('editable', r'\A\n') # If editable means that we have no regex, won't change anything with this regex
-def debugQuest(site, page):
+def showQuest(site, page):
quest = pywikibot.inputChoice(u'Do you want to open the page?',['with browser', 'with gui', 'no'], ['b','g','n'], 'n')
pathWiki = site.family.nicepath(site.lang)
url = 'http://%s%s%s?&redirect=no' % (pywikibot.getSite().hostname(), pathWiki, page.urlname())
@@ -204,7 +205,7 @@
# Loading the comments
global categoryToCheck, comment, project_inserted
# always, define a generator to understand if the user sets one, defining what's genFactory
- always = False; generator = False; debug = False
+ always = False; generator = False; show = False
moveBlockCheck = False; genFactory = pagegenerators.GeneratorFactory()
# To prevent Infinite loops
errorCount = 0
@@ -214,8 +215,8 @@
always = True
elif arg == '-move':
moveBlockCheck = True
- elif arg == '-debug':
- debug = True
+ elif arg == '-show':
+ show = True
elif arg.startswith('-protectedpages'):
if len(arg) == 15:
generator = site.protectedpages(namespace = 0)
@@ -278,8 +279,8 @@
continue
except pywikibot.IsRedirectPage:
pywikibot.output("%s is a redirect! Skipping..." % pagename)
- if debug:
- debugQuest(site, page)
+ if show:
+ showQuest(site, page)
continue
"""
# This check does not work :
Modified: trunk/pywikipedia/djvutext.py
===================================================================
--- trunk/pywikipedia/djvutext.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/djvutext.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -6,7 +6,7 @@
The following parameters are supported:
- -debug If given, doesn't do any real changes, but only shows
+ -dry If given, doesn't do any real changes, but only shows
what would have been changed.
-ask Ask for confirmation before uploading each page.
(Default: ask when overwriting pages)
@@ -18,6 +18,11 @@
All other parameters will be regarded as part of the title of a single page,
and the bot will only work on that single page.
"""
+#
+# (C) Pywikipedia bot team, 2008-2010
+#
+# Distributed under the terms of the MIT license.
+#
__version__ = '$Id$'
import wikipedia
import os, sys
@@ -49,14 +54,14 @@
def __init__(self, djvu, index, pages, ask=False, debug=False):
"""
Constructor. Parameters:
- djvu : filename
- index : page name
- pages : page range
+ djvu : filename
+ index : page name
+ pages : page range
"""
self.djvu = djvu
self.index = index
self.pages = pages
- self.debug = debug
+ self.dry = debug
self.ask = ask
def NoOfImages(self):
@@ -103,9 +108,7 @@
def has_text(self):
cmd = u"djvudump \"%s\" > \"%s\".out" % (self.djvu, self.djvu)
os.system ( cmd.encode(sys.stdout.encoding) )
-
f = codecs.open(u"%s.out" % self.djvu, 'r', config.textfile_encoding, 'replace')
-
s = f.read()
f.close()
return s.find('TXTz') >= 0
@@ -114,9 +117,7 @@
wikipedia.output(unicode("fetching page %d" % (pageno)))
cmd = u"djvutxt --page=%d \"%s\" \"%s.out\"" % (pageno, self.djvu, self.djvu)
os.system ( cmd.encode(sys.stdout.encoding) )
-
f = codecs.open(u"%s.out" % self.djvu, 'r', config.textfile_encoding, 'replace')
-
djvu_text = f.read()
f.close()
return djvu_text
@@ -137,7 +138,7 @@
text = u'<noinclude>{{PageQuality|1|%s}}<div class="pagetext">\n\n\n</noinclude>%s<noinclude><references/></div></noinclude>' % (self.username,djvutxt)
# convert to wikisyntax
- # this adds a second line feed, which makes a new paragraph
+ # this adds a second line feed, which makes a new paragraph
text = text.replace('', "\n")
# only save if something was changed
@@ -156,8 +157,8 @@
wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
wikipedia.showDiff(old_text, text)
- if self.debug:
- wikipedia.inputChoice(u'Debug mode... Press enter to continue', [], [], 'dummy')
+ if self.dry:
+ wikipedia.inputChoice(u'Dry mode... Press enter to continue', [], [], 'dummy')
return
if ask:
@@ -182,13 +183,13 @@
djvu = None
pages = None
# what would have been changed.
- debug = False
+ dry = False
ask = False
# Parse command line arguments
for arg in wikipedia.handleArgs():
- if arg.startswith("-debug"):
- debug = True
+ if arg.startswith("-dry"):
+ dry = True
elif arg.startswith("-ask"):
ask = True
elif arg.startswith("-djvu:"):
@@ -226,7 +227,7 @@
wikipedia.output(u"uploading text from %s to %s" % (djvu, index_page.aslink()) )
- bot = DjVuTextBot(djvu, index, pages, ask, debug)
+ bot = DjVuTextBot(djvu, index, pages, ask, dry)
if not bot.has_text():
raise ValueError("No text layer in djvu file")
Modified: trunk/pywikipedia/featured.py
===================================================================
--- trunk/pywikipedia/featured.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/featured.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -32,7 +32,7 @@
-quiet no corresponding pages are displayed.
--debug for debug purposes. No changes will be made.
+-dry for debug purposes. No changes will be made.
usage: featured.py [-interactive] [-nocache] [-top] [-after:zzzz] [-fromlang:xx,yy--zz|-fromall]
@@ -41,8 +41,9 @@
#
# (C) Maxim Razin, 2005
-# (C) Leonardo Gregianin, 2006-2007
-# (C) xqt, 2009
+# (C) Leonardo Gregianin, 2005-2008
+# (C) xqt, 2009-2010
+# (C) Pywikipedia bot team, 2005-2010
#
# Distributed under the terms of the MIT license.
#
@@ -351,11 +352,11 @@
arts=[]
try:
if pType == 'good':
- method=good_name[site.lang][0]
- elif pType == 'list':
- method=lists_name[site.lang][0]
+ method=good_name[site.lang][0]
+ elif pType == 'list':
+ method=lists_name[site.lang][0]
else:
- method=featured_name[site.lang][0]
+ method=featured_name[site.lang][0]
except KeyError:
wikipedia.output(u'Error: language %s doesn\'t has %s category source.' % (site.lang, feature))
return arts
@@ -452,8 +453,7 @@
templates = template['_default']
return templates
-
-def featuredWithInterwiki(fromsite, tosite, template_on_top, pType, quiet, debug = False):
+def featuredWithInterwiki(fromsite, tosite, template_on_top, pType, quiet, dry = False):
if not fromsite.lang in cache:
cache[fromsite.lang]={}
if not tosite.lang in cache[fromsite.lang]:
@@ -523,7 +523,7 @@
text=(text[:m.end()]
+ (u" {{%s|%s}}" % (templatelist[0], fromsite.lang))
+ text[m.end():])
- if not debug:
+ if not dry:
try:
atrans.put(text, comment)
except wikipedia.LockedPage:
@@ -541,7 +541,7 @@
doAll = False
part = False
quiet = False
- debug = False
+ dry = False
for arg in wikipedia.handleArgs():
if arg == '-interactive':
interactive=1
@@ -564,8 +564,8 @@
processType = 'list'
elif arg == '-quiet':
quiet = True
- elif arg == '-debug':
- debug = True
+ elif arg == '-dry':
+ dry = True
if part:
try:
@@ -574,7 +574,7 @@
ll1,ll2=fromlang[0].split("--",1)
if not ll1: ll1=""
if not ll2: ll2="zzzzzzz"
- if processType == 'good':
+ if processType == 'good':
fromlang=[ll for ll in good_name.keys() if ll>=ll1 and ll<=ll2]
elif processType == 'list':
fromlang=[ll for ll in good_lists.keys() if ll>=ll1 and ll<=ll2]
@@ -582,15 +582,15 @@
fromlang=[ll for ll in featured_name.keys() if ll>=ll1 and ll<=ll2]
except:
pass
-
+
if doAll:
- if processType == 'good':
+ if processType == 'good':
fromlang=good_name.keys()
- elif processType == 'list':
+ elif processType == 'list':
fromlang=lists_name.keys()
- else:
- fromlang=featured_name.keys()
-
+ else:
+ fromlang=featured_name.keys()
+
filename="cache/" + processType
try:
cache=pickle.load(file(filename,"rb"))
@@ -603,7 +603,7 @@
sys.exit(1)
fromlang.sort()
-
+
#test whether this site has template enabled
hasTemplate = False
if not featuredcount:
@@ -623,7 +623,7 @@
break
elif fromsite != wikipedia.getSite():
featuredWithInterwiki(fromsite, wikipedia.getSite(),
- template_on_top, processType, quiet, debug)
+ template_on_top, processType, quiet, dry)
except KeyboardInterrupt:
wikipedia.output('\nQuitting program...')
finally:
Modified: trunk/pywikipedia/pagefromfile.py
===================================================================
--- trunk/pywikipedia/pagefromfile.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/pagefromfile.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -31,7 +31,7 @@
-autosummary Use MediaWikis autosummary when creating a new page,
overrides -summary in this case
-minor set minor edit flag on page edits
--debug Do not really upload pages, just check and report
+-dry Do not really upload pages, just check and report
messages
If the page to be uploaded already exists:
@@ -42,6 +42,7 @@
"""
#
# (C) Andre Engels, 2004
+# (C) Pywikipedia bot team, 2005-2010
#
# Distributed under the terms of the MIT license.
#
@@ -139,7 +140,7 @@
self.summary = summary
self.minor = minor
self.autosummary = autosummary
- self.debug = debug
+ self.dry = debug
def run(self):
for title, contents in self.reader.run():
@@ -185,8 +186,8 @@
comment = ''
wikipedia.setAction('')
- if self.debug:
- wikipedia.output("*** Debug mode ***\n" + \
+ if self.dry:
+ wikipedia.output("*** Dry mode ***\n" + \
"\03{lightpurple}title\03{default}: " + title + "\n" + \
"\03{lightpurple}contents\03{default}:\n" + contents + "\n" \
"\03{lightpurple}comment\03{default}: " + comment + "\n")
@@ -282,7 +283,7 @@
summary = None
minor = False
autosummary = False
- debug = False
+ dry = False
for arg in wikipedia.handleArgs():
if arg.startswith("-start:"):
@@ -299,8 +300,8 @@
append = "Bottom"
elif arg == "-force":
force=True
- elif arg == "-debug":
- debug = True
+ elif arg == "-dry":
+ dry = True
elif arg == "-safe":
force = False
append = None
@@ -321,7 +322,7 @@
reader = PageFromFileReader(filename, pageStartMarker, pageEndMarker, titleStartMarker, titleEndMarker, include, notitle)
- bot = PageFromFileRobot(reader, force, append, summary, minor, autosummary, debug)
+ bot = PageFromFileRobot(reader, force, append, summary, minor, autosummary, dry)
bot.run()
if __name__ == "__main__":
Modified: trunk/pywikipedia/piper.py
===================================================================
--- trunk/pywikipedia/piper.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/piper.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -20,7 +20,7 @@
¶ms;
- -debug If given, doesn't do any real changes, but only shows
+ -dry If given, doesn't do any real changes, but only shows
what would have been changed.
-always Always commit changes without asking you to accept them
@@ -34,7 +34,13 @@
supported.
"""
+#
+# (C) Pywikipedia bot team, 2008-2010
+#
+# Distributed under the terms of the MIT license.
+#
__version__ = '$Id$'
+
import wikipedia
import pagegenerators
@@ -68,7 +74,7 @@
* always - If True, don't prompt for changes
"""
self.generator = generator
- self.debug = debug
+ self.dry = debug
self.always = always
self.filters = filters
@@ -104,16 +110,6 @@
return unicode_text
- # debug
- #def savePage(self, name, text):
- # mungedName = name.replace(":", "_").replace("/", "_").replace(" ", "_")
- #
- # saveName = "/tmp/piper/%s" % mungedName
- # file = open(saveName, 'w')
- # file.write(text.encode("utf-8"))
- # file.close()
- # print "Wrote to %s" % saveName
-
def treat(self, page):
"""
Loads the given page, does some changes, and saves it.
@@ -128,9 +124,6 @@
wikipedia.output(u"Page %s is a redirect; skipping." % page.aslink())
return
- # debug
- # self.savePage(page.title(), text)
-
# Munge!
for program in self.filters:
text = self.pipe(program, text);
@@ -142,7 +135,7 @@
wikipedia.output(u"\n\n>>> %s <<<" % page.title())
# show what was changed
wikipedia.showDiff(page.get(), text)
- if not self.debug:
+ if not self.dry:
if not self.always:
choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No'], ['y', 'N'], 'N')
else:
@@ -169,9 +162,9 @@
# This temporary array is used to read the page title if one single
# page to work on is specified by the arguments.
pageTitleParts = []
- # If debug is True, doesn't do any real changes, but only show
+ # If dry is True, doesn't do any real changes, but only show
# what would have been changed.
- debug = False
+ dry = False
# will become True when the user uses the -always flag.
always = False
# The program to pipe stuff through
@@ -179,8 +172,8 @@
# Parse command line arguments
for arg in wikipedia.handleArgs():
- if arg.startswith("-debug"):
- debug = True
+ if arg.startswith("-dry"):
+ dry = True
elif arg.startswith("-filter:"):
prog = arg[8:]
filters.append(prog)
@@ -204,7 +197,7 @@
# The preloading generator is responsible for downloading multiple
# pages from the wiki simultaneously.
gen = pagegenerators.PreloadingGenerator(gen)
- bot = PiperBot(gen, debug, filters, always)
+ bot = PiperBot(gen, dry, filters, always)
bot.run()
else:
wikipedia.showHelp()
Modified: trunk/pywikipedia/table2wiki.py
===================================================================
--- trunk/pywikipedia/table2wiki.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/table2wiki.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -46,10 +46,12 @@
Broken HTML tables will most likely result in broken wiki tables!
Please check every article you change.
"""
-
+#
# (C) 2003 Thomas R. Koll, <tomk32(a)tomk32.de>
+# (C) Pywikipedia bot team, 2003-2010
#
# Distributed under the terms of the MIT license.
+#
__version__='$Id$'
import re, sys, time
@@ -131,9 +133,8 @@
yield wikipedia.Page(wikipedia.getSite(), entry.title)
class Table2WikiRobot:
- def __init__(self, generator, debug = False, quietMode = False):
+ def __init__(self, generator, quietMode = False):
self.generator = generator
- self.debug = debug
self.quietMode = quietMode
def convertTable(self, table):
@@ -465,16 +466,12 @@
if not table:
# no more HTML tables left
break
- print ">> Table %i <<" % (convertedTables + 1)
+ wikipedia.output(">> Table %i <<" % (convertedTables + 1))
# convert the current table
newTable, warningsThisTable, warnMsgsThisTable = self.convertTable(table)
# show the changes for this table
- if self.debug:
- print table
- print newTable
- elif not self.quietMode:
+ if not self.quietMode:
wikipedia.showDiff(table.replace('##table##', 'table'), newTable)
- print ""
warningSum += warningsThisTable
for msg in warnMsgsThisTable:
warningMessages += 'In table %i: %s' % (convertedTables + 1, msg)
@@ -542,14 +539,12 @@
articles = []
# if -file is not used, this temporary array is used to read the page title.
page_title = []
- debug = False
# Which namespaces should be processed?
# default to [] which means all namespaces will be processed
namespaces = []
xmlfilename = None
-
gen = None
# This factory is responsible for processing command line arguments
@@ -584,8 +579,6 @@
print "Automatic mode!\n"
elif arg.startswith('-quiet'):
quietMode = True
- elif arg.startswith('-debug'):
- debug = True
else:
if not genFactory.handleArg(arg):
page_title.append(arg)
@@ -599,15 +592,15 @@
if not gen:
gen = genFactory.getCombinedGenerator()
- if not gen:
- # show help
+
+ if gen:
+ if namespaces != []:
+ gen = pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
+ preloadingGen = pagegenerators.PreloadingGenerator(gen)
+ bot = Table2WikiRobot(preloadingGen, quietMode)
+ bot.run()
+ else:
wikipedia.showHelp('table2wiki')
- sys.exit(0)
- if namespaces != []:
- gen = pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
- preloadingGen = pagegenerators.PreloadingGenerator(gen)
- bot = Table2WikiRobot(preloadingGen, debug, quietMode)
- bot.run()
if __name__ == "__main__":
try:
Modified: trunk/pywikipedia/wikipedia.py
===================================================================
--- trunk/pywikipedia/wikipedia.py 2010-02-11 15:20:48 UTC (rev 7923)
+++ trunk/pywikipedia/wikipedia.py 2010-02-12 06:40:57 UTC (rev 7924)
@@ -116,7 +116,7 @@
"""
from __future__ import generators
#
-# (C) Pywikipedia bot team, 2003-2009
+# (C) Pywikipedia bot team, 2003-2010
#
# Distributed under the terms of the MIT license.
#
@@ -1286,7 +1286,7 @@
for s in self.getReferencesOld(follow_redirects, withTemplateInclusion, onlyTemplateInclusion, redirectsOnly):
yield s
return
-
+
params = {
'action': 'query',
'list': [],
@@ -1314,13 +1314,13 @@
params['eifilterredir'] = 'redirects'
if not self.site().isAllowed('apihighlimits') and config.special_page_limit > 500:
params['eilimit'] = 500
-
+
allDone = False
-
+
while not allDone:
if not internal:
output(u'Getting references to %s via API...' % self.aslink())
-
+
datas = query.GetData(params, self.site())
data = datas['query'].values()
if len(data) == 2:
@@ -1333,7 +1333,7 @@
pg = Page(self.site(), blp['title'], defaultNamespace = blp['ns'])
if pg in refPages:
continue
-
+
yield pg
refPages.add(pg)
if follow_redirects and 'redirect' in blp and 'redirlinks' in blp:
@@ -1341,7 +1341,7 @@
plk = Page(self.site(), p['title'], defaultNamespace = p['ns'])
if plk in refPages:
continue
-
+
yield plk
refPages.add(plk)
if follow_redirects and 'redirect' in p:
@@ -1352,7 +1352,7 @@
continue
else:
continue
-
+
if 'query-continue' in datas:
if 'backlinks' in datas['query-continue']:
params['blcontinue'] = datas['query-continue']['backlinks']['blcontinue']
@@ -1361,8 +1361,8 @@
params['eicontinue'] = datas['query-continue']['embeddedin']['eicontinue']
else:
allDone = True
-
-
+
+
def getReferencesOld(self,
follow_redirects=True, withTemplateInclusion=True,
onlyTemplateInclusion=False, redirectsOnly=False):
@@ -2542,10 +2542,10 @@
dataQuery = self._versionhistory
else:
thisHistoryDone = True
-
+
if not thisHistoryDone:
dataQuery.extend(self._getVersionHistory(getAll, skip, reverseOrder, revCount))
-
+
if reverseOrder:
# Return only revCount edits, even if the version history is extensive
if dataQuery != []:
@@ -2562,7 +2562,7 @@
if len(self._versionhistory) > revCount and not getAll:
return self._versionhistory[:revCount]
return self._versionhistory
-
+
def _getVersionHistory(self, getAll = False, skipFirst = False, reverseOrder = False,
revCount=500):
"""Load history informations by API query.
@@ -2588,11 +2588,11 @@
while not thisHistoryDone:
if reverseOrder:
params['rvdir'] = 'newer'
-
+
result = query.GetData(params, self.site())
if 'error' in result:
raise RuntimeError("%s" % result['error'])
-
+
if 'query-continue' in result and getAll:
params['rvstartid'] = result['query-continue']['revisions']['rvstartid']
else:
@@ -2680,8 +2680,7 @@
thisHistoryDone = True
return dataQ
-
-
+
def getVersionHistoryTable(self, forceReload=False, reverseOrder=False,
getAll=False, revCount=500):
"""Return the version history as a wiki table."""
@@ -2771,13 +2770,13 @@
}
if movesubpages:
params['movesubpages'] = 1
-
+
if movetalkpage:
params['movetalk'] = 1
-
+
if not leaveRedirect:
params['noredirect'] = 1
-
+
result = query.GetData(params, self.site(), sysop=sysop)
if 'error' in result:
err = result['error']['code']
@@ -2811,8 +2810,7 @@
output(u'Page %s is moved and no longer exist.' % self.title() )
#delattr(self, '_contents')
return True
-
-
+
def _moveOld(self, newtitle, reason=None, movetalkpage=True, movesubpages=False, sysop=False,
throttle=True, deleteAndMove=False, safe=True, fixredirects=True, leaveRedirect=True):
@@ -2834,7 +2832,7 @@
reason = input(u'Please enter a reason for the move:')
if self.isTalkPage():
movetalkpage = False
-
+
host = self.site().hostname()
address = self.site().move_address()
token = self.site().getToken(sysop = sysop)
@@ -2846,40 +2844,40 @@
if deleteAndMove:
predata['wpDeleteAndMove'] = self.site().mediawiki_message('delete_and_move_confirm')
predata['wpConfirm'] = '1'
-
+
if movetalkpage:
predata['wpMovetalk'] = '1'
else:
predata['wpMovetalk'] = '0'
-
+
if self.site().versionnumber() >= 13:
if fixredirects:
predata['wpFixRedirects'] = '1'
else:
predata['wpFixRedirects'] = '0'
-
+
if leaveRedirect:
predata['wpLeaveRedirect'] = '1'
else:
predata['wpLeaveRedirect'] = '0'
-
+
if movesubpages:
predata['wpMovesubpages'] = '1'
else:
predata['wpMovesubpages'] = '0'
-
+
if token:
predata['wpEditToken'] = token
-
+
response, data = self.site().postForm(address, predata, sysop = sysop)
-
+
if data == u'' or self.site().mediawiki_message('pagemovedsub') in data:
#Move Success
if deleteAndMove:
output(u'Page %s moved to %s, deleting the existing page' % (self.title(), newtitle))
else:
output(u'Page %s moved to %s' % (self.title(), newtitle))
-
+
if hasattr(self, '_contents'):
#self.__init__(self.site(), newtitle, defaultNamespace = self._namespace)
try:
@@ -2887,7 +2885,7 @@
except NoPage:
output(u'Page %s is moved and no longer exist.' % self.title() )
#delattr(self, '_contents')
-
+
return True
else:
#Move Failure
@@ -3041,7 +3039,7 @@
output(u'Loading list of deleted revisions for [[%s]]...' % self.title())
self._deletedRevs = {}
-
+
if config.use_api and self.site().versionnumber() >= 12:
params = {
'action': 'query',
@@ -3059,17 +3057,17 @@
for x in data['query']['deletedrevs']:
if x['title'] != self.title():
continue
-
+
for y in x['revisions']:
count += 1
self._deletedRevs[parsetime2stamp(y['timestamp'])] = [y['timestamp'], y['user'], y['comment'] , y['*'], False]
-
+
if 'query-continue' in data and data['query-continue']['deletedrevs']['drcontinue'].split('|')[1] == self.titleWithoutNamespace():
params['drcontinue'] = data['query-continue']['deletedrevs']['drcontinue']
else:
break
self._deletedRevsModified = False
-
+
else:
address = self.site().undelete_view_address(self.urlname())
text = self.site().getUrl(address, sysop = True)
@@ -3086,7 +3084,7 @@
]
self._deletedRevsModified = False
-
+
return self._deletedRevs.keys()
def getDeletedRevision(self, timestamp, retrieveText=False):
@@ -3146,7 +3144,7 @@
if ... #decide whether to undelete a revision
pg.markDeletedRevision(rev) #mark for undeletion
pg.undelete('This will restore only selected revisions.')
-
+
"""
# Login
self._getActionUser(action = 'undelete', sysop = True)
@@ -3173,25 +3171,25 @@
if self._deletedRevs[ts][4]:
selected.append(ts)
params['timestamps'] = ts,
-
+
result = query.GetData(params, self.site(), sysop=True)
if 'error' in result:
raise RuntimeError("%s" % result['error'])
elif 'undelete' in result:
output(u'Page %s undeleted' % self.aslink())
-
+
return result
-
+
else:
address = self.site().undelete_address()
-
+
formdata = {
'target': self.title(),
'wpComment': comment,
'wpEditToken': token,
'restore': self.site().mediawiki_message('undeletebtn')
}
-
+
if self._deletedRevs and self._deletedRevsModified:
for ts in self._deletedRevs:
if self._deletedRevs[ts][4]:
@@ -3201,9 +3199,8 @@
#TODO: Check for errors below (have we succeeded? etc):
result = self.site().postForm(address,formdata,sysop=True)
output(u'Page %s undeleted' % self.aslink())
-
+
return result
-
def protect(self, editcreate = 'sysop', move = 'sysop', unprotect = False, reason = None, editcreate_duration = 'infinite',
move_duration = 'infinite', cascading = False, prompt = True, throttle = True):
@@ -3257,7 +3254,7 @@
except NotImplementedError:
return self._oldProtect( editcreate, move, unprotect, reason, editcreate_duration,
move_duration, cascading, prompt, throttle)
-
+
token = self.site().getToken(self, sysop = True)
# Translate 'none' to ''
@@ -3275,14 +3272,14 @@
if self.exists():
protections.append("edit=%s" % editcreate)
-
+
protections.append("move=%s" % move)
expiry.append(move_duration)
else:
protections.append("create=%s" % editcreate)
-
+
expiry.append(editcreate_duration)
-
+
params = {
'action': 'protect',
'title': self.title(),
@@ -3301,9 +3298,9 @@
output(u"NOTE: The page can't be protected with cascading and not also with only-sysop. Set cascading \"off\"")
else:
params['cascade'] = 1
-
+
result = query.GetData(params, self.site(), sysop=True)
-
+
if 'error' in result: #error occured
err = result['error']['code']
output('%s' % result)
@@ -3315,7 +3312,7 @@
if result['protect']:
output(u'Changed protection level of page %s.' % self.aslink())
return True
-
+
return False
def _oldProtect(self, editcreate = 'sysop', move = 'sysop', unprotect = False, reason = None, editcreate_duration = 'infinite',
@@ -3487,11 +3484,11 @@
data = self.getVersionHistory(getAll=True, revCount = limit)
else:
data = self.getVersionHistory(revCount = limit)
-
+
result = []
for i in data:
result.append({'user':i[2],'timestamp':i[1]})
-
+
return result
class ImagePage(Page):
@@ -3568,8 +3565,7 @@
infos.append(info)
if limit == 1:
break
-
-
+
if 'query-continue' in data and limit != 1:
params['iistart'] = data['query-continue']['imageinfo']['iistart']
else:
@@ -3725,7 +3721,7 @@
'iulimit': config.special_page_limit,
#'': '',
}
-
+
while True:
data = query.GetData(params, self.site())
if 'error' in data:
@@ -3806,13 +3802,13 @@
raise RuntimeError(data['error'])
else:
break
-
+
self.headerDoneApi(data['query'])
if 'normalized' in data['query']:
self._norm = dict([(x['from'],x['to']) for x in data['query']['normalized']])
for vals in data['query']['pages'].values():
self.oneDoneApi(vals)
-
+
else:
while True:
try:
@@ -3861,7 +3857,7 @@
for pl in self.pages:
if not hasattr(pl,'_contents') and not hasattr(pl,'_getexception'):
pl._getexception = NoPage
-
+
def oneDone(self, entry):
title = entry.title
username = entry.username
@@ -3964,7 +3960,7 @@
for id in self.site.family.namespaces:
if self.site.family.isDefinedNSLanguage(id, lang) and id not in header.namespaces:
output(u"WARNING: Family file %s includes namespace['%s'][%i], but it should be removed (namespace doesn't exist in the site)" % (self.site.family.name, lang, id))
-
+
def getData(self):
address = self.site.export_address()
pagenames = [page.sectionFreeTitle() for page in self.pages]
@@ -4016,13 +4012,13 @@
for page2 in self.pages:
if hasattr(self, '_norm') and page2.sectionFreeTitle() in self._norm:
page2._title = self._norm[page2.sectionFreeTitle()]
-
+
if page2.sectionFreeTitle() == page.sectionFreeTitle():
if 'missing' in data:
page2._getexception = NoPage
successful = True
break
-
+
if 'invalid' in data:
page2._getexception = BadTitle
successful = True
@@ -4115,7 +4111,7 @@
for id in self.site.family.namespaces:
if self.site.family.isDefinedNSLanguage(id, lang) and u'%i' % id not in header['namespaces']:
output(u"WARNING: Family file %s includes namespace['%s'][%i], but it should be removed (namespace doesn't exist in the site)" % (self.site.family.name, lang, id ) )
-
+
def getDataApi(self):
pagenames = [page.sectionFreeTitle() for page in self.pages]
params = {
@@ -5608,8 +5604,7 @@
#keep anonymous mode if not login and centralauth not enable
self._cookies[index] = None
self._isLoggedIn[index] = False
-
-
+
def _readCookies(self, filename):
"""read login cookie file and return a dictionary."""
try:
@@ -5638,7 +5633,7 @@
# So we need add centralauth username data into siteattribute
self._userName[index] = self._cookies[index][self.family.cross_projects_cookie_username]
-
+
for k, v in datas.iteritems():
#put key and values into save cache
if self.family.cross_projects and k in self.family.cross_projects_cookies:
@@ -5652,13 +5647,12 @@
f = open(config.datafilepath('login-data', filename), 'w')
f.write(cache[0])
f.close()
-
+
filename = '%s-%s-%s-login.data' % (self.family.name, self.lang, self.username(sysop))
f = open(config.datafilepath('login-data', filename), 'w')
f.write(cache[1])
f.close()
-
-
+
def _removeCookies(self, name):
# remove cookies.
# ToDo: remove all local datas if cross_projects enable.
@@ -5670,7 +5664,7 @@
file = config.datafilepath('login-data', '%s-%s-%s-login.data' % (self.family.name, self.lang, name))
if os.path.exists(file):
os.remove(file)
-
+
def updateCookies(self, datas, sysop = False):
"""Check and update the current cookies datas and save back to files."""
index = self._userIndex(sysop)
@@ -5685,8 +5679,7 @@
self._cookies[index][k] = v
self._setupCookies(self._cookies[index], sysop)
-
-
+
def urlEncode(self, query):
"""Encode a query so that it can be sent using an http POST request."""
if not query:
@@ -5926,7 +5919,6 @@
Returns the HTML text of the page converted to unicode.
"""
-
if retry is None:
retry = config.retry_on_fail
@@ -5939,7 +5931,7 @@
#'Cache-Control': 'max-age=0',
#'': '',
}
-
+
if not no_hostname and self.cookies(sysop = sysop):
headers['Cookie'] = self.cookies(sysop = sysop)
if compress:
@@ -6302,13 +6294,13 @@
# protection for key in other datatype
if type(key) not in [str, unicode]:
key = 'general'
-
+
if self._info and key in self._info and not force:
if dump:
return self._info
else:
return self._info[key]
-
+
params = {
'action':'query',
'meta':'siteinfo',
@@ -6332,7 +6324,7 @@
data = query.GetData(params, self)['query']
except NotImplementedError:
return None
-
+
if not hasattr(self, '_info'):
self._info = data
else:
@@ -6351,8 +6343,7 @@
return self._info[key]
except KeyError:
return None
-
-
+
def mediawiki_message(self, key, forceReload = False):
"""Return the MediaWiki message text for key "key" """
# Allmessages is retrieved once for all per created Site object
@@ -6371,7 +6362,7 @@
api = True
except NotImplementedError:
api = False
-
+
usePHP = False
elementtree = True
try:
@@ -6562,7 +6553,7 @@
}
if namespaces:
params['srnamespace'] = namespaces
-
+
offset = 0
while True:
params['sroffset'] = offset
@@ -7071,7 +7062,7 @@
}
if redirect:
params['rnredirect'] = 1
-
+
data = query.GetData(params, self)
return Page(self, data['query']['random'][0]['title'])
else:
@@ -8024,7 +8015,7 @@
args may be passed as an argument, thereby overriding sys.argv
"""
- global default_code, default_family, verbose
+ global default_code, default_family, verbose, debug
# get commandline arguments
if not args:
args = sys.argv[1:]
@@ -8061,9 +8052,12 @@
elif arg.startswith('-daemonize:'):
import daemonize
daemonize.daemonize(redirect_std = arg[11:])
- elif arg == "-cosmeticchanges" or arg == "-cc":
+ elif arg == '-cosmeticchanges' or arg == '-cc':
config.cosmetic_changes = not config.cosmetic_changes
output(u'NOTE: option cosmetic_changes is %s\n' % config.cosmetic_changes)
+ # global debug option for development purposes. Normally does nothing.
+ elif arg == '-debug':
+ debug = True
else:
# the argument is not global. Let the specific bot script care
# about it.
@@ -8082,6 +8076,7 @@
exec "import %s_interface as uiModule" % config.userinterface
ui = uiModule.UI()
verbose = 0
+debug = False
default_family = config.family
default_code = config.mylang