From owner-freebsd-ports@FreeBSD.ORG Mon Sep 10 08:46:20 2007 Return-Path: Delivered-To: freebsd-ports@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4CBCB16A417 for ; Mon, 10 Sep 2007 08:46:20 +0000 (UTC) (envelope-from carpetsmoker@rwxrwxrwx.net) Received: from mail.rwxrwxrwx.net (rwxrwxrwx.net [82.93.23.199]) by mx1.freebsd.org (Postfix) with ESMTP id 1C04E13C458 for ; Mon, 10 Sep 2007 08:46:14 +0000 (UTC) (envelope-from carpetsmoker@rwxrwxrwx.net) Received: by mail.rwxrwxrwx.net (Postfix, from userid 1001) id B26266D479; Mon, 10 Sep 2007 10:31:08 +0200 (CEST) Date: Mon, 10 Sep 2007 10:31:08 +0200 From: Martin Tournoij To: freebsd-ports@freebsd.org Message-ID: <20070910083108.GA44257@glitch.rwxrwxrwx.net> Mail-Followup-To: freebsd-ports@freebsd.org, green@FreeBSD.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="45Z9DzgjV8m4Oswq" Content-Disposition: inline User-Agent: mutt-ng/devel-r804 (FreeBSD) Cc: green@FreeBSD.org Subject: A new version of Tools/scripts/plist X-BeenThere: freebsd-ports@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting software to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Sep 2007 08:46:20 -0000 --45Z9DzgjV8m4Oswq Content-Type: text/plain; charset=us-ascii Content-Disposition: inline I've written a replacement for /ports/Tools/scripts/plist, the reason this is a complete rewrite rather than an update is because I'm not familair with ruby, and writing a new version in python was faster. Problems/additions in this rewrite: - Automaticlly replace the default PLIST_SUB values. - Sensible sorting of the directory list, the current plist put directory's in ths order: share/someport/ share/someport/adir/ share/someport/adir/foobar Which is the reverse of what it should be. - There are a number of directory's which are always created but should not be added to the pkg-plist, I have no idea where these directory's come from, see the comment on line 49 of my script. I wrote this script for personal purposes, but why not let other people benefit, maybe it can be placed in Tools/scripts? Either replacing the current plist or alongside it. Script is attached in this email, or you can view it online if you like: http://www.rwxrwxrwx.net/plist.py.txt Regards, Martin Tournoij --45Z9DzgjV8m4Oswq Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="plist.py" #!/usr/bin/env python # vim: set fileencoding=utf-8 : # -*- coding: utf-8 -*- # # $Carpetsmoker: ports/Scripts/plist.py,v 1.2 2007/09/10 08:02:53 carpetsmoker Exp $ # # Make a pkg-plist. # Maintained by Martin Tournoij # # No boring license info, this file is released in public domain, feel # free to do whatever you want with it (although eating it neither # supported nor recommended). # import re, os, sys from optparse import OptionParser def GetMtree(mtree, prefix): #{{{ ''' Read mtree file Arguments: mtree - Location to a mtree file prefix - prefixed to all entries (Should be a pathname) Returns a list. ''' list = [ ] prev_prefix = '' mtree = open(mtree) # Skip entries which are unimportant to us. for line in mtree: if line[0] == '#' or line[0] == '/' or line == '.\n' or line == '\n': continue # Remove all flags, we don't need them. r = re.compile('\s+[\w\=]*$') line = r.sub('', line.lstrip()) line = line.strip() if line == '..': (cur_prefix, a) = os.path.split(prev_prefix) prev_prefix = cur_prefix else: cur_prefix = os.path.join(prev_prefix, line) prev_prefix = cur_prefix list.append(cur_prefix) mtree.close() # XXX: This is a list of files that seem to be created always, but # how and where? # /etc/mtree/BSD.x11.dist lists some of the X11 related dirs, but # also many other dirs which are not created, and I can't find any # reference to the other files in either /etc/mtree/ or /ports/Mk/ # We will add them manually for now. list.extend ([ 'include/X11', 'include/X11/bitmaps', 'lib/X11', 'lib/X11/app-defaults', 'lib/X11/fonts', 'lib/X11/fonts/local', 'share/locale/be', 'share/locale/be/LC_MESSAGES', 'share/locale/ca', 'share/locale/ca/LC_MESSAGES', 'share/locale/cs', 'share/locale/cs/LC_MESSAGES', 'share/locale/de_AT', 'share/locale/de_AT/LC_MESSAGES', 'share/locale/el', 'share/locale/el/LC_MESSAGES', 'share/locale/en_AU', 'share/locale/en_AU/LC_MESSAGES', 'share/locale/fa_IR', 'share/locale/fa_IR/LC_MESSAGES', 'share/locale/fi', 'share/locale/fi/LC_MESSAGES', 'share/locale/fr_FR', 'share/locale/fr_FR/LC_MESSAGES', 'share/locale/gl', 'share/locale/gl/LC_MESSAGES', 'share/locale/ko', 'share/locale/ko/LC_MESSAGES', 'share/locale/li', 'share/locale/li/LC_MESSAGES', 'share/locale/ne', 'share/locale/ne/LC_MESSAGES', 'share/locale/nn', 'share/locale/nn/LC_MESSAGES', 'share/locale/no', 'share/locale/no/LC_MESSAGES', 'share/locale/pl', 'share/locale/pl/LC_MESSAGES', 'share/locale/pt', 'share/locale/pt/LC_MESSAGES', 'share/locale/ro', 'share/locale/ro/LC_MESSAGES', 'share/locale/sk', 'share/locale/sk/LC_MESSAGES', 'share/locale/sl', 'share/locale/sl/LC_MESSAGES', 'share/locale/sr', 'share/locale/sr/LC_MESSAGES', 'share/locale/tg', 'share/locale/tg/LC_MESSAGES', 'share/locale/tk', 'share/locale/tk/LC_MESSAGES', 'share/locale/uk', 'share/locale/uk/LC_MESSAGES', 'share/locale/uz', 'share/locale/uz/LC_MESSAGES', 'share/locale/zh_CN', 'share/locale/zh_CN/LC_MESSAGES', 'share/locale/zh_TW', 'share/locale/zh_TW/LC_MESSAGES', 'share/pixmaps', ]) return list #}}} def GetTree(prefix, prev, d, f): #{{{ ''' Return recursive list of files and dirs Arguments: prefix - pathname to get the list of. prev, d, and f should not be given, or should be empty, they are used in overloading. Returns two lists, one with a list of dirs and the other a list of files. ''' global opt for file in os.listdir(os.path.join(prefix, prev)): # Skip these files/dirs, they're added automatically if prev[:3] == 'man': continue if opt.noportdocs and prev.find('share/doc') != -1: continue path = os.path.join(prev, file) if os.path.isdir(os.path.join(prefix, path)): if CheckDir(path): d.append('@dirrm ' + path) GetTree(prefix, path, d, f) else: f.append(path) return d, f #}}} def CheckDir(path): #{{{ ''' Check if dir is in mtree Arguments: path - pathname to check Return False if it found the path in mtree, True if it didn't ''' global mtree for m in mtree: if path == m: return False else: continue return True #}}} def ReplaceSub(path, dir=None): #{{{ ''' Replace paths with common PLIST_SUB values Arguments: path - pathname to do the substitution on dir - Set this to True if path is a dir Returns modified path ''' global portname, prefix, opt plist_sub = { '%%PREFIX%%': prefix, '%%LOCALBASE%%': '/usr/local', '%%X11BASE%%': '/usr/X11R6', '%%DATADIR%%': os.path.join('share/', portname), '%%DOCSDIR%%': os.path.join('share/doc/', portname), '%%EXAMPLESDIR%%': os.path.join('share/examples/', portname), '%%WWWDIR%%': os.path.join('www', portname), '%%ETCDIR%%': os.path.join('etc', portname) } for replace, search in plist_sub.iteritems(): path = path.replace(search, replace) if opt.portdocs: if dir: path = path.replace('@dirrm %%DOCSDIR%%', '%%PORTDOCS%%@dirrm %%DOCSDIR%%') else: path = path.replace('%%DOCSDIR%%', '%%PORTDOCS%%%%DOCSDIR%%') return path # }}} parser = OptionParser(usage='usage: %prog [options] prefix') parser.add_option('-p', action='store', type='string', dest='portname', default=None, help='Port name, used to replace default PLIST_SUB values, no replacing will be done if it\'s empty.') parser.add_option('-d', action='store_true', dest='portdocs', default=None, help='Prefix all entries in %%DOCSDIR%% with %%PORTDOCS%%, doesn\'t do anything if -p isn\'t specified or if -n is given.') parser.add_option('-n', action='store_true', dest='noportdocs', default=None, help='Ignore all entries in %%DOCSDIR%%, usefull if you have PORTDOCS defined in your Makefile, doesn\'t do anything if -p isn\'t specified') (opt, arg) = parser.parse_args() try: prefix = arg[0] except: parser.print_help() print 'Error: You must specify a prefix.' sys.exit(1) if not os.path.exists(prefix): parser.print_help() print 'Error: The prefix"', prefix, '"doesn\'t exist.' sys.exit(1) try: portname = opt.portname except: portname = None mtree = GetMtree('/etc/mtree/BSD.local.dist', prefix) (dirlist, filelist) = GetTree(prefix, '', d = [ ], f = [ ]) dirlist.reverse() for f in filelist: if portname: f = ReplaceSub(f) print f for d in dirlist: if portname: d = ReplaceSub(d, True) print d --45Z9DzgjV8m4Oswq--