[libvirt] [PATCH 0/3] docs/website: drop some old bits

Patches to drop the (busted) website search, (busted) static todo list, and not-very-useful ChangeLog-old Cole Robinson (3): docs: website: remove search docs: website: drop the static todo list page docs: drop ChangeLog-old .gitignore | 2 - ChangeLog-old | 16699 ---------------------------------------------- Makefile.am | 1 - TODO | 22 +- docs/404.html.in | 9 +- docs/Makefile.am | 31 +- docs/devhelp/html.xsl | 4 - docs/index.py | 1266 ---- docs/libvirt.css | 24 - docs/page.xsl | 8 - docs/search.php.code.in | 225 - docs/search.php.in | 18 - docs/sitemap.html.in | 2 +- docs/todo.cfg-example | 26 - docs/todo.pl | 125 - 15 files changed, 13 insertions(+), 18449 deletions(-) delete mode 100644 ChangeLog-old delete mode 100755 docs/index.py delete mode 100644 docs/search.php.code.in delete mode 100644 docs/search.php.in delete mode 100644 docs/todo.cfg-example delete mode 100755 docs/todo.pl -- 2.7.4

It's currently broken: Could not connect to the database: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) And honestly there's no way this can be as effective as a targeted google search, so I think we should just drop it. https://bugzilla.redhat.com/show_bug.cgi?id=1337741 --- .gitignore | 1 - docs/404.html.in | 9 +- docs/devhelp/html.xsl | 4 - docs/index.py | 1266 ----------------------------------------------- docs/libvirt.css | 24 - docs/page.xsl | 8 - docs/search.php.code.in | 225 --------- docs/search.php.in | 18 - 8 files changed, 2 insertions(+), 1553 deletions(-) delete mode 100755 docs/index.py delete mode 100644 docs/search.php.code.in delete mode 100644 docs/search.php.in diff --git a/.gitignore b/.gitignore index ee89787..103edc6 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,6 @@ /docs/libvirt-lxc-*.xml /docs/libvirt-qemu-*.xml /docs/libvirt-refs.xml -/docs/search.php /docs/todo.html.in /examples/object-events/event-test /examples/dominfo/info1 diff --git a/docs/404.html.in b/docs/404.html.in index 5b771bb..19e8ca7 100644 --- a/docs/404.html.in +++ b/docs/404.html.in @@ -7,14 +7,9 @@ <p> Someone appears to have eaten the <del>penguin</del> page you were looking for. You might want to try + going back to the <a href="http://libvirt.org/">home page</a> to find + a collection of links to interesting pages on this site. </p> - <ul> - <li>going back to the <a href="http://libvirt.org/">home page</a> to find - a collection of links to interesting pages on this site</li> - <li>using the search box at the top right corner of the screen to - locate the content on this site or mailing list archives</li> - </ul> - <p class="image"> <img src="/libvirtLogo404.png" alt="libvirt Logo"/> </p> diff --git a/docs/devhelp/html.xsl b/docs/devhelp/html.xsl index 5e063f3..9cdc049 100644 --- a/docs/devhelp/html.xsl +++ b/docs/devhelp/html.xsl @@ -565,10 +565,6 @@ by a Linux instance. The library aim at providing long term stable C API initially for the <a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html">Xen paravirtualization</a> but should be able to integrate other virtualization mechanisms if needed.</p> -<p> If you get lost searching for some specific API use, try -<a href="http://libvirt.org/search.php">the online search -engine</a> hosted on <a href="http://libvirt.org/">libvirt.org</a> -it indexes the project page, the APIs as well as the mailing-list archives. </p> </body> </html> </xsl:document> diff --git a/docs/index.py b/docs/index.py deleted file mode 100755 index 2f0ad26..0000000 --- a/docs/index.py +++ /dev/null @@ -1,1266 +0,0 @@ -#!/usr/bin/python -u -# -# imports the API description and fills up a database with -# name relevance to modules, functions or web pages -# -# Operation needed: -# ================= -# -# install mysqld, the python wrappers for mysql and libxml2, start mysqld -# - mysql-server -# - mysql -# - php-mysql -# - MySQL-python -# Change the root passwd of mysql: -# mysqladmin -u root password new_password -# Create the new database libvir -# mysqladmin -p create libvir -# Create a database user 'veillard' and give him password access -# change veillard and abcde with the right user name and passwd -# mysql -p -# password: -# mysql> GRANT ALL PRIVILEGES ON libvir TO veillard@localhost -# IDENTIFIED BY 'abcde' WITH GRANT OPTION; -# mysql> GRANT ALL PRIVILEGES ON libvir.* TO veillard@localhost -# IDENTIFIED BY 'abcde' WITH GRANT OPTION; -# -# As the user check the access: -# mysql -p libvir -# Enter password: -# Welcome to the MySQL monitor.... -# mysql> use libvir -# Database changed -# mysql> quit -# Bye -# -# Then run the script in the doc subdir, it will create the symbols and -# word tables and populate them with information extracted from -# the libvirt-api.xml API description, and make then accessible read-only -# by nobody@loaclhost the user expected to be Apache's one -# -# On the Apache configuration, make sure you have php support enabled -# - -import MySQLdb -import libxml2 -import sys -import string -import os - -# -# We are not interested in parsing errors here -# -def callback(ctx, str): - return -libxml2.registerErrorHandler(callback, None) - -# -# The dictionary of tables required and the SQL command needed -# to create them -# -TABLES={ - "symbols" : """CREATE TABLE symbols ( - name varchar(255) BINARY NOT NULL, - module varchar(255) BINARY NOT NULL, - type varchar(25) NOT NULL, - descr varchar(255), - UNIQUE KEY name (name), - KEY module (module))""", - "words" : """CREATE TABLE words ( - name varchar(50) BINARY NOT NULL, - symbol varchar(255) BINARY NOT NULL, - relevance int, - KEY name (name), - KEY symbol (symbol), - UNIQUE KEY ID (name, symbol))""", - "wordsHTML" : """CREATE TABLE wordsHTML ( - name varchar(50) BINARY NOT NULL, - resource varchar(255) BINARY NOT NULL, - section varchar(255), - id varchar(50), - relevance int, - KEY name (name), - KEY resource (resource), - UNIQUE KEY ref (name, resource))""", - "wordsArchive" : """CREATE TABLE wordsArchive ( - name varchar(50) BINARY NOT NULL, - ID int(11) NOT NULL, - relevance int, - KEY name (name), - UNIQUE KEY ref (name, ID))""", - "pages" : """CREATE TABLE pages ( - resource varchar(255) BINARY NOT NULL, - title varchar(255) BINARY NOT NULL, - UNIQUE KEY name (resource))""", - "archives" : """CREATE TABLE archives ( - ID int(11) NOT NULL auto_increment, - resource varchar(255) BINARY NOT NULL, - title varchar(255) BINARY NOT NULL, - UNIQUE KEY id (ID,resource(255)), - INDEX (ID), - INDEX (resource))""", - "Queries" : """CREATE TABLE Queries ( - ID int(11) NOT NULL auto_increment, - Value varchar(50) NOT NULL, - Count int(11) NOT NULL, - UNIQUE KEY id (ID,Value(35)), - INDEX (ID))""", - "AllQueries" : """CREATE TABLE AllQueries ( - ID int(11) NOT NULL auto_increment, - Value varchar(50) NOT NULL, - Count int(11) NOT NULL, - UNIQUE KEY id (ID,Value(35)), - INDEX (ID))""", -} - -# -# The XML API description file to parse -# -API="libvirt-api.xml" -DB=None - -######################################################################### -# # -# MySQL database interfaces # -# # -######################################################################### -def createTable(db, name): - global TABLES - - if db is None: - return -1 - if name is None: - return -1 - c = db.cursor() - - ret = c.execute("DROP TABLE IF EXISTS %s" % (name)) - if ret == 1: - print "Removed table %s" % (name) - print "Creating table %s" % (name) - try: - ret = c.execute(TABLES[name]) - except: - print "Failed to create table %s" % (name) - return -1 - return ret - -def checkTables(db, verbose = 1): - global TABLES - - if db is None: - return -1 - c = db.cursor() - nbtables = c.execute("show tables") - if verbose: - print "Found %d tables" % (nbtables) - tables = {} - i = 0 - while i < nbtables: - l = c.fetchone() - name = l[0] - tables[name] = {} - i = i + 1 - - for table in TABLES.keys(): - if not tables.has_key(table): - print "table %s missing" % (table) - createTable(db, table) - try: - ret = c.execute("SELECT count(*) from %s" % table) - row = c.fetchone() - if verbose: - print "Table %s contains %d records" % (table, row[0]) - except: - print "Troubles with table %s : repairing" % (table) - ret = c.execute("repair table %s" % table) - print "repairing returned %d" % (ret) - ret = c.execute("SELECT count(*) from %s" % table) - row = c.fetchone() - print "Table %s contains %d records" % (table, row[0]) - if verbose: - print "checkTables finished" - - # make sure apache can access the tables read-only - try: - ret = c.execute("GRANT SELECT ON libvir.* TO nobody@localhost") - ret = c.execute("GRANT INSERT,SELECT,UPDATE ON libvir.Queries TO nobody@localhost") - except: - pass - return 0 - -def openMySQL(db="libvir", passwd=None, verbose = 1): - global DB - - if passwd is None: - try: - passwd = os.environ["MySQL_PASS"] - except: - print "No password available, set environment MySQL_PASS" - sys.exit(1) - - DB = MySQLdb.connect(passwd=passwd, db=db) - if DB is None: - return -1 - ret = checkTables(DB, verbose) - return ret - -def updateWord(name, symbol, relevance): - global DB - - if DB is None: - openMySQL() - if DB is None: - return -1 - if name is None: - return -1 - if symbol is None: - return -1 - - c = DB.cursor() - try: - ret = c.execute( -"""INSERT INTO words (name, symbol, relevance) VALUES ('%s','%s', %d)""" % - (name, symbol, relevance)) - except: - try: - ret = c.execute( - """UPDATE words SET relevance = %d where name = '%s' and symbol = '%s'""" % - (relevance, name, symbol)) - except: - print "Update word (%s, %s, %s) failed command" % (name, symbol, relevance) - print "UPDATE words SET relevance = %d where name = '%s' and symbol = '%s'" % (relevance, name, symbol) - print sys.exc_type, sys.exc_value - return -1 - - return ret - -def updateSymbol(name, module, type, desc): - global DB - - updateWord(name, name, 50) - if DB is None: - openMySQL() - if DB is None: - return -1 - if name is None: - return -1 - if module is None: - return -1 - if type is None: - return -1 - - try: - desc = string.replace(desc, "'", " ") - l = string.split(desc, ".") - desc = l[0] - desc = desc[0:99] - except: - desc = "" - - c = DB.cursor() - try: - ret = c.execute( -"""INSERT INTO symbols (name, module, type, descr) VALUES ('%s','%s', '%s', '%s')""" % - (name, module, type, desc)) - except: - try: - ret = c.execute( -"""UPDATE symbols SET module='%s', type='%s', descr='%s' where name='%s'""" % - (module, type, desc, name)) - except: - print "Update symbol (%s, %s, %s) failed command" % (name, module, type) - print """UPDATE symbols SET module='%s', type='%s', descr='%s' where name='%s'""" % (module, type, desc, name) - print sys.exc_type, sys.exc_value - return -1 - - return ret - -def addFunction(name, module, desc = ""): - return updateSymbol(name, module, 'function', desc) - -def addMacro(name, module, desc = ""): - return updateSymbol(name, module, 'macro', desc) - -def addEnum(name, module, desc = ""): - return updateSymbol(name, module, 'enum', desc) - -def addStruct(name, module, desc = ""): - return updateSymbol(name, module, 'struct', desc) - -def addConst(name, module, desc = ""): - return updateSymbol(name, module, 'const', desc) - -def addType(name, module, desc = ""): - return updateSymbol(name, module, 'type', desc) - -def addFunctype(name, module, desc = ""): - return updateSymbol(name, module, 'functype', desc) - -def addPage(resource, title): - global DB - - if DB is None: - openMySQL() - if DB is None: - return -1 - if resource is None: - return -1 - - c = DB.cursor() - try: - ret = c.execute( - """INSERT INTO pages (resource, title) VALUES ('%s','%s')""" % - (resource, title)) - except: - try: - ret = c.execute( - """UPDATE pages SET title='%s' WHERE resource='%s'""" % - (title, resource)) - except: - print "Update symbol (%s, %s, %s) failed command" % (name, module, type) - print """UPDATE pages SET title='%s' WHERE resource='%s'""" % (title, resource) - print sys.exc_type, sys.exc_value - return -1 - - return ret - -def updateWordHTML(name, resource, desc, id, relevance): - global DB - - if DB is None: - openMySQL() - if DB is None: - return -1 - if name is None: - return -1 - if resource is None: - return -1 - if id is None: - id = "" - if desc is None: - desc = "" - else: - try: - desc = string.replace(desc, "'", " ") - desc = desc[0:99] - except: - desc = "" - - c = DB.cursor() - try: - ret = c.execute( -"""INSERT INTO wordsHTML (name, resource, section, id, relevance) VALUES ('%s','%s', '%s', '%s', '%d')""" % - (name, resource, desc, id, relevance)) - except: - try: - ret = c.execute( -"""UPDATE wordsHTML SET section='%s', id='%s', relevance='%d' where name='%s' and resource='%s'""" % - (desc, id, relevance, name, resource)) - except: - print "Update symbol (%s, %s, %d) failed command" % (name, resource, relevance) - print """UPDATE wordsHTML SET section='%s', id='%s', relevance='%d' where name='%s' and resource='%s'""" % (desc, id, relevance, name, resource) - print sys.exc_type, sys.exc_value - return -1 - - return ret - -def checkXMLMsgArchive(url): - global DB - - if DB is None: - openMySQL() - if DB is None: - return -1 - if url is None: - return -1 - - c = DB.cursor() - try: - ret = c.execute( - """SELECT ID FROM archives WHERE resource='%s'""" % (url)) - row = c.fetchone() - if row is None: - return -1 - except: - return -1 - - return row[0] - -def addXMLMsgArchive(url, title): - global DB - - if DB is None: - openMySQL() - if DB is None: - return -1 - if url is None: - return -1 - if title is None: - title = "" - else: - title = string.replace(title, "'", " ") - title = title[0:99] - - c = DB.cursor() - try: - cmd = """INSERT INTO archives (resource, title) VALUES ('%s','%s')""" % (url, title) - ret = c.execute(cmd) - cmd = """SELECT ID FROM archives WHERE resource='%s'""" % (url) - ret = c.execute(cmd) - row = c.fetchone() - if row is None: - print "addXMLMsgArchive failed to get the ID: %s" % (url) - return -1 - except: - print "addXMLMsgArchive failed command: %s" % (cmd) - return -1 - - return((int)(row[0])) - -def updateWordArchive(name, id, relevance): - global DB - - if DB is None: - openMySQL() - if DB is None: - return -1 - if name is None: - return -1 - if id is None: - return -1 - - c = DB.cursor() - try: - ret = c.execute( -"""INSERT INTO wordsArchive (name, id, relevance) VALUES ('%s', '%d', '%d')""" % - (name, id, relevance)) - except: - try: - ret = c.execute( -"""UPDATE wordsArchive SET relevance='%d' where name='%s' and ID='%d'""" % - (relevance, name, id)) - except: - print "Update word archive (%s, %d, %d) failed command" % (name, id, relevance) - print """UPDATE wordsArchive SET relevance='%d' where name='%s' and ID='%d'""" % (relevance, name, id) - print sys.exc_type, sys.exc_value - return -1 - - return ret - -######################################################################### -# # -# Word dictionary and analysis routines # -# # -######################################################################### - -# -# top 100 english word without the one len < 3 + own set -# -dropWords = { - 'the':0, 'this':0, 'can':0, 'man':0, 'had':0, 'him':0, 'only':0, - 'and':0, 'not':0, 'been':0, 'other':0, 'even':0, 'are':0, 'was':0, - 'new':0, 'most':0, 'but':0, 'when':0, 'some':0, 'made':0, 'from':0, - 'who':0, 'could':0, 'after':0, 'that':0, 'will':0, 'time':0, 'also':0, - 'have':0, 'more':0, 'these':0, 'did':0, 'was':0, 'two':0, 'many':0, - 'they':0, 'may':0, 'before':0, 'for':0, 'which':0, 'out':0, 'then':0, - 'must':0, 'one':0, 'through':0, 'with':0, 'you':0, 'said':0, - 'first':0, 'back':0, 'were':0, 'what':0, 'any':0, 'years':0, 'his':0, - 'her':0, 'where':0, 'all':0, 'its':0, 'now':0, 'much':0, 'she':0, - 'about':0, 'such':0, 'your':0, 'there':0, 'into':0, 'like':0, 'may':0, - 'would':0, 'than':0, 'our':0, 'well':0, 'their':0, 'them':0, 'over':0, - 'down':0, - 'net':0, 'www':0, 'bad':0, 'Okay':0, 'bin':0, 'cur':0, -} - -wordsDict = {} -wordsDictHTML = {} -wordsDictArchive = {} - -def cleanupWordsString(str): - str = string.replace(str, ".", " ") - str = string.replace(str, "!", " ") - str = string.replace(str, "?", " ") - str = string.replace(str, ",", " ") - str = string.replace(str, "'", " ") - str = string.replace(str, '"', " ") - str = string.replace(str, ";", " ") - str = string.replace(str, "(", " ") - str = string.replace(str, ")", " ") - str = string.replace(str, "{", " ") - str = string.replace(str, "}", " ") - str = string.replace(str, "<", " ") - str = string.replace(str, ">", " ") - str = string.replace(str, "=", " ") - str = string.replace(str, "/", " ") - str = string.replace(str, "*", " ") - str = string.replace(str, ":", " ") - str = string.replace(str, "#", " ") - str = string.replace(str, "\\", " ") - str = string.replace(str, "\n", " ") - str = string.replace(str, "\r", " ") - str = string.replace(str, "\xc2", " ") - str = string.replace(str, "\xa0", " ") - return str - -def cleanupDescrString(str): - str = string.replace(str, "'", " ") - str = string.replace(str, "\n", " ") - str = string.replace(str, "\r", " ") - str = string.replace(str, "\xc2", " ") - str = string.replace(str, "\xa0", " ") - l = string.split(str) - str = string.join(str) - return str - -def splitIdentifier(str): - ret = [] - while str != "": - cur = string.lower(str[0]) - str = str[1:] - if ((cur < 'a') or (cur > 'z')): - continue - while (str != "") and (str[0] >= 'A') and (str[0] <= 'Z'): - cur = cur + string.lower(str[0]) - str = str[1:] - while (str != "") and (str[0] >= 'a') and (str[0] <= 'z'): - cur = cur + str[0] - str = str[1:] - while (str != "") and (str[0] >= '0') and (str[0] <= '9'): - str = str[1:] - ret.append(cur) - return ret - -def addWord(word, module, symbol, relevance): - global wordsDict - - if word is None or len(word) < 3: - return -1 - if module is None or symbol is None: - return -1 - if dropWords.has_key(word): - return 0 - if ord(word[0]) > 0x80: - return 0 - - if wordsDict.has_key(word): - d = wordsDict[word] - if d is None: - return 0 - if len(d) > 500: - wordsDict[word] = None - return 0 - try: - relevance = relevance + d[(module, symbol)] - except: - pass - else: - wordsDict[word] = {} - wordsDict[word][(module, symbol)] = relevance - return relevance - -def addString(str, module, symbol, relevance): - if str is None or len(str) < 3: - return -1 - ret = 0 - str = cleanupWordsString(str) - l = string.split(str) - for word in l: - if len(word) > 2: - ret = ret + addWord(word, module, symbol, 5) - - return ret - -def addWordHTML(word, resource, id, section, relevance): - global wordsDictHTML - - if word is None or len(word) < 3: - return -1 - if resource is None or section is None: - return -1 - if dropWords.has_key(word): - return 0 - if ord(word[0]) > 0x80: - return 0 - - section = cleanupDescrString(section) - - if wordsDictHTML.has_key(word): - d = wordsDictHTML[word] - if d is None: - print "skipped %s" % (word) - return 0 - try: - (r,i,s) = d[resource] - if i is not None: - id = i - if s is not None: - section = s - relevance = relevance + r - except: - pass - else: - wordsDictHTML[word] = {} - d = wordsDictHTML[word] - d[resource] = (relevance, id, section) - return relevance - -def addStringHTML(str, resource, id, section, relevance): - if str is None or len(str) < 3: - return -1 - ret = 0 - str = cleanupWordsString(str) - l = string.split(str) - for word in l: - if len(word) > 2: - try: - r = addWordHTML(word, resource, id, section, relevance) - if r < 0: - print "addWordHTML failed: %s %s" % (word, resource) - ret = ret + r - except: - print "addWordHTML failed: %s %s %d" % (word, resource, relevance) - print sys.exc_type, sys.exc_value - - return ret - -def addWordArchive(word, id, relevance): - global wordsDictArchive - - if word is None or len(word) < 3: - return -1 - if id is None or id == -1: - return -1 - if dropWords.has_key(word): - return 0 - if ord(word[0]) > 0x80: - return 0 - - if wordsDictArchive.has_key(word): - d = wordsDictArchive[word] - if d is None: - print "skipped %s" % (word) - return 0 - try: - r = d[id] - relevance = relevance + r - except: - pass - else: - wordsDictArchive[word] = {} - d = wordsDictArchive[word] - d[id] = relevance - return relevance - -def addStringArchive(str, id, relevance): - if str is None or len(str) < 3: - return -1 - ret = 0 - str = cleanupWordsString(str) - l = string.split(str) - for word in l: - i = len(word) - if i > 2: - try: - r = addWordArchive(word, id, relevance) - if r < 0: - print "addWordArchive failed: %s %s" % (word, id) - else: - ret = ret + r - except: - print "addWordArchive failed: %s %s %d" % (word, id, relevance) - print sys.exc_type, sys.exc_value - return ret - -######################################################################### -# # -# XML API description analysis # -# # -######################################################################### - -def loadAPI(filename): - doc = libxml2.parseFile(filename) - print "loaded %s" % (filename) - return doc - -def foundExport(file, symbol): - if file is None: - return 0 - if symbol is None: - return 0 - addFunction(symbol, file) - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - return 1 - -def analyzeAPIFile(top): - count = 0 - name = top.prop("name") - cur = top.children - while cur is not None: - if cur.type == 'text': - cur = cur.next - continue - if cur.name == "exports": - count = count + foundExport(name, cur.prop("symbol")) - else: - print "unexpected element %s in API doc <file name='%s'>" % (name) - cur = cur.next - return count - -def analyzeAPIFiles(top): - count = 0 - cur = top.children - - while cur is not None: - if cur.type == 'text': - cur = cur.next - continue - if cur.name == "file": - count = count + analyzeAPIFile(cur) - else: - print "unexpected element %s in API doc <files>" % (cur.name) - cur = cur.next - return count - -def analyzeAPIEnum(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - - addEnum(symbol, file) - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - - return 1 - -def analyzeAPIConst(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - - addConst(symbol, file) - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - - return 1 - -def analyzeAPIType(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - - addType(symbol, file) - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - return 1 - -def analyzeAPIFunctype(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - - addFunctype(symbol, file) - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - return 1 - -def analyzeAPIStruct(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - - addStruct(symbol, file) - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - - info = top.prop("info") - if info is not None: - info = string.replace(info, "'", " ") - info = string.strip(info) - l = string.split(info) - for word in l: - if len(word) > 2: - addWord(word, file, symbol, 5) - return 1 - -def analyzeAPIMacro(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - symbol = string.replace(symbol, "'", " ") - symbol = string.strip(symbol) - - info = None - cur = top.children - while cur is not None: - if cur.type == 'text': - cur = cur.next - continue - if cur.name == "info": - info = cur.content - break - cur = cur.next - - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - - if info is None: - addMacro(symbol, file) - print "Macro %s description has no <info>" % (symbol) - return 0 - - info = string.replace(info, "'", " ") - info = string.strip(info) - addMacro(symbol, file, info) - l = string.split(info) - for word in l: - if len(word) > 2: - addWord(word, file, symbol, 5) - return 1 - -def analyzeAPIFunction(top): - file = top.prop("file") - if file is None: - return 0 - symbol = top.prop("name") - if symbol is None: - return 0 - - symbol = string.replace(symbol, "'", " ") - symbol = string.strip(symbol) - info = None - cur = top.children - while cur is not None: - if cur.type == 'text': - cur = cur.next - continue - if cur.name == "info": - info = cur.content - elif cur.name == "return": - rinfo = cur.prop("info") - if rinfo is not None: - rinfo = string.replace(rinfo, "'", " ") - rinfo = string.strip(rinfo) - addString(rinfo, file, symbol, 7) - elif cur.name == "arg": - ainfo = cur.prop("info") - if ainfo is not None: - ainfo = string.replace(ainfo, "'", " ") - ainfo = string.strip(ainfo) - addString(ainfo, file, symbol, 5) - name = cur.prop("name") - if name is not None: - name = string.replace(name, "'", " ") - name = string.strip(name) - addWord(name, file, symbol, 7) - cur = cur.next - if info is None: - print "Function %s description has no <info>" % (symbol) - addFunction(symbol, file, "") - else: - info = string.replace(info, "'", " ") - info = string.strip(info) - addFunction(symbol, file, info) - addString(info, file, symbol, 5) - - l = splitIdentifier(symbol) - for word in l: - addWord(word, file, symbol, 10) - - return 1 - -def analyzeAPISymbols(top): - count = 0 - cur = top.children - - while cur is not None: - if cur.type == 'text': - cur = cur.next - continue - if cur.name == "macro": - count = count + analyzeAPIMacro(cur) - elif cur.name == "function": - count = count + analyzeAPIFunction(cur) - elif cur.name == "const": - count = count + analyzeAPIConst(cur) - elif cur.name == "typedef": - count = count + analyzeAPIType(cur) - elif cur.name == "struct": - count = count + analyzeAPIStruct(cur) - elif cur.name == "enum": - count = count + analyzeAPIEnum(cur) - elif cur.name == "functype": - count = count + analyzeAPIFunctype(cur) - else: - print "unexpected element %s in API doc <files>" % (cur.name) - cur = cur.next - return count - -def analyzeAPI(doc): - count = 0 - if doc is None: - return -1 - root = doc.getRootElement() - if root.name != "api": - print "Unexpected root name" - return -1 - cur = root.children - while cur is not None: - if cur.type == 'text': - cur = cur.next - continue - if cur.name == "files": - pass -# count = count + analyzeAPIFiles(cur) - elif cur.name == "symbols": - count = count + analyzeAPISymbols(cur) - else: - print "unexpected element %s in API doc" % (cur.name) - cur = cur.next - return count - -######################################################################### -# # -# Web pages parsing and analysis # -# # -######################################################################### - -import glob - -def analyzeHTMLText(doc, resource, p, section, id): - words = 0 - try: - content = p.content - words = words + addStringHTML(content, resource, id, section, 5) - except: - return -1 - return words - -def analyzeHTMLPara(doc, resource, p, section, id): - words = 0 - try: - content = p.content - words = words + addStringHTML(content, resource, id, section, 5) - except: - return -1 - return words - -def analyzeHTMLPre(doc, resource, p, section, id): - words = 0 - try: - content = p.content - words = words + addStringHTML(content, resource, id, section, 5) - except: - return -1 - return words - -def analyzeHTML(doc, resource, p, section, id): - words = 0 - try: - content = p.content - words = words + addStringHTML(content, resource, id, section, 5) - except: - return -1 - return words - -def analyzeHTML(doc, resource): - para = 0 - ctxt = doc.xpathNewContext() - try: - res = ctxt.xpathEval("//head/title") - title = res[0].content - except: - title = "Page %s" % (resource) - addPage(resource, title) - try: - items = ctxt.xpathEval("//h1 | //h2 | //h3 | //text()") - section = title - id = "" - for item in items: - if item.name == 'h1' or item.name == 'h2' or item.name == 'h3': - section = item.content - if item.prop("id"): - id = item.prop("id") - elif item.prop("name"): - id = item.prop("name") - elif item.type == 'text': - analyzeHTMLText(doc, resource, item, section, id) - para = para + 1 - elif item.name == 'p': - analyzeHTMLPara(doc, resource, item, section, id) - para = para + 1 - elif item.name == 'pre': - analyzeHTMLPre(doc, resource, item, section, id) - para = para + 1 - else: - print "Page %s, unexpected %s element" % (resource, item.name) - except: - print "Page %s: problem analyzing" % (resource) - print sys.exc_type, sys.exc_value - - return para - -def analyzeHTMLPages(): - ret = 0 - HTMLfiles = glob.glob("*.html") + glob.glob("tutorial/*.html") + \ - glob.glob("CIM/*.html") + glob.glob("ocaml/*.html") + \ - glob.glob("ruby/*.html") - for html in HTMLfiles: - if html[0:3] == "API": - continue - if html == "xml.html": - continue - try: - doc = libxml2.parseFile(html) - except: - doc = libxml2.htmlParseFile(html, None) - try: - res = analyzeHTML(doc, html) - print "Parsed %s : %d paragraphs" % (html, res) - ret = ret + 1 - except: - print "could not parse %s" % (html) - return ret - -######################################################################### -# # -# Mail archives parsing and analysis # -# # -######################################################################### - -import time - -def getXMLDateArchive(t = None): - if t is None: - t = time.time() - T = time.gmtime(t) - month = time.strftime("%B", T) - year = T[0] - url = "http://www.redhat.com/archives/libvir-list/%d-%s/date.html" % (year, month) - return url - -def scanXMLMsgArchive(url, title, force = 0): - if url is None or title is None: - return 0 - - ID = checkXMLMsgArchive(url) - if force == 0 and ID != -1: - return 0 - - if ID == -1: - ID = addXMLMsgArchive(url, title) - if ID == -1: - return 0 - - try: - print "Loading %s" % (url) - doc = libxml2.htmlParseFile(url, None) - except: - doc = None - if doc is None: - print "Failed to parse %s" % (url) - return 0 - - addStringArchive(title, ID, 20) - ctxt = doc.xpathNewContext() - texts = ctxt.xpathEval("//pre//text()") - for text in texts: - addStringArchive(text.content, ID, 5) - - return 1 - -def scanXMLDateArchive(t = None, force = 0): - global wordsDictArchive - - wordsDictArchive = {} - - url = getXMLDateArchive(t) - print "loading %s" % (url) - try: - doc = libxml2.htmlParseFile(url, None) - except: - doc = None - if doc is None: - print "Failed to parse %s" % (url) - return -1 - ctxt = doc.xpathNewContext() - anchors = ctxt.xpathEval("//a[@href]") - links = 0 - newmsg = 0 - for anchor in anchors: - href = anchor.prop("href") - if href is None or href[0:3] != "msg": - continue - try: - links = links + 1 - - msg = libxml2.buildURI(href, url) - title = anchor.content - if title is not None and title[0:4] == 'Re: ': - title = title[4:] - if title is not None and title[0:6] == '[xml] ': - title = title[6:] - newmsg = newmsg + scanXMLMsgArchive(msg, title, force) - - except: - pass - - return newmsg - - -######################################################################### -# # -# Main code: open the DB, the API XML and analyze it # -# # -######################################################################### -def analyzeArchives(t = None, force = 0): - global wordsDictArchive - - ret = scanXMLDateArchive(t, force) - print "Indexed %d words in %d archive pages" % (len(wordsDictArchive), ret) - - i = 0 - skipped = 0 - for word in wordsDictArchive.keys(): - refs = wordsDictArchive[word] - if refs is None: - skipped = skipped + 1 - continue - for id in refs.keys(): - relevance = refs[id] - updateWordArchive(word, id, relevance) - i = i + 1 - - print "Found %d associations in HTML pages" % (i) - -def analyzeHTMLTop(): - global wordsDictHTML - - ret = analyzeHTMLPages() - print "Indexed %d words in %d HTML pages" % (len(wordsDictHTML), ret) - - i = 0 - skipped = 0 - for word in wordsDictHTML.keys(): - refs = wordsDictHTML[word] - if refs is None: - skipped = skipped + 1 - continue - for resource in refs.keys(): - (relevance, id, section) = refs[resource] - updateWordHTML(word, resource, section, id, relevance) - i = i + 1 - - print "Found %d associations in HTML pages" % (i) - -def analyzeAPITop(): - global wordsDict - global API - - try: - doc = loadAPI(API) - ret = analyzeAPI(doc) - print "Analyzed %d blocs" % (ret) - doc.freeDoc() - except: - print "Failed to parse and analyze %s" % (API) - print sys.exc_type, sys.exc_value - sys.exit(1) - - print "Indexed %d words" % (len(wordsDict)) - i = 0 - skipped = 0 - for word in wordsDict.keys(): - refs = wordsDict[word] - if refs is None: - skipped = skipped + 1 - continue - for (module, symbol) in refs.keys(): - updateWord(word, symbol, refs[(module, symbol)]) - i = i + 1 - - print "Found %d associations, skipped %d words" % (i, skipped) - -def usage(): - print "Usage index.py [--force] [--archive] [--archive-year year] [--archive-month month] [--API] [--docs]" - sys.exit(1) - -def main(): - try: - openMySQL() - except: - print "Failed to open the database" - print sys.exc_type, sys.exc_value - sys.exit(1) - - args = sys.argv[1:] - force = 0 - if args: - i = 0 - while i < len(args): - if args[i] == '--force': - force = 1 - elif args[i] == '--archive': - analyzeArchives(None, force) - elif args[i] == '--archive-year': - i = i + 1 - year = args[i] - months = ["January" , "February", "March", "April", "May", - "June", "July", "August", "September", "October", - "November", "December"] - for month in months: - try: - str = "%s-%s" % (year, month) - T = time.strptime(str, "%Y-%B") - t = time.mktime(T) + 3600 * 24 * 10 - analyzeArchives(t, force) - except: - print "Failed to index month archive:" - print sys.exc_type, sys.exc_value - elif args[i] == '--archive-month': - i = i + 1 - month = args[i] - try: - T = time.strptime(month, "%Y-%B") - t = time.mktime(T) + 3600 * 24 * 10 - analyzeArchives(t, force) - except: - print "Failed to index month archive:" - print sys.exc_type, sys.exc_value - elif args[i] == '--API': - analyzeAPITop() - elif args[i] == '--docs': - analyzeHTMLTop() - else: - usage() - i = i + 1 - else: - usage() - -if __name__ == "__main__": - main() diff --git a/docs/libvirt.css b/docs/libvirt.css index 2310b20..2156165 100644 --- a/docs/libvirt.css +++ b/docs/libvirt.css @@ -105,30 +105,6 @@ h1, h2, h3, h4, h5, h6 { background: url(libvirt-header-logo.png); } -#headerSearch { - position: absolute; - top: 0px; - right: 0px; - padding: 2em; - z-index: 10; -} - -#headerSearch input { - border: 1px solid #999999; - color: #999999; - background: white; - padding: 3px; - font-size: 1em; -} - -#headerSearch #submit { - border: 1px solid #999999; - background: #eeeeee; - color: black; - padding: 3px; - font-size: 1em; -} - #sitemap ul li { list-style: none; } diff --git a/docs/page.xsl b/docs/page.xsl index cd98f7d..9ae0129 100644 --- a/docs/page.xsl +++ b/docs/page.xsl @@ -143,14 +143,6 @@ <body> <div id="header"> <div id="headerLogo"/> - <div id="headerSearch"> - <form action="{$href_base}search.php" enctype="application/x-www-form-urlencoded" method="get"> - <div> - <input id="query" name="query" type="text" size="12" value=""/> - <input id="submit" name="submit" type="submit" value="Search"/> - </div> - </form> - </div> </div> <div id="body"> <div id="menu"> diff --git a/docs/search.php.code.in b/docs/search.php.code.in deleted file mode 100644 index c7511c3..0000000 --- a/docs/search.php.code.in +++ /dev/null @@ -1,225 +0,0 @@ -<?php - $query = $_GET['query']; - // We handle only the first argument so far - $query = ltrim ($query); - - $scope = $_GET['scope']; - if ($scope == NULL) - $scope = "any"; - $scope = ltrim ($scope); - if ($scope == "") - $scope = "any"; - $querystr = htmlspecialchars($query, ENT_QUOTES, 'UTF-8'); -?> - -<form action="<?php echo $_SERVER['PHP_SELF'], "?query=", rawurlencode($query) ?>" - enctype="application/x-www-form-urlencoded" method="get"> - <input name="query" type="text" size="50" value="<?php echo $querystr ?>"/> - <select name="scope"> - <option value="any">Search All</option> - <option value="API" <?php if ($scope == 'API') print "selected='selected'"?>>Only the APIs</option> - <option value="DOCS" <?php if ($scope == 'DOCS') print "selected='selected'"?>>Only the Documentation</option> - <option value="LISTS" <?php if ($scope == 'LISTS') print "selected='selected'"?>>Only the lists archives</option> - </select> - <input name="submit" type="submit" value="Search ..."/> -</form> - -<?php - function logQueryWord($word) { - $result = mysql_query ("SELECT ID,Count FROM Queries WHERE Value='$word'"); - if ($result) { - $i = mysql_num_rows($result); - if ($i == 0) { - mysql_free_result($result); - mysql_query ("INSERT INTO Queries (Value,Count) VALUES ('$word',1)"); - } else { - $id = mysql_result($result, 0, 0); - $count = mysql_result($result, 0, 1); - $count ++; - mysql_query ("UPDATE Queries SET Count=$count WHERE ID=$id"); - } - } else { - mysql_query ("INSERT INTO Queries (Value,Count) VALUES ('$word',1)"); - } - } - function queryWord($word) { - $result = NULL; - $j = 0; - if ($word) { - $result = mysql_query ("SELECT words.relevance, symbols.name, symbols.type, symbols.module, symbols.descr FROM words, symbols WHERE LCASE(words.name) LIKE LCASE('$word') and words.symbol = symbols.name ORDER BY words.relevance DESC LIMIT 75"); - if ($result) { - $j = mysql_num_rows($result); - if ($j == 0) - mysql_free_result($result); - } - logQueryWord($word); - } - return array($result, $j); - } - function queryHTMLWord($word) { - $result = NULL; - $j = 0; - if ($word) { - $result = mysql_query ("SELECT relevance, name, id, resource, section FROM wordsHTML WHERE LCASE(name) LIKE LCASE('$word') ORDER BY relevance DESC LIMIT 75"); - if ($result) { - $j = mysql_num_rows($result); - if ($j == 0) - mysql_free_result($result); - } - logQueryWord($word); - } - return array($result, $j); - } - function queryArchiveWord($word) { - $result = NULL; - $j = 0; - if ($word) { - $result = mysql_query ("SELECT wordsArchive.relevance, wordsArchive.name, 'libvir-list', archives.resource, archives.title FROM wordsArchive, archives WHERE LCASE(wordsArchive.name) LIKE LCASE('$word') and wordsArchive.ID = archives.ID ORDER BY relevance DESC LIMIT 75"); - if ($result) { - $j = mysql_num_rows($result); - if ($j == 0) - mysql_free_result($result); - } - logQueryWord($word); - } - return array($result, $j); - } - function resSort ($a, $b) { - list($ra,$ta,$ma,$na,$da) = $a; - list($rb,$tb,$mb,$nb,$db) = $b; - if ($ra == $rb) return 0; - return ($ra > $rb) ? -1 : 1; - } - if (($query) && (strlen($query) <= 50)) { - $link = mysql_connect ("localhost", "nobody"); - if (!$link) { - echo "<p> Could not connect to the database: ", mysql_error(); - } else { - mysql_select_db("libvir", $link); - $list = explode (" ", $query); - $results = array(); - $number = 0; - for ($number = 0;$number < count($list);$number++) { - - $word = $list[$number]; - if (($scope == 'any') || ($scope == 'API')) { - list($result, $j) = queryWord($word); - if ($j > 0) { - for ($i = 0; $i < $j; $i++) { - $relevance = mysql_result($result, $i, 0); - $name = mysql_result($result, $i, 1); - $type = mysql_result($result, $i, 2); - $module = mysql_result($result, $i, 3); - $desc = mysql_result($result, $i, 4); - if (array_key_exists($name, $results)) { - list($r,$t,$m,$d,$w,$u) = $results[$name]; - $results[$name] = array(($r + $relevance) * 2, - $t,$m,$d,$w,$u); - } else { - $id = $name; - $m = strtolower($module); - $url = "html/libvirt-$module.html#$id"; - $results[$name] = array($relevance,$type, - $module, $desc, $name, $url); - } - } - mysql_free_result($result); - } - } - if (($scope == 'any') || ($scope == 'DOCS')) { - list($result, $k) = queryHTMLWord($word); - if ($k > 0) { - for ($i = 0; $i < $k; $i++) { - $relevance = mysql_result($result, $i, 0); - $name = mysql_result($result, $i, 1); - $id = mysql_result($result, $i, 2); - $module = mysql_result($result, $i, 3); - $desc = mysql_result($result, $i, 4); - $url = $module; - if ($id != "") { - $url = $url + "#$id"; - } - $results["$name _html_ $number _ $i"] = - array($relevance, "XML docs", - $module, $desc, $name, $url); - } - mysql_free_result($result); - } - } - if (($scope == 'any') || ($scope == 'LISTS')) { - list($result, $j) = queryArchiveWord($word); - if ($j > 0) { - for ($i = 0; $i < $j; $i++) { - $relevance = mysql_result($result, $i, 0); - $name = mysql_result($result, $i, 1); - $type = mysql_result($result, $i, 2); - $url = mysql_result($result, $i, 3); - $desc = mysql_result($result, $i, 4); - if (array_key_exists($url, $results)) { - list($r,$t,$m,$d,$w,$u) = $results[$url]; - $results[$name] = array(($r + $relevance) * 2, - $t,$m,$d,$w,$u); - } else { - $id = $name; - $m = strtolower($module); - $u = str_replace( - "http://www.redhat.com/archives/libvir-list/", "", $url); - $results[$url] = array($relevance,$type, - $u, $desc, $name, $url); - } - } - mysql_free_result($result); - } - } - } - if ((count($results) == 0) && (count($list) == 1)) { - $word = $list[0]; - if (($scope == 'any') || ($scope == 'XMLAPI')) { - list($result, $j) = queryWord("vir$word"); - if ($j > 0) { - for ($i = 0; $i < $j; $i++) { - $relevance = mysql_result($result, $i, 0); - $name = mysql_result($result, $i, 1); - $type = mysql_result($result, $i, 2); - $module = mysql_result($result, $i, 3); - $desc = mysql_result($result, $i, 4); - if (array_key_exists($name, $results)) { - list($r,$t,$m,$d,$w,$u) = $results[$name]; - $results[$name] = array(($r + $relevance) * 2, - $t,$m,$d,$w,$u); - } else { - $id = $name; - $m = strtolower($module); - $url = "html/libvirt-$module.html#$id"; - $results[$name] = array($relevance,$type, - $module, $desc, $name, $url); - } - } - mysql_free_result($result); - } - } - } - mysql_close($link); - $nb = count($results); - echo "<h3 align='center'>Found $nb results for query $querystr</h3>\n"; - usort($results, "resSort"); - - if ($nb > 0) { - printf("<table><tbody>\n"); - printf("<tr><td>Quality</td><td>Symbol</td><td>Type</td><td>module</td><td>Description</td></tr>\n"); - $i = 0; - while (list ($name, $val) = each ($results)) { - list($r,$t,$m,$d,$s,$u) = $val; - $m = str_replace("<", "<", $m); - $s = str_replace("<", "<", $s); - $d = str_replace("<", "<", $d); - echo "<tr><td>$r</td><td><a href='$u'>$s</a></td><td>$t</td><td>$m</td><td>$d</td></tr>"; - $i = $i + 1; - if ($i > 75) - break; - } - printf("</tbody></table>\n"); - } - } - } -?> diff --git a/docs/search.php.in b/docs/search.php.in deleted file mode 100644 index 3e1fea2..0000000 --- a/docs/search.php.in +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> - <body> - <h1>Search the documentation on Libvirt.org</h1> - - <p> - The search service indexes the libvirt APIs and documentation as - well as the libvir-list@redhat.com mailing-list archives. To use - it simply provide a set of keywords: - </p> - -<span id="php_placeholder"/> - - <img src="libvirtLogo.png" alt="libvirt Logo" /> - - </body> -</html> -- 2.7.4

