X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=roundup%2Finit.py;h=d4afecc9e8a50da5e33c7fc7d0dee6a3ff4e6918;hb=c28424f9add2dfbcb11b5288c4d5f8e6d99e1d8b;hp=fd7124c79460d28de6509dd723440826a4b8a684;hpb=ade2b8b84eee1b055043145f715717b24a0c4bcb;p=roundup.git diff --git a/roundup/init.py b/roundup/init.py index fd7124c..d4afecc 100644 --- a/roundup/init.py +++ b/roundup/init.py @@ -14,22 +14,23 @@ # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -# -# $Id: init.py,v 1.26 2003-04-17 03:37:58 richard Exp $ +# +# $Id: init.py,v 1.36 2005-12-03 11:22:50 a1s Exp $ -__doc__ = """ -Init (create) a roundup instance. +"""Init (create) a roundup instance. """ +__docformat__ = 'restructuredtext' -import os, sys, errno +import os, errno, rfc822 -import roundup.instance, password -from roundup import install_util +from roundup import install_util, password +from roundup.configuration import CoreConfig +from roundup.i18n import _ def copytree(src, dst, symlinks=0): """Recursively copy a directory tree using copyDigestedFile(). - The destination directory os allowed to exist. + The destination directory is allowed to exist. If the optional symlinks flag is true, symbolic links in the source tree result in symbolic links in the destination tree; if @@ -38,7 +39,9 @@ def copytree(src, dst, symlinks=0): This was copied from shutil.py in std lib. """ - names = os.listdir(src) + + # Prevent 'hidden' files (those starting with '.') from being considered. + names = [f for f in os.listdir(src) if not f.startswith('.')] try: os.mkdir(dst) except OSError, error: @@ -54,56 +57,137 @@ def copytree(src, dst, symlinks=0): else: install_util.copyDigestedFile(srcname, dstname) -def install(instance_home, template): +def install(instance_home, template, settings={}): '''Install an instance using the named template and backend. - instance_home - the directory to place the instance data in - template - the directory holding the template to use in creating - the instance data + 'instance_home' + the directory to place the instance data in + 'template' + the directory holding the template to use in creating the instance data + 'settings' + config.ini setting overrides (dictionary) The instance_home directory will be created using the files found in - the named template (roundup.templates.). A standard instance_home + the named template (roundup.templates.). A usual instance_home contains: - . config.py - - simple configuration of things like the email address for the - mail gateway, the mail domain, the mail host, ... - . dbinit.py and select_db.py - - defines the schema for the hyperdatabase and indicates which - backend to use. - . interfaces.py - - defines the CGI Client and mail gateway MailGW classes that are - used by roundup.cgi, roundup-server and roundup-mailgw. - . __init__.py - - ties together all the instance information into one interface - . db/ - - the actual database that stores the instance's data - . html/ - - the html templates that are used by the CGI Client - . detectors/ - - the auditor and reactor modules for this instance + config.ini + tracker configuration file + schema.py + database schema definition + initial_data.py + database initialization script, used to populate the database + with 'roundup-admin init' command + interfaces.py + (optional, not installed from standard templates) defines + the CGI Client and mail gateway MailGW classes that are + used by roundup.cgi, roundup-server and roundup-mailgw. + db/ + the actual database that stores the instance's data + html/ + the html templates that are used by the CGI Client + detectors/ + the auditor and reactor modules for this instance + extensions/ + code extensions to Roundup ''' # At the moment, it's just a copy copytree(template, instance_home) + # rename the tempate in the TEMPLATE-INFO.txt file + ti = loadTemplateInfo(instance_home) + ti['name'] = ti['name'] + '-' + os.path.split(instance_home)[1] + saveTemplateInfo(instance_home, ti) -def write_select_db(instance_home, backend): - ''' Write the file that selects the backend for the tracker - ''' - # now select database - db = '''# WARNING: DO NOT EDIT THIS FILE!!! -from roundup.backends.back_%s import Database, Class, FileClass, IssueClass -'''%backend - open(os.path.join(instance_home, 'select_db.py'), 'w').write(db) + # if there is no config.ini or old-style config.py + # installed from the template, write default config text + config_ini_file = os.path.join(instance_home, CoreConfig.INI_FILE) + if not os.path.isfile(config_ini_file): + config = CoreConfig(settings=settings) + config.save(config_ini_file) -def initialise(instance_home, adminpw): - '''Initialise an instance's database +def listTemplates(dir): + ''' List all the Roundup template directories in a given directory. - adminpw - the password for the "admin" user + Find all the dirs that contain a TEMPLATE-INFO.txt and parse it. + + Return a list of dicts of info about the templates. + ''' + ret = {} + for idir in os.listdir(dir): + idir = os.path.join(dir, idir) + ti = loadTemplateInfo(idir) + if ti: + ret[ti['name']] = ti + return ret + +def loadTemplateInfo(dir): + ''' Attempt to load a Roundup template from the indicated directory. + + Return None if there's no template, otherwise a template info + dictionary. + ''' + ti = os.path.join(dir, 'TEMPLATE-INFO.txt') + if not os.path.exists(ti): + return None + + if os.path.exists(os.path.join(dir, 'config.py')): + print _("WARNING: directory '%s'\n" + "\tcontains old-style template - ignored" + ) % os.path.abspath(dir) + return None + + # load up the template's information + f = open(ti) + try: + m = rfc822.Message(open(ti)) + ti = {} + ti['name'] = m['name'] + ti['description'] = m['description'] + ti['intended-for'] = m['intended-for'] + ti['path'] = dir + finally: + f.close() + return ti + +def writeHeader(name, value): + ''' Write an rfc822-compatible header line, making it wrap reasonably ''' - # now import the instance and call its init - instance = roundup.instance.open(instance_home) - instance.init(password.Password(adminpw)) + out = [name.capitalize() + ':'] + n = len(out[0]) + for word in value.split(): + if len(word) + n > 74: + out.append('\n') + n = 0 + out.append(' ' + word) + n += len(out[-1]) + return ''.join(out) + '\n' + +def saveTemplateInfo(dir, info): + ''' Save the template info (dict of values) to the TEMPLATE-INFO.txt + file in the indicated directory. + ''' + ti = os.path.join(dir, 'TEMPLATE-INFO.txt') + f = open(ti, 'w') + try: + for name in 'name description intended-for path'.split(): + f.write(writeHeader(name, info[name])) + finally: + f.close() + +def write_select_db(instance_home, backend, dbdir = 'db'): + ''' Write the file that selects the backend for the tracker + ''' + # dbdir may be a relative pathname, os.path.join does the right + # thing when the second component of a join is an absolute path + dbdir = os.path.join (instance_home, dbdir) + if not os.path.exists(dbdir): + os.makedirs(dbdir) + f = open(os.path.join(dbdir, 'backend_name'), 'w') + f.write(backend+'\n') + f.close() + + -# vim: set filetype=python ts=4 sw=4 et si +# vim: set filetype=python sts=4 sw=4 et si :