# Copyright 2013 rsiddharth # # This work is free. You can redistribute it and/or modify it under # the terms of the Do What The Fuck You Want To Public License, # Version 2, as published by Sam Hocevar. See the COPYING file or # for more details. import xmlrpclib as xmlrpc from xmlrpclib import Fault import filecmp import os.path as path def get_topsecret(src_dir): """ Returns the username, password & wikiurl They are stored in src/config/ directory in the topsecret.txt file. """ try: secrets = open(path.join(src_dir, "config", "topsecret.txt"), "r").readlines() username = secrets[0].strip() password = secrets[1].strip() wikiurl = secrets[2].strip() except IOError: print "ERROR: Specify your wikiusername, password & wikiurl at \ `src/config/topsecret.txt`. Look at the README for the proper format." exit(1) return username, password, wikiurl def update(table, src_dir): """ Generates wiki page using table and pushes it to the wiki using XML-RPC. """ # Code below adapted from # http://moinmo.in/MoinAPI/Examples#xmlrpc.putPage.28.29 name, password, wikiurl = get_topsecret(src_dir) homewiki = xmlrpc.ServerProxy(wikiurl + "?action=xmlrpc2", allow_none=True) auth_token = homewiki.getAuthToken(name, password) mc = xmlrpc.MultiCall(homewiki) mc.applyAuthToken(auth_token) pagename = "Documentation/3/DifferencesWithDebian" wiki_page_content, update = generate_wiki_page(table, src_dir) if(update): # Send the updated wiki page to moin wiki: mc.putPage(pagename, wiki_page_content) result = mc() success = None try: success = result[1] except Fault, e: print e if success: print "Updated %s" % (pagename) update_wiki_page_locally( wiki_page_content, path.join(src_dir, "wiki-files", "differences-with-debian.txt")) else: print ">> Script did not update wiki <<" else: print "Nothing new! %s/%s was not updated" % (wikiurl, pagename) def generate_wiki_page(table, src_dir): """ Generates the wiki page using the table. `differences-with-debian-head.txt' file, used by this function, contains text that precedes the table. """ # generate wikipage diff_with_deb_head = path.join(src_dir, "wiki-files", "differences-with-debian-head.txt") wiki_page_content = open(diff_with_deb_head, "r").read() + "\n" for row in table: wiki_page_content += row + "\n" update = wiki_page_updated(wiki_page_content, src_dir) return wiki_page_content, update def wiki_page_updated(wiki_page_content, src_dir): """ Returns True if the wiki page is updated """ # write wikipage to temp file temp_file = open("/tmp/diff-with-deb-tmp.txt", "w") temp_file.write(wiki_page_content) temp_file.close() # this file contains the wiki page last generated by the script. diff_with_deb = path.join(src_dir, "wiki-files", "differences-with-debian.txt") # first check if the file exists if(path.isfile(diff_with_deb)): # filecmp.cmp returns True if both the file are same. update = (filecmp.cmp(temp_file.name, diff_with_deb, 1) == False) else: # we don't have a local copy of the wiki page. So, let's # update the wiki. update = True return update def update_wiki_page_locally(wiki_page_content, filename): """ Writes the wiki page locally to `filename' """ wiki_file = open(filename, "w") wiki_file.write(wiki_page_content) wiki_file.close()