On Fri, May 20, 2016 at 10:27:03AM -0400, Cole Robinson wrote:
It's currently broken:
Could not connect to the database: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
And honestly there's no way this can be as effective as a targeted google search, so I think we should just drop it.
diff --git a/docs/page.xsl b/docs/page.xsl index cd98f7d..9ae0129 100644 --- a/docs/page.xsl +++ b/docs/page.xsl @@ -143,14 +143,6 @@ <body> <div id="header"> <div id="headerLogo"/> - <div id="headerSearch"> - <form action="{$href_base}search.php" enctype="application/x-www-form-urlencoded" method="get"> - <div> - <input id="query" name="query" type="text" size="12" value=""/> - <input id="submit" name="submit" type="submit" value="Search"/> - </div> - </form> - </div>
Instead of deleting this, I suggest that we simply change the action to point to google.com, and have a bit of javasccript that appends "site:libvirt.org" to the search string the user has entered in text field upon submission. This would also mean many of the other references to search you removed in this commit would remain in place too. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 05/20/2016 01:16 PM, Daniel P. Berrange wrote:
On Fri, May 20, 2016 at 10:27:03AM -0400, Cole Robinson wrote:
It's currently broken:
Could not connect to the database: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
And honestly there's no way this can be as effective as a targeted google search, so I think we should just drop it.
diff --git a/docs/page.xsl b/docs/page.xsl index cd98f7d..9ae0129 100644 --- a/docs/page.xsl +++ b/docs/page.xsl @@ -143,14 +143,6 @@ <body> <div id="header"> <div id="headerLogo"/> - <div id="headerSearch"> - <form action="{$href_base}search.php" enctype="application/x-www-form-urlencoded" method="get"> - <div> - <input id="query" name="query" type="text" size="12" value=""/> - <input id="submit" name="submit" type="submit" value="Search"/> - </div> - </form> - </div>
Instead of deleting this, I suggest that we simply change the action to point to google.com, and have a bit of javasccript that appends "site:libvirt.org" to the search string the user has entered in text field upon submission.
This would also mean many of the other references to search you removed in this commit would remain in place too.
Okay, I'll look into it. How do you feel about the other two patches? dropping the todolist stuff, and ChangeLog-old Thanks, Cole

