Author: reinhard Date: 2010-04-20 15:46:26 -0500 (Tue, 20 Apr 2010) New Revision: 10156
Added: trunk/gnue-common/.bzrignore trunk/gnue-common/README.bzr trunk/gnue-common/setup-bzr.py trunk/gnue-common/setup.bzr Removed: trunk/gnue-common/README.svn trunk/gnue-common/setup-svn.py trunk/gnue-common/setup.svn Modified: trunk/gnue-common/ Log: Migrated developer install scripts from Subversion to Bazaar. Property changes on: trunk/gnue-common ___________________________________________________________________ Name: bzr:revision-info + timestamp: 2010-04-09 20:46:14.513000011 +0200 committer: Reinhard Müller <reinhard.muel...@bytewise.at> properties: branch-nick: common Name: bzr:file-ids + .bzrignore bzrignore-20100409182546-xa0zbayeoj88p9k2-1 README.bzr 9...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-common:README.svn setup-bzr.py 9...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-common:setup-svn.py setup.bzr 9...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-common:setup.svn Name: bzr:ancestry:v3-single1-dHJ1bmsvZ251ZS1jb21tb24. + reinhard.muel...@bytewise.at-20100409183158-f6t50kimzgk20n4a Name: bzr:revision-id:v3-single1-dHJ1bmsvZ251ZS1jb21tb24. + 3114 reinhard.muel...@bytewise.at-20100409184614-7ocer3a78alcs3mm Added: trunk/gnue-common/.bzrignore =================================================================== --- trunk/gnue-common/.bzrignore (rev 0) +++ trunk/gnue-common/.bzrignore 2010-04-20 20:46:26 UTC (rev 10156) @@ -0,0 +1,5 @@ +po/STATISTICS +po/*.gmo +scripts/gcvs +scripts/gsscvs +setup.log Copied: trunk/gnue-common/README.bzr (from rev 10155, trunk/gnue-common/README.svn) =================================================================== --- trunk/gnue-common/README.bzr (rev 0) +++ trunk/gnue-common/README.bzr 2010-04-20 20:46:26 UTC (rev 10156) @@ -0,0 +1,21 @@ +Developer Installation Instructions +=================================== + +If you have downloaded gnue-common from the Bazaar repository (which you +most probably have, because you wouldn't see this file otherwise), you can +install and configure everything like described in the file "INSTALL". + +However, GNU Enterprise supports parallel use of an "installed" version and one +or several "development" versions by providing a "developer install" script +that uses different names for the programs. + +After downloading all the tools you want to have from the Bazaar repository, +you just to run ./setup-bzr.py in the gnue-common directory. + +With the developer installation, you have to substitute the commands of the +gnue-common package as follows: + +gnue-schema -> gsscvs + +Also, you will find all relevant files and directories in ~/gnue instead of +/usr/local/gnue. Deleted: trunk/gnue-common/README.svn =================================================================== --- trunk/gnue-common/README.svn 2010-04-07 06:51:21 UTC (rev 10155) +++ trunk/gnue-common/README.svn 2010-04-20 20:46:26 UTC (rev 10156) @@ -1,21 +0,0 @@ -Developer Installation Instructions -=================================== - -If you have downloaded gnue-common from the subversion repository (which you -most probably have, because you wouldn't see this file otherwise), you can -install and configure everything like described in the file "INSTALL". - -However, GNU Enterprise supports parallel use of an "installed" version and one -or several "development" versions by providing a "developer install" script -that uses different names for the programs. - -After downloading all the tools you want to have from the subversion -repository, you just to run ./setup-svn.py in the gnue-common directory. - -With the developer installation, you have to substitute the commands of the -gnue-common package as follows: - -gnue-schema -> gsscvs - -Also, you will find all relevant files and directories in ~/gnue instead of -/usr/local/gnue. Copied: trunk/gnue-common/setup-bzr.py (from rev 10155, trunk/gnue-common/setup-svn.py) =================================================================== --- trunk/gnue-common/setup-bzr.py (rev 0) +++ trunk/gnue-common/setup-bzr.py 2010-04-20 20:46:26 UTC (rev 10156) @@ -0,0 +1,648 @@ +#!/usr/bin/env python +# +# This file is part of GNU Enterprise. +# +# GNU Enterprise is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 3, or (at your option) any later version. +# +# GNU Enterprise is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with program; see the file COPYING. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place +# - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright 2001-2010 Free Software Foundation +# + + +########################################################## +# +# NOTE: Nightly cron scripts on www.gnuenterprise.org +# run this script with --auto, which uses the +# defaults passed to getInput. So, each input +# MUST have a sane default or various web functions +# might just break. +# + + +import sys, string, os, glob + +# Hack for python 2.1 compatibility. With 2.3 we can use the global __file__ +m = __import__ ('setup-bzr', None, None, '*') +if __name__ == '__main__': + sys.exit (0) + +# Determine if Windows is used +WIN=(sys.platform=="win32") + +BZRDIR = os.path.abspath(os.path.join(os.path.dirname(m.__file__),'..')) +BASEDIR = WIN and os.path.join(sys.prefix,"gnue-devel") or os.path.join(BZRDIR, '.bzrdevelbase') +PYTHONBIN=sys.executable + +global CURRENT_DIR +CURRENT_DIR = "" +CURRENT_TOOL = "" +rootCommands = [] + +def createShell (script,py,scriptdir="scripts"): + script = "%s%s" % (script, SUFFIX) + if py: + src = os.path.join(CURRENT_DIR, scriptdir, py) + else: + src = '' + if WIN: + dest = os.path.join(BINDIR, "%s.bat" % script) + else: + dest = os.path.join(CURRENT_DIR, scriptdir, script) + if not auto: + print "Creating %s....." % dest , + try: + file = open(dest,'w') + if WIN: + # create batch file at final destination + file.write("@set PYTHONPATH=%s;%%PYTHONPATH%%\n" % BASEDIR) + file.write("@set SCRIPT=%s\n" % src) + file.write("@%s \"%%SCRIPT%%\" %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9\n" % PYTHONBIN) + file.close() + else: + # create script in repository and + file.write(bzrbase % src) + file.close() + os.system ('chmod 700 %s' % dest) + + rootCommands.append ('rm -f %s/%s' % (BINDIR, script)) + rootCommands.append ('ln -s %s %s/%s' % \ + (dest, BINDIR, script)) + rootCommands.append ('chmod go+rx %s' % dest) + + except IOError: + print "Unable to create. Do you have this package checked out?" + else: + if not auto: + print "ok" + +def createDocs(sgmlfile, destdir): + if not willInstallDocs: + return + sgmlfile = os.path.join(CURRENT_DIR, sgmlfile) + destdir = os.path.join(DOCDIR, destdir) + rootCommands.append("if [ ! -d %s ]; then mkdir %s; fi" % (destdir, destdir)) + rootCommands.append("%s --output %s %s" % + (DB2HTML, destdir, sgmlfile)) + + +def getInput(message, default, responseSet=None): + + if auto: + return default + + print "" + while 1: + if default: + print "%s [%s] " % (message, default), + else: + print "%s " % (message), + + + val = string.strip(sys.stdin.readline()) + print "" + + if not len(val) and default: + return default + elif responseSet and string.upper(val) in (responseSet): + return string.upper(val) + elif not responseSet: + return val + + +_getYesNoAllStat = {} + +def getYesNo(message, default, category=None): + + if auto: + return default + + if category: + try: + response = _getYesNoAllStat[category] + print "\n" + message + ' ' + (response and 'Always' or 'Never') + return response + except KeyError: + pass + + response = getInput(message,default,('Y','N','A','V')) + val = response in ('Y','A') + if category and response in ('A','V'): + _getYesNoAllStat[category] = val + return val + + +def getBinPaths(): + paths = string.split(os.environ['PATH'],os.pathsep) + if not ('/usr/local/bin' in paths or '/usr/local/bin/' in paths) and \ + os.path.isdir('/usr/local/bin'): + paths.append('/usr/local/bin') + return(paths) + + +# Returns a list containing all Python executables in the user's path. +# List element 0 will always be the currently running executable +def findAllPythonExes(): + results = [sys.executable] + + for path in getBinPaths(): + for file in glob.glob('%s/python?*' % os.path.abspath(string.strip(path))): + base = os.path.basename(file) + version = base[6:] + + # Do not include python 1.x files + if version < '2': + pass + + # Do not include python2.2-popy-config + elif len(version)>8: + pass + + # Do not include python??.dll + elif base[-3:]=="dll": + pass + + elif os.path.realpath(file)==os.path.realpath(sys.executable): + # If this file is the one being executed, just replace w/full name + if results[0] == sys.executable: + results[0] = file + else: + results.append(file) + + return results + +def findAllGNUePackages(): + results = [] + for file in glob.glob('../*'): + if os.path.isfile(os.path.join(file, 'setup.bzr')): + base = os.path.basename(file) + results.append(base) + results.sort() + return results + +def finddb2html(): + for path in getBinPaths(): + for file in glob.glob('%s/db2html' % os.path.abspath(string.strip(path))): + return(file) + + # Nothing found + return ""; + + +def restartWithExecutable(exe): + os.system('%s %s --withNewExecutable "%s"' \ + % (exe, sys.argv[0], string.join(sys.argv[1:],'" "'))) + sys.exit() + +def createLink(file, dest, overwrite=0): + if WIN: + src=os.path.normpath(os.path.join(CURRENT_DIR, file)) + dest = os.path.normpath(dest) + + if os.path.isdir(src): + ret = os.system("xcopy /S /E /Y \"%s\" \"%s\\\" > NUL" % (src, dest)) + else: + ret = os.system("copy \"%s\" \"%s\" > NUL" % (src, dest)) + if ret!=0: + print "Failed to copy %s to %s." % (src, dest) + + else: + if overwrite: + rootCommands.append ("if [ -e %s ]; then rm -f %s; fi" % (dest, dest)) + + rootCommands.append("ln -f -s %s/%s %s" % (CURRENT_DIR, file, dest)) + + +def linkModule(subdir, module): + if WIN: + if not os.path.exists("%s/%s" % (GNUEDIR,module)): + os.makedirs("%s/%s" % (GNUEDIR,module)) + # create link via virtual python module + output = open ("%s/%s/__init__.py" % (GNUEDIR,module), "w") + output.write ("# This file was generated by setup-bzr.py.\n") + output.write ("\n") + output.write ("__path__ = [\"%s\\%s\"]\n" % (CURRENT_DIR,subdir)) + output.write ("from __init__ import *") + output.close () + else: + rootCommands.append("ln -f -s %s/%s %s/%s" % (CURRENT_DIR, subdir, GNUEDIR, module)) + +def createDir(subdir): + if WIN: + if not os.path.exists(subdir): + os.makedirs(subdir) + else: + rootCommands.append("if [ ! -d %s ]; then mkdir -p %s; fi" % (subdir,subdir)) + + +restarting = ('--withNewExecutable' in sys.argv) +auto = ('--auto' in sys.argv) + +if not restarting and not auto: + print """ +GNU Enterprise Developer Setup + +This script will install the GNU Enterprise tools to run +from a Bazaar tree. This allows GNUe to be run without a +full installation. THIS IS PRIMARILY USEFUL TO DEVELOPERS. + """ + +# First of all, make sure this is a current enough Python release. +try: + if sys.hexversion < 0x02000000: + raise AttributeError +except AttributeError: + + print "-" * 70 + print """ + You are running Python %s. + + GNU Enterprise requires at least Python 2.0 (recommended: 2.1+). + If you have a later version installed, you should run setup.py + against that version. For example, if you have Python 2.1 + installed, you may need to run: + + python2.1 %s +""" % (string.split(sys.version)[0], sys.argv[0]) + print "-" * 70 + + exes = findAllPythonExes() + + if len(exes) == 1: + sys.exit() + else: + + # There are better versions of Python installed... + + exes.pop(0) + print "\n" + print "I have found the following Python executables. " + print "Choose another version of Python to run." + print "" + + validOptions = [] + i = 0 + + for file in exes: + i = i + 1 # Do not change this to i += 1 as that's >= py2.x + validOptions.append(str(i)) + print " [%s] %s" % (i, file) + + validOptions.append ('Q') + selection = getInput( + "Please enter the number of the Python executable to\n" + 'use [1-%s] or enter "q" to quit.' % i, '1', validOptions) + + if selection == 'Q': + sys.exit() + + restartWithExecutable(exes[int(selection)-1]) + +if WIN: + print """ +Warning: +Under Windows GNUe data files (like images, settings etc) will NOT be +updated by an repository update! For a full update please re-execute +this script. + +You are creating a GNU Enterprise developer installation based on a +code repository. As Microsoft Windows doesn't support filesystem links +data files has to be copied from the repository to the installation +directory. Python source files are instead linked by a specific import +method and will be updated by a repository update. +""" + +if not restarting: + + if not auto: + print """ +If you are trying to install GNU Enterprise for production +use, then answer 'N' to the following question and install +each tool separately using it's setup.py script. + """ + + if not getYesNo("Continue installing the Bazaar-runnable tools? ","Y"): + sys.exit() + + exes = findAllPythonExes() + PYTHONBIN=exes[0] + + + # Make sure they are running against the version of python they intended + if len(exes) > 1 and not auto: + + print "\n" + print "I have found the following Python executables. Please" + print "choose the Python installation you would like to use." + print "" + + validOptions = [] + i = 0 + + for file in exes: + i = i + 1 # Do not change this to i += 1 as that's >= py2.x + validOptions.append(str(i)) + if i == 1: + print " [%s] %s (Current)" % (i, file) + else: + print " [%s] %s" % (i, file) + + validOptions.append ('Q') + selection = getInput( + "Please enter the number of the Python executable to\n" + 'use [1-%s] or enter "q" to quit.' % i, '1', validOptions) + + if selection == 'Q': + sys.exit() + + if selection != '1': + restartWithExecutable(exes[int(selection)-1]) + +if not auto: + print + print "Continuing with the developer installation...\n" + +if not auto and not WIN: + print """ +This setup script can install GNUe as either a local (per user) +copy or a system-wide copy. If you are unsure, choose the +recommended 'Local' setting. Installing system-wide will require +the root password and may force all users on this machine to use +your copy.""" + +ROOTINSTALL = WIN or getInput( + "Perform a [L]ocal/per-user or a [S]ystem-wide install?",'L',('L','S')) == 'S' + +# confirm base path +while WIN: + BASEDIR = os.path.abspath( + getInput ("Where do you want to install GNU Enterprise?", BASEDIR)) + + if os.path.isdir(BASEDIR) or \ + getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % BASEDIR, 'Y','directories'): + break + +if WIN: + BINDIR = os.path.join(BASEDIR,"bin") + CONFDIR = os.path.join(BASEDIR,"conf") + DOCDIR=os.path.join(BASEDIR,"docs") +elif ROOTINSTALL: + BINDIR = "/usr/local/bin" + CONFDIR = "/usr/local/gnue" + DOCDIR = "/usr/local/gnue/doc/" +else: + BINDIR = os.path.expanduser("~/bin") + CONFDIR = os.path.expanduser("~/gnue") + DOCDIR = os.path.expanduser("~/gnue/docs") + + +while 1: + BINDIR = os.path.abspath( + getInput ("Where shall I put executable files?", BINDIR)) + + if os.path.isdir(BINDIR) or \ + getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % BINDIR, 'Y','directories'): + break + +if not auto: + print """ +If you maintain multiple GNUe developer installations, you may +wish to add a suffix to the script names. For example, if +are installing the 0.1.x branch as a secondary branch, you +may want all the executables to be named as <script>-0.1. To +do this, enter '-0.1' at the next prompt. Normally, you will +leave the following option blank.""" + +SUFFIX = string.strip(getInput ("String to append to script names:","")) + +while 1: + CONFDIR = os.path.abspath( + getInput ("Where shall I put configuration files?", CONFDIR)) + + if os.path.isdir(CONFDIR) or \ + getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % CONFDIR, 'Y','directories'): + break + +newdirs = [BINDIR, CONFDIR, "%s/etc" % CONFDIR, + "%s/share" % CONFDIR, + "%s/share/gnue" % CONFDIR, + "%s/share/gnue/filters" % CONFDIR, + "%s/share/gnue/appserver" % CONFDIR, + "%s/share/gnue/forms" % CONFDIR, + "%s/share/gnue/images" % CONFDIR, + "%s/share/locale" % CONFDIR ] + +willInstallDocs = 0 + +DB2HTML = finddb2html(); +if DB2HTML: + if getYesNo("Generate and install documentation? (This could be slow.)", 'N'): + willInstallDocs = 1 + while 1: + DOCDIR = os.path.abspath( + getInput ("Where shall I put the documentation files?", DOCDIR)) + + if os.path.isdir(DOCDIR) or \ + getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % DOCDIR, 'Y','directories'): + newdirs.append(DOCDIR) + break +elif not auto: + print "Cannot generate documentation, could not find db2html in path\n"; + + +for dir in newdirs: + createDir(dir) + +GNUEDIR = os.path.join(BASEDIR,'gnue') + + +bzrbase = """#!/bin/sh + PYTHONPATH=%(BASEDIR)s:$PYTHONPATH; export PYTHONPATH + SCRIPT="%%s" + exec %(PYTHONBIN)s ${SCRIPT} "$@" + """ % globals() + +# FIXME: Need to cleanup old files for Win32 install +if os.path.isdir (GNUEDIR) and not WIN: + os.system ('rm -rf %s' % GNUEDIR) + +try: + os.makedirs(GNUEDIR) +except: + pass + +# create path.py +output = open ("%s/paths.py" % GNUEDIR, "w") +output.write ("# This file was generated by setup-bzr.py.\n") +output.write ("import os\n") +output.write ("\n") +output.write ("lib = os.path.dirname(os.path.dirname(__file__))\n") +output.write ("scripts = \"%s\"\n" % BINDIR) +output.write ("data = \"%s\"\n" % CONFDIR) +output.write ("config = \"%s/etc\"\n" % CONFDIR) +output.close () + +if WIN: + # create import for gnue-common + CURRENT_DIR = os.path.join(BZRDIR,"common") + linkModule("src","common") + os.system("copy \"%s\\common\\module\\base\\__init__.py\" \"%s\"" % (BZRDIR, GNUEDIR) ) + # FIXME: add locale support to Win32 developer install + +else: + rootCommands.append(""" + cd %(GNUEDIR)s + ln -f -s %(BZRDIR)s/common/module/base/__init__.py . + ln -f -s %(BZRDIR)s/common/src common + if [ -f %(BZRDIR)s/common/src/.GDTD.py ]; then rm -f %(BZRDIR)s/common/src/.GDTD.py; fi + + rm -rf %(CONFDIR)s/share/locale/* + cd %(CONFDIR)s/share/locale + for i in %(BZRDIR)s/*; do + package=`basename $i` + if [ -d $i/po ]; then + (cd $i/po; make -s gmo) + for j in $i/po/*.gmo; do + language=`basename $j .gmo` + mkdir -p %(CONFDIR)s/share/locale/${language}/LC_MESSAGES + ln -f -s $j %(CONFDIR)s/share/locale/${language}/LC_MESSAGES/${package}.mo + done + fi + done + + """ % globals() ) + +for CURRENT_TOOL in ('common', + 'appserver', + 'forms', + 'reports', + 'navigator', + 'designer'): + + CURRENT_DIR = os.path.join(BZRDIR, CURRENT_TOOL) + setupfile = os.path.join(CURRENT_DIR, 'setup.bzr') + + if not auto: + print setupfile + + if os.path.isfile(setupfile) and \ + getYesNo('Setup devloper runtime environment for %s? (Yes,No,All,neVer)'% CURRENT_TOOL, + 'Y','autotools'): + execfile(setupfile,globals()) + + +if getYesNo('Do you have any external/custom packages to setup?','N'): + while 1: + path = getInput("Path to package's directory containing a setup.bzr file? (blank line to end)",None) + if not path: + break + + CURRENT_TOOL = CURRENT_DIR = path + execfile(os.path.join(CURRENT_DIR,'setup.bzr'), globals()) + + + +willCreateConf = 0 +willCreateConn = 0 +willCreateFilt = 0 + +if os.path.isfile('/usr/local/gnue/etc/gnue.conf') and \ + CONFDIR != '/usr/local/gnue' and not os.path.isfile(CONFDIR+'/etc/gnue.conf'): + if getYesNo('Do you wish to use the current system-wide gnue.conf file? (Yes,No,All,neVer)','N','conf'): + rootCommands.append("ln -s /usr/local/gnue/etc/gnue.conf %(CONFDIR)s/etc/gnue.conf" % globals()) + willCreateConf = 1 + + +if os.path.isfile('/usr/local/gnue/etc/backends.conf') and \ + CONFDIR != '/usr/local/gnue' and not os.path.isfile(CONFDIR+'/etc/backends.conf'): + if getYesNo('Do you wish to use the current system-wide backends.conf file? (Yes,No,All,neVer)','Y','conf'): + rootCommands.append("ln -s /usr/local/gnue/etc/backends.conf %(CONFDIR)s/etc/backends.conf" % globals()) + willCreateConn = 1 + + +if os.path.isfile('/usr/local/gnue/etc/report-filters.conf') and \ + CONFDIR != '/usr/local/gnue' and not os.path.isfile(CONFDIR+'/etc/report-filters.conf'): + if getYesNo('Do you wish to use the current system-wide report-filters.conf file? (Yes,No,All,neVer)','N','conf'): + rootCommands.append("ln -s /usr/local/gnue/etc/report-filters.conf %(CONFDIR)s/etc/report-filters.conf" % globals()) + willCreateFilt = 1 + + +if not willCreateConf and not os.path.isfile("%s/etc/gnue.conf"%CONFDIR): + if WIN: + createLink("%s/common/etc/gnue.conf" % BZRDIR, "%s/etc/gnue.conf" % CONFDIR) + else: + rootCommands.append("cp %(BZRDIR)s/common/etc/gnue.conf %(CONFDIR)s/etc/gnue.conf" % globals()) + + +if not willCreateConn and not os.path.isfile("%s/etc/backends.conf"%CONFDIR): + if WIN: + createLink("%s/common/etc/backends.conf" % BZRDIR, "%s/etc/backends.conf" % CONFDIR) + else: + rootCommands.append("cp %(BZRDIR)s/common/etc/backends.conf %(CONFDIR)s/etc/backends.conf" % globals()) + +if not auto: + print + print "NOTE: Your backends.conf file will need to" + print " be edited to reflect your local setup." + print + + +if not willCreateFilt and not os.path.isfile("%s/etc/report-filters.conf"%CONFDIR): + if WIN or getYesNo ("Do you want to use a symlinked report-filters.conf file? (Yes,No,All,neVer)",'N', 'symconf'): + createLink("%s/reports/etc/sample.report-filters.conf" % BZRDIR, "%s/etc/report-filters.conf" % CONFDIR) + else: + rootCommands.append("cp %(BZRDIR)s/reports/etc/sample.report-filters.conf %(CONFDIR)s/etc/report-filters.conf" % globals()) + + +if WIN: + print "Setup completed!" + +elif ROOTINSTALL: + + out = open("setup-root.sh",'w') + out.write("#!/bin/sh\n") + out.write(string.join(rootCommands,"\n")) + out.write("\n") + out.close() + + print "" + print "All the commands that need to be run as root have been written" + print "to setup-root.sh . In order for your setup to be complete, this" + print "file must be run. This setup script can run setup-root.sh for" + print "you. If you choose to run the script now and are not currently" + print "logged in as root, you will be prompted for the root password." + if getYesNo('Run "/bin/sh setup-root.sh" as root?','Y'): + os.system('su root -c "/bin/sh setup-root.sh"') + else: + print "" + print 'Do not forget to run "/bin/sh setup-root.sh" as root' + print "" + +else: + + out = open("setup.log",'w') + out.write(string.join(rootCommands,"\n")) + out.write("\n") + out.close() + + os.system(string.join(rootCommands,'\n')) + +# +# Save our config settings +# +from pprint import pformat +c = open (os.path.join(BZRDIR,'.bzr-config'),'w') +for key, val in globals().items(): + if key[0].isupper(): + c.write('%s=%s\n\n' % (key, pformat(val))) Deleted: trunk/gnue-common/setup-svn.py =================================================================== --- trunk/gnue-common/setup-svn.py 2010-04-07 06:51:21 UTC (rev 10155) +++ trunk/gnue-common/setup-svn.py 2010-04-20 20:46:26 UTC (rev 10156) @@ -1,651 +0,0 @@ -#!/usr/bin/env python -# -# This file is part of GNU Enterprise. -# -# GNU Enterprise is free software; you can redistribute it -# and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation; either -# version 3, or (at your option) any later version. -# -# GNU Enterprise is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied -# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -# PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with program; see the file COPYING. If not, -# write to the Free Software Foundation, Inc., 59 Temple Place -# - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright 2001-2009 Free Software Foundation -# - - -########################################################## -# -# NOTE: Nightly cron scripts on www.gnuenterprise.org -# run this script with --auto, which uses the -# defaults passed to getInput. So, each input -# MUST have a sane default or various web functions -# might just break. -# - - -import sys, string, os, glob - -# Hack for python 2.1 compatibility. With 2.3 we can use the global __file__ -m = __import__ ('setup-svn', None, None, '*') -if __name__ == '__main__': - sys.exit (0) - -# Determine if Windows is used -WIN=(sys.platform=="win32") - -SVNDIR = os.path.abspath(os.path.join(os.path.dirname(m.__file__),'..')) -BASEDIR = WIN and os.path.join(sys.prefix,"gnue-devel") or os.path.join(SVNDIR, '.svndevelbase') -PYTHONBIN=sys.executable - -global CURRENT_DIR -CURRENT_DIR = "" -CURRENT_TOOL = "" -rootCommands = [] - -def createShell (script,py,scriptdir="scripts"): - script = "%s%s" % (script, SUFFIX) - if py: - src = os.path.join(CURRENT_DIR, scriptdir, py) - else: - src = '' - if WIN: - dest = os.path.join(BINDIR, "%s.bat" % script) - else: - dest = os.path.join(CURRENT_DIR, scriptdir, script) - if not auto: - print "Creating %s....." % dest , - try: - file = open(dest,'w') - if WIN: - # create batch file at final destination - file.write("@set PYTHONPATH=%s;%%PYTHONPATH%%\n" % BASEDIR) - file.write("@set SCRIPT=%s\n" % src) - file.write("@%s \"%%SCRIPT%%\" %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9\n" % PYTHONBIN) - file.close() - else: - # create script in repository and - file.write(svnbase % src) - file.close() - os.system ('chmod 700 %s' % dest) - - rootCommands.append ('rm -f %s/%s' % (BINDIR, script)) - rootCommands.append ('ln -s %s %s/%s' % \ - (dest, BINDIR, script)) - rootCommands.append ('chmod go+rx %s' % dest) - - except IOError: - print "Unable to create. Do you have this package checked out?" - else: - if not auto: - print "ok" - -def createDocs(sgmlfile, destdir): - if not willInstallDocs: - return - sgmlfile = os.path.join(CURRENT_DIR, sgmlfile) - destdir = os.path.join(DOCDIR, destdir) - rootCommands.append("if [ ! -d %s ]; then mkdir %s; fi" % (destdir, destdir)) - rootCommands.append("%s --output %s %s" % - (DB2HTML, destdir, sgmlfile)) - - -def getInput(message, default, responseSet=None): - - if auto: - return default - - print "" - while 1: - if default: - print "%s [%s] " % (message, default), - else: - print "%s " % (message), - - - val = string.strip(sys.stdin.readline()) - print "" - - if not len(val) and default: - return default - elif responseSet and string.upper(val) in (responseSet): - return string.upper(val) - elif not responseSet: - return val - - -_getYesNoAllStat = {} - -def getYesNo(message, default, category=None): - - if auto: - return default - - if category: - try: - response = _getYesNoAllStat[category] - print "\n" + message + ' ' + (response and 'Always' or 'Never') - return response - except KeyError: - pass - - response = getInput(message,default,('Y','N','A','V')) - val = response in ('Y','A') - if category and response in ('A','V'): - _getYesNoAllStat[category] = val - return val - - -def getBinPaths(): - paths = string.split(os.environ['PATH'],os.pathsep) - if not ('/usr/local/bin' in paths or '/usr/local/bin/' in paths) and \ - os.path.isdir('/usr/local/bin'): - paths.append('/usr/local/bin') - return(paths) - - -# Returns a list containing all Python executables in the user's path. -# List element 0 will always be the currently running executable -def findAllPythonExes(): - results = [sys.executable] - - for path in getBinPaths(): - for file in glob.glob('%s/python?*' % os.path.abspath(string.strip(path))): - base = os.path.basename(file) - version = base[6:] - - # Do not include python 1.x files - if version < '2': - pass - - # Do not include python2.2-popy-config - elif len(version)>8: - pass - - # Do not include python??.dll - elif base[-3:]=="dll": - pass - - elif os.path.realpath(file)==os.path.realpath(sys.executable): - # If this file is the one being executed, just replace w/full name - if results[0] == sys.executable: - results[0] = file - else: - results.append(file) - - return results - -def findAllGNUePackages(): - results = [] - for file in glob.glob('../*'): - if os.path.isfile(os.path.join(file, 'setup.svn')): - base = os.path.basename(file) - results.append(base) - results.sort() - return results - -def finddb2html(): - for path in getBinPaths(): - for file in glob.glob('%s/db2html' % os.path.abspath(string.strip(path))): - return(file) - - # Nothing found - return ""; - - -def restartWithExecutable(exe): - os.system('%s %s --withNewExecutable "%s"' \ - % (exe, sys.argv[0], string.join(sys.argv[1:],'" "'))) - sys.exit() - -def createLink(file, dest, overwrite=0): - if WIN: - src=os.path.normpath(os.path.join(CURRENT_DIR, file)) - dest = os.path.normpath(dest) - - if os.path.isdir(src): - ret = os.system("xcopy /S /E /Y \"%s\" \"%s\\\" > NUL" % (src, dest)) - else: - ret = os.system("copy \"%s\" \"%s\" > NUL" % (src, dest)) - if ret!=0: - print "Failed to copy %s to %s." % (src, dest) - - else: - if overwrite: - rootCommands.append ("if [ -e %s ]; then rm -f %s; fi" % (dest, dest)) - - rootCommands.append("ln -f -s %s/%s %s" % (CURRENT_DIR, file, dest)) - - -def linkModule(subdir, module): - if WIN: - if not os.path.exists("%s/%s" % (GNUEDIR,module)): - os.makedirs("%s/%s" % (GNUEDIR,module)) - # create link via virtual python module - output = open ("%s/%s/__init__.py" % (GNUEDIR,module), "w") - output.write ("# This file was generated by setup-svn.py.\n") - output.write ("\n") - output.write ("__path__ = [\"%s\\%s\"]\n" % (CURRENT_DIR,subdir)) - output.write ("from __init__ import *") - output.close () - else: - rootCommands.append("ln -f -s %s/%s %s/%s" % (CURRENT_DIR, subdir, GNUEDIR, module)) - -def createDir(subdir): - if WIN: - if not os.path.exists(subdir): - os.makedirs(subdir) - else: - rootCommands.append("if [ ! -d %s ]; then mkdir -p %s; fi" % (subdir,subdir)) - - -restarting = ('--withNewExecutable' in sys.argv) -auto = ('--auto' in sys.argv) - -if not restarting and not auto: - print """ -GNU Enterprise Developer Setup - -This script will install the GNU Enterprise tools to run -from a SVN copy. This allows GNUe to be run without a -full installation. THIS IS PRIMARILY USEFUL TO DEVELOPERS. - """ - -# First of all, make sure this is a current enough Python release. -try: - if sys.hexversion < 0x02000000: - raise AttributeError -except AttributeError: - - print "-" * 70 - print """ - You are running Python %s. - - GNU Enterprise requires at least Python 2.0 (recommended: 2.1+). - If you have a later version installed, you should run setup.py - against that version. For example, if you have Python 2.1 - installed, you may need to run: - - python2.1 %s -""" % (string.split(sys.version)[0], sys.argv[0]) - print "-" * 70 - - exes = findAllPythonExes() - - if len(exes) == 1: - sys.exit() - else: - - # There are better versions of Python installed... - - exes.pop(0) - print "\n" - print "I have found the following Python executables. " - print "Choose another version of Python to run." - print "" - - validOptions = [] - i = 0 - - for file in exes: - i = i + 1 # Do not change this to i += 1 as that's >= py2.x - validOptions.append(str(i)) - print " [%s] %s" % (i, file) - - validOptions.append ('Q') - selection = getInput( - "Please enter the number of the Python executable to\n" - 'use [1-%s] or enter "q" to quit.' % i, '1', validOptions) - - if selection == 'Q': - sys.exit() - - restartWithExecutable(exes[int(selection)-1]) - -if WIN: - print """ -Warning: -Under Windows GNUe data files (like images, settings etc) will NOT be -updated by an repository update! For a full update please re-execute -this script. - -You are creating a GNU Enterprise developer installation based on a -code repository. As Microsoft Windows doesn't support filesystem links -data files has to be copied from the repository to the installation -directory. Python source files are instead linked by a specific import -method and will be updated by a repository update. -""" - -if not restarting: - - if not auto: - print """ -If you are trying to install GNU Enterprise for production -use, then answer 'N' to the following question and install -each tool separately using it's setup.py script. - """ - - if not getYesNo("Continue installing the SVN-runnable tools? ","Y"): - sys.exit() - - exes = findAllPythonExes() - PYTHONBIN=exes[0] - - - # Make sure they are running against the version of python they intended - if len(exes) > 1 and not auto: - - print "\n" - print "I have found the following Python executables. Please" - print "choose the Python installation you would like to use." - print "" - - validOptions = [] - i = 0 - - for file in exes: - i = i + 1 # Do not change this to i += 1 as that's >= py2.x - validOptions.append(str(i)) - if i == 1: - print " [%s] %s (Current)" % (i, file) - else: - print " [%s] %s" % (i, file) - - validOptions.append ('Q') - selection = getInput( - "Please enter the number of the Python executable to\n" - 'use [1-%s] or enter "q" to quit.' % i, '1', validOptions) - - if selection == 'Q': - sys.exit() - - if selection != '1': - restartWithExecutable(exes[int(selection)-1]) - -if not auto: - print - print "Continuing with the developer installation...\n" - -if not auto and not WIN: - print """ -This setup script can install GNUe as either a local (per user) -copy or a system-wide copy. If you are unsure, choose the -recommended 'Local' setting. Installing system-wide will require -the root password and may force all users on this machine to use -your copy.""" - -ROOTINSTALL = WIN or getInput( - "Perform a [L]ocal/per-user or a [S]ystem-wide install?",'L',('L','S')) == 'S' - -# confirm base path -while WIN: - BASEDIR = os.path.abspath( - getInput ("Where do you want to install GNU Enterprise?", BASEDIR)) - - if os.path.isdir(BASEDIR) or \ - getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % BASEDIR, 'Y','directories'): - break - -if WIN: - BINDIR = os.path.join(BASEDIR,"bin") - CONFDIR = os.path.join(BASEDIR,"conf") - DOCDIR=os.path.join(BASEDIR,"docs") -elif ROOTINSTALL: - BINDIR = "/usr/local/bin" - CONFDIR = "/usr/local/gnue" - DOCDIR = "/usr/local/gnue/doc/" -else: - BINDIR = os.path.expanduser("~/bin") - CONFDIR = os.path.expanduser("~/gnue") - DOCDIR = os.path.expanduser("~/gnue/docs") - - -while 1: - BINDIR = os.path.abspath( - getInput ("Where shall I put executable files?", BINDIR)) - - if os.path.isdir(BINDIR) or \ - getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % BINDIR, 'Y','directories'): - break - -if not auto: - print """ -If you maintain multiple GNUe developer installations, you may -wish to add a suffix to the script names. For example, if -are installing the 0.1.x branch as a secondary branch, you -may want all the executables to be named as <script>-0.1. To -do this, enter '-0.1' at the next prompt. Normally, you will -leave the following option blank.""" - -SUFFIX = string.strip(getInput ("String to append to script names:","")) - -while 1: - CONFDIR = os.path.abspath( - getInput ("Where shall I put configuration files?", CONFDIR)) - - if os.path.isdir(CONFDIR) or \ - getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % CONFDIR, 'Y','directories'): - break - -newdirs = [BINDIR, CONFDIR, "%s/etc" % CONFDIR, - "%s/share" % CONFDIR, - "%s/share/gnue" % CONFDIR, - "%s/share/gnue/filters" % CONFDIR, - "%s/share/gnue/appserver" % CONFDIR, - "%s/share/gnue/forms" % CONFDIR, - "%s/share/gnue/images" % CONFDIR, - "%s/share/locale" % CONFDIR ] - -willInstallDocs = 0 - -DB2HTML = finddb2html(); -if DB2HTML: - if getYesNo("Generate and install documentation? (This could be slow.)", 'N'): - willInstallDocs = 1 - while 1: - DOCDIR = os.path.abspath( - getInput ("Where shall I put the documentation files?", DOCDIR)) - - if os.path.isdir(DOCDIR) or \ - getYesNo("Directory %s does not exist. Create? (Yes,No,All,neVer)" % DOCDIR, 'Y','directories'): - newdirs.append(DOCDIR) - break -elif not auto: - print "Cannot generate documentation, could not find db2html in path\n"; - - -for dir in newdirs: - createDir(dir) - -GNUEDIR = os.path.join(BASEDIR,'gnue') - - -svnbase = """#!/bin/sh - PYTHONPATH=%(BASEDIR)s:$PYTHONPATH; export PYTHONPATH - SCRIPT="%%s" - exec %(PYTHONBIN)s ${SCRIPT} "$@" - """ % globals() - -# FIXME: Need to cleanup old files for Win32 install -if os.path.isdir (GNUEDIR) and not WIN: - os.system ('rm -rf %s' % GNUEDIR) - -try: - os.makedirs(GNUEDIR) -except: - pass - -# create path.py -output = open ("%s/paths.py" % GNUEDIR, "w") -output.write ("# This file was generated by setup-svn.py.\n") -output.write ("import os\n") -output.write ("\n") -output.write ("lib = os.path.dirname(os.path.dirname(__file__))\n") -output.write ("scripts = \"%s\"\n" % BINDIR) -output.write ("data = \"%s\"\n" % CONFDIR) -output.write ("config = \"%s/etc\"\n" % CONFDIR) -output.close () - -if WIN: - # create import for gnue-common - CURRENT_DIR = os.path.join(SVNDIR,"gnue-common") - linkModule("src","common") - os.system("copy \"%s\\gnue-common\\module\\base\\__init__.py\" \"%s\"" % (SVNDIR, GNUEDIR) ) - # FIXME: add locale support to Win32 developer install - -else: - rootCommands.append(""" - cd %(GNUEDIR)s - ln -f -s %(SVNDIR)s/gnue-common/module/base/__init__.py . - ln -f -s %(SVNDIR)s/gnue-common/src common - if [ -f %(SVNDIR)s/gnue-common/src/.GDTD.py ]; then rm -f %(SVNDIR)s/gnue-common/src/.GDTD.py; fi - - rm -rf %(CONFDIR)s/share/locale/* - cd %(CONFDIR)s/share/locale - for i in %(SVNDIR)s/*; do - package=`basename $i` - if [ -d $i/po ]; then - (cd $i/po; make -s gmo) - for j in $i/po/*.gmo; do - language=`basename $j .gmo` - mkdir -p %(CONFDIR)s/share/locale/${language}/LC_MESSAGES - ln -f -s $j %(CONFDIR)s/share/locale/${language}/LC_MESSAGES/${package}.mo - done - fi - done - - """ % globals() ) - -for CURRENT_TOOL in ('gnue-common', - 'gnue-designer', - 'gnue-dbtools', - 'gnue-forms', - 'gnue-reports', - 'gnue-navigator', - 'gnue-pos', - 'gnue-integrator', - 'gnue-appserver'): - - CURRENT_DIR = os.path.join(SVNDIR, CURRENT_TOOL) - setupfile = os.path.join(CURRENT_DIR, 'setup.svn') - - if not auto: - print setupfile - - if os.path.isfile(setupfile) and \ - getYesNo('Setup SVN environment for %s? (Yes,No,All,neVer)'% CURRENT_TOOL, - 'Y','autotools'): - execfile(setupfile,globals()) - - -if getYesNo('Do you have any external/custom packages to setup?','N'): - while 1: - path = getInput("Path to package's directory containing a setup.svn file? (blank line to end)",None) - if not path: - break - - CURRENT_TOOL = CURRENT_DIR = path - execfile(os.path.join(CURRENT_DIR,'setup.svn'), globals()) - - - -willCreateConf = 0 -willCreateConn = 0 -willCreateFilt = 0 - -if os.path.isfile('/usr/local/gnue/etc/gnue.conf') and \ - CONFDIR != '/usr/local/gnue' and not os.path.isfile(CONFDIR+'/etc/gnue.conf'): - if getYesNo('Do you wish to use the current system-wide gnue.conf file? (Yes,No,All,neVer)','N','conf'): - rootCommands.append("ln -s /usr/local/gnue/etc/gnue.conf %(CONFDIR)s/etc/gnue.conf" % globals()) - willCreateConf = 1 - - -if os.path.isfile('/usr/local/gnue/etc/backends.conf') and \ - CONFDIR != '/usr/local/gnue' and not os.path.isfile(CONFDIR+'/etc/backends.conf'): - if getYesNo('Do you wish to use the current system-wide backends.conf file? (Yes,No,All,neVer)','Y','conf'): - rootCommands.append("ln -s /usr/local/gnue/etc/backends.conf %(CONFDIR)s/etc/backends.conf" % globals()) - willCreateConn = 1 - - -if os.path.isfile('/usr/local/gnue/etc/report-filters.conf') and \ - CONFDIR != '/usr/local/gnue' and not os.path.isfile(CONFDIR+'/etc/report-filters.conf'): - if getYesNo('Do you wish to use the current system-wide report-filters.conf file? (Yes,No,All,neVer)','N','conf'): - rootCommands.append("ln -s /usr/local/gnue/etc/report-filters.conf %(CONFDIR)s/etc/report-filters.conf" % globals()) - willCreateFilt = 1 - - -if not willCreateConf and not os.path.isfile("%s/etc/gnue.conf"%CONFDIR): - if WIN: - createLink("%s/gnue-common/etc/gnue.conf" % SVNDIR, "%s/etc/gnue.conf" % CONFDIR) - else: - rootCommands.append("cp %(SVNDIR)s/gnue-common/etc/gnue.conf %(CONFDIR)s/etc/gnue.conf" % globals()) - - -if not willCreateConn and not os.path.isfile("%s/etc/backends.conf"%CONFDIR): - if WIN: - createLink("%s/gnue-common/etc/backends.conf" % SVNDIR, "%s/etc/backends.conf" % CONFDIR) - else: - rootCommands.append("cp %(SVNDIR)s/gnue-common/etc/backends.conf %(CONFDIR)s/etc/backends.conf" % globals()) - -if not auto: - print - print "NOTE: Your backends.conf file will need to" - print " be edited to reflect your local setup." - print - - -if not willCreateFilt and not os.path.isfile("%s/etc/report-filters.conf"%CONFDIR): - if WIN or getYesNo ("Do you want to use a symlinked report-filters.conf file? (Yes,No,All,neVer)",'N', 'symconf'): - createLink("%s/gnue-reports/etc/sample.report-filters.conf" % SVNDIR, "%s/etc/report-filters.conf" % CONFDIR) - else: - rootCommands.append("cp %(SVNDIR)s/gnue-reports/etc/sample.report-filters.conf %(CONFDIR)s/etc/report-filters.conf" % globals()) - - -if WIN: - print "Setup completed!" - -elif ROOTINSTALL: - - out = open("setup-root.sh",'w') - out.write("#!/bin/sh\n") - out.write(string.join(rootCommands,"\n")) - out.write("\n") - out.close() - - print "" - print "All the commands that need to be run as root have been written" - print "to setup-root.sh . In order for your setup to be complete, this" - print "file must be run. This setup script can run setup-root.sh for" - print "you. If you choose to run the script now and are not currently" - print "logged in as root, you will be prompted for the root password." - if getYesNo('Run "/bin/sh setup-root.sh" as root?','Y'): - os.system('su root -c "/bin/sh setup-root.sh"') - else: - print "" - print 'Do not forget to run "/bin/sh setup-root.sh" as root' - print "" - -else: - - out = open("setup.log",'w') - out.write(string.join(rootCommands,"\n")) - out.write("\n") - out.close() - - os.system(string.join(rootCommands,'\n')) - -# -# Save our config settings -# -from pprint import pformat -c = open (os.path.join(SVNDIR,'.svn-config'),'w') -for key, val in globals().items(): - if key[0].isupper(): - c.write('%s=%s\n\n' % (key, pformat(val))) Copied: trunk/gnue-common/setup.bzr (from rev 10155, trunk/gnue-common/setup.svn) =================================================================== --- trunk/gnue-common/setup.bzr (rev 0) +++ trunk/gnue-common/setup.bzr 2010-04-20 20:46:26 UTC (rev 10156) @@ -0,0 +1,31 @@ +# +# This file is part of GNU Enterprise. +# +# GNU Enterprise is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 3, or (at your option) any later version. +# +# GNU Enterprise is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with program; see the file COPYING. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place +# - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright 2001-2010 Free Software Foundation +# +# ******************** +# NOTE: +# This file is parsed/run by gnue-common's setup-bzr.py script. +# If you are attempting to set up a Bazaar install environment, +# please run that file. This file is not a standalone script. +# ******************** + +createShell ('gsscvs', 'gnue-schema') +createShell ('gcvs','') + +createLink ('images/*.*', '%s/share/gnue/images/' % CONFDIR) Deleted: trunk/gnue-common/setup.svn =================================================================== --- trunk/gnue-common/setup.svn 2010-04-07 06:51:21 UTC (rev 10155) +++ trunk/gnue-common/setup.svn 2010-04-20 20:46:26 UTC (rev 10156) @@ -1,32 +0,0 @@ -# -# This file is part of GNU Enterprise. -# -# GNU Enterprise is free software; you can redistribute it -# and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation; either -# version 3, or (at your option) any later version. -# -# GNU Enterprise is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied -# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -# PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with program; see the file COPYING. If not, -# write to the Free Software Foundation, Inc., 59 Temple Place -# - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright 2001-2004 Free Software Foundation -# -# ******************** -# NOTE: -# This file is parsed/run by gnue-common's setup-svn.py script. -# If you are attempting to set up a CVS install environment, please -# run that file. This file is not a standalone script. -# ******************** -# - -createShell ('gsscvs', 'gnue-schema') -createShell ('gcvs','') - -createLink ('images/*.*', '%s/share/gnue/images/' % CONFDIR) _______________________________________________ commit-gnue mailing list commit-gnue@gnu.org http://lists.gnu.org/mailman/listinfo/commit-gnue