Mercurial > gub
view bin/gpkg @ 6512:ccc20ae889ca default tip guix
mingw::guile-2.0.7 builds.
author | Jan Nieuwenhuizen <janneke@gnu.org> |
---|---|
date | Thu, 24 Mar 2016 08:03:39 +0100 |
parents | 72b46c22bf99 |
children |
line wrap: on
line source
#! /usr/bin/env python """ gpkg - GUB package manager Copyright (c) 2005--2008 Jan Nieuwenhuizen <janneke@gnu.org> Han-Wen Nienhuys <hanwen@xs4all.nl> 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, or (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ def argv0_relocation (): import os, sys bindir = os.path.dirname (sys.argv[0]) prefix = os.path.dirname (bindir) if not prefix: prefix = bindir + '/..' sys.path.insert (0, prefix) if sys.path[0] == 'gbin/..': sys.path[0] = '/' os.getcwd = lambda: '/' argv0_relocation () import optparse import os import re import string import sys # from gub.syntax import printf from gub import gup from gub import gub_log from gub import misc from gub.settings import Settings class Command: def __init__ (self, pm, options): self.pm = pm self.options = options def available (self): '''list available packages''' printf ('\n'.join (sorted (self.pm._packages.keys ()))) def files (self): '''list installed files''' for p in self.options.arguments: if not self.pm.is_installed (p): printf ('%s not installed' % p) else: printf ('\n'.join (self.pm.package_installed_files (p))) def find (self): '''package containing file''' # urg self.options.packagename = self.options.arguments[0] regexp = re.sub ('^%s/' % self.options.root, '/', self.options.packagename) regexp = re.compile (regexp) hits = [] for p in sorted (self.pm.installed_packages ()): hits += ['%s: /%s' % (p, i) for i in self.pm.package_installed_files (p) if regexp.search ('/%s' % i)] printf ('\n'.join (hits)) def get_dependencies (self, packages): return gup.topologically_sorted (packages, {}, self.pm.dependencies) def dependencies (self): '''print package dependencies''' printf ('\n'.join (self.get_dependencies (self.options.arguments))) def install (self): '''download and install packages with dependencies''' packages = self.options.arguments dependencies = packages if not self.options.no_deps: packages = self.get_dependencies (packages) for p in dependencies: platform, name = misc.split_platform (p) if self.pm.is_installed (name): if name in packages: printf ('%s already installed' % name) continue self.pm.install_package (name) def list (self): '''installed packages''' if self.options.print_only_name: printf ('\n'.join (sorted (self.pm.installed_packages ()))) else: printf ('\n'.join (sorted (['%(split_name)-20s%(version)s' % d for d in self.pm.installed_package_dicts()]))) def remove_package (self, p): if not self.pm.is_installed (p): printf ('%s not installed' % p) else: self.pm.uninstall_package (p) def remove (self): '''uninstall packages''' packages = gup.topologically_sorted (self.options.arguments, {}, self.pm.dependencies, recurse_stop_predicate=lambda p: p not in self.options.arguments) packages.reverse () for p in packages: self.remove_package (p) def get_cli_parser (): p = optparse.OptionParser () p.usage = '%prog [OPTION]... COMMAND\n\nCommands:\n' d = Command.__dict__ commands = [(k, d[k].__doc__) for k in list (d.keys ()) if d[k].__doc__ and type (d[k]) == type (lambda x: x)] commands.sort () for (command, doc) in commands: p.usage += " %s - %s\n" % (re.sub ('_', '-', command), doc) p.add_option ('--branch', action='append', dest='branches', default=[], metavar='NAME=BRANCH', help='select branch') p.add_option ('-p', '--platform', default=None, dest='platform', metavar='PLATFORM', help='platform to use') p.add_option ('-n', '--name', help='print package name only', action='store_true', dest='print_only_name') p.add_option ('-r','--root', help='set platform root', metavar='DIR', dest='root', action='store') p.add_option ('-x', '--no-deps', help='ignore dependencies', action='store_true', dest='no_deps') p.add_option ('','--dbdir', action='store', dest='dbdir', help='set db directory') p.add_option ('-v', '--verbose', action='count', dest='verbosity', default=0) p.add_option ('-q', '--quiet', action='count', dest='quiet', default=0) return p def parse_options (): p = get_cli_parser () (options, arguments) = p.parse_args () options.command = '' options.arguments = [] if len (arguments) > 0: options.command = re.sub ('-', '_', arguments.pop (0)) options.arguments = arguments if not options.command: p.print_help () sys.exit (2) return options def main (): options = parse_options () options.verbosity -= options.quiet if not options.platform and len (options.arguments) == 1: options.platform, x = misc.split_platform (options.arguments[0]) settings = Settings (options.platform) options.root = settings.system_root options.platform = settings.platform gub_log.default_logger.threshold = options.verbosity gub_log.verbose ('root: ' + settings.system_root + '\n') gub_log.verbose ('platform: ' + settings.platform + '\n') # TODO: hook log into target/PLAT/log target_manager = gup.DependencyManager (options.root, dbdir=options.dbdir) target_manager.verbose = options.verbosity if options.command in ['install', 'dependencies']: target_manager.read_package_headers (settings.packages, dict ([x.split ('=') for x in options.branches])) target_manager.read_package_headers (settings.cross_packages, dict ([x.split ('=') for x in options.branches])) commands = Command (target_manager, options) if options.command in Command.__dict__: Command.__dict__[options.command] (commands) else: sys.stderr.write ('no such command: ' + options.command) sys.stderr.write ('\n') sys.exit (2) if __name__ == '__main__': main ()