On Mon, May 23, 2016 at 11:20:19AM -0400, Cole Robinson wrote:
On 05/20/2016 01:16 PM, Daniel P. Berrange wrote:
On Fri, May 20, 2016 at 10:27:03AM -0400, Cole Robinson wrote:
It's currently broken:
Could not connect to the database: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
And honestly there's no way this can be as effective as a targeted google search, so I think we should just drop it.
diff --git a/docs/page.xsl b/docs/page.xsl index cd98f7d..9ae0129 100644 --- a/docs/page.xsl +++ b/docs/page.xsl @@ -143,14 +143,6 @@ <body> <div id="header"> <div id="headerLogo"/> - <div id="headerSearch"> - <form action="{$href_base}search.php" enctype="application/x-www-form-urlencoded" method="get"> - <div> - <input id="query" name="query" type="text" size="12" value=""/> - <input id="submit" name="submit" type="submit" value="Search"/> - </div> - </form> - </div>
Instead of deleting this, I suggest that we simply change the action to point to google.com, and have a bit of javasccript that appends "site:libvirt.org" to the search string the user has entered in text field upon submission.
This would also mean many of the other references to search you removed in this commit would remain in place too.
Okay, I'll look into it. How do you feel about the other two patches? dropping the todolist stuff, and ChangeLog-old
Sure, that's fine with me. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

