#! /usr/bin/env python
# portell.py
# Description: Prints a BSD systems Port's description instantly from whatever directory you're in.
# Author: Ryan "gt3" Kulla
# Email: rkulla@gmail.com
# Version: 0.2
# Usage: portell.py <portname>

import sys, os, shelve

try:
    PORTELL_DB = os.environ['PORTELL_PATH']
except KeyError:
    PORTELL_DB = "/var/db/portell.db"

PORTS_DIR = "/usr/ports/"
IGNORE_DIRS = { "distfiles":None, "Tools":None, "packages":None }

def write_pathname(d, dirname, names):
	dirs=dirname.split('/')
	if len(dirs)==4:
	    if IGNORE_DIRS.has_key(dirs[3]):
		del names[:]
	elif len(dirs)==5:
	    d[dirs[4]] = dirname
	    del names[:]

def update_db(msg):
    print msg
    
    if os.path.exists(PORTELL_DB):
        os.unlink(PORTELL_DB) 
    if os.path.exists(PORTELL_DB + ".db"):
        os.unlink(PORTELL_DB + ".db") 
        
    try:
        d = shelve.open(PORTELL_DB)
        fix_dbdb()
        os.chmod(PORTELL_DB, 0666) 
    except:
        print "can't read or write %s. are you root?" % PORTELL_DB
        sys.exit(0)

    os.path.walk(PORTS_DIR, write_pathname, d)
    d.close()
    print "done."
    sys.exit(0)


def fix_dbdb():
    # sometimes the os seems to append its own .db extention to files
    if os.path.exists(PORTELL_DB + ".db"):
        os.rename(PORTELL_DB + ".db", PORTELL_DB)


def main():
    if len(sys.argv) != 2:
        print "Usage: %s <portname>" % sys.argv[0]
        print "To update the database: %s -u" % sys.argv[0]
        print "The db will be \"/var/db/portell.db\" or whatever PORTELL_PATH points to"
        sys.exit(0)

    if sys.argv[1] == '-u':
        update_db("updating database %s..." % PORTELL_DB)
    elif os.path.exists(PORTELL_DB) == False:
        update_db("creating database %s..." % PORTELL_DB)
    else:
        portname = sys.argv[1]

    d = shelve.open(PORTELL_DB)
    fix_dbdb()

    if d.has_key(portname): 
        if os.uname()[0].lower() == "freebsd":
            descr_path = d[portname] + "/pkg-descr"
        else:
            descr_path = d[portname] + "/pkg/DESCR"
        match = descr_path 
        try:
            descr_file = open(match, 'r').readlines()
            print "%s reads:\n" % descr_path
            for line in descr_file:
                print line,
        except IOError, errmsg:
            print errmsg
    else:
        print >> sys.stderr, "can't find %s's description file" % portname

    d.close()


if __name__=='__main__':
    main()


syntax highlighted by Code2HTML, v. 0.9.1