From f5865e8b1c1d7452874695263aac37b28a6f05a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Sun, 28 Aug 2005 00:34:44 +0000 Subject: [PATCH] * global'lari context'de toplayalim * herseyi duzgunce init edelim * global'larin modulunu duzgun bicimde import edelim * fixes #413 * expect major breakage! --- pisi-cli | 1 - pisi.e3p | 52 ++++++++++++++++-- pisi/__init__.py | 2 +- pisi/actionsapi/autotools.py | 12 ++-- pisi/actionsapi/get.py | 4 +- pisi/actionsapi/kde.py | 10 ++-- pisi/actionsapi/libtools.py | 6 +- pisi/actionsapi/pisitools.py | 6 +- pisi/actionsapi/shelltools.py | 38 ++++++------- pisi/api.py | 100 ++++++++++++++++++---------------- pisi/build.py | 86 ++++++++++++++++++++--------- pisi/cli/commands.py | 14 ++--- pisi/config.py | 5 +- pisi/constants.py | 3 - pisi/context.py | 41 +++----------- pisi/dependency.py | 13 ++--- pisi/fetcher.py | 6 +- pisi/files.py | 6 +- pisi/global.py | 15 ----- pisi/index.py | 22 ++++---- pisi/install.py | 2 - pisi/installdb.py | 12 ++-- pisi/lockeddbshelve.py | 11 ++-- pisi/metadata.py | 8 +-- pisi/operations.py | 4 +- pisi/package.py | 13 ++--- pisi/packagedb.py | 16 ++++-- pisi/repodb.py | 12 +++- pisi/sourcearchive.py | 2 - pisi/sourcedb.py | 5 +- pisi/specfile.py | 3 +- pisi/ui.py | 10 +--- pisi/util.py | 3 - 33 files changed, 286 insertions(+), 257 deletions(-) delete mode 100644 pisi/global.py diff --git a/pisi-cli b/pisi-cli index 599d255a..ff41a38c 100755 --- a/pisi-cli +++ b/pisi-cli @@ -17,7 +17,6 @@ __trans = gettext.translation('pisi', fallback=True) _ = __trans.ugettext from pisi.cli.pisicli import PisiCLI -from pisi.ui import ui def handle_exception(exception, value, tb): import traceback diff --git a/pisi.e3p b/pisi.e3p index 0ccdc611..d5c20449 100644 --- a/pisi.e3p +++ b/pisi.e3p @@ -1,7 +1,7 @@ - + Python @@ -20,10 +20,6 @@ tools cat-db.py - - tools - list-portage-base.py - tests popt @@ -307,6 +303,52 @@ pisi api.py + + + home + exa + code + projects + pisi-gurer + dependency.py + + + + home + exa + code + projects + pisi-gurer + specfile.py + + + + home + exa + code + projects + pisi-gurer + xmlutil.py + + + + home + exa + code + projects + pisi-kga + setup.py + + + + home + exa + code + projects + pisi-kga + src + pisi_kga.py + diff --git a/pisi/__init__.py b/pisi/__init__.py index 5ba82456..aad21c68 100644 --- a/pisi/__init__.py +++ b/pisi/__init__.py @@ -8,7 +8,7 @@ # Please read the COPYING file. # -# PISI version +# PiSi version __version__ = "0.3" diff --git a/pisi/actionsapi/autotools.py b/pisi/actionsapi/autotools.py index 608f8fba..d79cf547 100644 --- a/pisi/actionsapi/autotools.py +++ b/pisi/actionsapi/autotools.py @@ -14,7 +14,7 @@ import os # Pisi Modules -from pisi.ui import ui +import pisi.context as ctx # ActionsAPI Modules import pisi.actionsapi @@ -25,21 +25,21 @@ from pisi.actionsapi.libtools import gnuconfig_update class ConfigureError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) if can_access_file('config.log'): - ui.error('\n!!! Please attach the config.log to your bug report:\n%s/config.log\n' % os.getcwd()) + ctx.ui.error('\n!!! Please attach the config.log to your bug report:\n%s/config.log\n' % os.getcwd()) class MakeError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) class InstallError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) class RunTimeError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) def configure(parameters = ''): '''configure source with given parameters = "--with-nls --with-libusb --with-something-usefull"''' diff --git a/pisi/actionsapi/get.py b/pisi/actionsapi/get.py index fd7bfad4..2b9d1ac7 100644 --- a/pisi/actionsapi/get.py +++ b/pisi/actionsapi/get.py @@ -15,7 +15,7 @@ import os.path # PISI Modules import pisi.actionsapi -from pisi.ui import ui +import pisi.context as ctx # ActionsAPI Modules from variables import glb @@ -115,7 +115,7 @@ def getBinutilsInfo(util): if not exists_binary(util): raise BinutilsError('util %s cannot be found' % util) else: - ui.debug('Warning: %s does not exist, using plain name %s' \ + ctx.ui.debug('Warning: %s does not exist, using plain name %s' \ % (cross_build_name, util)) return util else: diff --git a/pisi/actionsapi/kde.py b/pisi/actionsapi/kde.py index 5d763fa9..e04973fc 100644 --- a/pisi/actionsapi/kde.py +++ b/pisi/actionsapi/kde.py @@ -14,7 +14,7 @@ import os # Pisi Modules -from pisi.ui import ui +import pisi.context as ctx # ActionsAPI Modules import pisi.actionsapi @@ -23,17 +23,17 @@ from pisi.actionsapi.shelltools import system class ConfigureError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) if can_access_file('config.log'): - ui.error('\n!!! Please attach the config.log to your bug report:\n%s/config.log\n' % os.getcwd()) + ctx.ui.error('\n!!! Please attach the config.log to your bug report:\n%s/config.log\n' % os.getcwd()) class MakeError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) class InstallError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) def configure(parameters = ''): ''' parameters = '--with-nls --with-libusb --with-something-usefull ''' diff --git a/pisi/actionsapi/libtools.py b/pisi/actionsapi/libtools.py index 7aa06966..085411bc 100644 --- a/pisi/actionsapi/libtools.py +++ b/pisi/actionsapi/libtools.py @@ -14,7 +14,7 @@ import os # Pisi-Core Modules -from pisi.ui import ui +import pisi.context as ctx # ActionsAPI Modules import pisi.actionsapi @@ -23,7 +23,7 @@ import pisi.actionsapi.get as get class RunTimeError(pisi.actionsapi.Error): def __init__(self, Exception): - ui.error(Exception) + ctx.ui.error(Exception) def preplib(sourceDirectory = '/usr/lib'): sourceDirectory = get.installDIR() + sourceDirectory @@ -40,7 +40,7 @@ def gnuconfig_update(): for file in files: if file in ['config.sub', 'config.guess']: copy('/usr/share/gnuconfig/%s' % file, os.path.join(root, file)) - ui.info('GNU Config Update Finished...\n') + ctx.ui.info('GNU Config Update Finished...\n') def libtoolize(parameters = ''): if system('/usr/bin/libtoolize %s' % parameters): diff --git a/pisi/actionsapi/pisitools.py b/pisi/actionsapi/pisitools.py index a29af0ed..b92ac1b2 100644 --- a/pisi/actionsapi/pisitools.py +++ b/pisi/actionsapi/pisitools.py @@ -18,7 +18,7 @@ import fileinput import re # Pisi Modules -from pisi.ui import ui +import pisi.context as ctx # ActionsAPI Modules import pisi.actionsapi @@ -125,7 +125,7 @@ def doman(*sourceFiles): pageName, pageDirectory = source[:source.rindex('.')], \ source[source.rindex('.')+1:] except ValueError: - ui.error('\n!!! ActionsAPI [doman]: Wrong man page file...\n') + ctx.ui.error('\n!!! ActionsAPI [doman]: Wrong man page file...\n') makedirs(manDIR + '/man%s' % pageDirectory) system('install -m0644 %s %s' % (source, manDIR + '/man%s' % pageDirectory)) @@ -186,7 +186,7 @@ def dosym(sourceFile, destinationFile): try: os.symlink(sourceFile, get.installDIR() + destinationFile) except OSError: - ui.error('\n!!! ActionsAPI [dosym]: File exists...\n') + ctx.ui.error('\n!!! ActionsAPI [dosym]: File exists...\n') def insinto(destinationDirectory, sourceFile, destinationFile = ''): '''insert a sourceFile into destinationDirectory as a destinationFile with same uid/guid/permissions''' diff --git a/pisi/actionsapi/shelltools.py b/pisi/actionsapi/shelltools.py index 4c0c3bc8..826410c0 100644 --- a/pisi/actionsapi/shelltools.py +++ b/pisi/actionsapi/shelltools.py @@ -16,7 +16,7 @@ import glob import shutil # Pisi Modules -from pisi.ui import ui +import pisi.context as ctx # ActionsAPI Modules import pisi.actionsapi @@ -44,9 +44,9 @@ def chmod(sourceFile, mode = 0755): try: os.chmod(file, mode) except OSError: - ui.error('\n!!! ActionsAPI [chmod]: Operation not permitted...\n') + ctx.ui.error('\n!!! ActionsAPI [chmod]: Operation not permitted...\n') else: - ui.error('\n!!! ActionsAPI [chmod]: File doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [chmod]: File doesn\'t exists...\n') def chown(sourceFile, uid = 0, gid = 0): '''change the owner and group id of sourceFile to the numeric uid and gid''' @@ -54,16 +54,16 @@ def chown(sourceFile, uid = 0, gid = 0): try: os.chown(sourceFile, uid, gid) except OSError: - ui.error('\n!!! ActionsAPI [chown]: Operation not permitted...\n') + ctx.ui.error('\n!!! ActionsAPI [chown]: Operation not permitted...\n') else: - ui.error('\n!!! ActionsAPI [chown]: File doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [chown]: File doesn\'t exists...\n') def sym(sourceFile, destinationFile): '''creates symbolic link''' try: os.symlink(sourceFile, destinationFile) except OSError: - ui.error('\n!!! ActionsAPI [sym]: Permission denied...\n') + ctx.ui.error('\n!!! ActionsAPI [sym]: Permission denied...\n') def unlink(sourceFile): '''remove the file path''' @@ -71,11 +71,11 @@ def unlink(sourceFile): try: os.unlink(sourceFile) except OSError: - ui.error('\n!!! ActionsAPI [unlink]: Permission denied...\n') + ctx.ui.error('\n!!! ActionsAPI [unlink]: Permission denied...\n') elif isDirectory(sourceFile): pass else: - ui.error('\n!!! ActionsAPI [unlink]: File doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [unlink]: File doesn\'t exists...\n') def unlinkDir(sourceDirectory): '''delete an entire directory tree''' @@ -83,11 +83,11 @@ def unlinkDir(sourceDirectory): try: shutil.rmtree(sourceDirectory) except OSError: - ui.error('\n!!! ActionsAPI [unlinkDir]: Operation not permitted...\n') + ctx.ui.error('\n!!! ActionsAPI [unlinkDir]: Operation not permitted...\n') elif isFile(sourceDirectory): pass else: - ui.error('\n!!! ActionsAPI [unlinkDir]: Directory doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [unlinkDir]: Directory doesn\'t exists...\n') def move(sourceFile, destinationFile): '''recursively move a sourceFile or directory to destinationFile''' @@ -96,9 +96,9 @@ def move(sourceFile, destinationFile): try: shutil.move(file, destinationFile) except OSError: - ui.error('\n!!! ActionsAPI [move]: Permission denied...\n') + ctx.ui.error('\n!!! ActionsAPI [move]: Permission denied...\n') else: - ui.error('\n!!! ActionsAPI [move]: File doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [move]: File doesn\'t exists...\n') def copy(sourceFile, destinationFile): '''recursively copy a sourceFile or directory to destinationFile''' @@ -107,9 +107,9 @@ def copy(sourceFile, destinationFile): try: shutil.copy(file, destinationFile) except IOError: - ui.error('\n!!! ActionsAPI [copy]: Permission denied...\n') + ctx.ui.error('\n!!! ActionsAPI [copy]: Permission denied...\n') else: - ui.error('\n!!! ActionsAPI [copy]: File doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [copy]: File doesn\'t exists...\n') def copytree(source, destination, sym = False): '''recursively copy an entire directory tree rooted at source''' @@ -117,9 +117,9 @@ def copytree(source, destination, sym = False): try: shutil.copytree(source, destination, sym) except OSError: - ui.error('\n!!! ActionsAPI [copytree]: Permission denied...\n') + ctx.ui.error('\n!!! ActionsAPI [copytree]: Permission denied...\n') else: - ui.error('\n!!! ActionsAPI [copytree]: Directory doesn\'t exists...\n') + ctx.ui.error('\n!!! ActionsAPI [copytree]: Directory doesn\'t exists...\n') def touch(sourceFile): '''changes the access time of the 'sourceFile', or creates it if it is not exist''' @@ -131,7 +131,7 @@ def touch(sourceFile): f = open(sourceFile, 'w') f.close() except IOError: - ui.error('\n!!! ActionsAPI [touch]: Permission denied...\n') + ctx.ui.error('\n!!! ActionsAPI [touch]: Permission denied...\n') def cd(directoryName = ''): '''change directory''' @@ -179,12 +179,12 @@ def dirName(sourceFile): def system(command): #FIXME: String formatting command = command.replace(" ", " ") - ui.debug('executing %s\n' % command) + ctx.ui.debug('executing %s\n' % command) p = os.popen(command) while 1: line = p.readline() if not line: break - ui.debug(line) + ctx.ui.debug(line) return p.close() diff --git a/pisi/api.py b/pisi/api.py index 1ffdb492..ecf4d271 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -19,29 +19,7 @@ if ver[0] <= 2 and ver[1] < 4: import pisi -class Error(pisi.Error): - pass - -def init(database = True, options = None, ui = None ): - import pisi.config - import pisi.ui - """Initialize PiSi subsystem""" - pisi.config.config = pisi.config.Config(options) - if ui is None: - if options: - pisi.ui.ui = pisi.ui.CLI(options.debug) - else: - pisi.ui.ui = pisi.ui.CLI() - else: - pisi.ui.ui = ui - # initialize repository databases - if database: - from pisi.repodb import repodb - repodb.init_dbs() - -from pisi.config import config -from pisi.constants import const -from pisi.ui import ui +import pisi.context as ctx from pisi.uri import URI import pisi.util as util import pisi.dependency as dependency @@ -52,6 +30,34 @@ from pisi.repodb import repodb from pisi.installdb import installdb from pisi.index import Index +class Error(pisi.Error): + pass + +def init(database = True, options = None, ui = None ): + """Initialize PiSi subsystem""" + + import pisi.config + ctx.config = pisi.config.Config(options) + + if ui is None: + import pisi.ui + if options: + pisi.context.ui = pisi.ui.CLI(options.debug) + else: + pisi.context.ui = pisi.ui.CLI() + else: + pisi.context.ui = ui + + # initialize repository databases + if database: + import pisi.repodb + pisi.repodb.init() + import pisi.installdb + pisi.installdb.init() + import pisi.packagedb + pisi.packagedb.init() + import pisi.sourcedb + pisi.sourcedb.init() def install(packages): """install a list of packages (either files/urls, or names)""" @@ -68,26 +74,26 @@ def install(packages): install_pkg_names(packages) except InstallError, e: - ui.error("%s\n" % e) + ctx.ui.error("%s\n" % e) except packagedb.PackageDBError, e: - ui.error("PackageDBError: (%s)\n" % e) - ui.error("Package is not installable.\n") + ctx.ui.error("PackageDBError: (%s)\n" % e) + ctx.ui.error("Package is not installable.\n") #except Exception, e: # print e - # ui.error("Error: %s\n" % e) + # ctx.ui.error("Error: %s\n" % e) def install_pkg_files(package_URIs): """install a number of pisi package files""" from package import Package - ui.debug('A = %s\n' % str(package_URIs)) + ctx.ui.debug('A = %s\n' % str(package_URIs)) for x in package_URIs: if not x.endswith(const.package_prefix): - ui.error('Mixing file names and package names not supported YET.\n') + ctx.ui.error('Mixing file names and package names not supported YET.\n') return False # read the package information into memory first @@ -136,7 +142,7 @@ def install_pkg_files(package_URIs): A = d_t.keys() if len(A)==0: - ui.info('No packages to install.\n') + ctx.ui.info('No packages to install.\n') return True # try to construct a pisi graph of packages to @@ -180,10 +186,10 @@ def install_pkg_names(A): the repository, trying to perform a minimum number of installs""" - ui.debug('A = %s\n' % str(A)) + ctx.ui.debug('A = %s\n' % str(A)) if len(A)==0: - ui.info('No packages to install.\n') + ctx.ui.info('No packages to install.\n') return True # try to construct a pisi graph of packages to @@ -235,7 +241,7 @@ def upgrade_pkg_names(A): Ap = [] for x in A: if not installdb.is_installed(x): - ui.info('Package %s is not installed.\n' % x) + ctx.ui.info('Package %s is not installed.\n' % x) continue (version, release, build) = installdb.get_version(x) pkg = packagedb.get_package(x) @@ -245,17 +251,17 @@ def upgrade_pkg_names(A): elif build < pkg.build: Ap.append(x) else: - #ui.info('Package %s cannot be upgraded. ' % x) - ui.info('Package %s is already at its latest version %s,\ + #ctx.ui.info('Package %s cannot be upgraded. ' % x) + ctx.ui.info('Package %s is already at its latest version %s,\ release %s, build %s.\n' % (x, pkg.version, pkg.release, pkg.build)) A = Ap if len(A)==0: - ui.info('No packages to upgrade.\n') + ctx.ui.info('No packages to upgrade.\n') return True - ui.debug('A = %s\n' % str(A)) + ctx.ui.debug('A = %s\n' % str(A)) # try to construct a pisi graph of packages to # install / reinstall @@ -310,11 +316,11 @@ def remove(A): if installdb.is_installed(x): Ap.append(x) else: - ui.info('Package %s does not exist. Cannot remove.\n' % x) + ctx.ui.info('Package %s does not exist. Cannot remove.\n' % x) A = Ap if len(A)==0: - ui.info('No packages to remove.\n') + ctx.ui.info('No packages to remove.\n') return True # try to construct a pisi graph of packages to @@ -350,7 +356,7 @@ def remove(A): if installdb.is_installed(x): operations.remove_single(x) else: - ui.info('Package %s is not installed. Cannot remove.\n' % x) + ctx.ui.info('Package %s is not installed. Cannot remove.\n' % x) return True # everything went OK :) @@ -396,11 +402,11 @@ def info_name(package_name): def index(repo_dir = '.'): - ui.info('* Building index of PISI files under %s\n' % repo_dir) + ctx.ui.info('* Building index of PISI files under %s\n' % repo_dir) index = Index() index.index(repo_dir) - index.write(const.pisi_index) - ui.info('* Index file written\n') + index.write(ctx.const.pisi_index) + ctx.ui.info('* Index file written\n') class Repo: def __init__(self, indexuri): @@ -414,16 +420,16 @@ def remove_repo(name): if repodb.has_repo(name): repodb.remove_repo(name) else: - ui.error('* Repository %s does not exist. Cannot remove.\n' + ctx.ui.error('* Repository %s does not exist. Cannot remove.\n' % name) def update_repo(repo): - ui.info('* Updating repository: %s\n' % repo) + ctx.ui.info('* Updating repository: %s\n' % repo) index = Index() index.read(repodb.get_repo(repo).indexuri.get_uri(), repo) index.update_db(repo) - ui.info('* Package database updated.\n') + ctx.ui.info('* Package database updated.\n') # build functions... @@ -489,7 +495,7 @@ def build_until(pspecfile, state, authInfo=None): pb.compile_action_script() last = pb.get_state() - ui.info("Last state was %s\n"%last) + ctx.ui.info("Last state was %s\n"%last) if not last: last = "none" diff --git a/pisi/build.py b/pisi/build.py index 31f161ee..62615b7a 100644 --- a/pisi/build.py +++ b/pisi/build.py @@ -23,9 +23,7 @@ _ = __trans.ugettext import pisi import pisi.util as util -from pisi.ui import ui -from pisi.constants import const -from pisi.config import config +import pisi.context as ctx from pisi.context import BuildContext from pisi.sourcearchive import SourceArchive from pisi.files import Files, FileInfo @@ -74,10 +72,48 @@ def check_path_collision(package, pkgList): # path.pathname: /usr/share/doc if util.subpath(pinfo.pathname, path.pathname): collisions.append(path.pathname) - ui.error(_('Path %s belongs in multiple packages\n') % + ctx.ui.error(_('Path %s belongs in multiple packages\n') % path.pathname) return collisions +# a dynamic build context +from pisi.specfile import SpecFile + + +class BuildContext(object): + """Build Context Singleton""" + + def __init__(self, pspecfile): + super(BuildContext, self).__init__() + self.set_spec_file(pspecfile) + + def set_spec_file(self, pspecfile): + self.pspecfile = pspecfile + spec = SpecFile() + spec.read(pspecfile) + # FIXME: following checks the integrity but does nothing when it is wrong + # -gurer + #spec.verify() # check pspec integrity + self.spec = spec + + # directory accessor functions + + # pkg_x_dir: per package directory for storing info type x + + def pkg_dir(self): + "package build directory" + packageDir = self.spec.source.name + '-' + \ + self.spec.source.version + '-' + self.spec.source.release + + return config.destdir + config.values.dirs.tmp_dir \ + + '/' + packageDir + + def pkg_work_dir(self): + return self.pkg_dir() + const.work_dir_suffix + + def pkg_install_dir(self): + return self.pkg_dir() + const.install_dir_suffix + class PisiBuild: """PisiBuild class, provides the package build and creation routines""" @@ -106,7 +142,7 @@ class PisiBuild: def build(self): """Build the package in one shot.""" - ui.info(_("Building PISI source package: %s\n") % self.spec.source.name) + ctx.ui.info(_("Building PISI source package: %s\n") % self.spec.source.name) util.xterm_title(_("Building PISI source package: %s\n") % self.spec.source.name) self.compile_action_script() @@ -140,30 +176,30 @@ class PisiBuild: os.environ.update(evn) def fetch_source_archive(self): - ui.info(_("Fetching source from: %s\n") % self.spec.source.archiveUri) + ctx.ui.info(_("Fetching source from: %s\n") % self.spec.source.archiveUri) self.sourceArchive.fetch() - ui.info(_("Source archive is stored: %s/%s\n") + ctx.ui.info(_("Source archive is stored: %s/%s\n") %(config.archives_dir(), self.spec.source.archiveName)) def unpack_source_archive(self): - ui.info(_("Unpacking archive...")) + ctx.ui.info(_("Unpacking archive...")) self.sourceArchive.unpack() - ui.info(_(" unpacked (%s)\n") % self.ctx.pkg_work_dir()) + ctx.ui.info(_(" unpacked (%s)\n") % self.ctx.pkg_work_dir()) self.set_state("unpacked") def run_setup_action(self): # Run configure, build and install phase - ui.action(_("Setting up source...\n")) + ctx.ui.action(_("Setting up source...\n")) self.run_action_function(const.setup_func) self.set_state("setupaction") def run_build_action(self): - ui.action(_("Building source...\n")) + ctx.ui.action(_("Building source...\n")) self.run_action_function(const.build_func) self.set_state("buildaction") def run_install_action(self): - ui.action(_("Installing...\n")) + ctx.ui.action(_("Installing...\n")) # Before install make sure install_dir is clean if os.path.exists(self.ctx.pkg_install_dir()): @@ -182,10 +218,10 @@ class PisiBuild: buf = open(scriptfile).read() exec compile(buf, "error", "exec") in localSymbols, globalSymbols except IOError, e: - ui.error(_("Unable to read Action Script (%s): %s\n") %(scriptfile,e)) + ctx.ui.error(_("Unable to read Action Script (%s): %s\n") %(scriptfile,e)) sys.exit(1) except SyntaxError, e: - ui.error (_("SyntaxError in Action Script (%s): %s\n") %(scriptfile,e)) + ctx.ui.error (_("SyntaxError in Action Script (%s): %s\n") %(scriptfile,e)) sys.exit(1) self.actionLocals = localSymbols @@ -236,7 +272,7 @@ class PisiBuild: compressType=patch.compressionType, targetDir=config.tmp_dir()) - ui.action(_("* Applying patch: %s\n") % patch.filename) + ctx.ui.action(_("* Applying patch: %s\n") % patch.filename) util.do_patch(self.srcDir, patchFile, level=patch.level, target=patch.target) def gen_metadata_xml(self, package): @@ -262,7 +298,7 @@ class PisiBuild: # build no if config.options.ignore_build_no: metadata.package.build = None # means, build no information n/a - ui.warning('build number is not available.') + ctx.ui.warning('build number is not available.') else: metadata.package.build = self.calc_build_no(metadata.package.name) @@ -305,7 +341,7 @@ class PisiBuild: if fn.startswith(package_name + '-') and \ fn.endswith(const.package_prefix): old_package_fn = os.path.join(root, fn) - ui.info('(found old version %s)' % old_package_fn) + ctx.ui.info('(found old version %s)' % old_package_fn) old_pkg = Package(old_package_fn, 'r') from os.path import join old_pkg.read(join(config.tmp_dir(), 'oldpkg')) @@ -313,7 +349,7 @@ class PisiBuild: found.append( (old_package_fn, old_build) ) if not found: return 0 - ui.warning('(no previous build found, setting build no to 0.)') + ctx.ui.warning('(no previous build found, setting build no to 0.)') else: a = filter(lambda (x,y): y != None, found) if a: @@ -350,7 +386,7 @@ class PisiBuild: # set build number if old_build is None: - ui.warning('(old package lacks a build no, setting build no to 0.)') + ctx.ui.warning('(old package lacks a build no, setting build no to 0.)') return 0 elif changed: return old_build + 1 @@ -367,17 +403,17 @@ class PisiBuild: self.spec.source.release) - ui.action(_("** Building package %s\n") % package.name); + ctx.ui.action(_("** Building package %s\n") % package.name); - ui.action(_("Generating %s...") % const.files_xml) + ctx.ui.action(_("Generating %s...") % const.files_xml) self.gen_files_xml(package) - ui.info(_(" done.\n")) + ctx.ui.info(_(" done.\n")) - ui.action(_("Generating %s...") % const.metadata_xml) + ctx.ui.action(_("Generating %s...") % const.metadata_xml) self.gen_metadata_xml(package) - ui.info(_(" done.\n")) + ctx.ui.info(_(" done.\n")) - ui.action(_("Creating PISI package %s\n") % name) + ctx.ui.action(_("Creating PISI package %s\n") % name) pkg = Package(name, 'w') diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index db90363e..d121d8cc 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -116,7 +116,7 @@ class Command(object): import pisi import pisi.api pisi.api.init(database, self.options) - from pisi.ui import ui + import pisi.context as ctx def finalize(self): """do cleanup work for PiSi components""" @@ -134,7 +134,7 @@ class Command(object): def help(self): """print help for the command""" - pisi.ui.ui.info(self.format_name() + ': ') + ctx.ui.info(self.format_name() + ': ') print getattr(self, "__doc__") print self.parser.format_option_help() @@ -227,8 +227,7 @@ fetch all necessary files and build the package for you. return self.init() - from pisi.config import config - pisi.ui.ui.info('Output directory: %s\n' % config.options.output_dir) + ctx.ui.info('Output directory: %s\n' % config.options.output_dir) for arg in self.args: pisi.api.build(arg, self.authInfo) self.finalize() @@ -254,7 +253,7 @@ class PackageOp(Command): try: pisi.comariface.init() except pisi.comariface.ComarError: - pisi.ui.ui.error('Comar error encountered\n') + ctx.ui.error('Comar error encountered\n') self.die() def finalize(self): @@ -645,7 +644,6 @@ Gives a brief list of PiSi components published in the repository. def run(self): from pisi.repodb import repodb - from pisi.ui import ui self.init(True) @@ -655,7 +653,7 @@ Gives a brief list of PiSi components published in the repository. else: # print for all repos for repo in repodb.list(): - ui.info("Repository : %s\n" % repo) + ctx.ui.info("Repository : %s\n" % repo) self.print_packages(repo) self.finalize() @@ -681,8 +679,6 @@ class ListPending(Command): def run(self): from pisi.installdb import installdb - from pisi.ui import ui - self.init(True) list = installdb.list_pending() diff --git a/pisi/config.py b/pisi/config.py index 084b874c..ee1bc82b 100644 --- a/pisi/config.py +++ b/pisi/config.py @@ -17,7 +17,7 @@ # Eray Ozkural import pisi -from pisi.constants import const +import pisi.context as ctx from pisi.configfile import ConfigurationFile class Config(object): @@ -55,6 +55,7 @@ class Config(object): # kullanılıyor ama /var/tmp/pisi/install gibi bir dizine niye # ihtiyacımız var? (baris) def install_dir(self): - return self.tmp_dir() + const.install_dir_suffix + return self.tmp_dir() + ctx.const.install_dir_suffix +#TODO: remove this config = Config() diff --git a/pisi/constants.py b/pisi/constants.py index c725066a..e6fe21b1 100644 --- a/pisi/constants.py +++ b/pisi/constants.py @@ -88,6 +88,3 @@ class Constants: def __delattr__(self, attr): delattr(self.__c, attr) - -# singleton for easy access here -const = Constants() diff --git a/pisi/context.py b/pisi/context.py index 36388aa1..d7803070 100644 --- a/pisi/context.py +++ b/pisi/context.py @@ -15,40 +15,17 @@ # Authors: Baris Metin -from pisi.constants import const -from pisi.config import config -from pisi.specfile import SpecFile +# global variables here -class BuildContext(object): - """Build Context Singleton""" +import pisi.constants - def __init__(self, pspecfile): - super(BuildContext, self).__init__() - self.set_spec_file(pspecfile) +const = pisi.constants.Constants() - def set_spec_file(self, pspecfile): - self.pspecfile = pspecfile - spec = SpecFile() - spec.read(pspecfile) - # FIXME: following checks the integrity but does nothing when it is wrong - # -gurer - #spec.verify() # check pspec integrity - self.spec = spec +config = None - # directory accessor functions - - # pkg_x_dir: per package directory for storing info type x +# default UI is CLI +ui = None # not now - def pkg_dir(self): - "package build directory" - packageDir = self.spec.source.name + '-' + \ - self.spec.source.version + '-' + self.spec.source.release - - return config.destdir + config.values.dirs.tmp_dir \ - + '/' + packageDir - - def pkg_work_dir(self): - return self.pkg_dir() + const.work_dir_suffix - - def pkg_install_dir(self): - return self.pkg_dir() + const.install_dir_suffix +#def register(_impl): +# """ Register a UI implementation""" +# ui = _impl diff --git a/pisi/dependency.py b/pisi/dependency.py index 57339039..5ec6511e 100644 --- a/pisi/dependency.py +++ b/pisi/dependency.py @@ -12,13 +12,12 @@ # Author: Eray Ozkural -from installdb import installdb -import packagedb -from ui import ui -from version import Version -from xmlext import * -from xmlfile import XmlFile -from util import Checks +#import pisi.db as db +import pisi.context as ctx +from pisi.version import Version +from pisi.xmlext import * +from pisi.xmlfile import XmlFile +from pisi.util import Checks class DepInfo: def __init__(self, node = None): diff --git a/pisi/fetcher.py b/pisi/fetcher.py index 0af800e5..87dfd143 100644 --- a/pisi/fetcher.py +++ b/pisi/fetcher.py @@ -24,7 +24,7 @@ from base64 import encodestring import pisi import pisi.util as util from pisi.uri import URI -from pisi.ui import ui +import pisi.context as ctx class FetchError(pisi.Error): @@ -37,7 +37,7 @@ def fetch_url(url, dest, progress=None): fetch.progress = progress fetch.fetch() if progress: - ui.info('\n') + ctx.ctx.ui.info('\n') class Fetcher: @@ -101,7 +101,7 @@ class Fetcher: 'percent' : self.percent, 'rate': self.rate, 'symbol': symbol} - ui.display_progress(retval) + ctx.ui.display_progress(retval) dest.close() diff --git a/pisi/files.py b/pisi/files.py index 0d000056..9e29651f 100644 --- a/pisi/files.py +++ b/pisi/files.py @@ -13,9 +13,9 @@ # Authors: Eray Ozkural -from xmlext import * -from xmlfile import XmlFile -from util import Checks +from pisi.xmlext import * +from pisi.xmlfile import XmlFile +from pisi.util import Checks class FileInfo: """FileInfo holds the information for a File node/tag in files.xml""" diff --git a/pisi/global.py b/pisi/global.py deleted file mode 100644 index 744e319f..00000000 --- a/pisi/global.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program 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 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - - -config = None -ui = None diff --git a/pisi/index.py b/pisi/index.py index 6ccd1d2b..ae30d955 100644 --- a/pisi/index.py +++ b/pisi/index.py @@ -20,10 +20,8 @@ from pisi.package import Package from pisi.xmlfile import XmlFile import pisi.metadata as metadata import pisi.packagedb as packagedb -from pisi.ui import ui +import pisi.context as ctx import pisi.util as util -from pisi.config import config -from pisi.constants import const from pisi.uri import URI class Index(XmlFile): @@ -41,10 +39,10 @@ class Index(XmlFile): if url.is_remote_file(): from fetcher import fetch_url - dest = os.path.join(config.index_dir(), repo) + dest = os.path.join(ctx.config.index_dir(), repo) if not os.path.exists(dest): os.makedirs(dest) - fetch_url(url, dest, ui.Progress) + fetch_url(url, dest, ctx.ui.Progress) self.filepath = os.path.join(dest, url.filename()) @@ -68,8 +66,8 @@ class Index(XmlFile): self.repo_dir = repo_uri for root, dirs, files in os.walk(repo_uri): for fn in files: - if fn.endswith(const.package_prefix): - ui.info('Adding ' + fn + ' to package index\n') + if fn.endswith(ctx.const.package_prefix): + ctx.ui.info('Adding ' + fn + ' to package index\n') self.add_package(os.path.join(root, fn), repo_uri) def update_db(self, repo): @@ -81,12 +79,12 @@ class Index(XmlFile): def add_package(self, path, repo_uri): package = Package(path, 'r') # extract control files - util.clean_dir(config.install_dir()) - package.extract_PISI_files(config.install_dir()) + util.clean_dir(ctx.config.install_dir()) + package.extract_PISI_files(ctx.config.install_dir()) md = metadata.MetaData() - md.read(os.path.join(config.install_dir(), const.metadata_xml)) - if config.options and config.options.absolute_uris: + md.read(os.path.join(ctx.config.install_dir(), ctx.const.metadata_xml)) + if ctx.config.options and ctx.config.options.absolute_uris: md.package.packageURI = os.path.realpath(path) else: # create relative path by default # TODO: in the future we'll do all of this with purl/pfile/&helpers @@ -95,6 +93,6 @@ class Index(XmlFile): md.package.packageURI = util.removepathprefix(repo_uri, path) # check package semantics if md.has_errors(): - ui.error('Package ' + md.package.name + ': metadata corrupt\n') + ctx.ui.error('Package ' + md.package.name + ': metadata corrupt\n') else: self.packages.append(md.package) diff --git a/pisi/install.py b/pisi/install.py index b6eb9d09..5c977f95 100644 --- a/pisi/install.py +++ b/pisi/install.py @@ -19,8 +19,6 @@ import os import pisi from pisi.specfile import * from pisi.package import Package -from pisi.config import config -from pisi.constants import const from pisi.ui import ui from pisi.installdb import installdb import pisi.packagedb as packagedb diff --git a/pisi/installdb.py b/pisi/installdb.py index 6cafbef2..ee71ae0d 100644 --- a/pisi/installdb.py +++ b/pisi/installdb.py @@ -20,8 +20,8 @@ import fcntl # PiSi import pisi +import pisi.context as ctx import pisi.lockeddbshelve as shelve -from pisi.constants import const from pisi.files import Files import pisi.util as util @@ -72,12 +72,10 @@ class InstallDB: from os.path import join self.d = shelve.LockedDBShelf('install') self.dp = shelve.LockedDBShelf('configpending') - from pisi.config import config - self.files_dir = os.path.join(config.db_dir(), 'files') + self.files_dir = os.path.join(ctx.config.db_dir(), 'files') def files_name(self, pkg, version, release): from os.path import join - from pisi.config import config pkg_dir = join(config.lib_dir(), pkg + '-' + version + '-' + release) return join(pkg_dir, const.files_xml) @@ -133,7 +131,6 @@ class InstallDB: def install(self, pkg, version, release, build, distro = ""): """install package with specific version, release, build""" pkg = str(pkg) - from pisi.config import config if self.is_installed(pkg): raise InstallDBError("already installed") if config.options and config.options.ignore_comar: @@ -155,5 +152,8 @@ class InstallDB: if self.d.has_key(pkg): del self.d[pkg] -installdb = InstallDB() +installdb = None + +def init(): + installdb = InstallDB() diff --git a/pisi/lockeddbshelve.py b/pisi/lockeddbshelve.py index d5e6ab18..e7931392 100644 --- a/pisi/lockeddbshelve.py +++ b/pisi/lockeddbshelve.py @@ -19,8 +19,7 @@ import bsddb.db as db import os import fcntl -from pisi.config import config -import pisi.util as util +import pisi class LockedDBShelf(shelve.DBShelf): @@ -41,22 +40,20 @@ class LockedDBShelf(shelve.DBShelf): flags = db.DB_TRUNCATE | db.DB_CREATE else: raise error, "flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" - filename = os.path.join( config.db_dir(), dbname + '.bdb') + filename = os.path.join( pisi.context.config.db_dir(), dbname + '.bdb') LockedDBShelf.open(self,filename, dbname, filetype, flags, mode) def open(self, filename, dbname, filetype, flags, mode): - util.check_dir(config.db_dir()) + pisi.util.check_dir(pisi.context.config.db_dir()) self.lockfile = file(filename + '.lock', 'w') try: fcntl.flock(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: import sys - from ui import ui - ui.error("Another instance of PISI is running. Try later!\n") + pisi.context.ui.error("Another instance of PISI is running. Try later!\n") sys.exit(1) return self.db.open(filename, dbname, filetype, flags, mode) def close(self): self.db.close() self.lockfile.close() - diff --git a/pisi/metadata.py b/pisi/metadata.py index 480cc69a..21a20a5e 100644 --- a/pisi/metadata.py +++ b/pisi/metadata.py @@ -16,11 +16,11 @@ # Authors: Eray Ozkural # Baris Metin