libvirt.org/todo.html is currently broken: Todo list unavailable: no config file The page is supposed to be auto generated from the bug tracker using todo.pl scripts, but apparently that's broken, and the bug tracking assumptions used by the script were never maintained. A manual run of todo.pl from 2013 was present on the wiki at http://wiki.libvirt.org/page/Todo With some more info explaining that the list isn't any guarantee the RFEs will be included. Drop the broken static page and scripts, and point the sitemap link at the wiki page, which is easier to maintain and to automate using bugzilla queries and RSS --- .gitignore | 1 - TODO | 22 +++------ docs/Makefile.am | 31 ++----------- docs/sitemap.html.in | 2 +- docs/todo.cfg-example | 26 ----------- docs/todo.pl | 125 -------------------------------------------------- 6 files changed, 11 insertions(+), 196 deletions(-) delete mode 100644 docs/todo.cfg-example delete mode 100755 docs/todo.pl diff --git a/.gitignore b/.gitignore index 103edc6..c885d84 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,6 @@ /docs/libvirt-lxc-*.xml /docs/libvirt-qemu-*.xml /docs/libvirt-refs.xml -/docs/todo.html.in /examples/object-events/event-test /examples/dominfo/info1 /examples/domsuspend/suspend diff --git a/TODO b/TODO index 6843a17..c837ce8 100644 --- a/TODO +++ b/TODO @@ -1,22 +1,12 @@ libvirt TODO list ================= -The TODO list changes frequently, so is maintained online -in the libvirt bugzilla +Libvirt does not maintain an authoritative TODO list. However you +can find a list of open feature requests at: - http://bugzilla.redhat.com/ + http://wiki.libvirt.org/page/Todo -Search against +A list of introductory tasks for new contributors is +maintained at: - Product: Virtualization Tools - Component: libvirt - Subject: RFE - -Or browse dependent bugs under - - https://bugzilla.redhat.com/show_bug.cgi?id=libvirtTodo - -Summarized reports automatically generated from bugzilla -and provided online at - - http://libvirt.org/todo.html + http://wiki.libvirt.org/page/BiteSizedTasks diff --git a/docs/Makefile.am b/docs/Makefile.am index 282d101..b5379bf 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -95,14 +95,12 @@ internals_html_in = \ $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in)) internals_html = $(internals_html_in:%.html.in=%.html) -# todo.html is special - it is shipped in the tarball, but we -# have a dedicated 'todo' target to rebuild it from a proper -# config file, all other users are able to build it locally. +# hvsupport.html.in is special, it's automatically generated so we +# list it here explicitly. # For all other files, since we ship pre-built html in the # tarball, we must also ship the sources, even when those # sources are themselves generated. dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) \ - todo.html.in \ hvsupport.html.in dot_html = $(dot_html_in:%.html.in=%.html) @@ -159,7 +157,7 @@ EXTRA_DIST= \ $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\ $(internals_html_in) $(internals_html) \ sitemap.html.in aclperms.htmlinc \ - todo.pl hvsupport.pl todo.cfg-example \ + hvsupport.pl \ $(schema_DATA) acl_generated = aclperms.htmlinc @@ -186,24 +184,6 @@ admin_api: $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \ $(dot_php) -todo.html.in: todo.pl - if [ -f todo.cfg ]; then \ - echo "Generating $@"; \ - $(PERL) $< > $@ \ - || { rm $@ && exit 1; }; \ - else \ - echo "Stubbing $@"; \ - printf "%s\n" \ - "<html xmlns=\"http://www.w3.org/1999/xhtml\">" \ - "<body>" \ - "<h1>Todo list unavailable: no config file</h1>" \ - "</body></html>" > $@ ; \ - fi - -todo: - rm -f todo.html.in - $(MAKE) todo.html - hvsupport.html: $(srcdir)/hvsupport.html.in $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \ @@ -213,8 +193,6 @@ $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \ $(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \ || { rm $@ && exit 1; } -.PHONY: todo - %.png: %.fig convert -rotate 90 $< $@ @@ -336,8 +314,7 @@ clean-local: rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html maintainer-clean-local: clean-local - rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml \ - todo.html.in + rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml rm -rf $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml rm -rf $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml diff --git a/docs/sitemap.html.in b/docs/sitemap.html.in index d5cf723..3ea34b1 100644 --- a/docs/sitemap.html.in +++ b/docs/sitemap.html.in @@ -445,7 +445,7 @@ <span>Security bug reporting and resolution process</span> </li> <li> - <a href="todo.html">Todo list</a> + <a href="http://wiki.libvirt.org/page/Todo">Todo list</a> <span>Main feature request list</span> </li> <li> diff --git a/docs/todo.cfg-example b/docs/todo.cfg-example deleted file mode 100644 index a99c61a..0000000 --- a/docs/todo.cfg-example +++ /dev/null @@ -1,26 +0,0 @@ -bugzilla = { - #username = ...some email addr... - #password = ...some bz password... - server = https://bugzilla.redhat.com -} -query = { - product = Virtualization Tools - alias = libvirtTodo -} - -output = { - title = Todo list - blurb = <<EOF -This is a summary of all the ideas submitted for future todo items in -libvirt. Listing an idea here does not imply that it is committed to -for inclusion in libvirt, just that someone thought it might be a -useful feature. Discussion for final approval of features always takes -place on the <a href="contact.html">development mailing list</a>. -If you intend to work on one of the items here, it is recommended to -add a comment to the corresponding bugzilla ticket to this effect. -This will reduce the risk of duplicated effort between developers. -It is also strongly recommended to mail the development mailing list -with proposals for new APIs & XML before fully implementing them, to -allow for early design review. -EOF -} diff --git a/docs/todo.pl b/docs/todo.pl deleted file mode 100755 index 36698e8..0000000 --- a/docs/todo.pl +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -use BZ::Client; -use BZ::Client::Bug; - -use Config::Record; - -my $cfg = Config::Record->new(file => "todo.cfg"); -my $server = $cfg->get("bugzilla/server", "https://bugzilla.redhat.com"); -my $username = $cfg->get("bugzilla/username"); -my $password = $cfg->get("bugzilla/password"); - -my $product = $cfg->get("query/product", "Virtualization Tools"); -my $todoalias = $cfg->get("query/todoalias", "libvirtTodo"); - -my $title = $cfg->get("output/title", undef); -my $blurb = $cfg->get("output/blurb", undef); - -$SIG{__DIE__} = sub { - my $err = shift; - if (UNIVERSAL::isa($err, "BZ::Client::Exception")) { - die "Unable to access bugzilla: " . $err->message; - } - die $err; -}; - -my $client = BZ::Client->new(url => $server, - user => $username, - password => $password); - -my $todo = BZ::Client::Bug->search($client, {'product' => $product, - 'alias' => $todoalias}); - -die "Cannot find bug alias 'libvirtTodo'" unless $#{$todo} > -1; -my $todoid = $todo->[0]->{'bug_id'}; -my $todosummary = $todo->[0]->{'short_desc'}; -$todosummary =~ s/^\s*RFE\s*:\s*//; -$todosummary =~ s/^\s*\[\s*RFE\s*\]\s*:?\s*//; -$todosummary =~ s/^\s*Tracker\s*:\s*//; - -my $trackers = BZ::Client::Bug->search($client, {'product' => $product, - 'blocked' => $todoid }); - -my @trackers; - -foreach my $tracker (@{$trackers}) { - next if $tracker->{'bug_status'} eq "CLOSED"; - - my $summary = $tracker->{'short_desc'}; - $summary =~ s/^\s*RFE\s*:\s*//; - $summary =~ s/^\s*\[\s*RFE\s*\]\s*:?\s*//; - $summary =~ s/^\s*Tracker\s*:\s*//; - - push @trackers, { - id => $tracker->{'bug_id'}, - summary => $summary, - features => [], - }; -} - -foreach my $tracker (@trackers) { - my $features = BZ::Client::Bug->search($client, {'product' => $product, - 'blocked' => $tracker->{id}}); - - foreach my $feature (@{$features}) { - next if $feature->{'bug_status'} eq "CLOSED"; - - my $summary = $feature->{'short_desc'}; - $summary =~ s/^\s*RFE\s*:\s*//; - $summary =~ s/^\s*\[\s*RFE\s*\]\s*:?\s*//; - - push @{$tracker->{features}}, { - id => $feature->{'bug_id'}, - summary => $summary, - }; - } -} - -sub escape { - my $txt = shift; - $txt =~ s/&/&/g; - $txt =~ s/</</g; - $txt =~ s/>/>/g; - return $txt; -}; - -print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; -print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; -print "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"; -print " <body>\n"; -if (defined $title) { - print " <h1>", &escape($title), "</h1>\n"; -} else { - print " <h1>", &escape($todosummary), "</h1>\n"; -} -if (defined $blurb) { - print " <p>\n"; - print $blurb; - print " </p>\n"; -} -foreach my $tracker (sort { $a->{summary} cmp $b->{summary} } @trackers) { - next unless $#{$tracker->{features}} >= 0; - - my $summary = &escape($tracker->{summary}); - my $id = $tracker->{id}; - print " <h2><a href=\"$server/$id\">$summary</a></h2>\n"; - print " <ul>\n"; - foreach my $feature (sort { $a->{summary} cmp $b->{summary} } @{$tracker->{features}}) { - $summary = &escape($feature->{summary}); - $summary =~ s,^([^:]+):,<strong>$1</strong>,; - - $id = $feature->{id}; - print " <li>$summary (<strong>rhbz <a href=\"$server/$id\">$id</a></strong>)</li>\n"; - } - print " </ul>\n"; -} - -print " <p>\n"; -print " This page is automatically generated from <a href=\"$server/$todoid\">", &escape($todosummary), "</a>\n"; -print " </p>\n"; -print " </body>\n"; -print "</html>\n"; -- 2.7.4

This is the manually maintained ChangeLog file from the CVS days. We don't use it for anything, except shipping in the tarball. It tends to have more info than the commit messages from that time frame, but personally I haven't consulted it for years and all it does is gunk up git grep results. So let's drop it --- ChangeLog-old | 16699 -------------------------------------------------------- Makefile.am | 1 - 2 files changed, 16700 deletions(-) delete mode 100644 ChangeLog-old <giant diff snipped> diff --git a/Makefile.am b/Makefile.am index da07e6c..a72bb5e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,7 +26,6 @@ ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = \ config-post.h \ - ChangeLog-old \ libvirt.spec libvirt.spec.in \ mingw-libvirt.spec.in \ libvirt.pc.in \ -- 2.7.4
participants (2)
-
Cole Robinson
-
Daniel P. Berrange