Thursday, April 3, 2008

Well, I have a todo list stored away on Neo Ports Manager and one of the things on my todo was to remove the dependency on the psearch program, namely because it would be faster to update our display as we find stuff in ports rather then parsing the output.


I think I might make another page in the settings to allow one to choose what fields to search in and possibly which to display as details. I plan on embedding the code to search ports right in NPM, but if it doesn't clog things up I don't see why not to allow the ability to use an external program. The best reason being if the index file ever changes or is ax'ed and I get hit by a bus, no one has to learn Python to fix NPM lol.


A couple months ago I sat down and started trying to figure out the format of the index file in ports, it was pretty easy and I wrote a small script to search it and print out all the cells of information in each entry of the index that had a matching package-version in it.


This is a quick test script I wrote tonight that searchs for a port and displays a short info on it, being a test I wrote the port to look for in the file test rather then passing sys.argv over to save time. I plan to adopt NPM to using a variation of this for searching ports now.






     1: #!/usr/bin/env python
     2: 
     3: # This is as much of the format of /usr/ports/INDEX-* file as I have
     4: # been able to reverse engineer by looking at it and a few other things
     5: # that didn't come with a nice fat manual page: the source is the documentation!
     6: #
     7: # Each program is listed on one line with each field separated with the pipe
     8: # symbol (|), list values are delimited by a space.
     9: #
    10: # pkg-ver|                   -> as listed in pkg_info
    11: # location in ports|         -> /usr/ports/editors/vim
    12: # install prefix|            -> /usr/local
    13: # short descr|               ->
    14: # path to pkg-descr|         -> /usr/ports/editors/vim/pkg-decsr
    15: # maintainer e-mail|         -> who@foo.com
    16: # listed in categories|      -> list of cat, e.g. cat1 cat2
    17: # dependencies to build|     -> list of pkg-ver required to build this port
    18: # dependencies at run time|  -> list of pkg-ver required to run this program
    19: # website|                   -> the programs website
    20: # |                          -> unknown
    21: # |                          -> unknown
    22: # XXX: the unknowns may relate to internal port opts, e..g use zip, etc
    23: ####
    24: 
    25: 
    26: import re, os.path
    27: 
    28: INDEX="/usr/ports/INDEX-6"
    29: 
    30: # find keys 1,2,4 in index row via regex
    31: def search(pattern):
    32:     idx = open(INDEX)
    33:     for line in idx:
    34:         keys = line.split('|')
    35:         k = (keys[0],os.path.split(keys[1])[1], keys[3])
    36:         for each in k:
    37:             if re.search(pattern, each):
    38:                 print 'found'
    39:                 mypp(keys)
    40:     idx.close()
    41: 
    42: def mypp(table):
    43:     print "PORT INFORMATION FOR: %s" % table[0]
    44:     print 'location: %s' % table[1][11:]
    45:     print 'descr: %s' % table[3]
    46:     print 'category: %s' % table[6]
    47:     print 'website: %s' % table[9]
    48: 
    49: 
    50: if __name__ == "__main__":
    51:     search("linux-flock")
    52: 
    53: 



No comments:

Post a Comment